diff --git a/vendor/datatables/.ht_info_cdnorlocal.json b/vendor/datatables/.ht_info_cdnorlocal.json
new file mode 100644
index 0000000000000000000000000000000000000000..89d6e2654ad9c81ca00b49546f7ae5f4bccfcdc0
--- /dev/null
+++ b/vendor/datatables/.ht_info_cdnorlocal.json
@@ -0,0 +1 @@
+{"_cdn":{"name":"datatables","version":"1.10.15","filename":"js\/jquery.dataTables.min.js","description":"DataTables enhances HTML tables with the ability to sort, filter and page the data in the table very easily. It provides a comprehensive API and set of configuration options, allowing you to consume data from virtually any data source.","homepage":"http:\/\/datatables.net","keywords":["DataTables","DataTable","table","grid","filter","sort","page","internationalisable"],"autoupdate":{"type":"git","target":"git:\/\/github.com\/DataTables\/DataTables.git"},"license":"MIT","repository":{"type":"git","url":"https:\/\/github.com\/DataTables\/DataTables.git"},"author":{"name":"Allan Jardine","url":"http:\/\/sprymedia.co.uk"},"assets":[{"version":"1.10.15","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.bootstrap4.css","css\/dataTables.bootstrap4.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/dataTables.material.css","css\/dataTables.material.min.css","css\/dataTables.semanticui.css","css\/dataTables.semanticui.min.css","css\/dataTables.uikit.css","css\/dataTables.uikit.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.bootstrap4.js","js\/dataTables.bootstrap4.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/dataTables.material.js","js\/dataTables.material.min.js","js\/dataTables.semanticui.js","js\/dataTables.semanticui.min.js","js\/dataTables.uikit.js","js\/dataTables.uikit.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js"]},{"version":"1.10.13","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.bootstrap4.css","css\/dataTables.bootstrap4.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/dataTables.material.css","css\/dataTables.material.min.css","css\/dataTables.semanticui.css","css\/dataTables.semanticui.min.css","css\/dataTables.uikit.css","css\/dataTables.uikit.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.bootstrap4.js","js\/dataTables.bootstrap4.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/dataTables.material.js","js\/dataTables.material.min.js","js\/dataTables.semanticui.js","js\/dataTables.semanticui.min.js","js\/dataTables.uikit.js","js\/dataTables.uikit.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js"]},{"version":"1.10.12","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.bootstrap4.css","css\/dataTables.bootstrap4.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/dataTables.material.css","css\/dataTables.material.min.css","css\/dataTables.semanticui.css","css\/dataTables.semanticui.min.css","css\/dataTables.uikit.css","css\/dataTables.uikit.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.bootstrap4.js","js\/dataTables.bootstrap4.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/dataTables.material.js","js\/dataTables.material.min.js","js\/dataTables.semanticui.js","js\/dataTables.semanticui.min.js","js\/dataTables.uikit.js","js\/dataTables.uikit.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js"]},{"version":"1.10.11","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.bootstrap4.css","css\/dataTables.bootstrap4.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/dataTables.material.css","css\/dataTables.material.min.css","css\/dataTables.semanticui.css","css\/dataTables.semanticui.min.css","css\/dataTables.uikit.css","css\/dataTables.uikit.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.bootstrap4.js","js\/dataTables.bootstrap4.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/dataTables.material.js","js\/dataTables.material.min.js","js\/dataTables.semanticui.js","js\/dataTables.semanticui.min.js","js\/dataTables.uikit.js","js\/dataTables.uikit.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.10","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.9","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.8","files":["css\/dataTables.bootstrap.css","css\/dataTables.bootstrap.min.css","css\/dataTables.foundation.css","css\/dataTables.foundation.min.css","css\/dataTables.jqueryui.css","css\/dataTables.jqueryui.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/dataTables.bootstrap.js","js\/dataTables.bootstrap.min.js","js\/dataTables.foundation.js","js\/dataTables.foundation.min.js","js\/dataTables.jqueryui.js","js\/dataTables.jqueryui.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.7","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.6","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.5","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.4","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.3","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.2","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.1","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.10.0-rc.1","files":["css\/demo_page.css","css\/demo_table_jui.css","css\/demo_table.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.js"]},{"version":"1.10.0-beta.2","files":["css\/demo_page.css","css\/demo_table_jui.css","css\/demo_table.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.js"]},{"version":"1.10.0-beta.1","files":["css\/demo_page.css","css\/demo_table_jui.css","css\/demo_table.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.js"]},{"version":"1.10.0","files":["css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables_themeroller.min.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","jquery.dataTables.js","jquery.dataTables.min.js","js\/jquery.dataTables.js","js\/jquery.dataTables.min.js","js\/jquery.js"]},{"version":"1.9.4","files":["css\/demo_page.css","css\/demo_page.min.css","css\/demo_table_jui.css","css\/demo_table_jui.min.css","css\/demo_table.css","css\/demo_table.min.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables_themeroller.min.css","css\/jquery.dataTables.css","css\/jquery.dataTables.min.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","jquery.dataTables.js","jquery.dataTables.min.js"]},{"version":"1.9.3","files":["jquery.dataTables.js","jquery.dataTables.min.js"]},{"version":"1.9.2","files":["jquery.dataTables.js","jquery.dataTables.min.js"]},{"version":"1.9.1","files":["css\/demo_page.css","css\/demo_table_jui.css","css\/demo_table.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.js"]},{"version":"1.9.0","files":["css\/demo_page.css","css\/demo_table_jui.css","css\/demo_table.css","css\/jquery.dataTables_themeroller.css","css\/jquery.dataTables.css","images\/back_disabled.png","images\/back_enabled_hover.png","images\/back_enabled.png","images\/forward_disabled.png","images\/forward_enabled_hover.png","images\/forward_enabled.png","images\/sort_asc_disabled.png","images\/sort_asc.png","images\/sort_both.png","images\/sort_desc_disabled.png","images\/sort_desc.png","js\/jquery.dataTables.js","js\/jquery.js"]}]}}
\ No newline at end of file
diff --git a/vendor/datatables/1.10.15/css/dataTables.bootstrap.css b/vendor/datatables/1.10.15/css/dataTables.bootstrap.css
new file mode 100644
index 0000000000000000000000000000000000000000..2bbb3ef290bcd79142a12827cebecc99fa7f2f5e
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.bootstrap.css
@@ -0,0 +1,184 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 8px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 8px;
+  right: 8px;
+  display: block;
+  font-family: 'Glyphicons Halflings';
+  opacity: 0.5;
+}
+table.dataTable thead .sorting:after {
+  opacity: 0.2;
+  content: "\e150";
+  /* sort */
+}
+table.dataTable thead .sorting_asc:after {
+  content: "\e155";
+  /* sort-by-attributes */
+}
+table.dataTable thead .sorting_desc:after {
+  content: "\e156";
+  /* sort-by-attributes-alt */
+}
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  color: #eee;
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody > table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody > table > thead .sorting:after,
+div.dataTables_scrollBody > table > thead .sorting_asc:after,
+div.dataTables_scrollBody > table > thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody > table > tbody > tr:first-child > th,
+div.dataTables_scrollBody > table > tbody > tr:first-child > td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot > table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.table-condensed > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.table-condensed .sorting:after,
+table.dataTable.table-condensed .sorting_asc:after,
+table.dataTable.table-condensed .sorting_desc:after {
+  top: 6px;
+  right: 6px;
+}
+
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
+}
+table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
+}
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
+}
+
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
+}
+
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
+  padding-right: 0;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.bootstrap.min.css b/vendor/datatables/1.10.15/css/dataTables.bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..66a70ab2f5d61feb67b70c1443f4be89c9985c2f
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
diff --git a/vendor/datatables/1.10.15/css/dataTables.bootstrap4.css b/vendor/datatables/1.10.15/css/dataTables.bootstrap4.css
new file mode 100644
index 0000000000000000000000000000000000000000..07c97597ea22242ac1f94372c0507724cd6ffd93
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.bootstrap4.css
@@ -0,0 +1,194 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 0.85em;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+  justify-content: flex-end;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 0.9em;
+  display: block;
+  opacity: 0.3;
+}
+table.dataTable thead .sorting:before,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:before {
+  right: 1em;
+  content: "\2191";
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  right: 0.5em;
+  content: "\2193";
+}
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:after {
+  opacity: 1;
+}
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  opacity: 0;
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table thead .sorting:after,
+div.dataTables_scrollBody table thead .sorting_asc:after,
+div.dataTables_scrollBody table thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.table-condensed > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.table-condensed .sorting:after,
+table.dataTable.table-condensed .sorting_asc:after,
+table.dataTable.table-condensed .sorting_desc:after {
+  top: 6px;
+  right: 6px;
+}
+
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
+}
+table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
+}
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
+}
+
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
+}
+
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
+  padding-right: 0;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.bootstrap4.min.css b/vendor/datatables/1.10.15/css/dataTables.bootstrap4.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..5ec0a8b7b414abcd65c4251d6eaba0de376387db
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:0.85em;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:0.9em;display:block;opacity:0.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
diff --git a/vendor/datatables/1.10.15/css/dataTables.foundation.css b/vendor/datatables/1.10.15/css/dataTables.foundation.css
new file mode 100644
index 0000000000000000000000000000000000000000..79848c9581f516074bad28a5ef0ded05a0a398ba
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.foundation.css
@@ -0,0 +1,118 @@
+table.dataTable {
+  clear: both;
+  margin: 0.5em 0 !important;
+  max-width: none !important;
+  width: 100%;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper {
+  position: relative;
+}
+div.dataTables_wrapper div.dataTables_length label {
+  float: left;
+  text-align: left;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  float: right;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  display: inline-block !important;
+  width: auto !important;
+  margin-bottom: 0;
+  margin-left: 0.5em;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 2px;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  float: right;
+  margin: 0;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1rem 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 1.5rem;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  background-repeat: no-repeat;
+  background-position: center right;
+}
+table.dataTable thead .sorting {
+  background-image: url("../images/sort_both.png");
+}
+table.dataTable thead .sorting_asc {
+  background-image: url("../images/sort_asc.png");
+}
+table.dataTable thead .sorting_desc {
+  background-image: url("../images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+  background-image: url("../images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+  background-image: url("../images/sort_desc_disabled.png");
+}
+
+div.dataTables_scrollHead table {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+  margin-top: 0 !important;
+  border-top: none;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.foundation.min.css b/vendor/datatables/1.10.15/css/dataTables.foundation.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..73af41efc03b88e9247a786fc76e31d9bc9116fe
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables_wrapper div.dataTables_length select{width:75px;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter label{float:right;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter input{display:inline-block !important;width:auto !important;margin-bottom:0;margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:2px}div.dataTables_wrapper div.dataTables_paginate{float:right;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1rem 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:1.5rem}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}div.dataTables_scrollHead table{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}
diff --git a/vendor/datatables/1.10.15/css/dataTables.jqueryui.css b/vendor/datatables/1.10.15/css/dataTables.jqueryui.css
new file mode 100644
index 0000000000000000000000000000000000000000..dcc8f82f7981a102f6bb033eb074a48bffe37b4f
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.jqueryui.css
@@ -0,0 +1,482 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+  width: 100%;
+  margin: 0 auto;
+  clear: both;
+  border-collapse: separate;
+  border-spacing: 0;
+  /*
+   * Header and footer styles
+   */
+  /*
+   * Body styles
+   */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+  font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+  padding: 10px 18px;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+  outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+  padding: 10px 18px 6px 18px;
+}
+table.dataTable tbody tr {
+  background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+  background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+  padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+  border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+  border-top: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+  border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+  background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+  background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+  background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+  background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+  background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+  background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+  background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+  background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+  background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+  background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+  background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+  background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+  background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+  background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+  background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+  background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+  background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+  background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+  background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+  background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+  border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+  padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+  padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+  padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  *zoom: 1;
+  zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+  float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+  margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+  clear: both;
+  float: left;
+  padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+  float: right;
+  text-align: right;
+  padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em 1em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  color: #333 !important;
+  border: 1px solid transparent;
+  border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+  color: #333 !important;
+  border: 1px solid #979797;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+  cursor: default;
+  color: #666 !important;
+  border: 1px solid transparent;
+  background: transparent;
+  box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+  color: white !important;
+  border: 1px solid #111;
+  background-color: #585858;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #585858 0%, #111 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #585858 0%, #111 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+  outline: none;
+  background-color: #2b2b2b;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+  /* W3C */
+  box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+  padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 40px;
+  margin-left: -50%;
+  margin-top: -25px;
+  padding-top: 20px;
+  text-align: center;
+  font-size: 1.2em;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+  clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+  vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+  height: 0;
+  overflow: hidden;
+  margin: 0 !important;
+  padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead > table,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+  border-bottom: none;
+}
+.dataTables_wrapper:after {
+  visibility: hidden;
+  display: block;
+  content: "";
+  clear: both;
+  height: 0;
+}
+
+@media screen and (max-width: 767px) {
+  .dataTables_wrapper .dataTables_info,
+  .dataTables_wrapper .dataTables_paginate {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_paginate {
+    margin-top: 0.5em;
+  }
+}
+@media screen and (max-width: 640px) {
+  .dataTables_wrapper .dataTables_length,
+  .dataTables_wrapper .dataTables_filter {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_filter {
+    margin-top: 0.5em;
+  }
+}
+table.dataTable thead th div.DataTables_sort_wrapper {
+  position: relative;
+}
+table.dataTable thead th div.DataTables_sort_wrapper span {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  right: -18px;
+}
+table.dataTable thead th.ui-state-default,
+table.dataTable tfoot th.ui-state-default {
+  border-left-width: 0;
+}
+table.dataTable thead th.ui-state-default:first-child,
+table.dataTable tfoot th.ui-state-default:first-child {
+  border-left-width: 1px;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper .dataTables_paginate .fg-button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:active {
+  outline: none;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.dataTables_wrapper .ui-widget-header {
+  font-weight: normal;
+}
+.dataTables_wrapper .ui-toolbar {
+  padding: 8px;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: none;
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: inherit;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.jqueryui.min.css b/vendor/datatables/1.10.15/css/dataTables.jqueryui.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..fe64abca985b94c33573327415e513ae91c91e8c
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead>table,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}table.dataTable thead th div.DataTables_sort_wrapper{position:relative}table.dataTable thead th div.DataTables_sort_wrapper span{position:absolute;top:50%;margin-top:-8px;right:-18px}table.dataTable thead th.ui-state-default,table.dataTable tfoot th.ui-state-default{border-left-width:0}table.dataTable thead th.ui-state-default:first-child,table.dataTable tfoot th.ui-state-default:first-child{border-left-width:1px}.dataTables_wrapper .dataTables_paginate .fg-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .fg-button:active{outline:none}.dataTables_wrapper .dataTables_paginate .fg-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.dataTables_wrapper .dataTables_paginate .fg-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dataTables_wrapper .ui-widget-header{font-weight:normal}.dataTables_wrapper .ui-toolbar{padding:8px}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:none}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}
diff --git a/vendor/datatables/1.10.15/css/dataTables.material.css b/vendor/datatables/1.10.15/css/dataTables.material.css
new file mode 100644
index 0000000000000000000000000000000000000000..c00f2e9093163cc9de7b11272fb18c6ecd32d3db
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.material.css
@@ -0,0 +1,87 @@
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 10px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  text-align: center;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  text-align: right;
+}
+div.dataTables_wrapper div.mdl-grid.dt-table {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+div.dataTables_wrapper div.mdl-grid.dt-table > div.mdl-cell {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 11px;
+  display: block;
+  opacity: 0.3;
+  font-size: 1.3em;
+}
+table.dataTable thead .sorting:before,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:before {
+  right: 1em;
+  content: "\2191";
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  right: 0.5em;
+  content: "\2193";
+}
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:after {
+  opacity: 1;
+}
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  opacity: 0;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.material.min.css b/vendor/datatables/1.10.15/css/dataTables.material.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..5935ac4d0c60188b259f0c15a81cec28574ce51d
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.material.min.css
@@ -0,0 +1 @@
+div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:10px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.dataTables_paginate{text-align:right}div.dataTables_wrapper div.mdl-grid.dt-table{padding-top:0;padding-bottom:0}div.dataTables_wrapper div.mdl-grid.dt-table>div.mdl-cell{margin-top:0;margin-bottom:0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:11px;display:block;opacity:0.3;font-size:1.3em}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}
diff --git a/vendor/datatables/1.10.15/css/dataTables.semanticui.css b/vendor/datatables/1.10.15/css/dataTables.semanticui.css
new file mode 100644
index 0000000000000000000000000000000000000000..2583842659a3816c2ae5c9e1d5e6ed41e7dda4c9
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.semanticui.css
@@ -0,0 +1,102 @@
+/*
+ * Styling for DataTables with Semantic UI
+ */
+table.dataTable.table {
+  margin: 0;
+}
+table.dataTable.table thead th,
+table.dataTable.table thead td {
+  position: relative;
+}
+table.dataTable.table thead th.sorting, table.dataTable.table thead th.sorting_asc, table.dataTable.table thead th.sorting_desc,
+table.dataTable.table thead td.sorting,
+table.dataTable.table thead td.sorting_asc,
+table.dataTable.table thead td.sorting_desc {
+  padding-right: 20px;
+}
+table.dataTable.table thead th.sorting:after, table.dataTable.table thead th.sorting_asc:after, table.dataTable.table thead th.sorting_desc:after,
+table.dataTable.table thead td.sorting:after,
+table.dataTable.table thead td.sorting_asc:after,
+table.dataTable.table thead td.sorting_desc:after {
+  position: absolute;
+  top: 12px;
+  right: 8px;
+  display: block;
+  font-family: Icons;
+}
+table.dataTable.table thead th.sorting:after,
+table.dataTable.table thead td.sorting:after {
+  content: "\f0dc";
+  color: #ddd;
+  font-size: 0.8em;
+}
+table.dataTable.table thead th.sorting_asc:after,
+table.dataTable.table thead td.sorting_asc:after {
+  content: "\f0de";
+}
+table.dataTable.table thead th.sorting_desc:after,
+table.dataTable.table thead td.sorting_desc:after {
+  content: "\f0dd";
+}
+table.dataTable.table td,
+table.dataTable.table th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable.table td.dataTables_empty,
+table.dataTable.table th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.table.nowrap th,
+table.dataTable.table.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length select {
+  vertical-align: middle;
+  min-height: 2.7142em;
+}
+div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown {
+  min-width: 0;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 13px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  text-align: center;
+}
+div.dataTables_wrapper div.row.dt-table {
+  padding: 0;
+}
+div.dataTables_wrapper div.dataTables_scrollHead table.dataTable {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  border-bottom: none;
+}
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_wrapper div.dataTables_scrollBody table.dataTable {
+  border-radius: 0;
+  border-top: none;
+  border-bottom-width: 0;
+}
+div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer {
+  border-bottom-width: 1px;
+}
+div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+  border-top: none;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.semanticui.min.css b/vendor/datatables/1.10.15/css/dataTables.semanticui.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..c192a34209b42542285e80f0f4d92ef2d490c2a3
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable.table{margin:0}table.dataTable.table thead th,table.dataTable.table thead td{position:relative}table.dataTable.table thead th.sorting,table.dataTable.table thead th.sorting_asc,table.dataTable.table thead th.sorting_desc,table.dataTable.table thead td.sorting,table.dataTable.table thead td.sorting_asc,table.dataTable.table thead td.sorting_desc{padding-right:20px}table.dataTable.table thead th.sorting:after,table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting:after,table.dataTable.table thead td.sorting_asc:after,table.dataTable.table thead td.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:Icons}table.dataTable.table thead th.sorting:after,table.dataTable.table thead td.sorting:after{content:"\f0dc";color:#ddd;font-size:0.8em}table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead td.sorting_asc:after{content:"\f0de"}table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting_desc:after{content:"\f0dd"}table.dataTable.table td,table.dataTable.table th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable.table td.dataTables_empty,table.dataTable.table th.dataTables_empty{text-align:center}table.dataTable.table.nowrap th,table.dataTable.table.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{vertical-align:middle;min-height:2.7142em}div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown{min-width:0}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:13px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.row.dt-table{padding:0}div.dataTables_wrapper div.dataTables_scrollHead table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after{display:none}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer{border-bottom-width:1px}div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none}
diff --git a/vendor/datatables/1.10.15/css/dataTables.uikit.css b/vendor/datatables/1.10.15/css/dataTables.uikit.css
new file mode 100644
index 0000000000000000000000000000000000000000..8e1e21eea2413a46e1115c4c5733a186a1ad0bc4
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.uikit.css
@@ -0,0 +1,146 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.row.uk-grid.dt-merge-grid {
+  margin-top: 5px;
+}
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 8px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th,
+table.dataTable thead > tr > td {
+  position: relative;
+}
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th.sorting:after, table.dataTable thead > tr > th.sorting_asc:after, table.dataTable thead > tr > th.sorting_desc:after,
+table.dataTable thead > tr > td.sorting:after,
+table.dataTable thead > tr > td.sorting_asc:after,
+table.dataTable thead > tr > td.sorting_desc:after {
+  position: absolute;
+  top: 7px;
+  right: 8px;
+  display: block;
+  font-family: 'FontAwesome';
+}
+table.dataTable thead > tr > th.sorting:after,
+table.dataTable thead > tr > td.sorting:after {
+  content: "\f0dc";
+  color: #ddd;
+  font-size: 0.8em;
+  padding-top: 0.12em;
+}
+table.dataTable thead > tr > th.sorting_asc:after,
+table.dataTable thead > tr > td.sorting_asc:after {
+  content: "\f0de";
+}
+table.dataTable thead > tr > th.sorting_desc:after,
+table.dataTable thead > tr > td.sorting_desc:after {
+  content: "\f0dd";
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table thead .sorting:after,
+div.dataTables_scrollBody table thead .sorting_asc:after,
+div.dataTables_scrollBody table thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.uk-table-condensed > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.uk-table-condensed .sorting:after,
+table.dataTable.uk-table-condensed .sorting_asc:after,
+table.dataTable.uk-table-condensed .sorting_desc:after {
+  top: 6px;
+  right: 6px;
+}
diff --git a/vendor/datatables/1.10.15/css/dataTables.uikit.min.css b/vendor/datatables/1.10.15/css/dataTables.uikit.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..0818eed3b06d37416148a18b3735801f1f75fa59
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/dataTables.uikit.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.row.uk-grid.dt-merge-grid{margin-top:5px}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th,table.dataTable thead>tr>td{position:relative}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after{position:absolute;top:7px;right:8px;display:block;font-family:'FontAwesome'}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>td.sorting:after{content:"\f0dc";color:#ddd;font-size:0.8em;padding-top:0.12em}table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>td.sorting_asc:after{content:"\f0de"}table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_desc:after{content:"\f0dd"}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.uk-table-condensed>thead>tr>th{padding-right:20px}table.dataTable.uk-table-condensed .sorting:after,table.dataTable.uk-table-condensed .sorting_asc:after,table.dataTable.uk-table-condensed .sorting_desc:after{top:6px;right:6px}
diff --git a/vendor/datatables/1.10.15/css/jquery.dataTables.css b/vendor/datatables/1.10.15/css/jquery.dataTables.css
new file mode 100644
index 0000000000000000000000000000000000000000..6c55f8b6d52287cba6bf238d9b2662f1cf7aa7f5
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/jquery.dataTables.css
@@ -0,0 +1,455 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+  width: 100%;
+  margin: 0 auto;
+  clear: both;
+  border-collapse: separate;
+  border-spacing: 0;
+  /*
+   * Header and footer styles
+   */
+  /*
+   * Body styles
+   */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+  font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+  padding: 10px 18px;
+  border-bottom: 1px solid #111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+  outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+  padding: 10px 18px 6px 18px;
+  border-top: 1px solid #111;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  *cursor: hand;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  background-repeat: no-repeat;
+  background-position: center right;
+}
+table.dataTable thead .sorting {
+  background-image: url("../images/sort_both.png");
+}
+table.dataTable thead .sorting_asc {
+  background-image: url("../images/sort_asc.png");
+}
+table.dataTable thead .sorting_desc {
+  background-image: url("../images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+  background-image: url("../images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+  background-image: url("../images/sort_desc_disabled.png");
+}
+table.dataTable tbody tr {
+  background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+  background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+  padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+  border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+  border-top: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+  border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+  background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+  background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+  background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+  background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+  background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+  background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+  background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+  background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+  background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+  background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+  background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+  background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+  background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+  background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+  background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+  background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+  background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+  background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+  background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+  background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+  border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+  padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+  padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+  padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  *zoom: 1;
+  zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+  float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+  margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+  clear: both;
+  float: left;
+  padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+  float: right;
+  text-align: right;
+  padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em 1em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  color: #333 !important;
+  border: 1px solid transparent;
+  border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+  color: #333 !important;
+  border: 1px solid #979797;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+  cursor: default;
+  color: #666 !important;
+  border: 1px solid transparent;
+  background: transparent;
+  box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+  color: white !important;
+  border: 1px solid #111;
+  background-color: #585858;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #585858 0%, #111 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #585858 0%, #111 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+  outline: none;
+  background-color: #2b2b2b;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+  /* W3C */
+  box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+  padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 40px;
+  margin-left: -50%;
+  margin-top: -25px;
+  padding-top: 20px;
+  text-align: center;
+  font-size: 1.2em;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+  clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+  vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+  height: 0;
+  overflow: hidden;
+  margin: 0 !important;
+  padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead > table,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+  border-bottom: none;
+}
+.dataTables_wrapper:after {
+  visibility: hidden;
+  display: block;
+  content: "";
+  clear: both;
+  height: 0;
+}
+
+@media screen and (max-width: 767px) {
+  .dataTables_wrapper .dataTables_info,
+  .dataTables_wrapper .dataTables_paginate {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_paginate {
+    margin-top: 0.5em;
+  }
+}
+@media screen and (max-width: 640px) {
+  .dataTables_wrapper .dataTables_length,
+  .dataTables_wrapper .dataTables_filter {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_filter {
+    margin-top: 0.5em;
+  }
+}
diff --git a/vendor/datatables/1.10.15/css/jquery.dataTables.min.css b/vendor/datatables/1.10.15/css/jquery.dataTables.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..471c29329357ead7691773842f239dbabf4d31ad
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/jquery.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead>table,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
diff --git a/vendor/datatables/1.10.15/css/jquery.dataTables_themeroller.css b/vendor/datatables/1.10.15/css/jquery.dataTables_themeroller.css
new file mode 100644
index 0000000000000000000000000000000000000000..1426a44a18bf40baaf52c108b041b31bc44a1811
--- /dev/null
+++ b/vendor/datatables/1.10.15/css/jquery.dataTables_themeroller.css
@@ -0,0 +1,416 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+  width: 100%;
+  margin: 0 auto;
+  clear: both;
+  border-collapse: separate;
+  border-spacing: 0;
+  /*
+   * Header and footer styles
+   */
+  /*
+   * Body styles
+   */
+}
+table.dataTable thead th,
+table.dataTable thead td,
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+  padding: 4px 10px;
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+  font-weight: bold;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+  outline: none;
+}
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting {
+  cursor: pointer;
+  *cursor: hand;
+}
+table.dataTable thead th div.DataTables_sort_wrapper {
+  position: relative;
+  padding-right: 10px;
+}
+table.dataTable thead th div.DataTables_sort_wrapper span {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  right: -5px;
+}
+table.dataTable thead th.ui-state-default {
+  border-right-width: 0;
+}
+table.dataTable thead th.ui-state-default:last-child {
+  border-right-width: 1px;
+}
+table.dataTable tbody tr {
+  background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+  background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+  padding: 8px 10px;
+}
+table.dataTable th.center,
+table.dataTable td.center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.right,
+table.dataTable td.right {
+  text-align: right;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+  border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+  border-top: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+  border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+  background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+  background-color: #abb9d3;
+}
+table.dataTable.hover tbody tr:hover,
+table.dataTable.hover tbody tr.odd:hover,
+table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
+table.dataTable.display tbody tr.odd:hover,
+table.dataTable.display tbody tr.even:hover {
+  background-color: whitesmoke;
+}
+table.dataTable.hover tbody tr:hover.selected,
+table.dataTable.hover tbody tr.odd:hover.selected,
+table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
+table.dataTable.display tbody tr.odd:hover.selected,
+table.dataTable.display tbody tr.even:hover.selected {
+  background-color: #a9b7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+  background-color: #f9f9f9;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+  background-color: #acbad4;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+  background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+  background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+  background-color: #a6b3cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+  background-color: #a7b5ce;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+  background-color: #a9b6d0;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background-color: #f9f9f9;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+  background-color: #fbfbfb;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+  background-color: #fdfdfd;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+  background-color: #acbad4;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+  background-color: #adbbd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+  background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1,
+table.dataTable.display tbody tr.odd:hover > .sorting_1,
+table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
+  background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2,
+table.dataTable.display tbody tr.odd:hover > .sorting_2,
+table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
+  background-color: #ebebeb;
+}
+table.dataTable.display tbody tr:hover > .sorting_3,
+table.dataTable.display tbody tr.odd:hover > .sorting_3,
+table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
+  background-color: #eeeeee;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
+  background-color: #a1aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
+  background-color: #a2afc8;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
+  background-color: #a4b2cb;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+  padding: 5px 9px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+  padding: 5px 9px 3px 9px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+  padding: 4px 5px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  *zoom: 1;
+  zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+  float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+  margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+  clear: both;
+  float: left;
+  padding-top: 0.55em;
+}
+.dataTables_wrapper .dataTables_paginate {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  color: #333 !important;
+  border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:active {
+  outline: none;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.dataTables_wrapper .dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 40px;
+  margin-left: -50%;
+  margin-top: -25px;
+  padding-top: 20px;
+  text-align: center;
+  font-size: 1.2em;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+  clear: both;
+}
+.dataTables_wrapper .dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .ui-widget-header {
+  font-weight: normal;
+}
+.dataTables_wrapper .ui-toolbar {
+  padding: 8px;
+}
+.dataTables_wrapper:after {
+  visibility: hidden;
+  display: block;
+  content: "";
+  clear: both;
+  height: 0;
+}
+
+@media screen and (max-width: 767px) {
+  .dataTables_wrapper .dataTables_length,
+  .dataTables_wrapper .dataTables_filter,
+  .dataTables_wrapper .dataTables_info,
+  .dataTables_wrapper .dataTables_paginate {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_filter,
+  .dataTables_wrapper .dataTables_paginate {
+    margin-top: 0.5em;
+  }
+}
diff --git a/vendor/datatables/1.10.15/images/sort_asc.png b/vendor/datatables/1.10.15/images/sort_asc.png
new file mode 100644
index 0000000000000000000000000000000000000000..47586a22aaf7a79072f3e734fa06e1735ef00a1a
Binary files /dev/null and b/vendor/datatables/1.10.15/images/sort_asc.png differ
diff --git a/vendor/datatables/1.10.15/images/sort_asc_disabled.png b/vendor/datatables/1.10.15/images/sort_asc_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb11dfe24a6c564cb7ddf8bc96703ebb121df1e7
Binary files /dev/null and b/vendor/datatables/1.10.15/images/sort_asc_disabled.png differ
diff --git a/vendor/datatables/1.10.15/images/sort_both.png b/vendor/datatables/1.10.15/images/sort_both.png
new file mode 100644
index 0000000000000000000000000000000000000000..af5bc7c5a10b9d6d57cb641aeec752428a07f0ca
Binary files /dev/null and b/vendor/datatables/1.10.15/images/sort_both.png differ
diff --git a/vendor/datatables/1.10.15/images/sort_desc.png b/vendor/datatables/1.10.15/images/sort_desc.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fac2b6394216378c47b837614f13b3799ed6c4d
Binary files /dev/null and b/vendor/datatables/1.10.15/images/sort_desc.png differ
diff --git a/vendor/datatables/1.10.15/images/sort_desc_disabled.png b/vendor/datatables/1.10.15/images/sort_desc_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9fdd8a1502fda301682e907afde86bc450da10f
Binary files /dev/null and b/vendor/datatables/1.10.15/images/sort_desc_disabled.png differ
diff --git a/vendor/datatables/1.10.15/js/dataTables.bootstrap.js b/vendor/datatables/1.10.15/js/dataTables.bootstrap.js
new file mode 100644
index 0000000000000000000000000000000000000000..f69acdc6fb4cf25f1654b4d40a019709806797fa
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.bootstrap.js
@@ -0,0 +1,182 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
+	renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper form-inline dt-bootstrap",
+	sFilterInput:  "form-control input-sm",
+	sLengthSelect: "form-control input-sm",
+	sProcessing:   "dataTables_processing panel panel-default"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
diff --git a/vendor/datatables/1.10.15/js/dataTables.bootstrap.min.js b/vendor/datatables/1.10.15/js/dataTables.bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..98661c6c73792a5e0613bfcd4566ecbd48ac89d8
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.bootstrap.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
+"aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/vendor/datatables/1.10.15/js/dataTables.bootstrap4.js b/vendor/datatables/1.10.15/js/dataTables.bootstrap4.js
new file mode 100644
index 0000000000000000000000000000000000000000..7977fd79df001ea189ffc6de8618b3fc19b625a5
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.bootstrap4.js
@@ -0,0 +1,184 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+	renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper container-fluid dt-bootstrap4",
+	sFilterInput:  "form-control form-control-sm",
+	sLengthSelect: "form-control form-control-sm",
+	sProcessing:   "dataTables_processing card",
+	sPageButton:   "paginate_button page-item"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex,
+								'class': 'page-link'
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
diff --git a/vendor/datatables/1.10.15/js/dataTables.bootstrap4.min.js b/vendor/datatables/1.10.15/js/dataTables.bootstrap4.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..b689d7eb482d7d6ef6b550e4ec7091625421c459
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.bootstrap4.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+renderer:"bootstrap"});b.extend(f.ext.classes,{sWrapper:"dataTables_wrapper container-fluid dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&
+o.page()!=a.data.action&&o.page(a.data.action).draw("page")};l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":t.sPageButton+" "+g,id:0===r&&
+"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#","aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex,"class":"page-link"}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/vendor/datatables/1.10.15/js/dataTables.foundation.js b/vendor/datatables/1.10.15/js/dataTables.foundation.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d3bb45eb7cc02ce4785c5b699f51b86e7a626c7
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.foundation.js
@@ -0,0 +1,174 @@
+/*! DataTables Foundation integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Foundation. This requires Foundation 5 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Foundation. See http://datatables.net/manual/styling/foundation
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+// Detect Foundation 5 / 6 as they have different element and class requirements
+var meta = $('<meta class="foundation-mq"/>').appendTo('head');
+DataTable.ext.foundationVersion = meta.css('font-family').match(/small|medium|large/) ? 6 : 5;
+meta.remove();
+
+
+$.extend( DataTable.ext.classes, {
+	sWrapper:    "dataTables_wrapper dt-foundation",
+	sProcessing: "dataTables_processing panel callout"
+} );
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'small-6 columns'l><'small-6 columns'f>r>"+
+		"t"+
+		"<'row'<'small-6 columns'i><'small-6 columns'p>>",
+	renderer: 'foundation'
+} );
+
+
+/* Page button renderer */
+DataTable.ext.renderer.pageButton.foundation = function ( settings, host, idx, buttons, page, pages ) {
+	var api = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass;
+	var tag;
+	var v5 = DataTable.ext.foundationVersion === 5;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('unavailable') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+				tag = null;
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'unavailable disabled';
+						tag = null;
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' unavailable disabled');
+						tag = page > 0 ? 'a' : null;
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' unavailable disabled');
+						tag = page > 0 ? 'a' : null;
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' unavailable disabled');
+						tag = page < pages-1 ? 'a' : null;
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' unavailable disabled');
+						tag = page < pages-1 ? 'a' : null;
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'current' : '';
+						tag = page === button ?
+							null : 'a';
+						break;
+				}
+
+				if ( v5 ) {
+					tag = 'a';
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'aria-controls': settings.sTableId,
+							'aria-label': aria[ button ],
+							'tabindex': settings.iTabIndex,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( tag ?
+							$('<'+tag+'/>', {'href': '#'} ).html( btnDisplay ) :
+							btnDisplay
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+				}
+			}
+		}
+	};
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+};
+
+
+return DataTable;
+}));
diff --git a/vendor/datatables/1.10.15/js/dataTables.foundation.min.js b/vendor/datatables/1.10.15/js/dataTables.foundation.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d47166b4e2b881eb1583fef66768844233594e27
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.foundation.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Foundation integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return d(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net")(a,b).$;return d(b,a,a.document)}:d(jQuery,window,document)})(function(d){var a=d.fn.dataTable,b=d('<meta class="foundation-mq"/>').appendTo("head");a.ext.foundationVersion=b.css("font-family").match(/small|medium|large/)?6:5;b.remove();d.extend(a.ext.classes,
+{sWrapper:"dataTables_wrapper dt-foundation",sProcessing:"dataTables_processing panel callout"});d.extend(!0,a.defaults,{dom:"<'row'<'small-6 columns'l><'small-6 columns'f>r>t<'row'<'small-6 columns'i><'small-6 columns'p>>",renderer:"foundation"});a.ext.renderer.pageButton.foundation=function(b,l,r,s,e,i){var m=new a.Api(b),t=b.oClasses,j=b.oLanguage.oPaginate,u=b.oLanguage.oAria.paginate||{},f,h,g,v=5===a.ext.foundationVersion,q=function(a,n){var k,o,p,c,l=function(a){a.preventDefault();!d(a.currentTarget).hasClass("unavailable")&&
+m.page()!=a.data.action&&m.page(a.data.action).draw("page")};k=0;for(o=n.length;k<o;k++)if(c=n[k],d.isArray(c))q(a,c);else{h=f="";g=null;switch(c){case "ellipsis":f="&#x2026;";h="unavailable disabled";g=null;break;case "first":f=j.sFirst;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "previous":f=j.sPrevious;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "next":f=j.sNext;h=c+(e<i-1?"":" unavailable disabled");g=e<i-1?"a":null;break;case "last":f=j.sLast;h=c+(e<i-1?
+"":" unavailable disabled");g=e<i-1?"a":null;break;default:f=c+1,h=e===c?"current":"",g=e===c?null:"a"}v&&(g="a");f&&(p=d("<li>",{"class":t.sPageButton+" "+h,"aria-controls":b.sTableId,"aria-label":u[c],tabindex:b.iTabIndex,id:0===r&&"string"===typeof c?b.sTableId+"_"+c:null}).append(g?d("<"+g+"/>",{href:"#"}).html(f):f).appendTo(a),b.oApi._fnBindAction(p,{action:c},l))}};q(d(l).empty().html('<ul class="pagination"/>').children("ul"),s)};return a});
diff --git a/vendor/datatables/1.10.15/js/dataTables.jqueryui.js b/vendor/datatables/1.10.15/js/dataTables.jqueryui.js
new file mode 100644
index 0000000000000000000000000000000000000000..64d4325239292d8db2c3e36f228385a344efc5dd
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.jqueryui.js
@@ -0,0 +1,164 @@
+/*! DataTables jQuery UI integration
+ * ©2011-2014 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for jQuery UI. This requires jQuery UI and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using jQuery UI. See http://datatables.net/manual/styling/jqueryui
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+var sort_prefix = 'css_right ui-icon ui-icon-';
+var toolbar_prefix = 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-';
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		'<"'+toolbar_prefix+'tl ui-corner-tr"lfr>'+
+		't'+
+		'<"'+toolbar_prefix+'bl ui-corner-br"ip>',
+	renderer: 'jqueryui'
+} );
+
+
+$.extend( DataTable.ext.classes, {
+	"sWrapper":            "dataTables_wrapper dt-jqueryui",
+
+	/* Full numbers paging buttons */
+	"sPageButton":         "fg-button ui-button ui-state-default",
+	"sPageButtonActive":   "ui-state-disabled",
+	"sPageButtonDisabled": "ui-state-disabled",
+
+	/* Features */
+	"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+		"ui-buttonset-multi paging_", /* Note that the type is postfixed */
+
+	/* Sorting */
+	"sSortAsc":            "ui-state-default sorting_asc",
+	"sSortDesc":           "ui-state-default sorting_desc",
+	"sSortable":           "ui-state-default sorting",
+	"sSortableAsc":        "ui-state-default sorting_asc_disabled",
+	"sSortableDesc":       "ui-state-default sorting_desc_disabled",
+	"sSortableNone":       "ui-state-default sorting_disabled",
+	"sSortIcon":           "DataTables_sort_icon",
+
+	/* Scrolling */
+	"sScrollHead": "dataTables_scrollHead "+"ui-state-default",
+	"sScrollFoot": "dataTables_scrollFoot "+"ui-state-default",
+
+	/* Misc */
+	"sHeaderTH":  "ui-state-default",
+	"sFooterTH":  "ui-state-default"
+} );
+
+
+DataTable.ext.renderer.header.jqueryui = function ( settings, cell, column, classes ) {
+	// Calculate what the unsorted class should be
+	var noSortAppliedClass = sort_prefix+'carat-2-n-s';
+	var asc = $.inArray('asc', column.asSorting) !== -1;
+	var desc = $.inArray('desc', column.asSorting) !== -1;
+
+	if ( !column.bSortable || (!asc && !desc) ) {
+		noSortAppliedClass = '';
+	}
+	else if ( asc && !desc ) {
+		noSortAppliedClass = sort_prefix+'carat-1-n';
+	}
+	else if ( !asc && desc ) {
+		noSortAppliedClass = sort_prefix+'carat-1-s';
+	}
+
+	// Setup the DOM structure
+	$('<div/>')
+		.addClass( 'DataTables_sort_wrapper' )
+		.append( cell.contents() )
+		.append( $('<span/>')
+			.addClass( classes.sSortIcon+' '+noSortAppliedClass )
+		)
+		.appendTo( cell );
+
+	// Attach a sort listener to update on sort
+	$(settings.nTable).on( 'order.dt', function ( e, ctx, sorting, columns ) {
+		if ( settings !== ctx ) {
+			return;
+		}
+
+		var colIdx = column.idx;
+
+		cell
+			.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+			.addClass( columns[ colIdx ] == 'asc' ?
+				classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+					classes.sSortDesc :
+					column.sSortingClass
+			);
+
+		cell
+			.find( 'span.'+classes.sSortIcon )
+			.removeClass(
+				sort_prefix+'triangle-1-n' +" "+
+				sort_prefix+'triangle-1-s' +" "+
+				sort_prefix+'carat-2-n-s' +" "+
+				sort_prefix+'carat-1-n' +" "+
+				sort_prefix+'carat-1-s'
+			)
+			.addClass( columns[ colIdx ] == 'asc' ?
+				sort_prefix+'triangle-1-n' : columns[ colIdx ] == 'desc' ?
+					sort_prefix+'triangle-1-s' :
+					noSortAppliedClass
+			);
+	} );
+};
+
+
+/*
+ * TableTools jQuery UI compatibility
+ * Required TableTools 2.1+
+ */
+if ( DataTable.TableTools ) {
+	$.extend( true, DataTable.TableTools.classes, {
+		"container": "DTTT_container ui-buttonset ui-buttonset-multi",
+		"buttons": {
+			"normal": "DTTT_button ui-button ui-state-default"
+		},
+		"collection": {
+			"container": "DTTT_collection ui-buttonset ui-buttonset-multi"
+		}
+	} );
+}
+
+
+return DataTable;
+}));
diff --git a/vendor/datatables/1.10.15/js/dataTables.jqueryui.min.js b/vendor/datatables/1.10.15/js/dataTables.jqueryui.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..782d10fda665109bf07c75b6d14421a7c1252966
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.jqueryui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables jQuery UI integration
+ ©2011-2014 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,d){b||(b=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(b,d).$;return a(d,b,b.document)}:a(jQuery,window,document)})(function(a){var b=a.fn.dataTable;a.extend(!0,b.defaults,{dom:'<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-tl ui-corner-tr"lfr>t<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-bl ui-corner-br"ip>',
+renderer:"jqueryui"});a.extend(b.ext.classes,{sWrapper:"dataTables_wrapper dt-jqueryui",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default sorting_asc",sSortDesc:"ui-state-default sorting_desc",sSortable:"ui-state-default sorting",sSortableAsc:"ui-state-default sorting_asc_disabled",sSortableDesc:"ui-state-default sorting_desc_disabled",
+sSortableNone:"ui-state-default sorting_disabled",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sHeaderTH:"ui-state-default",sFooterTH:"ui-state-default"});b.ext.renderer.header.jqueryui=function(b,h,e,c){var f="css_right ui-icon ui-icon-carat-2-n-s",g=-1!==a.inArray("asc",e.asSorting),i=-1!==a.inArray("desc",e.asSorting);!e.bSortable||!g&&!i?f="":g&&!i?f="css_right ui-icon ui-icon-carat-1-n":!g&&i&&(f="css_right ui-icon ui-icon-carat-1-s");
+a("<div/>").addClass("DataTables_sort_wrapper").append(h.contents()).append(a("<span/>").addClass(c.sSortIcon+" "+f)).appendTo(h);a(b.nTable).on("order.dt",function(a,g,i,j){b===g&&(a=e.idx,h.removeClass(c.sSortAsc+" "+c.sSortDesc).addClass("asc"==j[a]?c.sSortAsc:"desc"==j[a]?c.sSortDesc:e.sSortingClass),h.find("span."+c.sSortIcon).removeClass("css_right ui-icon ui-icon-triangle-1-n css_right ui-icon ui-icon-triangle-1-s css_right ui-icon ui-icon-carat-2-n-s css_right ui-icon ui-icon-carat-1-n css_right ui-icon ui-icon-carat-1-s").addClass("asc"==
+j[a]?"css_right ui-icon ui-icon-triangle-1-n":"desc"==j[a]?"css_right ui-icon ui-icon-triangle-1-s":f))})};b.TableTools&&a.extend(!0,b.TableTools.classes,{container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}});return b});
diff --git a/vendor/datatables/1.10.15/js/dataTables.material.js b/vendor/datatables/1.10.15/js/dataTables.material.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffdaf12393a0e6531d30b2a7a09b3ac20250a7d0
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.material.js
@@ -0,0 +1,191 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'mdl-grid'"+
+			"<'mdl-cell mdl-cell--6-col'l>"+
+			"<'mdl-cell mdl-cell--6-col'f>"+
+		">"+
+		"<'mdl-grid dt-table'"+
+			"<'mdl-cell mdl-cell--12-col'tr>"+
+		">"+
+		"<'mdl-grid'"+
+			"<'mdl-cell mdl-cell--4-col'i>"+
+			"<'mdl-cell mdl-cell--8-col'p>"+
+		">",
+	renderer: 'material'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper form-inline dt-material",
+	sFilterInput:  "form-control input-sm",
+	sLengthSelect: "form-control input-sm",
+	sProcessing:   "dataTables_processing panel panel-default"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.material = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button, disabled, active;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				active = false;
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = '';
+						active = page === button;
+						break;
+				}
+
+				if ( active ) {
+					btnClass += ' mdl-button--raised mdl-button--colored';
+				}
+
+				if ( btnDisplay ) {
+					node = $('<button>', {
+							'class': 'mdl-button '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null,
+							'aria-controls': settings.sTableId,
+							'aria-label': aria[ button ],
+							'data-dt-idx': counter,
+							'tabindex': settings.iTabIndex,
+							'disabled': btnClass.indexOf('disabled') !== -1
+						} )
+						.html( btnDisplay )
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<div class="pagination"/>').children(),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
\ No newline at end of file
diff --git a/vendor/datatables/1.10.15/js/dataTables.material.min.js b/vendor/datatables/1.10.15/js/dataTables.material.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bafd12e61388c6369f39f59729695c06c88b90e5
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.material.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return c(d,a,a.document)}:c(jQuery,window,document)})(function(c,a,d,r){var g=c.fn.dataTable;c.extend(!0,g.defaults,{dom:"<'mdl-grid'<'mdl-cell mdl-cell--6-col'l><'mdl-cell mdl-cell--6-col'f>><'mdl-grid dt-table'<'mdl-cell mdl-cell--12-col'tr>><'mdl-grid'<'mdl-cell mdl-cell--4-col'i><'mdl-cell mdl-cell--8-col'p>>",
+renderer:"material"});c.extend(g.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-material",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});g.ext.renderer.pageButton.material=function(a,h,s,t,i,n){var o=new g.Api(a),l=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},f,e,p=0,q=function(d,g){var m,h,j,b,k=function(a){a.preventDefault();!c(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&
+o.page(a.data.action).draw("page")};m=0;for(h=g.length;m<h;m++)if(b=g[m],c.isArray(b))q(d,b);else{f="";j=!1;switch(b){case "ellipsis":f="&#x2026;";e="disabled";break;case "first":f=l.sFirst;e=b+(0<i?"":" disabled");break;case "previous":f=l.sPrevious;e=b+(0<i?"":" disabled");break;case "next":f=l.sNext;e=b+(i<n-1?"":" disabled");break;case "last":f=l.sLast;e=b+(i<n-1?"":" disabled");break;default:f=b+1,e="",j=i===b}j&&(e+=" mdl-button--raised mdl-button--colored");f&&(j=c("<button>",{"class":"mdl-button "+
+e,id:0===s&&"string"===typeof b?a.sTableId+"_"+b:null,"aria-controls":a.sTableId,"aria-label":u[b],"data-dt-idx":p,tabindex:a.iTabIndex,disabled:-1!==e.indexOf("disabled")}).html(f).appendTo(d),a.oApi._fnBindAction(j,{action:b},k),p++)}},k;try{k=c(h).find(d.activeElement).data("dt-idx")}catch(v){}q(c(h).empty().html('<div class="pagination"/>').children(),t);k!==r&&c(h).find("[data-dt-idx="+k+"]").focus()};return g});
diff --git a/vendor/datatables/1.10.15/js/dataTables.semanticui.js b/vendor/datatables/1.10.15/js/dataTables.semanticui.js
new file mode 100644
index 0000000000000000000000000000000000000000..c19ffe06cdf029914a5138fffdb6ac32fc4da838
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.semanticui.js
@@ -0,0 +1,208 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'ui stackable grid'"+
+			"<'row'"+
+				"<'eight wide column'l>"+
+				"<'right aligned eight wide column'f>"+
+			">"+
+			"<'row dt-table'"+
+				"<'sixteen wide column'tr>"+
+			">"+
+			"<'row'"+
+				"<'seven wide column'i>"+
+				"<'right aligned nine wide column'p>"+
+			">"+
+		">",
+	renderer: 'semanticUI'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper dt-semanticUI",
+	sFilter:       "dataTables_filter ui input",
+	sProcessing:   "dataTables_processing ui segment",
+	sPageButton:   "paginate_button item"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.semanticUI = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				var tag = btnClass.indexOf( 'disabled' ) === -1 ?
+					'a' :
+					'div';
+
+				if ( btnDisplay ) {
+					node = $('<'+tag+'>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null,
+							'href': '#',
+							'aria-controls': settings.sTableId,
+							'aria-label': aria[ button ],
+							'data-dt-idx': counter,
+							'tabindex': settings.iTabIndex
+						} )
+						.html( btnDisplay )
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<div class="ui stackable pagination menu"/>').children(),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+// Javascript enhancements on table initialisation
+$(document).on( 'init.dt', function (e, ctx) {
+	if ( e.namespace !== 'dt' ) {
+		return;
+	}
+
+	// Length menu drop down
+	if ( $.fn.dropdown ) {
+		var api = new $.fn.dataTable.Api( ctx );
+
+		$( 'div.dataTables_length select', api.table().container() ).dropdown();
+	}
+} );
+
+
+return DataTable;
+}));
\ No newline at end of file
diff --git a/vendor/datatables/1.10.15/js/dataTables.semanticui.min.js b/vendor/datatables/1.10.15/js/dataTables.semanticui.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..3b2d3d90891b7bb54a6f5ec8010677b00453da46
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.semanticui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables Bootstrap 3 integration
+ ©2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var e=b.fn.dataTable;b.extend(!0,e.defaults,{dom:"<'ui stackable grid'<'row'<'eight wide column'l><'right aligned eight wide column'f>><'row dt-table'<'sixteen wide column'tr>><'row'<'seven wide column'i><'right aligned nine wide column'p>>>",
+renderer:"semanticUI"});b.extend(e.ext.classes,{sWrapper:"dataTables_wrapper dt-semanticUI",sFilter:"dataTables_filter ui input",sProcessing:"dataTables_processing ui segment",sPageButton:"paginate_button item"});e.ext.renderer.pageButton.semanticUI=function(h,a,r,s,j,n){var o=new e.Api(h),t=h.oClasses,k=h.oLanguage.oPaginate,u=h.oLanguage.oAria.paginate||{},f,g,p=0,q=function(a,d){var e,i,l,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+e=0;for(i=d.length;e<i;e++)if(c=d[e],b.isArray(c))q(a,c);else{g=f="";switch(c){case "ellipsis":f="&#x2026;";g="disabled";break;case "first":f=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":f=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":f=k.sLast;g=c+(j<n-1?"":" disabled");break;default:f=c+1,g=j===c?"active":""}l=-1===g.indexOf("disabled")?"a":"div";f&&(l=b("<"+l+">",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?
+h.sTableId+"_"+c:null,href:"#","aria-controls":h.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:h.iTabIndex}).html(f).appendTo(a),h.oApi._fnBindAction(l,{action:c},m),p++)}},i;try{i=b(a).find(d.activeElement).data("dt-idx")}catch(v){}q(b(a).empty().html('<div class="ui stackable pagination menu"/>').children(),s);i!==m&&b(a).find("[data-dt-idx="+i+"]").focus()};b(d).on("init.dt",function(a,d){if("dt"===a.namespace&&b.fn.dropdown){var e=new b.fn.dataTable.Api(d);b("div.dataTables_length select",
+e.table().container()).dropdown()}});return e});
diff --git a/vendor/datatables/1.10.15/js/dataTables.uikit.js b/vendor/datatables/1.10.15/js/dataTables.uikit.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e617613b3a1d9503ab84591b08944ff35e9dd54
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.uikit.js
@@ -0,0 +1,176 @@
+/*! DataTables UIkit 3 integration
+ */
+
+/**
+ * This is a tech preview of UIKit integration with DataTables.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row uk-grid'<'uk-width-1-2'l><'uk-width-1-2'f>>" +
+		"<'row uk-grid dt-merge-grid'<'uk-width-1-1'tr>>" +
+		"<'row uk-grid dt-merge-grid'<'uk-width-2-5'i><'uk-width-3-5'p>>",
+	renderer: 'uikit'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper uk-form dt-uikit",
+	sFilterInput:  "uk-form-small",
+	sLengthSelect: "uk-form-small",
+	sProcessing:   "dataTables_processing uk-panel"
+} );
+
+
+/* UIkit paging button renderer */
+DataTable.ext.renderer.pageButton.uikit = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '<i class="uk-icon-ellipsis-h"></i>';
+						btnClass = 'uk-disabled disabled';
+						break;
+
+					case 'first':
+						btnDisplay = '<i class="uk-icon-angle-double-left"></i> ' + lang.sFirst;
+						btnClass = (page > 0 ?
+							'' : ' uk-disabled disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = '<i class="uk-icon-angle-left"></i> ' + lang.sPrevious;
+						btnClass = (page > 0 ?
+							'' : 'uk-disabled disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext + ' <i class="uk-icon-angle-right"></i>';
+						btnClass = (page < pages-1 ?
+							'' : 'uk-disabled disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast + ' <i class="uk-icon-angle-double-right"></i>';
+						btnClass = (page < pages-1 ?
+							'' : ' uk-disabled disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'uk-active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $(( -1 != btnClass.indexOf('disabled') || -1 != btnClass.indexOf('active') ) ? '<span>' : '<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="uk-pagination uk-pagination-right"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
\ No newline at end of file
diff --git a/vendor/datatables/1.10.15/js/dataTables.uikit.min.js b/vendor/datatables/1.10.15/js/dataTables.uikit.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..5bbe6518dfd4241f5893dd0ca087441a703bf573
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/dataTables.uikit.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables UIkit 3 integration
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,c){a||(a=window);if(!c||!c.fn.dataTable)c=require("datatables.net")(a,c).$;return b(c,a,a.document)}:b(jQuery,window,document)})(function(b,a,c){var g=b.fn.dataTable;b.extend(!0,g.defaults,{dom:"<'row uk-grid'<'uk-width-1-2'l><'uk-width-1-2'f>><'row uk-grid dt-merge-grid'<'uk-width-1-1'tr>><'row uk-grid dt-merge-grid'<'uk-width-2-5'i><'uk-width-3-5'p>>",
+renderer:"uikit"});b.extend(g.ext.classes,{sWrapper:"dataTables_wrapper uk-form dt-uikit",sFilterInput:"uk-form-small",sLengthSelect:"uk-form-small",sProcessing:"dataTables_processing uk-panel"});g.ext.renderer.pageButton.uikit=function(a,h,r,m,j,n){var o=new g.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,d,p=0,q=function(c,g){var l,h,i,e,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+l=0;for(h=g.length;l<h;l++)if(e=g[l],b.isArray(e))q(c,e);else{d=f="";switch(e){case "ellipsis":f='<i class="uk-icon-ellipsis-h"></i>';d="uk-disabled disabled";break;case "first":f='<i class="uk-icon-angle-double-left"></i> '+k.sFirst;d=0<j?"":" uk-disabled disabled";break;case "previous":f='<i class="uk-icon-angle-left"></i> '+k.sPrevious;d=0<j?"":"uk-disabled disabled";break;case "next":f=k.sNext+' <i class="uk-icon-angle-right"></i>';d=j<n-1?"":"uk-disabled disabled";break;case "last":f=k.sLast+
+' <i class="uk-icon-angle-double-right"></i>';d=j<n-1?"":" uk-disabled disabled";break;default:f=e+1,d=j===e?"uk-active":""}f&&(i=b("<li>",{"class":s.sPageButton+" "+d,id:0===r&&"string"===typeof e?a.sTableId+"_"+e:null}).append(b(-1!=d.indexOf("disabled")||-1!=d.indexOf("active")?"<span>":"<a>",{href:"#","aria-controls":a.sTableId,"aria-label":t[e],"data-dt-idx":p,tabindex:a.iTabIndex}).html(f)).appendTo(c),a.oApi._fnBindAction(i,{action:e},m),p++)}},i;try{i=b(h).find(c.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="uk-pagination uk-pagination-right"/>').children("ul"),
+m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return g});
diff --git a/vendor/datatables/1.10.15/js/jquery.dataTables.js b/vendor/datatables/1.10.15/js/jquery.dataTables.js
new file mode 100644
index 0000000000000000000000000000000000000000..e749018a657c64e4e28592c11a5331390218c911
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/jquery.dataTables.js
@@ -0,0 +1,15345 @@
+/*! DataTables 1.10.15
+ * ©2008-2017 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * @summary     DataTables
+ * @description Paginate, search and order HTML tables
+ * @version     1.10.15
+ * @file        jquery.dataTables.js
+ * @author      SpryMedia Ltd
+ * @contact     www.datatables.net
+ * @copyright   Copyright 2008-2017 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ *   MIT license - http://datatables.net/license
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
+
+(function( factory ) {
+	"use strict";
+
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				// CommonJS environments without a window global must pass a
+				// root. This will give an error otherwise
+				root = window;
+			}
+
+			if ( ! $ ) {
+				$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
+					require('jquery') :
+					require('jquery')( root );
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}
+(function( $, window, document, undefined ) {
+	"use strict";
+
+	/**
+	 * DataTables is a plug-in for the jQuery Javascript library. It is a highly
+	 * flexible tool, based upon the foundations of progressive enhancement,
+	 * which will add advanced interaction controls to any HTML table. For a
+	 * full list of features please refer to
+	 * [DataTables.net](href="http://datatables.net).
+	 *
+	 * Note that the `DataTable` object is not a global variable but is aliased
+	 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
+	 * be  accessed.
+	 *
+	 *  @class
+	 *  @param {object} [init={}] Configuration object for DataTables. Options
+	 *    are defined by {@link DataTable.defaults}
+	 *  @requires jQuery 1.7+
+	 *
+	 *  @example
+	 *    // Basic initialisation
+	 *    $(document).ready( function {
+	 *      $('#example').dataTable();
+	 *    } );
+	 *
+	 *  @example
+	 *    // Initialisation with configuration options - in this case, disable
+	 *    // pagination and sorting.
+	 *    $(document).ready( function {
+	 *      $('#example').dataTable( {
+	 *        "paginate": false,
+	 *        "sort": false
+	 *      } );
+	 *    } );
+	 */
+	var DataTable = function ( options )
+	{
+		/**
+		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+		 * return the resulting jQuery object.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+		 *    criterion ("applied") or all TR elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {object} jQuery object, filtered by the given selector.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Highlight every second row
+		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
+		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
+		 *      oTable.fnFilter('Webkit');
+		 *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
+		 *      oTable.fnFilter('');
+		 *    } );
+		 */
+		this.$ = function ( sSelector, oOpts )
+		{
+			return this.api(true).$( sSelector, oOpts );
+		};
+		
+		
+		/**
+		 * Almost identical to $ in operation, but in this case returns the data for the matched
+		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
+		 * rows are found, the data returned is the original data array/object that was used to
+		 * create the row (or a generated array if from a DOM source).
+		 *
+		 * This method is often useful in-combination with $ where both functions are given the
+		 * same parameters and the array indexes will match identically.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
+		 *    criterion ("applied") or all elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
+		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
+		 *    entry in the array.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the data from the first row in the table
+		 *      var data = oTable._('tr:first');
+		 *
+		 *      // Do something useful with the data
+		 *      alert( "First cell is: "+data[0] );
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to 'Webkit' and get all data for
+		 *      oTable.fnFilter('Webkit');
+		 *      var data = oTable._('tr', {"search": "applied"});
+		 *
+		 *      // Do something with the data
+		 *      alert( data.length+" rows matched the search" );
+		 *    } );
+		 */
+		this._ = function ( sSelector, oOpts )
+		{
+			return this.api(true).rows( sSelector, oOpts ).data();
+		};
+		
+		
+		/**
+		 * Create a DataTables Api instance, with the currently selected tables for
+		 * the Api's context.
+		 * @param {boolean} [traditional=false] Set the API instance's context to be
+		 *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
+		 *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
+		 *   or if all tables captured in the jQuery object should be used.
+		 * @return {DataTables.Api}
+		 */
+		this.api = function ( traditional )
+		{
+			return traditional ?
+				new _Api(
+					_fnSettingsFromNode( this[ _ext.iApiIndex ] )
+				) :
+				new _Api( this );
+		};
+		
+		
+		/**
+		 * Add a single new row or multiple rows of data to the table. Please note
+		 * that this is suitable for client-side processing only - if you are using
+		 * server-side processing (i.e. "bServerSide": true), then to add data, you
+		 * must add it to the data source, i.e. the server-side, through an Ajax call.
+		 *  @param {array|object} data The data to be added to the table. This can be:
+		 *    <ul>
+		 *      <li>1D array of data - add a single row with the data provided</li>
+		 *      <li>2D array of arrays - add multiple rows in a single call</li>
+		 *      <li>object - data object when using <i>mData</i></li>
+		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
+		 *    </ul>
+		 *  @param {bool} [redraw=true] redraw the table or not
+		 *  @returns {array} An array of integers, representing the list of indexes in
+		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
+		 *    the table.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Global var for counter
+		 *    var giCount = 2;
+		 *
+		 *    $(document).ready(function() {
+		 *      $('#example').dataTable();
+		 *    } );
+		 *
+		 *    function fnClickAddRow() {
+		 *      $('#example').dataTable().fnAddData( [
+		 *        giCount+".1",
+		 *        giCount+".2",
+		 *        giCount+".3",
+		 *        giCount+".4" ]
+		 *      );
+		 *
+		 *      giCount++;
+		 *    }
+		 */
+		this.fnAddData = function( data, redraw )
+		{
+			var api = this.api( true );
+		
+			/* Check if we want to add multiple rows or not */
+			var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
+				api.rows.add( data ) :
+				api.row.add( data );
+		
+			if ( redraw === undefined || redraw ) {
+				api.draw();
+			}
+		
+			return rows.flatten().toArray();
+		};
+		
+		
+		/**
+		 * This function will make DataTables recalculate the column sizes, based on the data
+		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+		 * through the sWidth parameter). This can be useful when the width of the table's
+		 * parent element changes (for example a window resize).
+		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable( {
+		 *        "sScrollY": "200px",
+		 *        "bPaginate": false
+		 *      } );
+		 *
+		 *      $(window).on('resize', function () {
+		 *        oTable.fnAdjustColumnSizing();
+		 *      } );
+		 *    } );
+		 */
+		this.fnAdjustColumnSizing = function ( bRedraw )
+		{
+			var api = this.api( true ).columns.adjust();
+			var settings = api.settings()[0];
+			var scroll = settings.oScroll;
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw( false );
+			}
+			else if ( scroll.sX !== "" || scroll.sY !== "" ) {
+				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+				_fnScrollDraw( settings );
+			}
+		};
+		
+		
+		/**
+		 * Quickly and simply clear a table
+		 *  @param {bool} [bRedraw=true] redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+		 *      oTable.fnClearTable();
+		 *    } );
+		 */
+		this.fnClearTable = function( bRedraw )
+		{
+			var api = this.api( true ).clear();
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
+			}
+		};
+		
+		
+		/**
+		 * The exact opposite of 'opening' a row, this function will close any rows which
+		 * are currently 'open'.
+		 *  @param {node} nTr the table row to 'close'
+		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnClose = function( nTr )
+		{
+			this.api( true ).row( nTr ).child.hide();
+		};
+		
+		
+		/**
+		 * Remove a row for the table
+		 *  @param {mixed} target The index of the row from aoData to be deleted, or
+		 *    the TR element you want to delete
+		 *  @param {function|null} [callBack] Callback function
+		 *  @param {bool} [redraw=true] Redraw the table or not
+		 *  @returns {array} The row that was deleted
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately remove the first row
+		 *      oTable.fnDeleteRow( 0 );
+		 *    } );
+		 */
+		this.fnDeleteRow = function( target, callback, redraw )
+		{
+			var api = this.api( true );
+			var rows = api.rows( target );
+			var settings = rows.settings()[0];
+			var data = settings.aoData[ rows[0][0] ];
+		
+			rows.remove();
+		
+			if ( callback ) {
+				callback.call( this, settings, data );
+			}
+		
+			if ( redraw === undefined || redraw ) {
+				api.draw();
+			}
+		
+			return data;
+		};
+		
+		
+		/**
+		 * Restore the table to it's original state in the DOM by removing all of DataTables
+		 * enhancements, alterations to the DOM structure of the table and event listeners.
+		 *  @param {boolean} [remove=false] Completely remove the table from the DOM
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnDestroy();
+		 *    } );
+		 */
+		this.fnDestroy = function ( remove )
+		{
+			this.api( true ).destroy( remove );
+		};
+		
+		
+		/**
+		 * Redraw the table
+		 *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+		 *      oTable.fnDraw();
+		 *    } );
+		 */
+		this.fnDraw = function( complete )
+		{
+			// Note that this isn't an exact match to the old call to _fnDraw - it takes
+			// into account the new data, but can hold position.
+			this.api( true ).draw( complete );
+		};
+		
+		
+		/**
+		 * Filter the input based on data
+		 *  @param {string} sInput String to filter the table on
+		 *  @param {int|null} [iColumn] Column to limit filtering to
+		 *  @param {bool} [bRegex=false] Treat as regular expression or not
+		 *  @param {bool} [bSmart=true] Perform smart filtering or not
+		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sometime later - filter...
+		 *      oTable.fnFilter( 'test string' );
+		 *    } );
+		 */
+		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+		{
+			var api = this.api( true );
+		
+			if ( iColumn === null || iColumn === undefined ) {
+				api.search( sInput, bRegex, bSmart, bCaseInsensitive );
+			}
+			else {
+				api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
+			}
+		
+			api.draw();
+		};
+		
+		
+		/**
+		 * Get the data for the whole table, an individual row or an individual cell based on the
+		 * provided parameters.
+		 *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
+		 *    a TR node then the data source for the whole row will be returned. If given as a
+		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
+		 *    cell returned. If given as an integer, then this is treated as the aoData internal
+		 *    data index for the row (see fnGetPosition) and the data for that row used.
+		 *  @param {int} [col] Optional column index that you want the data of.
+		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
+		 *    returned. If mRow is defined, just data for that row, and is iCol is
+		 *    defined, only data for the designated cell is returned.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Row data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('tr').click( function () {
+		 *        var data = oTable.fnGetData( this );
+		 *        // ... do something with the array / object of data for the row
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Individual cell data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('td').click( function () {
+		 *        var sData = oTable.fnGetData( this );
+		 *        alert( 'The cell clicked on had the value of '+sData );
+		 *      } );
+		 *    } );
+		 */
+		this.fnGetData = function( src, col )
+		{
+			var api = this.api( true );
+		
+			if ( src !== undefined ) {
+				var type = src.nodeName ? src.nodeName.toLowerCase() : '';
+		
+				return col !== undefined || type == 'td' || type == 'th' ?
+					api.cell( src, col ).data() :
+					api.row( src ).data() || null;
+			}
+		
+			return api.data().toArray();
+		};
+		
+		
+		/**
+		 * Get an array of the TR nodes that are used in the table's body. Note that you will
+		 * typically want to use the '$' API method in preference to this as it is more
+		 * flexible.
+		 *  @param {int} [iRow] Optional row index for the TR element you want
+		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
+		 *    in the table's body, or iRow is defined, just the TR element requested.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the nodes from the table
+		 *      var nNodes = oTable.fnGetNodes( );
+		 *    } );
+		 */
+		this.fnGetNodes = function( iRow )
+		{
+			var api = this.api( true );
+		
+			return iRow !== undefined ?
+				api.row( iRow ).node() :
+				api.rows().nodes().flatten().toArray();
+		};
+		
+		
+		/**
+		 * Get the array indexes of a particular cell from it's DOM element
+		 * and column index including hidden columns
+		 *  @param {node} node this can either be a TR, TD or TH in the table's body
+		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
+		 *    if given as a cell, an array of [row index, column index (visible),
+		 *    column index (all)] is given.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      $('#example tbody td').click( function () {
+		 *        // Get the position of the current data from the node
+		 *        var aPos = oTable.fnGetPosition( this );
+		 *
+		 *        // Get the data array for this row
+		 *        var aData = oTable.fnGetData( aPos[0] );
+		 *
+		 *        // Update the data array and return the value
+		 *        aData[ aPos[1] ] = 'clicked';
+		 *        this.innerHTML = 'clicked';
+		 *      } );
+		 *
+		 *      // Init DataTables
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnGetPosition = function( node )
+		{
+			var api = this.api( true );
+			var nodeName = node.nodeName.toUpperCase();
+		
+			if ( nodeName == 'TR' ) {
+				return api.row( node ).index();
+			}
+			else if ( nodeName == 'TD' || nodeName == 'TH' ) {
+				var cell = api.cell( node ).index();
+		
+				return [
+					cell.row,
+					cell.columnVisible,
+					cell.column
+				];
+			}
+			return null;
+		};
+		
+		
+		/**
+		 * Check to see if a row is 'open' or not.
+		 *  @param {node} nTr the table row to check
+		 *  @returns {boolean} true if the row is currently open, false otherwise
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnIsOpen = function( nTr )
+		{
+			return this.api( true ).row( nTr ).child.isShown();
+		};
+		
+		
+		/**
+		 * This function will place a new row directly after a row which is currently
+		 * on display on the page, with the HTML contents that is passed into the
+		 * function. This can be used, for example, to ask for confirmation that a
+		 * particular record should be deleted.
+		 *  @param {node} nTr The table row to 'open'
+		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
+		 *  @param {string} sClass Class to give the new TD cell
+		 *  @returns {node} The row opened. Note that if the table row passed in as the
+		 *    first parameter, is not found in the table, this method will silently
+		 *    return.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnOpen = function( nTr, mHtml, sClass )
+		{
+			return this.api( true )
+				.row( nTr )
+				.child( mHtml, sClass )
+				.show()
+				.child()[0];
+		};
+		
+		
+		/**
+		 * Change the pagination - provides the internal logic for pagination in a simple API
+		 * function. With this function you can have a DataTables table go to the next,
+		 * previous, first or last pages.
+		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+		 *    or page number to jump to (integer), note that page 0 is the first page.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnPageChange( 'next' );
+		 *    } );
+		 */
+		this.fnPageChange = function ( mAction, bRedraw )
+		{
+			var api = this.api( true ).page( mAction );
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw(false);
+			}
+		};
+		
+		
+		/**
+		 * Show a particular column
+		 *  @param {int} iCol The column whose display should be changed
+		 *  @param {bool} bShow Show (true) or hide (false) the column
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Hide the second column after initialisation
+		 *      oTable.fnSetColumnVis( 1, false );
+		 *    } );
+		 */
+		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+		{
+			var api = this.api( true ).column( iCol ).visible( bShow );
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.columns.adjust().draw();
+			}
+		};
+		
+		
+		/**
+		 * Get the settings for a particular table for external manipulation
+		 *  @returns {object} DataTables settings object. See
+		 *    {@link DataTable.models.oSettings}
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      var oSettings = oTable.fnSettings();
+		 *
+		 *      // Show an example parameter from the settings
+		 *      alert( oSettings._iDisplayStart );
+		 *    } );
+		 */
+		this.fnSettings = function()
+		{
+			return _fnSettingsFromNode( this[_ext.iApiIndex] );
+		};
+		
+		
+		/**
+		 * Sort the table by a particular column
+		 *  @param {int} iCol the data index to sort on. Note that this will not match the
+		 *    'display index' if you have hidden data entries
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort immediately with columns 0 and 1
+		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+		 *    } );
+		 */
+		this.fnSort = function( aaSort )
+		{
+			this.api( true ).order( aaSort ).draw();
+		};
+		
+		
+		/**
+		 * Attach a sort listener to an element for a given column
+		 *  @param {node} nNode the element to attach the sort listener to
+		 *  @param {int} iColumn the column that a click on this node will sort on
+		 *  @param {function} [fnCallback] callback function when sort is run
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort on column 1, when 'sorter' is clicked on
+		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
+		 *    } );
+		 */
+		this.fnSortListener = function( nNode, iColumn, fnCallback )
+		{
+			this.api( true ).order.listener( nNode, iColumn, fnCallback );
+		};
+		
+		
+		/**
+		 * Update a table cell or row - this method will accept either a single value to
+		 * update the cell with, an array of values with one element for each column or
+		 * an object in the same format as the original data source. The function is
+		 * self-referencing in order to make the multi column updates easier.
+		 *  @param {object|array|string} mData Data to update the cell/row with
+		 *  @param {node|int} mRow TR element you want to update or the aoData index
+		 *  @param {int} [iColumn] The column to update, give as null or undefined to
+		 *    update a whole row.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
+		 *  @returns {int} 0 on success, 1 on error
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
+		 *    } );
+		 */
+		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+		{
+			var api = this.api( true );
+		
+			if ( iColumn === undefined || iColumn === null ) {
+				api.row( mRow ).data( mData );
+			}
+			else {
+				api.cell( mRow, iColumn ).data( mData );
+			}
+		
+			if ( bAction === undefined || bAction ) {
+				api.columns.adjust();
+			}
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
+			}
+			return 0;
+		};
+		
+		
+		/**
+		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
+		 * to ensure compatibility.
+		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+		 *    formats "X" and "X.Y" are also acceptable.
+		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
+		 *    version, or false if this version of DataTales is not suitable
+		 *  @method
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
+		 *    } );
+		 */
+		this.fnVersionCheck = _ext.fnVersionCheck;
+		
+
+		var _that = this;
+		var emptyInit = options === undefined;
+		var len = this.length;
+
+		if ( emptyInit ) {
+			options = {};
+		}
+
+		this.oApi = this.internal = _ext.internal;
+
+		// Extend with old style plug-in API methods
+		for ( var fn in DataTable.ext.internal ) {
+			if ( fn ) {
+				this[fn] = _fnExternApiFunc(fn);
+			}
+		}
+
+		this.each(function() {
+			// For each initialisation we want to give it a clean initialisation
+			// object that can be bashed around
+			var o = {};
+			var oInit = len > 1 ? // optimisation for single table case
+				_fnExtend( o, options, true ) :
+				options;
+
+			/*global oInit,_that,emptyInit*/
+			var i=0, iLen, j, jLen, k, kLen;
+			var sId = this.getAttribute( 'id' );
+			var bInitHandedOff = false;
+			var defaults = DataTable.defaults;
+			var $this = $(this);
+			
+			
+			/* Sanity check */
+			if ( this.nodeName.toLowerCase() != 'table' )
+			{
+				_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
+				return;
+			}
+			
+			/* Backwards compatibility for the defaults */
+			_fnCompatOpts( defaults );
+			_fnCompatCols( defaults.column );
+			
+			/* Convert the camel-case defaults to Hungarian */
+			_fnCamelToHungarian( defaults, defaults, true );
+			_fnCamelToHungarian( defaults.column, defaults.column, true );
+			
+			/* Setting up the initialisation object */
+			_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
+			
+			
+			
+			/* Check to see if we are re-initialising a table */
+			var allSettings = DataTable.settings;
+			for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
+			{
+				var s = allSettings[i];
+			
+				/* Base check on table node */
+				if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
+				{
+					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
+					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
+			
+					if ( emptyInit || bRetrieve )
+					{
+						return s.oInstance;
+					}
+					else if ( bDestroy )
+					{
+						s.oInstance.fnDestroy();
+						break;
+					}
+					else
+					{
+						_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
+						return;
+					}
+				}
+			
+				/* If the element we are initialising has the same ID as a table which was previously
+				 * initialised, but the table nodes don't match (from before) then we destroy the old
+				 * instance by simply deleting it. This is under the assumption that the table has been
+				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+				 */
+				if ( s.sTableId == this.id )
+				{
+					allSettings.splice( i, 1 );
+					break;
+				}
+			}
+			
+			/* Ensure the table has an ID - required for accessibility */
+			if ( sId === null || sId === "" )
+			{
+				sId = "DataTables_Table_"+(DataTable.ext._unique++);
+				this.id = sId;
+			}
+			
+			/* Create the settings object for this table and set some of the default parameters */
+			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+				"sDestroyWidth": $this[0].style.width,
+				"sInstance":     sId,
+				"sTableId":      sId
+			} );
+			oSettings.nTable = this;
+			oSettings.oApi   = _that.internal;
+			oSettings.oInit  = oInit;
+			
+			allSettings.push( oSettings );
+			
+			// Need to add the instance after the instance after the settings object has been added
+			// to the settings array, so we can self reference the table instance if more than one
+			oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
+			
+			// Backwards compatibility, before we apply all the defaults
+			_fnCompatOpts( oInit );
+			
+			if ( oInit.oLanguage )
+			{
+				_fnLanguageCompat( oInit.oLanguage );
+			}
+			
+			// If the length menu is given, but the init display length is not, use the length menu
+			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
+			{
+				oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
+					oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
+			}
+			
+			// Apply the defaults and init options to make a single init object will all
+			// options defined from defaults and instance options.
+			oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
+			
+			
+			// Map the initialisation options onto the settings object
+			_fnMap( oSettings.oFeatures, oInit, [
+				"bPaginate",
+				"bLengthChange",
+				"bFilter",
+				"bSort",
+				"bSortMulti",
+				"bInfo",
+				"bProcessing",
+				"bAutoWidth",
+				"bSortClasses",
+				"bServerSide",
+				"bDeferRender"
+			] );
+			_fnMap( oSettings, oInit, [
+				"asStripeClasses",
+				"ajax",
+				"fnServerData",
+				"fnFormatNumber",
+				"sServerMethod",
+				"aaSorting",
+				"aaSortingFixed",
+				"aLengthMenu",
+				"sPaginationType",
+				"sAjaxSource",
+				"sAjaxDataProp",
+				"iStateDuration",
+				"sDom",
+				"bSortCellsTop",
+				"iTabIndex",
+				"fnStateLoadCallback",
+				"fnStateSaveCallback",
+				"renderer",
+				"searchDelay",
+				"rowId",
+				[ "iCookieDuration", "iStateDuration" ], // backwards compat
+				[ "oSearch", "oPreviousSearch" ],
+				[ "aoSearchCols", "aoPreSearchCols" ],
+				[ "iDisplayLength", "_iDisplayLength" ],
+				[ "bJQueryUI", "bJUI" ]
+			] );
+			_fnMap( oSettings.oScroll, oInit, [
+				[ "sScrollX", "sX" ],
+				[ "sScrollXInner", "sXInner" ],
+				[ "sScrollY", "sY" ],
+				[ "bScrollCollapse", "bCollapse" ]
+			] );
+			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+			
+			/* Callback functions which are array driven */
+			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
+			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
+			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
+			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
+			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
+			
+			oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
+			
+			/* Browser support detection */
+			_fnBrowserDetect( oSettings );
+			
+			var oClasses = oSettings.oClasses;
+			
+			// @todo Remove in 1.11
+			if ( oInit.bJQueryUI )
+			{
+				/* Use the JUI classes object for display. You could clone the oStdClasses object if
+				 * you want to have multiple tables with multiple independent classes
+				 */
+				$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );
+			
+				if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" )
+				{
+					/* Set the DOM to use a layout suitable for jQuery UI's theming */
+					oSettings.sDom = '<"H"lfr>t<"F"ip>';
+				}
+			
+				if ( ! oSettings.renderer ) {
+					oSettings.renderer = 'jqueryui';
+				}
+				else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {
+					oSettings.renderer.header = 'jqueryui';
+				}
+			}
+			else
+			{
+				$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
+			}
+			$this.addClass( oClasses.sTable );
+			
+			
+			if ( oSettings.iInitDisplayStart === undefined )
+			{
+				/* Display start point, taking into account the save saving */
+				oSettings.iInitDisplayStart = oInit.iDisplayStart;
+				oSettings._iDisplayStart = oInit.iDisplayStart;
+			}
+			
+			if ( oInit.iDeferLoading !== null )
+			{
+				oSettings.bDeferLoading = true;
+				var tmp = $.isArray( oInit.iDeferLoading );
+				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
+			}
+			
+			/* Language definitions */
+			var oLanguage = oSettings.oLanguage;
+			$.extend( true, oLanguage, oInit.oLanguage );
+			
+			if ( oLanguage.sUrl )
+			{
+				/* Get the language definitions from a file - because this Ajax call makes the language
+				 * get async to the remainder of this function we use bInitHandedOff to indicate that
+				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+				 */
+				$.ajax( {
+					dataType: 'json',
+					url: oLanguage.sUrl,
+					success: function ( json ) {
+						_fnLanguageCompat( json );
+						_fnCamelToHungarian( defaults.oLanguage, json );
+						$.extend( true, oLanguage, json );
+						_fnInitialise( oSettings );
+					},
+					error: function () {
+						// Error occurred loading language file, continue on as best we can
+						_fnInitialise( oSettings );
+					}
+				} );
+				bInitHandedOff = true;
+			}
+			
+			/*
+			 * Stripes
+			 */
+			if ( oInit.asStripeClasses === null )
+			{
+				oSettings.asStripeClasses =[
+					oClasses.sStripeOdd,
+					oClasses.sStripeEven
+				];
+			}
+			
+			/* Remove row stripe classes if they are already on the table row */
+			var stripeClasses = oSettings.asStripeClasses;
+			var rowOne = $this.children('tbody').find('tr').eq(0);
+			if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
+				return rowOne.hasClass(el);
+			} ) ) !== -1 ) {
+				$('tbody tr', this).removeClass( stripeClasses.join(' ') );
+				oSettings.asDestroyStripes = stripeClasses.slice();
+			}
+			
+			/*
+			 * Columns
+			 * See if we should load columns automatically or use defined ones
+			 */
+			var anThs = [];
+			var aoColumnsInit;
+			var nThead = this.getElementsByTagName('thead');
+			if ( nThead.length !== 0 )
+			{
+				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
+				anThs = _fnGetUniqueThs( oSettings );
+			}
+			
+			/* If not given a column array, generate one with nulls */
+			if ( oInit.aoColumns === null )
+			{
+				aoColumnsInit = [];
+				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+				{
+					aoColumnsInit.push( null );
+				}
+			}
+			else
+			{
+				aoColumnsInit = oInit.aoColumns;
+			}
+			
+			/* Add the columns */
+			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+			{
+				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
+			}
+			
+			/* Apply the column definitions */
+			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+				_fnColumnOptions( oSettings, iCol, oDef );
+			} );
+			
+			/* HTML5 attribute detection - build an mData object automatically if the
+			 * attributes are found
+			 */
+			if ( rowOne.length ) {
+				var a = function ( cell, name ) {
+					return cell.getAttribute( 'data-'+name ) !== null ? name : null;
+				};
+			
+				$( rowOne[0] ).children('th, td').each( function (i, cell) {
+					var col = oSettings.aoColumns[i];
+			
+					if ( col.mData === i ) {
+						var sort = a( cell, 'sort' ) || a( cell, 'order' );
+						var filter = a( cell, 'filter' ) || a( cell, 'search' );
+			
+						if ( sort !== null || filter !== null ) {
+							col.mData = {
+								_:      i+'.display',
+								sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								type:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								filter: filter !== null ? i+'.@data-'+filter : undefined
+							};
+			
+							_fnColumnOptions( oSettings, i );
+						}
+					}
+				} );
+			}
+			
+			var features = oSettings.oFeatures;
+			var loadedInit = function () {
+				/*
+				 * Sorting
+				 * @todo For modularisation (1.11) this needs to do into a sort start up handler
+				 */
+			
+				// If aaSorting is not defined, then we use the first indicator in asSorting
+				// in case that has been altered, so the default sort reflects that option
+				if ( oInit.aaSorting === undefined ) {
+					var sorting = oSettings.aaSorting;
+					for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {
+						sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
+					}
+				}
+			
+				/* Do a first pass on the sorting classes (allows any size changes to be taken into
+				 * account, and also will apply sorting disabled classes if disabled
+				 */
+				_fnSortingClasses( oSettings );
+			
+				if ( features.bSort ) {
+					_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+						if ( oSettings.bSorted ) {
+							var aSort = _fnSortFlatten( oSettings );
+							var sortedColumns = {};
+			
+							$.each( aSort, function (i, val) {
+								sortedColumns[ val.src ] = val.dir;
+							} );
+			
+							_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
+							_fnSortAria( oSettings );
+						}
+					} );
+				}
+			
+				_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+					if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
+						_fnSortingClasses( oSettings );
+					}
+				}, 'sc' );
+			
+			
+				/*
+				 * Final init
+				 * Cache the header, body and footer as required, creating them if needed
+				 */
+			
+				// Work around for Webkit bug 83867 - store the caption-side before removing from doc
+				var captions = $this.children('caption').each( function () {
+					this._captionSide = $(this).css('caption-side');
+				} );
+			
+				var thead = $this.children('thead');
+				if ( thead.length === 0 ) {
+					thead = $('<thead/>').appendTo($this);
+				}
+				oSettings.nTHead = thead[0];
+			
+				var tbody = $this.children('tbody');
+				if ( tbody.length === 0 ) {
+					tbody = $('<tbody/>').appendTo($this);
+				}
+				oSettings.nTBody = tbody[0];
+			
+				var tfoot = $this.children('tfoot');
+				if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) {
+					// If we are a scrolling table, and no footer has been given, then we need to create
+					// a tfoot element for the caption element to be appended to
+					tfoot = $('<tfoot/>').appendTo($this);
+				}
+			
+				if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
+					$this.addClass( oClasses.sNoFooter );
+				}
+				else if ( tfoot.length > 0 ) {
+					oSettings.nTFoot = tfoot[0];
+					_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+				}
+			
+				/* Check if there is data passing into the constructor */
+				if ( oInit.aaData ) {
+					for ( i=0 ; i<oInit.aaData.length ; i++ ) {
+						_fnAddData( oSettings, oInit.aaData[ i ] );
+					}
+				}
+				else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {
+					/* Grab the data from the page - only do this when deferred loading or no Ajax
+					 * source since there is no point in reading the DOM data if we are then going
+					 * to replace it with Ajax data
+					 */
+					_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
+				}
+			
+				/* Copy the data index array */
+				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+			
+				/* Initialisation complete - table can be drawn */
+				oSettings.bInitialised = true;
+			
+				/* Check if we need to initialise the table (it might not have been handed off to the
+				 * language processor)
+				 */
+				if ( bInitHandedOff === false ) {
+					_fnInitialise( oSettings );
+				}
+			};
+			
+			/* Must be done after everything which can be overridden by the state saving! */
+			if ( oInit.bStateSave )
+			{
+				features.bStateSave = true;
+				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
+				_fnLoadState( oSettings, oInit, loadedInit );
+			}
+			else {
+				loadedInit();
+			}
+			
+		} );
+		_that = null;
+		return this;
+	};
+
+	
+	/*
+	 * It is useful to have variables which are scoped locally so only the
+	 * DataTables functions can access them and they don't leak into global space.
+	 * At the same time these functions are often useful over multiple files in the
+	 * core and API, so we list, or at least document, all variables which are used
+	 * by DataTables as private variables here. This also ensures that there is no
+	 * clashing of variable names and that they can easily referenced for reuse.
+	 */
+	
+	
+	// Defined else where
+	//  _selector_run
+	//  _selector_opts
+	//  _selector_first
+	//  _selector_row_indexes
+	
+	var _ext; // DataTable.ext
+	var _Api; // DataTable.Api
+	var _api_register; // DataTable.Api.register
+	var _api_registerPlural; // DataTable.Api.registerPlural
+	
+	var _re_dic = {};
+	var _re_new_lines = /[\r\n]/g;
+	var _re_html = /<.*?>/g;
+	
+	// This is not strict ISO8601 - Date.parse() is quite lax, although
+	// implementations differ between browsers.
+	var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/;
+	
+	// Escape regular expression special characters
+	var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
+	
+	// http://en.wikipedia.org/wiki/Foreign_exchange_market
+	// - \u20BD - Russian ruble.
+	// - \u20a9 - South Korean Won
+	// - \u20BA - Turkish Lira
+	// - \u20B9 - Indian Rupee
+	// - R - Brazil (R$) and South Africa
+	// - fr - Swiss Franc
+	// - kr - Swedish krona, Norwegian krone and Danish krone
+	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
+	//   standards as thousands separators.
+	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
+	
+	
+	var _empty = function ( d ) {
+		return !d || d === true || d === '-' ? true : false;
+	};
+	
+	
+	var _intVal = function ( s ) {
+		var integer = parseInt( s, 10 );
+		return !isNaN(integer) && isFinite(s) ? integer : null;
+	};
+	
+	// Convert from a formatted number with characters other than `.` as the
+	// decimal place, to a Javascript number
+	var _numToDecimal = function ( num, decimalPoint ) {
+		// Cache created regular expressions for speed as this function is called often
+		if ( ! _re_dic[ decimalPoint ] ) {
+			_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
+		}
+		return typeof num === 'string' && decimalPoint !== '.' ?
+			num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
+			num;
+	};
+	
+	
+	var _isNumber = function ( d, decimalPoint, formatted ) {
+		var strType = typeof d === 'string';
+	
+		// If empty return immediately so there must be a number if it is a
+		// formatted string (this stops the string "k", or "kr", etc being detected
+		// as a formatted number for currency
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		if ( decimalPoint && strType ) {
+			d = _numToDecimal( d, decimalPoint );
+		}
+	
+		if ( formatted && strType ) {
+			d = d.replace( _re_formatted_numeric, '' );
+		}
+	
+		return !isNaN( parseFloat(d) ) && isFinite( d );
+	};
+	
+	
+	// A string without HTML in it can be considered to be HTML still
+	var _isHtml = function ( d ) {
+		return _empty( d ) || typeof d === 'string';
+	};
+	
+	
+	var _htmlNumeric = function ( d, decimalPoint, formatted ) {
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		var html = _isHtml( d );
+		return ! html ?
+			null :
+			_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
+				true :
+				null;
+	};
+	
+	
+	var _pluck = function ( a, prop, prop2 ) {
+		var out = [];
+		var i=0, ien=a.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] && a[i][ prop ] ) {
+					out.push( a[i][ prop ][ prop2 ] );
+				}
+			}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] ) {
+					out.push( a[i][ prop ] );
+				}
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	// Basically the same as _pluck, but rather than looping over `a` we use `order`
+	// as the indexes to pick from `a`
+	var _pluck_order = function ( a, order, prop, prop2 )
+	{
+		var out = [];
+		var i=0, ien=order.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[ order[i] ][ prop ] ) {
+					out.push( a[ order[i] ][ prop ][ prop2 ] );
+				}
+			}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				out.push( a[ order[i] ][ prop ] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _range = function ( len, start )
+	{
+		var out = [];
+		var end;
+	
+		if ( start === undefined ) {
+			start = 0;
+			end = len;
+		}
+		else {
+			end = start;
+			start = len;
+		}
+	
+		for ( var i=start ; i<end ; i++ ) {
+			out.push( i );
+		}
+	
+		return out;
+	};
+	
+	
+	var _removeEmpty = function ( a )
+	{
+		var out = [];
+	
+		for ( var i=0, ien=a.length ; i<ien ; i++ ) {
+			if ( a[i] ) { // careful - will remove all falsy values!
+				out.push( a[i] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _stripHtml = function ( d ) {
+		return d.replace( _re_html, '' );
+	};
+	
+	
+	/**
+	 * Determine if all values in the array are unique. This means we can short
+	 * cut the _unique method at the cost of a single loop. A sorted array is used
+	 * to easily check the values.
+	 *
+	 * @param  {array} src Source array
+	 * @return {boolean} true if all unique, false otherwise
+	 * @ignore
+	 */
+	var _areAllUnique = function ( src ) {
+		if ( src.length < 2 ) {
+			return true;
+		}
+	
+		var sorted = src.slice().sort();
+		var last = sorted[0];
+	
+		for ( var i=1, ien=sorted.length ; i<ien ; i++ ) {
+			if ( sorted[i] === last ) {
+				return false;
+			}
+	
+			last = sorted[i];
+		}
+	
+		return true;
+	};
+	
+	
+	/**
+	 * Find the unique elements in a source array.
+	 *
+	 * @param  {array} src Source array
+	 * @return {array} Array of unique items
+	 * @ignore
+	 */
+	var _unique = function ( src )
+	{
+		if ( _areAllUnique( src ) ) {
+			return src.slice();
+		}
+	
+		// A faster unique method is to use object keys to identify used values,
+		// but this doesn't work with arrays or objects, which we must also
+		// consider. See jsperf.com/compare-array-unique-versions/4 for more
+		// information.
+		var
+			out = [],
+			val,
+			i, ien=src.length,
+			j, k=0;
+	
+		again: for ( i=0 ; i<ien ; i++ ) {
+			val = src[i];
+	
+			for ( j=0 ; j<k ; j++ ) {
+				if ( out[j] === val ) {
+					continue again;
+				}
+			}
+	
+			out.push( val );
+			k++;
+		}
+	
+		return out;
+	};
+	
+	
+	/**
+	 * DataTables utility methods
+	 * 
+	 * This namespace provides helper methods that DataTables uses internally to
+	 * create a DataTable, but which are not exclusively used only for DataTables.
+	 * These methods can be used by extension authors to save the duplication of
+	 * code.
+	 *
+	 *  @namespace
+	 */
+	DataTable.util = {
+		/**
+		 * Throttle the calls to a function. Arguments and context are maintained
+		 * for the throttled function.
+		 *
+		 * @param {function} fn Function to be called
+		 * @param {integer} freq Call frequency in mS
+		 * @return {function} Wrapped function
+		 */
+		throttle: function ( fn, freq ) {
+			var
+				frequency = freq !== undefined ? freq : 200,
+				last,
+				timer;
+	
+			return function () {
+				var
+					that = this,
+					now  = +new Date(),
+					args = arguments;
+	
+				if ( last && now < last + frequency ) {
+					clearTimeout( timer );
+	
+					timer = setTimeout( function () {
+						last = undefined;
+						fn.apply( that, args );
+					}, frequency );
+				}
+				else {
+					last = now;
+					fn.apply( that, args );
+				}
+			};
+		},
+	
+	
+		/**
+		 * Escape a string such that it can be used in a regular expression
+		 *
+		 *  @param {string} val string to escape
+		 *  @returns {string} escaped string
+		 */
+		escapeRegex: function ( val ) {
+			return val.replace( _re_escape_regex, '\\$1' );
+		}
+	};
+	
+	
+	
+	/**
+	 * Create a mapping object that allows camel case parameters to be looked up
+	 * for their Hungarian counterparts. The mapping is stored in a private
+	 * parameter called `_hungarianMap` which can be accessed on the source object.
+	 *  @param {object} o
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnHungarianMap ( o )
+	{
+		var
+			hungarian = 'a aa ai ao as b fn i m o s ',
+			match,
+			newKey,
+			map = {};
+	
+		$.each( o, function (key, val) {
+			match = key.match(/^([^A-Z]+?)([A-Z])/);
+	
+			if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
+			{
+				newKey = key.replace( match[0], match[2].toLowerCase() );
+				map[ newKey ] = key;
+	
+				if ( match[1] === 'o' )
+				{
+					_fnHungarianMap( o[key] );
+				}
+			}
+		} );
+	
+		o._hungarianMap = map;
+	}
+	
+	
+	/**
+	 * Convert from camel case parameters to Hungarian, based on a Hungarian map
+	 * created by _fnHungarianMap.
+	 *  @param {object} src The model object which holds all parameters that can be
+	 *    mapped.
+	 *  @param {object} user The object to convert from camel case to Hungarian.
+	 *  @param {boolean} force When set to `true`, properties which already have a
+	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
+	 *    won't be.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCamelToHungarian ( src, user, force )
+	{
+		if ( ! src._hungarianMap ) {
+			_fnHungarianMap( src );
+		}
+	
+		var hungarianKey;
+	
+		$.each( user, function (key, val) {
+			hungarianKey = src._hungarianMap[ key ];
+	
+			if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
+			{
+				// For objects, we need to buzz down into the object to copy parameters
+				if ( hungarianKey.charAt(0) === 'o' )
+				{
+					// Copy the camelCase options over to the hungarian
+					if ( ! user[ hungarianKey ] ) {
+						user[ hungarianKey ] = {};
+					}
+					$.extend( true, user[hungarianKey], user[key] );
+	
+					_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
+				}
+				else {
+					user[hungarianKey] = user[ key ];
+				}
+			}
+		} );
+	}
+	
+	
+	/**
+	 * Language compatibility - when certain options are given, and others aren't, we
+	 * need to duplicate the values over, in order to provide backwards compatibility
+	 * with older language files.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLanguageCompat( lang )
+	{
+		var defaults = DataTable.defaults.oLanguage;
+		var zeroRecords = lang.sZeroRecords;
+	
+		/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+		 * sZeroRecords - assuming that is given.
+		 */
+		if ( ! lang.sEmptyTable && zeroRecords &&
+			defaults.sEmptyTable === "No data available in table" )
+		{
+			_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
+		}
+	
+		/* Likewise with loading records */
+		if ( ! lang.sLoadingRecords && zeroRecords &&
+			defaults.sLoadingRecords === "Loading..." )
+		{
+			_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
+		}
+	
+		// Old parameter name of the thousands separator mapped onto the new
+		if ( lang.sInfoThousands ) {
+			lang.sThousands = lang.sInfoThousands;
+		}
+	
+		var decimal = lang.sDecimal;
+		if ( decimal ) {
+			_addNumericSort( decimal );
+		}
+	}
+	
+	
+	/**
+	 * Map one parameter onto another
+	 *  @param {object} o Object to map
+	 *  @param {*} knew The new parameter name
+	 *  @param {*} old The old parameter name
+	 */
+	var _fnCompatMap = function ( o, knew, old ) {
+		if ( o[ knew ] !== undefined ) {
+			o[ old ] = o[ knew ];
+		}
+	};
+	
+	
+	/**
+	 * Provide backwards compatibility for the main DT options. Note that the new
+	 * options are mapped onto the old parameters, so this is an external interface
+	 * change only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatOpts ( init )
+	{
+		_fnCompatMap( init, 'ordering',      'bSort' );
+		_fnCompatMap( init, 'orderMulti',    'bSortMulti' );
+		_fnCompatMap( init, 'orderClasses',  'bSortClasses' );
+		_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
+		_fnCompatMap( init, 'order',         'aaSorting' );
+		_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
+		_fnCompatMap( init, 'paging',        'bPaginate' );
+		_fnCompatMap( init, 'pagingType',    'sPaginationType' );
+		_fnCompatMap( init, 'pageLength',    'iDisplayLength' );
+		_fnCompatMap( init, 'searching',     'bFilter' );
+	
+		// Boolean initialisation of x-scrolling
+		if ( typeof init.sScrollX === 'boolean' ) {
+			init.sScrollX = init.sScrollX ? '100%' : '';
+		}
+		if ( typeof init.scrollX === 'boolean' ) {
+			init.scrollX = init.scrollX ? '100%' : '';
+		}
+	
+		// Column search objects are in an array, so it needs to be converted
+		// element by element
+		var searchCols = init.aoSearchCols;
+	
+		if ( searchCols ) {
+			for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
+				if ( searchCols[i] ) {
+					_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Provide backwards compatibility for column options. Note that the new options
+	 * are mapped onto the old parameters, so this is an external interface change
+	 * only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatCols ( init )
+	{
+		_fnCompatMap( init, 'orderable',     'bSortable' );
+		_fnCompatMap( init, 'orderData',     'aDataSort' );
+		_fnCompatMap( init, 'orderSequence', 'asSorting' );
+		_fnCompatMap( init, 'orderDataType', 'sortDataType' );
+	
+		// orderData can be given as an integer
+		var dataSort = init.aDataSort;
+		if ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {
+			init.aDataSort = [ dataSort ];
+		}
+	}
+	
+	
+	/**
+	 * Browser feature detection for capabilities, quirks
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBrowserDetect( settings )
+	{
+		// We don't need to do this every time DataTables is constructed, the values
+		// calculated are specific to the browser and OS configuration which we
+		// don't expect to change between initialisations
+		if ( ! DataTable.__browser ) {
+			var browser = {};
+			DataTable.__browser = browser;
+	
+			// Scrolling feature / quirks detection
+			var n = $('<div/>')
+				.css( {
+					position: 'fixed',
+					top: 0,
+					left: $(window).scrollLeft()*-1, // allow for scrolling
+					height: 1,
+					width: 1,
+					overflow: 'hidden'
+				} )
+				.append(
+					$('<div/>')
+						.css( {
+							position: 'absolute',
+							top: 1,
+							left: 1,
+							width: 100,
+							overflow: 'scroll'
+						} )
+						.append(
+							$('<div/>')
+								.css( {
+									width: '100%',
+									height: 10
+								} )
+						)
+				)
+				.appendTo( 'body' );
+	
+			var outer = n.children();
+			var inner = outer.children();
+	
+			// Numbers below, in order, are:
+			// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
+			//
+			// IE6 XP:                           100 100 100  83
+			// IE7 Vista:                        100 100 100  83
+			// IE 8+ Windows:                     83  83 100  83
+			// Evergreen Windows:                 83  83 100  83
+			// Evergreen Mac with scrollbars:     85  85 100  85
+			// Evergreen Mac without scrollbars: 100 100 100 100
+	
+			// Get scrollbar width
+			browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
+	
+			// IE6/7 will oversize a width 100% element inside a scrolling element, to
+			// include the width of the scrollbar, while other browsers ensure the inner
+			// element is contained without forcing scrolling
+			browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
+	
+			// In rtl text layout, some browsers (most, but not all) will place the
+			// scrollbar on the left, rather than the right.
+			browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
+	
+			// IE8- don't provide height and width for getBoundingClientRect
+			browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
+	
+			n.remove();
+		}
+	
+		$.extend( settings.oBrowser, DataTable.__browser );
+		settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
+	}
+	
+	
+	/**
+	 * Array.prototype reduce[Right] method, used for browsers which don't support
+	 * JS 1.6. Done this way to reduce code size, since we iterate either way
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReduce ( that, fn, init, start, end, inc )
+	{
+		var
+			i = start,
+			value,
+			isSet = false;
+	
+		if ( init !== undefined ) {
+			value = init;
+			isSet = true;
+		}
+	
+		while ( i !== end ) {
+			if ( ! that.hasOwnProperty(i) ) {
+				continue;
+			}
+	
+			value = isSet ?
+				fn( value, that[i], i, that ) :
+				that[i];
+	
+			isSet = true;
+			i += inc;
+		}
+	
+		return value;
+	}
+	
+	/**
+	 * Add a column to the list used for the table with default values
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nTh The th element for this column
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddColumn( oSettings, nTh )
+	{
+		// Add column to aoColumns array
+		var oDefaults = DataTable.defaults.column;
+		var iCol = oSettings.aoColumns.length;
+		var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+			"nTh": nTh ? nTh : document.createElement('th'),
+			"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
+			"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+			"mData": oDefaults.mData ? oDefaults.mData : iCol,
+			idx: iCol
+		} );
+		oSettings.aoColumns.push( oCol );
+	
+		// Add search object for column specific search. Note that the `searchCols[ iCol ]`
+		// passed into extend can be undefined. This allows the user to give a default
+		// with only some of the parameters defined, and also not give a default
+		var searchCols = oSettings.aoPreSearchCols;
+		searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
+	
+		// Use the default column options function to initialise classes etc
+		_fnColumnOptions( oSettings, iCol, $(nTh).data() );
+	}
+	
+	
+	/**
+	 * Apply options for a column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iCol column index to consider
+	 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnOptions( oSettings, iCol, oOptions )
+	{
+		var oCol = oSettings.aoColumns[ iCol ];
+		var oClasses = oSettings.oClasses;
+		var th = $(oCol.nTh);
+	
+		// Try to get width information from the DOM. We can't get it from CSS
+		// as we'd need to parse the CSS stylesheet. `width` option can override
+		if ( ! oCol.sWidthOrig ) {
+			// Width attribute
+			oCol.sWidthOrig = th.attr('width') || null;
+	
+			// Style attribute
+			var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
+			if ( t ) {
+				oCol.sWidthOrig = t[1];
+			}
+		}
+	
+		/* User specified column options */
+		if ( oOptions !== undefined && oOptions !== null )
+		{
+			// Backwards compatibility
+			_fnCompatCols( oOptions );
+	
+			// Map camel case parameters to their Hungarian counterparts
+			_fnCamelToHungarian( DataTable.defaults.column, oOptions );
+	
+			/* Backwards compatibility for mDataProp */
+			if ( oOptions.mDataProp !== undefined && !oOptions.mData )
+			{
+				oOptions.mData = oOptions.mDataProp;
+			}
+	
+			if ( oOptions.sType )
+			{
+				oCol._sManualType = oOptions.sType;
+			}
+	
+			// `class` is a reserved word in Javascript, so we need to provide
+			// the ability to use a valid name for the camel case input
+			if ( oOptions.className && ! oOptions.sClass )
+			{
+				oOptions.sClass = oOptions.className;
+			}
+	
+			$.extend( oCol, oOptions );
+			_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+	
+			/* iDataSort to be applied (backwards compatibility), but aDataSort will take
+			 * priority if defined
+			 */
+			if ( oOptions.iDataSort !== undefined )
+			{
+				oCol.aDataSort = [ oOptions.iDataSort ];
+			}
+			_fnMap( oCol, oOptions, "aDataSort" );
+		}
+	
+		/* Cache the data get and set functions for speed */
+		var mDataSrc = oCol.mData;
+		var mData = _fnGetObjectDataFn( mDataSrc );
+		var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+	
+		var attrTest = function( src ) {
+			return typeof src === 'string' && src.indexOf('@') !== -1;
+		};
+		oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
+			attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
+		);
+		oCol._setter = null;
+	
+		oCol.fnGetData = function (rowData, type, meta) {
+			var innerData = mData( rowData, type, undefined, meta );
+	
+			return mRender && type ?
+				mRender( innerData, type, rowData, meta ) :
+				innerData;
+		};
+		oCol.fnSetData = function ( rowData, val, meta ) {
+			return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
+		};
+	
+		// Indicate if DataTables should read DOM data as an object or array
+		// Used in _fnGetRowElements
+		if ( typeof mDataSrc !== 'number' ) {
+			oSettings._rowReadObject = true;
+		}
+	
+		/* Feature sorting overrides column specific when off */
+		if ( !oSettings.oFeatures.bSort )
+		{
+			oCol.bSortable = false;
+			th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
+		}
+	
+		/* Check that the class assignment is correct for sorting */
+		var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
+		var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
+		if ( !oCol.bSortable || (!bAsc && !bDesc) )
+		{
+			oCol.sSortingClass = oClasses.sSortableNone;
+			oCol.sSortingClassJUI = "";
+		}
+		else if ( bAsc && !bDesc )
+		{
+			oCol.sSortingClass = oClasses.sSortableAsc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
+		}
+		else if ( !bAsc && bDesc )
+		{
+			oCol.sSortingClass = oClasses.sSortableDesc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
+		}
+		else
+		{
+			oCol.sSortingClass = oClasses.sSortable;
+			oCol.sSortingClassJUI = oClasses.sSortJUI;
+		}
+	}
+	
+	
+	/**
+	 * Adjust the table column widths for new data. Note: you would probably want to
+	 * do a redraw after calling this function!
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAdjustColumnSizing ( settings )
+	{
+		/* Not interested in doing column width calculation if auto-width is disabled */
+		if ( settings.oFeatures.bAutoWidth !== false )
+		{
+			var columns = settings.aoColumns;
+	
+			_fnCalculateColumnWidths( settings );
+			for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
+			{
+				columns[i].nTh.style.width = columns[i].sWidth;
+			}
+		}
+	
+		var scroll = settings.oScroll;
+		if ( scroll.sY !== '' || scroll.sX !== '')
+		{
+			_fnScrollDraw( settings );
+		}
+	
+		_fnCallbackFire( settings, null, 'column-sizing', [settings] );
+	}
+	
+	
+	/**
+	 * Covert the index of a visible column to the index in the data array (take account
+	 * of hidden columns)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iMatch Visible column index to lookup
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisibleToColumnIndex( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+	
+		return typeof aiVis[iMatch] === 'number' ?
+			aiVis[iMatch] :
+			null;
+	}
+	
+	
+	/**
+	 * Covert the index of an index in the data array and convert it to the visible
+	 *   column index (take account of hidden columns)
+	 *  @param {int} iMatch Column index to lookup
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnIndexToVisible( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+		var iPos = $.inArray( iMatch, aiVis );
+	
+		return iPos !== -1 ? iPos : null;
+	}
+	
+	
+	/**
+	 * Get the number of visible columns
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the number of visible columns
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisbleColumns( oSettings )
+	{
+		var vis = 0;
+	
+		// No reduce in IE8, use a loop for now
+		$.each( oSettings.aoColumns, function ( i, col ) {
+			if ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {
+				vis++;
+			}
+		} );
+	
+		return vis;
+	}
+	
+	
+	/**
+	 * Get an array of column indexes that match a given property
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sParam Parameter in aoColumns to look for - typically
+	 *    bVisible or bSearchable
+	 *  @returns {array} Array of indexes with matched properties
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetColumns( oSettings, sParam )
+	{
+		var a = [];
+	
+		$.map( oSettings.aoColumns, function(val, i) {
+			if ( val[sParam] ) {
+				a.push( i );
+			}
+		} );
+	
+		return a;
+	}
+	
+	
+	/**
+	 * Calculate the 'type' of a column
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnTypes ( settings )
+	{
+		var columns = settings.aoColumns;
+		var data = settings.aoData;
+		var types = DataTable.ext.type.detect;
+		var i, ien, j, jen, k, ken;
+		var col, cell, detectedType, cache;
+	
+		// For each column, spin over the 
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			col = columns[i];
+			cache = [];
+	
+			if ( ! col.sType && col._sManualType ) {
+				col.sType = col._sManualType;
+			}
+			else if ( ! col.sType ) {
+				for ( j=0, jen=types.length ; j<jen ; j++ ) {
+					for ( k=0, ken=data.length ; k<ken ; k++ ) {
+						// Use a cache array so we only need to get the type data
+						// from the formatter once (when using multiple detectors)
+						if ( cache[k] === undefined ) {
+							cache[k] = _fnGetCellData( settings, k, i, 'type' );
+						}
+	
+						detectedType = types[j]( cache[k], settings );
+	
+						// If null, then this type can't apply to this column, so
+						// rather than testing all cells, break out. There is an
+						// exception for the last type which is `html`. We need to
+						// scan all rows since it is possible to mix string and HTML
+						// types
+						if ( ! detectedType && j !== types.length-1 ) {
+							break;
+						}
+	
+						// Only a single match is needed for html type since it is
+						// bottom of the pile and very similar to string
+						if ( detectedType === 'html' ) {
+							break;
+						}
+					}
+	
+					// Type is valid for all data points in the column - use this
+					// type
+					if ( detectedType ) {
+						col.sType = detectedType;
+						break;
+					}
+				}
+	
+				// Fall back - if no type was detected, always use string
+				if ( ! col.sType ) {
+					col.sType = 'string';
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Take the column definitions and static columns arrays and calculate how
+	 * they relate to column indexes. The callback function will then apply the
+	 * definition found for a column to a suitable configuration object.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
+	 *  @param {array} aoCols The aoColumns array that defines columns individually
+	 *  @param {function} fn Callback function - takes two parameters, the calculated
+	 *    column index and the definition for that column.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+	{
+		var i, iLen, j, jLen, k, kLen, def;
+		var columns = oSettings.aoColumns;
+	
+		// Column definitions with aTargets
+		if ( aoColDefs )
+		{
+			/* Loop over the definitions array - loop in reverse so first instance has priority */
+			for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
+			{
+				def = aoColDefs[i];
+	
+				/* Each definition can target multiple columns, as it is an array */
+				var aTargets = def.targets !== undefined ?
+					def.targets :
+					def.aTargets;
+	
+				if ( ! $.isArray( aTargets ) )
+				{
+					aTargets = [ aTargets ];
+				}
+	
+				for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+				{
+					if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
+					{
+						/* Add columns that we don't yet know about */
+						while( columns.length <= aTargets[j] )
+						{
+							_fnAddColumn( oSettings );
+						}
+	
+						/* Integer, basic index */
+						fn( aTargets[j], def );
+					}
+					else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+					{
+						/* Negative integer, right to left column counting */
+						fn( columns.length+aTargets[j], def );
+					}
+					else if ( typeof aTargets[j] === 'string' )
+					{
+						/* Class name matching on TH element */
+						for ( k=0, kLen=columns.length ; k<kLen ; k++ )
+						{
+							if ( aTargets[j] == "_all" ||
+							     $(columns[k].nTh).hasClass( aTargets[j] ) )
+							{
+								fn( k, def );
+							}
+						}
+					}
+				}
+			}
+		}
+	
+		// Statically defined columns array
+		if ( aoCols )
+		{
+			for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
+			{
+				fn( i, aoCols[i] );
+			}
+		}
+	}
+	
+	/**
+	 * Add a data array to the table, creating DOM node etc. This is the parallel to
+	 * _fnGatherData, but for adding rows from a Javascript source, rather than a
+	 * DOM source.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aData data array to be added
+	 *  @param {node} [nTr] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddData ( oSettings, aDataIn, nTr, anTds )
+	{
+		/* Create the object for storing information about this new row */
+		var iRow = oSettings.aoData.length;
+		var oData = $.extend( true, {}, DataTable.models.oRow, {
+			src: nTr ? 'dom' : 'data',
+			idx: iRow
+		} );
+	
+		oData._aData = aDataIn;
+		oSettings.aoData.push( oData );
+	
+		/* Create the cells */
+		var nTd, sThisType;
+		var columns = oSettings.aoColumns;
+	
+		// Invalidate the column types as the new data needs to be revalidated
+		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+		{
+			columns[i].sType = null;
+		}
+	
+		/* Add to the display array */
+		oSettings.aiDisplayMaster.push( iRow );
+	
+		var id = oSettings.rowIdFn( aDataIn );
+		if ( id !== undefined ) {
+			oSettings.aIds[ id ] = oData;
+		}
+	
+		/* Create the DOM information, or register it if already present */
+		if ( nTr || ! oSettings.oFeatures.bDeferRender )
+		{
+			_fnCreateTr( oSettings, iRow, nTr, anTds );
+		}
+	
+		return iRow;
+	}
+	
+	
+	/**
+	 * Add one or more TR elements to the table. Generally we'd expect to
+	 * use this for reading data from a DOM sourced table, but it could be
+	 * used for an TR element. Note that if a TR is given, it is used (i.e.
+	 * it is not cloned).
+	 *  @param {object} settings dataTables settings object
+	 *  @param {array|node|jQuery} trs The TR element(s) to add to the table
+	 *  @returns {array} Array of indexes for the added rows
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddTr( settings, trs )
+	{
+		var row;
+	
+		// Allow an individual node to be passed in
+		if ( ! (trs instanceof $) ) {
+			trs = $(trs);
+		}
+	
+		return trs.map( function (i, el) {
+			row = _fnGetRowElements( settings, el );
+			return _fnAddData( settings, row.data, el, row.cells );
+		} );
+	}
+	
+	
+	/**
+	 * Take a TR element and convert it to an index in aoData
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} n the TR element to find
+	 *  @returns {int} index if the node is found, null if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToDataIndex( oSettings, n )
+	{
+		return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+	}
+	
+	
+	/**
+	 * Take a TD element and convert it into a column data index (not the visible index)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow The row number the TD/TH can be found in
+	 *  @param {node} n The TD/TH element to find
+	 *  @returns {int} index if the node is found, -1 if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToColumnIndex( oSettings, iRow, n )
+	{
+		return $.inArray( n, oSettings.aoData[ iRow ].anCells );
+	}
+	
+	
+	/**
+	 * Get the data for a given cell from the internal cache, taking into account data mapping
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
+	 *  @returns {*} Cell data
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetCellData( settings, rowIdx, colIdx, type )
+	{
+		var draw           = settings.iDraw;
+		var col            = settings.aoColumns[colIdx];
+		var rowData        = settings.aoData[rowIdx]._aData;
+		var defaultContent = col.sDefaultContent;
+		var cellData       = col.fnGetData( rowData, type, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		} );
+	
+		if ( cellData === undefined ) {
+			if ( settings.iDrawError != draw && defaultContent === null ) {
+				_fnLog( settings, 0, "Requested unknown parameter "+
+					(typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
+					" for row "+rowIdx+", column "+colIdx, 4 );
+				settings.iDrawError = draw;
+			}
+			return defaultContent;
+		}
+	
+		// When the data source is null and a specific data type is requested (i.e.
+		// not the original data), we can use default column data
+		if ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {
+			cellData = defaultContent;
+		}
+		else if ( typeof cellData === 'function' ) {
+			// If the data source is a function, then we run it and use the return,
+			// executing in the scope of the data object (for instances)
+			return cellData.call( rowData );
+		}
+	
+		if ( cellData === null && type == 'display' ) {
+			return '';
+		}
+		return cellData;
+	}
+	
+	
+	/**
+	 * Set the value for a specific cell, into the internal data cache
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {*} val Value to set
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetCellData( settings, rowIdx, colIdx, val )
+	{
+		var col     = settings.aoColumns[colIdx];
+		var rowData = settings.aoData[rowIdx]._aData;
+	
+		col.fnSetData( rowData, val, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		}  );
+	}
+	
+	
+	// Private variable that is used to match action syntax in the data property object
+	var __reArray = /\[.*?\]$/;
+	var __reFn = /\(\)$/;
+	
+	/**
+	 * Split string on periods, taking into account escaped periods
+	 * @param  {string} str String to split
+	 * @return {array} Split string
+	 */
+	function _fnSplitObjNotation( str )
+	{
+		return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
+			return s.replace(/\\\./g, '.');
+		} );
+	}
+	
+	
+	/**
+	 * Return a function that can be used to get data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data get function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
+		{
+			/* Build an object of get functions, and wrap them in a single call */
+			var o = {};
+			$.each( mSource, function (key, val) {
+				if ( val ) {
+					o[key] = _fnGetObjectDataFn( val );
+				}
+			} );
+	
+			return function (data, type, row, meta) {
+				var t = o[type] || o._;
+				return t !== undefined ?
+					t(data, type, row, meta) :
+					data;
+			};
+		}
+		else if ( mSource === null )
+		{
+			/* Give an empty string for rendering / sorting etc */
+			return function (data) { // type, row and meta also passed, but not used
+				return data;
+			};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, type, row, meta) {
+				return mSource( data, type, row, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* If there is a . in the source string then the data source is in a
+			 * nested object so we loop over the data for each level to get the next
+			 * level down. On each loop we test for undefined, and if found immediately
+			 * return. This allows entire objects to be missing and sDefaultContent to
+			 * be used if defined, rather than throwing an error
+			 */
+			var fetchData = function (data, type, src) {
+				var arrayNotation, funcNotation, out, innerSrc;
+	
+				if ( src !== "" )
+				{
+					var a = _fnSplitObjNotation( src );
+	
+					for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+					{
+						// Check if we are dealing with special notation
+						arrayNotation = a[i].match(__reArray);
+						funcNotation = a[i].match(__reFn);
+	
+						if ( arrayNotation )
+						{
+							// Array notation
+							a[i] = a[i].replace(__reArray, '');
+	
+							// Condition allows simply [] to be passed in
+							if ( a[i] !== "" ) {
+								data = data[ a[i] ];
+							}
+							out = [];
+	
+							// Get the remainder of the nested object to get
+							a.splice( 0, i+1 );
+							innerSrc = a.join('.');
+	
+							// Traverse each entry in the array getting the properties requested
+							if ( $.isArray( data ) ) {
+								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+									out.push( fetchData( data[j], type, innerSrc ) );
+								}
+							}
+	
+							// If a string is given in between the array notation indicators, that
+							// is used to join the strings together, otherwise an array is returned
+							var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+							data = (join==="") ? out : out.join(join);
+	
+							// The inner call to fetchData has already traversed through the remainder
+							// of the source requested, so we exit from the loop
+							break;
+						}
+						else if ( funcNotation )
+						{
+							// Function call
+							a[i] = a[i].replace(__reFn, '');
+							data = data[ a[i] ]();
+							continue;
+						}
+	
+						if ( data === null || data[ a[i] ] === undefined )
+						{
+							return undefined;
+						}
+						data = data[ a[i] ];
+					}
+				}
+	
+				return data;
+			};
+	
+			return function (data, type) { // row and meta also passed, but not used
+				return fetchData( data, type, mSource );
+			};
+		}
+		else
+		{
+			/* Array or flat object mapping */
+			return function (data, type) { // row and meta also passed, but not used
+				return data[mSource];
+			};
+		}
+	}
+	
+	
+	/**
+	 * Return a function that can be used to set data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data set function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
+		{
+			/* Unlike get, only the underscore (global) option is used for for
+			 * setting data since we don't know the type here. This is why an object
+			 * option is not documented for `mData` (which is read/write), but it is
+			 * for `mRender` which is read only.
+			 */
+			return _fnSetObjectDataFn( mSource._ );
+		}
+		else if ( mSource === null )
+		{
+			/* Nothing to do when the data source is null */
+			return function () {};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, val, meta) {
+				mSource( data, 'set', val, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* Like the get, we need to get data from a nested object */
+			var setData = function (data, val, src) {
+				var a = _fnSplitObjNotation( src ), b;
+				var aLast = a[a.length-1];
+				var arrayNotation, funcNotation, o, innerSrc;
+	
+				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
+				{
+					// Check if we are dealing with an array notation request
+					arrayNotation = a[i].match(__reArray);
+					funcNotation = a[i].match(__reFn);
+	
+					if ( arrayNotation )
+					{
+						a[i] = a[i].replace(__reArray, '');
+						data[ a[i] ] = [];
+	
+						// Get the remainder of the nested object to set so we can recurse
+						b = a.slice();
+						b.splice( 0, i+1 );
+						innerSrc = b.join('.');
+	
+						// Traverse each entry in the array setting the properties requested
+						if ( $.isArray( val ) )
+						{
+							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+							{
+								o = {};
+								setData( o, val[j], innerSrc );
+								data[ a[i] ].push( o );
+							}
+						}
+						else
+						{
+							// We've been asked to save data to an array, but it
+							// isn't array data to be saved. Best that can be done
+							// is to just save the value.
+							data[ a[i] ] = val;
+						}
+	
+						// The inner call to setData has already traversed through the remainder
+						// of the source and has set the data, thus we can exit here
+						return;
+					}
+					else if ( funcNotation )
+					{
+						// Function call
+						a[i] = a[i].replace(__reFn, '');
+						data = data[ a[i] ]( val );
+					}
+	
+					// If the nested object doesn't currently exist - since we are
+					// trying to set the value - create it
+					if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
+					{
+						data[ a[i] ] = {};
+					}
+					data = data[ a[i] ];
+				}
+	
+				// Last item in the input - i.e, the actual set
+				if ( aLast.match(__reFn ) )
+				{
+					// Function call
+					data = data[ aLast.replace(__reFn, '') ]( val );
+				}
+				else
+				{
+					// If array notation is used, we just want to strip it and use the property name
+					// and assign the value. If it isn't used, then we get the result we want anyway
+					data[ aLast.replace(__reArray, '') ] = val;
+				}
+			};
+	
+			return function (data, val) { // meta is also passed in, but not used
+				return setData( data, val, mSource );
+			};
+		}
+		else
+		{
+			/* Array or flat object mapping */
+			return function (data, val) { // meta is also passed in, but not used
+				data[mSource] = val;
+			};
+		}
+	}
+	
+	
+	/**
+	 * Return an array with the full table data
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns array {array} aData Master data array
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetDataMaster ( settings )
+	{
+		return _pluck( settings.aoData, '_aData' );
+	}
+	
+	
+	/**
+	 * Nuke the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnClearTable( settings )
+	{
+		settings.aoData.length = 0;
+		settings.aiDisplayMaster.length = 0;
+		settings.aiDisplay.length = 0;
+		settings.aIds = {};
+	}
+	
+	
+	 /**
+	 * Take an array of integers (index array) and remove a target integer (value - not
+	 * the key!)
+	 *  @param {array} a Index array to target
+	 *  @param {int} iTarget value to find
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDeleteIndex( a, iTarget, splice )
+	{
+		var iTargetIndex = -1;
+	
+		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+		{
+			if ( a[i] == iTarget )
+			{
+				iTargetIndex = i;
+			}
+			else if ( a[i] > iTarget )
+			{
+				a[i]--;
+			}
+		}
+	
+		if ( iTargetIndex != -1 && splice === undefined )
+		{
+			a.splice( iTargetIndex, 1 );
+		}
+	}
+	
+	
+	/**
+	 * Mark cached data as invalid such that a re-read of the data will occur when
+	 * the cached data is next requested. Also update from the data source object.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {int}    rowIdx   Row index to invalidate
+	 * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
+	 *     or 'data'
+	 * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
+	 *     row will be invalidated
+	 * @memberof DataTable#oApi
+	 *
+	 * @todo For the modularisation of v1.11 this will need to become a callback, so
+	 *   the sort and filter methods can subscribe to it. That will required
+	 *   initialisation options for sorting, which is why it is not already baked in
+	 */
+	function _fnInvalidate( settings, rowIdx, src, colIdx )
+	{
+		var row = settings.aoData[ rowIdx ];
+		var i, ien;
+		var cellWrite = function ( cell, col ) {
+			// This is very frustrating, but in IE if you just write directly
+			// to innerHTML, and elements that are overwritten are GC'ed,
+			// even if there is a reference to them elsewhere
+			while ( cell.childNodes.length ) {
+				cell.removeChild( cell.firstChild );
+			}
+	
+			cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
+		};
+	
+		// Are we reading last data from DOM or the data object?
+		if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
+			// Read the data from the DOM
+			row._aData = _fnGetRowElements(
+					settings, row, colIdx, colIdx === undefined ? undefined : row._aData
+				)
+				.data;
+		}
+		else {
+			// Reading from data object, update the DOM
+			var cells = row.anCells;
+	
+			if ( cells ) {
+				if ( colIdx !== undefined ) {
+					cellWrite( cells[colIdx], colIdx );
+				}
+				else {
+					for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+						cellWrite( cells[i], i );
+					}
+				}
+			}
+		}
+	
+		// For both row and cell invalidation, the cached data for sorting and
+		// filtering is nulled out
+		row._aSortData = null;
+		row._aFilterData = null;
+	
+		// Invalidate the type for a specific column (if given) or all columns since
+		// the data might have changed
+		var cols = settings.aoColumns;
+		if ( colIdx !== undefined ) {
+			cols[ colIdx ].sType = null;
+		}
+		else {
+			for ( i=0, ien=cols.length ; i<ien ; i++ ) {
+				cols[i].sType = null;
+			}
+	
+			// Update DataTables special `DT_*` attributes for the row
+			_fnRowAttributes( settings, row );
+		}
+	}
+	
+	
+	/**
+	 * Build a data source object from an HTML row, reading the contents of the
+	 * cells that are in the row.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {node|object} TR element from which to read data or existing row
+	 *   object from which to re-read the data from the cells
+	 * @param {int} [colIdx] Optional column index
+	 * @param {array|object} [d] Data source object. If `colIdx` is given then this
+	 *   parameter should also be given and will be used to write the data into.
+	 *   Only the column in question will be written
+	 * @returns {object} Object with two parameters: `data` the data read, in
+	 *   document order, and `cells` and array of nodes (they can be useful to the
+	 *   caller, so rather than needing a second traversal to get them, just return
+	 *   them from here).
+	 * @memberof DataTable#oApi
+	 */
+	function _fnGetRowElements( settings, row, colIdx, d )
+	{
+		var
+			tds = [],
+			td = row.firstChild,
+			name, col, o, i=0, contents,
+			columns = settings.aoColumns,
+			objectRead = settings._rowReadObject;
+	
+		// Allow the data object to be passed in, or construct
+		d = d !== undefined ?
+			d :
+			objectRead ?
+				{} :
+				[];
+	
+		var attr = function ( str, td  ) {
+			if ( typeof str === 'string' ) {
+				var idx = str.indexOf('@');
+	
+				if ( idx !== -1 ) {
+					var attr = str.substring( idx+1 );
+					var setter = _fnSetObjectDataFn( str );
+					setter( d, td.getAttribute( attr ) );
+				}
+			}
+		};
+	
+		// Read data from a cell and store into the data object
+		var cellProcess = function ( cell ) {
+			if ( colIdx === undefined || colIdx === i ) {
+				col = columns[i];
+				contents = $.trim(cell.innerHTML);
+	
+				if ( col && col._bAttrSrc ) {
+					var setter = _fnSetObjectDataFn( col.mData._ );
+					setter( d, contents );
+	
+					attr( col.mData.sort, cell );
+					attr( col.mData.type, cell );
+					attr( col.mData.filter, cell );
+				}
+				else {
+					// Depending on the `data` option for the columns the data can
+					// be read to either an object or an array.
+					if ( objectRead ) {
+						if ( ! col._setter ) {
+							// Cache the setter function
+							col._setter = _fnSetObjectDataFn( col.mData );
+						}
+						col._setter( d, contents );
+					}
+					else {
+						d[i] = contents;
+					}
+				}
+			}
+	
+			i++;
+		};
+	
+		if ( td ) {
+			// `tr` element was passed in
+			while ( td ) {
+				name = td.nodeName.toUpperCase();
+	
+				if ( name == "TD" || name == "TH" ) {
+					cellProcess( td );
+					tds.push( td );
+				}
+	
+				td = td.nextSibling;
+			}
+		}
+		else {
+			// Existing row object passed in
+			tds = row.anCells;
+	
+			for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
+				cellProcess( tds[j] );
+			}
+		}
+	
+		// Read the ID from the DOM if present
+		var rowNode = row.firstChild ? row : row.nTr;
+	
+		if ( rowNode ) {
+			var id = rowNode.getAttribute( 'id' );
+	
+			if ( id ) {
+				_fnSetObjectDataFn( settings.rowId )( d, id );
+			}
+		}
+	
+		return {
+			data: d,
+			cells: tds
+		};
+	}
+	/**
+	 * Create a new TR element (and it's TD children) for a row
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow Row to consider
+	 *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
+	{
+		var
+			row = oSettings.aoData[iRow],
+			rowData = row._aData,
+			cells = [],
+			nTr, nTd, oCol,
+			i, iLen;
+	
+		if ( row.nTr === null )
+		{
+			nTr = nTrIn || document.createElement('tr');
+	
+			row.nTr = nTr;
+			row.anCells = cells;
+	
+			/* Use a private property on the node to allow reserve mapping from the node
+			 * to the aoData array for fast look up
+			 */
+			nTr._DT_RowIndex = iRow;
+	
+			/* Special parameters can be given by the data source to be used on the row */
+			_fnRowAttributes( oSettings, row );
+	
+			/* Process each column */
+			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+			{
+				oCol = oSettings.aoColumns[i];
+	
+				nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
+				nTd._DT_CellIndex = {
+					row: iRow,
+					column: i
+				};
+				
+				cells.push( nTd );
+	
+				// Need to create the HTML if new, or if a rendering function is defined
+				if ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&
+					 (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
+				) {
+					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
+				}
+	
+				/* Add user defined class */
+				if ( oCol.sClass )
+				{
+					nTd.className += ' '+oCol.sClass;
+				}
+	
+				// Visibility - add or remove as required
+				if ( oCol.bVisible && ! nTrIn )
+				{
+					nTr.appendChild( nTd );
+				}
+				else if ( ! oCol.bVisible && nTrIn )
+				{
+					nTd.parentNode.removeChild( nTd );
+				}
+	
+				if ( oCol.fnCreatedCell )
+				{
+					oCol.fnCreatedCell.call( oSettings.oInstance,
+						nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
+					);
+				}
+			}
+	
+			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
+		}
+	
+		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
+		// and deployed
+		row.nTr.setAttribute( 'role', 'row' );
+	}
+	
+	
+	/**
+	 * Add attributes to a row based on the special `DT_*` parameters in a data
+	 * source object.
+	 *  @param {object} settings DataTables settings object
+	 *  @param {object} DataTables row object for the row to be modified
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnRowAttributes( settings, row )
+	{
+		var tr = row.nTr;
+		var data = row._aData;
+	
+		if ( tr ) {
+			var id = settings.rowIdFn( data );
+	
+			if ( id ) {
+				tr.id = id;
+			}
+	
+			if ( data.DT_RowClass ) {
+				// Remove any classes added by DT_RowClass before
+				var a = data.DT_RowClass.split(' ');
+				row.__rowc = row.__rowc ?
+					_unique( row.__rowc.concat( a ) ) :
+					a;
+	
+				$(tr)
+					.removeClass( row.__rowc.join(' ') )
+					.addClass( data.DT_RowClass );
+			}
+	
+			if ( data.DT_RowAttr ) {
+				$(tr).attr( data.DT_RowAttr );
+			}
+	
+			if ( data.DT_RowData ) {
+				$(tr).data( data.DT_RowData );
+			}
+		}
+	}
+	
+	
+	/**
+	 * Create the HTML header for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBuildHead( oSettings )
+	{
+		var i, ien, cell, row, column;
+		var thead = oSettings.nTHead;
+		var tfoot = oSettings.nTFoot;
+		var createHeader = $('th, td', thead).length === 0;
+		var classes = oSettings.oClasses;
+		var columns = oSettings.aoColumns;
+	
+		if ( createHeader ) {
+			row = $('<tr/>').appendTo( thead );
+		}
+	
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			column = columns[i];
+			cell = $( column.nTh ).addClass( column.sClass );
+	
+			if ( createHeader ) {
+				cell.appendTo( row );
+			}
+	
+			// 1.11 move into sorting
+			if ( oSettings.oFeatures.bSort ) {
+				cell.addClass( column.sSortingClass );
+	
+				if ( column.bSortable !== false ) {
+					cell
+						.attr( 'tabindex', oSettings.iTabIndex )
+						.attr( 'aria-controls', oSettings.sTableId );
+	
+					_fnSortAttachListener( oSettings, column.nTh, i );
+				}
+			}
+	
+			if ( column.sTitle != cell[0].innerHTML ) {
+				cell.html( column.sTitle );
+			}
+	
+			_fnRenderer( oSettings, 'header' )(
+				oSettings, cell, column, classes
+			);
+		}
+	
+		if ( createHeader ) {
+			_fnDetectHeader( oSettings.aoHeader, thead );
+		}
+		
+		/* ARIA role for the rows */
+	 	$(thead).find('>tr').attr('role', 'row');
+	
+		/* Deal with the footer - add classes if required */
+		$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
+		$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
+	
+		// Cache the footer cells. Note that we only take the cells from the first
+		// row in the footer. If there is more than one row the user wants to
+		// interact with, they need to use the table().foot() method. Note also this
+		// allows cells to be used for multiple columns using colspan
+		if ( tfoot !== null ) {
+			var cells = oSettings.aoFooter[0];
+	
+			for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+				column = columns[i];
+				column.nTf = cells[i].cell;
+	
+				if ( column.sClass ) {
+					$(column.nTf).addClass( column.sClass );
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Draw the header (or footer) element based on the column visibility states. The
+	 * methodology here is to use the layout array from _fnDetectHeader, modified for
+	 * the instantaneous column visibility, to construct the new layout. The grid is
+	 * traversed over cell at a time in a rows x columns grid fashion, although each
+	 * cell insert can cover multiple elements in the grid - which is tracks using the
+	 * aApplied array. Cell inserts in the grid will only occur where there isn't
+	 * already a cell in that position.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param array {objects} aoSource Layout array from _fnDetectHeader
+	 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+	{
+		var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+		var aoLocal = [];
+		var aApplied = [];
+		var iColumns = oSettings.aoColumns.length;
+		var iRowspan, iColspan;
+	
+		if ( ! aoSource )
+		{
+			return;
+		}
+	
+		if (  bIncludeHidden === undefined )
+		{
+			bIncludeHidden = false;
+		}
+	
+		/* Make a copy of the master layout array, but without the visible columns in it */
+		for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+		{
+			aoLocal[i] = aoSource[i].slice();
+			aoLocal[i].nTr = aoSource[i].nTr;
+	
+			/* Remove any columns which are currently hidden */
+			for ( j=iColumns-1 ; j>=0 ; j-- )
+			{
+				if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+				{
+					aoLocal[i].splice( j, 1 );
+				}
+			}
+	
+			/* Prep the applied array - it needs an element for each row */
+			aApplied.push( [] );
+		}
+	
+		for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+		{
+			nLocalTr = aoLocal[i].nTr;
+	
+			/* All cells are going to be replaced, so empty out the row */
+			if ( nLocalTr )
+			{
+				while( (n = nLocalTr.firstChild) )
+				{
+					nLocalTr.removeChild( n );
+				}
+			}
+	
+			for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+			{
+				iRowspan = 1;
+				iColspan = 1;
+	
+				/* Check to see if there is already a cell (row/colspan) covering our target
+				 * insert point. If there is, then there is nothing to do.
+				 */
+				if ( aApplied[i][j] === undefined )
+				{
+					nLocalTr.appendChild( aoLocal[i][j].cell );
+					aApplied[i][j] = 1;
+	
+					/* Expand the cell to cover as many rows as needed */
+					while ( aoLocal[i+iRowspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
+					{
+						aApplied[i+iRowspan][j] = 1;
+						iRowspan++;
+					}
+	
+					/* Expand the cell to cover as many columns as needed */
+					while ( aoLocal[i][j+iColspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
+					{
+						/* Must update the applied array over the rows for the columns */
+						for ( k=0 ; k<iRowspan ; k++ )
+						{
+							aApplied[i+k][j+iColspan] = 1;
+						}
+						iColspan++;
+					}
+	
+					/* Do the actual expansion in the DOM */
+					$(aoLocal[i][j].cell)
+						.attr('rowspan', iRowspan)
+						.attr('colspan', iColspan);
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Insert the required TR nodes into the table for display
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDraw( oSettings )
+	{
+		/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+		var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+		if ( $.inArray( false, aPreDraw ) !== -1 )
+		{
+			_fnProcessingDisplay( oSettings, false );
+			return;
+		}
+	
+		var i, iLen, n;
+		var anRows = [];
+		var iRowCount = 0;
+		var asStripeClasses = oSettings.asStripeClasses;
+		var iStripes = asStripeClasses.length;
+		var iOpenRows = oSettings.aoOpenRows.length;
+		var oLang = oSettings.oLanguage;
+		var iInitDisplayStart = oSettings.iInitDisplayStart;
+		var bServerSide = _fnDataSource( oSettings ) == 'ssp';
+		var aiDisplay = oSettings.aiDisplay;
+	
+		oSettings.bDrawing = true;
+	
+		/* Check and see if we have an initial draw position from state saving */
+		if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
+		{
+			oSettings._iDisplayStart = bServerSide ?
+				iInitDisplayStart :
+				iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
+					0 :
+					iInitDisplayStart;
+	
+			oSettings.iInitDisplayStart = -1;
+		}
+	
+		var iDisplayStart = oSettings._iDisplayStart;
+		var iDisplayEnd = oSettings.fnDisplayEnd();
+	
+		/* Server-side processing draw intercept */
+		if ( oSettings.bDeferLoading )
+		{
+			oSettings.bDeferLoading = false;
+			oSettings.iDraw++;
+			_fnProcessingDisplay( oSettings, false );
+		}
+		else if ( !bServerSide )
+		{
+			oSettings.iDraw++;
+		}
+		else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+		{
+			return;
+		}
+	
+		if ( aiDisplay.length !== 0 )
+		{
+			var iStart = bServerSide ? 0 : iDisplayStart;
+			var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
+	
+			for ( var j=iStart ; j<iEnd ; j++ )
+			{
+				var iDataIndex = aiDisplay[j];
+				var aoData = oSettings.aoData[ iDataIndex ];
+				if ( aoData.nTr === null )
+				{
+					_fnCreateTr( oSettings, iDataIndex );
+				}
+	
+				var nRow = aoData.nTr;
+	
+				/* Remove the old striping classes and then add the new one */
+				if ( iStripes !== 0 )
+				{
+					var sStripe = asStripeClasses[ iRowCount % iStripes ];
+					if ( aoData._sRowStripe != sStripe )
+					{
+						$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+						aoData._sRowStripe = sStripe;
+					}
+				}
+	
+				// Row callback functions - might want to manipulate the row
+				// iRowCount and j are not currently documented. Are they at all
+				// useful?
+				_fnCallbackFire( oSettings, 'aoRowCallback', null,
+					[nRow, aoData._aData, iRowCount, j] );
+	
+				anRows.push( nRow );
+				iRowCount++;
+			}
+		}
+		else
+		{
+			/* Table is empty - create a row with an empty message in it */
+			var sZero = oLang.sZeroRecords;
+			if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
+			{
+				sZero = oLang.sLoadingRecords;
+			}
+			else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
+			{
+				sZero = oLang.sEmptyTable;
+			}
+	
+			anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
+				.append( $('<td />', {
+					'valign':  'top',
+					'colSpan': _fnVisbleColumns( oSettings ),
+					'class':   oSettings.oClasses.sRowEmpty
+				} ).html( sZero ) )[0];
+		}
+	
+		/* Header and footer callbacks */
+		_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		var body = $(oSettings.nTBody);
+	
+		body.children().detach();
+		body.append( $(anRows) );
+	
+		/* Call all required callback functions for the end of a draw */
+		_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+	
+		/* Draw is complete, sorting and filtering must be as well */
+		oSettings.bSorted = false;
+		oSettings.bFiltered = false;
+		oSettings.bDrawing = false;
+	}
+	
+	
+	/**
+	 * Redraw the table - taking account of the various features which are enabled
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {boolean} [holdPosition] Keep the current paging position. By default
+	 *    the paging is reset to the first page
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReDraw( settings, holdPosition )
+	{
+		var
+			features = settings.oFeatures,
+			sort     = features.bSort,
+			filter   = features.bFilter;
+	
+		if ( sort ) {
+			_fnSort( settings );
+		}
+	
+		if ( filter ) {
+			_fnFilterComplete( settings, settings.oPreviousSearch );
+		}
+		else {
+			// No filtering, so we want to just use the display master
+			settings.aiDisplay = settings.aiDisplayMaster.slice();
+		}
+	
+		if ( holdPosition !== true ) {
+			settings._iDisplayStart = 0;
+		}
+	
+		// Let any modules know about the draw hold position state (used by
+		// scrolling internally)
+		settings._drawHold = holdPosition;
+	
+		_fnDraw( settings );
+	
+		settings._drawHold = false;
+	}
+	
+	
+	/**
+	 * Add the options to the page HTML for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddOptionsHtml ( oSettings )
+	{
+		var classes = oSettings.oClasses;
+		var table = $(oSettings.nTable);
+		var holding = $('<div/>').insertBefore( table ); // Holding element for speed
+		var features = oSettings.oFeatures;
+	
+		// All DataTables are wrapped in a div
+		var insert = $('<div/>', {
+			id:      oSettings.sTableId+'_wrapper',
+			'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
+		} );
+	
+		oSettings.nHolding = holding[0];
+		oSettings.nTableWrapper = insert[0];
+		oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+	
+		/* Loop over the user set positioning and place the elements as needed */
+		var aDom = oSettings.sDom.split('');
+		var featureNode, cOption, nNewNode, cNext, sAttr, j;
+		for ( var i=0 ; i<aDom.length ; i++ )
+		{
+			featureNode = null;
+			cOption = aDom[i];
+	
+			if ( cOption == '<' )
+			{
+				/* New container div */
+				nNewNode = $('<div/>')[0];
+	
+				/* Check to see if we should append an id and/or a class name to the container */
+				cNext = aDom[i+1];
+				if ( cNext == "'" || cNext == '"' )
+				{
+					sAttr = "";
+					j = 2;
+					while ( aDom[i+j] != cNext )
+					{
+						sAttr += aDom[i+j];
+						j++;
+					}
+	
+					/* Replace jQuery UI constants @todo depreciated */
+					if ( sAttr == "H" )
+					{
+						sAttr = classes.sJUIHeader;
+					}
+					else if ( sAttr == "F" )
+					{
+						sAttr = classes.sJUIFooter;
+					}
+	
+					/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+					 * breaks the string into parts and applies them as needed
+					 */
+					if ( sAttr.indexOf('.') != -1 )
+					{
+						var aSplit = sAttr.split('.');
+						nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+						nNewNode.className = aSplit[1];
+					}
+					else if ( sAttr.charAt(0) == "#" )
+					{
+						nNewNode.id = sAttr.substr(1, sAttr.length-1);
+					}
+					else
+					{
+						nNewNode.className = sAttr;
+					}
+	
+					i += j; /* Move along the position array */
+				}
+	
+				insert.append( nNewNode );
+				insert = $(nNewNode);
+			}
+			else if ( cOption == '>' )
+			{
+				/* End container div */
+				insert = insert.parent();
+			}
+			// @todo Move options into their own plugins?
+			else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
+			{
+				/* Length */
+				featureNode = _fnFeatureHtmlLength( oSettings );
+			}
+			else if ( cOption == 'f' && features.bFilter )
+			{
+				/* Filter */
+				featureNode = _fnFeatureHtmlFilter( oSettings );
+			}
+			else if ( cOption == 'r' && features.bProcessing )
+			{
+				/* pRocessing */
+				featureNode = _fnFeatureHtmlProcessing( oSettings );
+			}
+			else if ( cOption == 't' )
+			{
+				/* Table */
+				featureNode = _fnFeatureHtmlTable( oSettings );
+			}
+			else if ( cOption ==  'i' && features.bInfo )
+			{
+				/* Info */
+				featureNode = _fnFeatureHtmlInfo( oSettings );
+			}
+			else if ( cOption == 'p' && features.bPaginate )
+			{
+				/* Pagination */
+				featureNode = _fnFeatureHtmlPaginate( oSettings );
+			}
+			else if ( DataTable.ext.feature.length !== 0 )
+			{
+				/* Plug-in features */
+				var aoFeatures = DataTable.ext.feature;
+				for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+				{
+					if ( cOption == aoFeatures[k].cFeature )
+					{
+						featureNode = aoFeatures[k].fnInit( oSettings );
+						break;
+					}
+				}
+			}
+	
+			/* Add to the 2D features array */
+			if ( featureNode )
+			{
+				var aanFeatures = oSettings.aanFeatures;
+	
+				if ( ! aanFeatures[cOption] )
+				{
+					aanFeatures[cOption] = [];
+				}
+	
+				aanFeatures[cOption].push( featureNode );
+				insert.append( featureNode );
+			}
+		}
+	
+		/* Built our DOM structure - replace the holding div with what we want */
+		holding.replaceWith( insert );
+		oSettings.nHolding = null;
+	}
+	
+	
+	/**
+	 * Use the DOM source to create up an array of header cells. The idea here is to
+	 * create a layout grid (array) of rows x columns, which contains a reference
+	 * to the cell that that point in the grid (regardless of col/rowspan), such that
+	 * any column / row could be removed and the new grid constructed
+	 *  @param array {object} aLayout Array to store the calculated layout in
+	 *  @param {node} nThead The header/footer element for the table
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDetectHeader ( aLayout, nThead )
+	{
+		var nTrs = $(nThead).children('tr');
+		var nTr, nCell;
+		var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+		var bUnique;
+		var fnShiftCol = function ( a, i, j ) {
+			var k = a[i];
+	                while ( k[j] ) {
+				j++;
+			}
+			return j;
+		};
+	
+		aLayout.splice( 0, aLayout.length );
+	
+		/* We know how many rows there are in the layout - so prep it */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+		{
+			aLayout.push( [] );
+		}
+	
+		/* Calculate a layout array */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+		{
+			nTr = nTrs[i];
+			iColumn = 0;
+	
+			/* For every cell in the row... */
+			nCell = nTr.firstChild;
+			while ( nCell ) {
+				if ( nCell.nodeName.toUpperCase() == "TD" ||
+				     nCell.nodeName.toUpperCase() == "TH" )
+				{
+					/* Get the col and rowspan attributes from the DOM and sanitise them */
+					iColspan = nCell.getAttribute('colspan') * 1;
+					iRowspan = nCell.getAttribute('rowspan') * 1;
+					iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+					iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+	
+					/* There might be colspan cells already in this row, so shift our target
+					 * accordingly
+					 */
+					iColShifted = fnShiftCol( aLayout, i, iColumn );
+	
+					/* Cache calculation for unique columns */
+					bUnique = iColspan === 1 ? true : false;
+	
+					/* If there is col / rowspan, copy the information into the layout grid */
+					for ( l=0 ; l<iColspan ; l++ )
+					{
+						for ( k=0 ; k<iRowspan ; k++ )
+						{
+							aLayout[i+k][iColShifted+l] = {
+								"cell": nCell,
+								"unique": bUnique
+							};
+							aLayout[i+k].nTr = nTr;
+						}
+					}
+				}
+				nCell = nCell.nextSibling;
+			}
+		}
+	}
+	
+	
+	/**
+	 * Get an array of unique th elements, one for each column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nHeader automatically detect the layout from this node - optional
+	 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+	 *  @returns array {node} aReturn list of unique th's
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+	{
+		var aReturn = [];
+		if ( !aLayout )
+		{
+			aLayout = oSettings.aoHeader;
+			if ( nHeader )
+			{
+				aLayout = [];
+				_fnDetectHeader( aLayout, nHeader );
+			}
+		}
+	
+		for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+		{
+			for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+			{
+				if ( aLayout[i][j].unique &&
+					 (!aReturn[j] || !oSettings.bSortCellsTop) )
+				{
+					aReturn[j] = aLayout[i][j].cell;
+				}
+			}
+		}
+	
+		return aReturn;
+	}
+	
+	/**
+	 * Create an Ajax call based on the table's settings, taking into account that
+	 * parameters can have multiple forms, and backwards compatibility.
+	 *
+	 * @param {object} oSettings dataTables settings object
+	 * @param {array} data Data to send to the server, required by
+	 *     DataTables - may be augmented by developer callbacks
+	 * @param {function} fn Callback function to run when data is obtained
+	 */
+	function _fnBuildAjax( oSettings, data, fn )
+	{
+		// Compatibility with 1.9-, allow fnServerData and event to manipulate
+		_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
+	
+		// Convert to object based for 1.10+ if using the old array scheme which can
+		// come from server-side processing or serverParams
+		if ( data && $.isArray(data) ) {
+			var tmp = {};
+			var rbracket = /(.*?)\[\]$/;
+	
+			$.each( data, function (key, val) {
+				var match = val.name.match(rbracket);
+	
+				if ( match ) {
+					// Support for arrays
+					var name = match[0];
+	
+					if ( ! tmp[ name ] ) {
+						tmp[ name ] = [];
+					}
+					tmp[ name ].push( val.value );
+				}
+				else {
+					tmp[val.name] = val.value;
+				}
+			} );
+			data = tmp;
+		}
+	
+		var ajaxData;
+		var ajax = oSettings.ajax;
+		var instance = oSettings.oInstance;
+		var callback = function ( json ) {
+			_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
+			fn( json );
+		};
+	
+		if ( $.isPlainObject( ajax ) && ajax.data )
+		{
+			ajaxData = ajax.data;
+	
+			var newData = $.isFunction( ajaxData ) ?
+				ajaxData( data, oSettings ) :  // fn can manipulate data or return
+				ajaxData;                      // an object object or array to merge
+	
+			// If the function returned something, use that alone
+			data = $.isFunction( ajaxData ) && newData ?
+				newData :
+				$.extend( true, data, newData );
+	
+			// Remove the data property as we've resolved it already and don't want
+			// jQuery to do it again (it is restored at the end of the function)
+			delete ajax.data;
+		}
+	
+		var baseAjax = {
+			"data": data,
+			"success": function (json) {
+				var error = json.error || json.sError;
+				if ( error ) {
+					_fnLog( oSettings, 0, error );
+				}
+	
+				oSettings.json = json;
+				callback( json );
+			},
+			"dataType": "json",
+			"cache": false,
+			"type": oSettings.sServerMethod,
+			"error": function (xhr, error, thrown) {
+				var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
+	
+				if ( $.inArray( true, ret ) === -1 ) {
+					if ( error == "parsererror" ) {
+						_fnLog( oSettings, 0, 'Invalid JSON response', 1 );
+					}
+					else if ( xhr.readyState === 4 ) {
+						_fnLog( oSettings, 0, 'Ajax error', 7 );
+					}
+				}
+	
+				_fnProcessingDisplay( oSettings, false );
+			}
+		};
+	
+		// Store the data submitted for the API
+		oSettings.oAjaxData = data;
+	
+		// Allow plug-ins and external processes to modify the data
+		_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
+	
+		if ( oSettings.fnServerData )
+		{
+			// DataTables 1.9- compatibility
+			oSettings.fnServerData.call( instance,
+				oSettings.sAjaxSource,
+				$.map( data, function (val, key) { // Need to convert back to 1.9 trad format
+					return { name: key, value: val };
+				} ),
+				callback,
+				oSettings
+			);
+		}
+		else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
+		{
+			// DataTables 1.9- compatibility
+			oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
+				url: ajax || oSettings.sAjaxSource
+			} ) );
+		}
+		else if ( $.isFunction( ajax ) )
+		{
+			// Is a function - let the caller define what needs to be done
+			oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
+		}
+		else
+		{
+			// Object to extend the base settings
+			oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
+	
+			// Restore for next time around
+			ajax.data = ajaxData;
+		}
+	}
+	
+	
+	/**
+	 * Update the table using an Ajax call
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {boolean} Block the table drawing or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxUpdate( settings )
+	{
+		if ( settings.bAjaxDataGet ) {
+			settings.iDraw++;
+			_fnProcessingDisplay( settings, true );
+	
+			_fnBuildAjax(
+				settings,
+				_fnAjaxParameters( settings ),
+				function(json) {
+					_fnAjaxUpdateDraw( settings, json );
+				}
+			);
+	
+			return false;
+		}
+		return true;
+	}
+	
+	
+	/**
+	 * Build up the parameters in an object needed for a server-side processing
+	 * request. Note that this is basically done twice, is different ways - a modern
+	 * method which is used by default in DataTables 1.10 which uses objects and
+	 * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
+	 * the sAjaxSource option is used in the initialisation, or the legacyAjax
+	 * option is set.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {bool} block the table drawing or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxParameters( settings )
+	{
+		var
+			columns = settings.aoColumns,
+			columnCount = columns.length,
+			features = settings.oFeatures,
+			preSearch = settings.oPreviousSearch,
+			preColSearch = settings.aoPreSearchCols,
+			i, data = [], dataProp, column, columnSearch,
+			sort = _fnSortFlatten( settings ),
+			displayStart = settings._iDisplayStart,
+			displayLength = features.bPaginate !== false ?
+				settings._iDisplayLength :
+				-1;
+	
+		var param = function ( name, value ) {
+			data.push( { 'name': name, 'value': value } );
+		};
+	
+		// DataTables 1.9- compatible method
+		param( 'sEcho',          settings.iDraw );
+		param( 'iColumns',       columnCount );
+		param( 'sColumns',       _pluck( columns, 'sName' ).join(',') );
+		param( 'iDisplayStart',  displayStart );
+		param( 'iDisplayLength', displayLength );
+	
+		// DataTables 1.10+ method
+		var d = {
+			draw:    settings.iDraw,
+			columns: [],
+			order:   [],
+			start:   displayStart,
+			length:  displayLength,
+			search:  {
+				value: preSearch.sSearch,
+				regex: preSearch.bRegex
+			}
+		};
+	
+		for ( i=0 ; i<columnCount ; i++ ) {
+			column = columns[i];
+			columnSearch = preColSearch[i];
+			dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
+	
+			d.columns.push( {
+				data:       dataProp,
+				name:       column.sName,
+				searchable: column.bSearchable,
+				orderable:  column.bSortable,
+				search:     {
+					value: columnSearch.sSearch,
+					regex: columnSearch.bRegex
+				}
+			} );
+	
+			param( "mDataProp_"+i, dataProp );
+	
+			if ( features.bFilter ) {
+				param( 'sSearch_'+i,     columnSearch.sSearch );
+				param( 'bRegex_'+i,      columnSearch.bRegex );
+				param( 'bSearchable_'+i, column.bSearchable );
+			}
+	
+			if ( features.bSort ) {
+				param( 'bSortable_'+i, column.bSortable );
+			}
+		}
+	
+		if ( features.bFilter ) {
+			param( 'sSearch', preSearch.sSearch );
+			param( 'bRegex', preSearch.bRegex );
+		}
+	
+		if ( features.bSort ) {
+			$.each( sort, function ( i, val ) {
+				d.order.push( { column: val.col, dir: val.dir } );
+	
+				param( 'iSortCol_'+i, val.col );
+				param( 'sSortDir_'+i, val.dir );
+			} );
+	
+			param( 'iSortingCols', sort.length );
+		}
+	
+		// If the legacy.ajax parameter is null, then we automatically decide which
+		// form to use, based on sAjaxSource
+		var legacy = DataTable.ext.legacy.ajax;
+		if ( legacy === null ) {
+			return settings.sAjaxSource ? data : d;
+		}
+	
+		// Otherwise, if legacy has been specified then we use that to decide on the
+		// form
+		return legacy ? data : d;
+	}
+	
+	
+	/**
+	 * Data the data from the server (nuking the old) and redraw the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} json json data return from the server.
+	 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
+	 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
+	 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
+	 *  @param {array} json.aaData The data to display on this page
+	 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxUpdateDraw ( settings, json )
+	{
+		// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
+		// Support both
+		var compat = function ( old, modern ) {
+			return json[old] !== undefined ? json[old] : json[modern];
+		};
+	
+		var data = _fnAjaxDataSrc( settings, json );
+		var draw            = compat( 'sEcho',                'draw' );
+		var recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );
+		var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
+	
+		if ( draw ) {
+			// Protect against out of sequence returns
+			if ( draw*1 < settings.iDraw ) {
+				return;
+			}
+			settings.iDraw = draw * 1;
+		}
+	
+		_fnClearTable( settings );
+		settings._iRecordsTotal   = parseInt(recordsTotal, 10);
+		settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
+	
+		for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+			_fnAddData( settings, data[i] );
+		}
+		settings.aiDisplay = settings.aiDisplayMaster.slice();
+	
+		settings.bAjaxDataGet = false;
+		_fnDraw( settings );
+	
+		if ( ! settings._bInitComplete ) {
+			_fnInitComplete( settings, json );
+		}
+	
+		settings.bAjaxDataGet = true;
+		_fnProcessingDisplay( settings, false );
+	}
+	
+	
+	/**
+	 * Get the data from the JSON data source to use for drawing a table. Using
+	 * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
+	 * source object, or from a processing function.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param  {object} json Data source object / array from the server
+	 *  @return {array} Array of data to use
+	 */
+	function _fnAjaxDataSrc ( oSettings, json )
+	{
+		var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
+			oSettings.ajax.dataSrc :
+			oSettings.sAjaxDataProp; // Compatibility with 1.9-.
+	
+		// Compatibility with 1.9-. In order to read from aaData, check if the
+		// default has been changed, if not, check for aaData
+		if ( dataSrc === 'data' ) {
+			return json.aaData || json[dataSrc];
+		}
+	
+		return dataSrc !== "" ?
+			_fnGetObjectDataFn( dataSrc )( json ) :
+			json;
+	}
+	
+	/**
+	 * Generate the node required for filtering text
+	 *  @returns {node} Filter control element
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlFilter ( settings )
+	{
+		var classes = settings.oClasses;
+		var tableId = settings.sTableId;
+		var language = settings.oLanguage;
+		var previousSearch = settings.oPreviousSearch;
+		var features = settings.aanFeatures;
+		var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
+	
+		var str = language.sSearch;
+		str = str.match(/_INPUT_/) ?
+			str.replace('_INPUT_', input) :
+			str+input;
+	
+		var filter = $('<div/>', {
+				'id': ! features.f ? tableId+'_filter' : null,
+				'class': classes.sFilter
+			} )
+			.append( $('<label/>' ).append( str ) );
+	
+		var searchFn = function() {
+			/* Update all other filter input elements for the new display */
+			var n = features.f;
+			var val = !this.value ? "" : this.value; // mental IE8 fix :-(
+	
+			/* Now do the filter */
+			if ( val != previousSearch.sSearch ) {
+				_fnFilterComplete( settings, {
+					"sSearch": val,
+					"bRegex": previousSearch.bRegex,
+					"bSmart": previousSearch.bSmart ,
+					"bCaseInsensitive": previousSearch.bCaseInsensitive
+				} );
+	
+				// Need to redraw, without resorting
+				settings._iDisplayStart = 0;
+				_fnDraw( settings );
+			}
+		};
+	
+		var searchDelay = settings.searchDelay !== null ?
+			settings.searchDelay :
+			_fnDataSource( settings ) === 'ssp' ?
+				400 :
+				0;
+	
+		var jqFilter = $('input', filter)
+			.val( previousSearch.sSearch )
+			.attr( 'placeholder', language.sSearchPlaceholder )
+			.on(
+				'keyup.DT search.DT input.DT paste.DT cut.DT',
+				searchDelay ?
+					_fnThrottle( searchFn, searchDelay ) :
+					searchFn
+			)
+			.on( 'keypress.DT', function(e) {
+				/* Prevent form submission */
+				if ( e.keyCode == 13 ) {
+					return false;
+				}
+			} )
+			.attr('aria-controls', tableId);
+	
+		// Update the input elements whenever the table is filtered
+		$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
+			if ( settings === s ) {
+				// IE9 throws an 'unknown error' if document.activeElement is used
+				// inside an iframe or frame...
+				try {
+					if ( jqFilter[0] !== document.activeElement ) {
+						jqFilter.val( previousSearch.sSearch );
+					}
+				}
+				catch ( e ) {}
+			}
+		} );
+	
+		return filter[0];
+	}
+	
+	
+	/**
+	 * Filter the table using both the global filter and column based filtering
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} oSearch search information
+	 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterComplete ( oSettings, oInput, iForce )
+	{
+		var oPrevSearch = oSettings.oPreviousSearch;
+		var aoPrevSearch = oSettings.aoPreSearchCols;
+		var fnSaveFilter = function ( oFilter ) {
+			/* Save the filtering values */
+			oPrevSearch.sSearch = oFilter.sSearch;
+			oPrevSearch.bRegex = oFilter.bRegex;
+			oPrevSearch.bSmart = oFilter.bSmart;
+			oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+		};
+		var fnRegex = function ( o ) {
+			// Backwards compatibility with the bEscapeRegex option
+			return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
+		};
+	
+		// Resolve any column types that are unknown due to addition or invalidation
+		// @todo As per sort - can this be moved into an event handler?
+		_fnColumnTypes( oSettings );
+	
+		/* In server-side processing all filtering is done by the server, so no point hanging around here */
+		if ( _fnDataSource( oSettings ) != 'ssp' )
+		{
+			/* Global filter */
+			_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
+			fnSaveFilter( oInput );
+	
+			/* Now do the individual column filter */
+			for ( var i=0 ; i<aoPrevSearch.length ; i++ )
+			{
+				_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
+					aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+			}
+	
+			/* Custom filtering */
+			_fnFilterCustom( oSettings );
+		}
+		else
+		{
+			fnSaveFilter( oInput );
+		}
+	
+		/* Tell the draw function we have been filtering */
+		oSettings.bFiltered = true;
+		_fnCallbackFire( oSettings, null, 'search', [oSettings] );
+	}
+	
+	
+	/**
+	 * Apply custom filtering functions
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterCustom( settings )
+	{
+		var filters = DataTable.ext.search;
+		var displayRows = settings.aiDisplay;
+		var row, rowIdx;
+	
+		for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
+			var rows = [];
+	
+			// Loop over each row and see if it should be included
+			for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
+				rowIdx = displayRows[ j ];
+				row = settings.aoData[ rowIdx ];
+	
+				if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
+					rows.push( rowIdx );
+				}
+			}
+	
+			// So the array reference doesn't break set the results into the
+			// existing array
+			displayRows.length = 0;
+			$.merge( displayRows, rows );
+		}
+	}
+	
+	
+	/**
+	 * Filter the table on a per-column basis
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sInput string to filter on
+	 *  @param {int} iColumn column to filter
+	 *  @param {bool} bRegex treat search string as a regular expression or not
+	 *  @param {bool} bSmart use smart filtering or not
+	 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
+	{
+		if ( searchStr === '' ) {
+			return;
+		}
+	
+		var data;
+		var out = [];
+		var display = settings.aiDisplay;
+		var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
+	
+		for ( var i=0 ; i<display.length ; i++ ) {
+			data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
+	
+			if ( rpSearch.test( data ) ) {
+				out.push( display[i] );
+			}
+		}
+	
+		settings.aiDisplay = out;
+	}
+	
+	
+	/**
+	 * Filter the data table based on user input and draw the table
+	 *  @param {object} settings dataTables settings object
+	 *  @param {string} input string to filter on
+	 *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
+	 *  @param {bool} regex treat as a regular expression or not
+	 *  @param {bool} smart perform smart filtering or not
+	 *  @param {bool} caseInsensitive Do case insenstive matching or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
+	{
+		var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
+		var prevSearch = settings.oPreviousSearch.sSearch;
+		var displayMaster = settings.aiDisplayMaster;
+		var display, invalidated, i;
+		var filtered = [];
+	
+		// Need to take account of custom filtering functions - always filter
+		if ( DataTable.ext.search.length !== 0 ) {
+			force = true;
+		}
+	
+		// Check if any of the rows were invalidated
+		invalidated = _fnFilterData( settings );
+	
+		// If the input is blank - we just want the full data set
+		if ( input.length <= 0 ) {
+			settings.aiDisplay = displayMaster.slice();
+		}
+		else {
+			// New search - start from the master array
+			if ( invalidated ||
+				 force ||
+				 prevSearch.length > input.length ||
+				 input.indexOf(prevSearch) !== 0 ||
+				 settings.bSorted // On resort, the display master needs to be
+				                  // re-filtered since indexes will have changed
+			) {
+				settings.aiDisplay = displayMaster.slice();
+			}
+	
+			// Search the display array
+			display = settings.aiDisplay;
+	
+			for ( i=0 ; i<display.length ; i++ ) {
+				if ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
+					filtered.push( display[i] );
+				}
+			}
+	
+			settings.aiDisplay = filtered;
+		}
+	}
+	
+	
+	/**
+	 * Build a regular expression object suitable for searching a table
+	 *  @param {string} sSearch string to search for
+	 *  @param {bool} bRegex treat as a regular expression or not
+	 *  @param {bool} bSmart perform smart filtering or not
+	 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
+	 *  @returns {RegExp} constructed object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
+	{
+		search = regex ?
+			search :
+			_fnEscapeRegex( search );
+		
+		if ( smart ) {
+			/* For smart filtering we want to allow the search to work regardless of
+			 * word order. We also want double quoted text to be preserved, so word
+			 * order is important - a la google. So this is what we want to
+			 * generate:
+			 * 
+			 * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
+			 */
+			var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
+				if ( word.charAt(0) === '"' ) {
+					var m = word.match( /^"(.*)"$/ );
+					word = m ? m[1] : word;
+				}
+	
+				return word.replace('"', '');
+			} );
+	
+			search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
+		}
+	
+		return new RegExp( search, caseInsensitive ? 'i' : '' );
+	}
+	
+	
+	/**
+	 * Escape a string such that it can be used in a regular expression
+	 *  @param {string} sVal string to escape
+	 *  @returns {string} escaped string
+	 *  @memberof DataTable#oApi
+	 */
+	var _fnEscapeRegex = DataTable.util.escapeRegex;
+	
+	var __filter_div = $('<div>')[0];
+	var __filter_div_textContent = __filter_div.textContent !== undefined;
+	
+	// Update the filtering data for each row if needed (by invalidation or first run)
+	function _fnFilterData ( settings )
+	{
+		var columns = settings.aoColumns;
+		var column;
+		var i, j, ien, jen, filterData, cellData, row;
+		var fomatters = DataTable.ext.type.search;
+		var wasInvalidated = false;
+	
+		for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			row = settings.aoData[i];
+	
+			if ( ! row._aFilterData ) {
+				filterData = [];
+	
+				for ( j=0, jen=columns.length ; j<jen ; j++ ) {
+					column = columns[j];
+	
+					if ( column.bSearchable ) {
+						cellData = _fnGetCellData( settings, i, j, 'filter' );
+	
+						if ( fomatters[ column.sType ] ) {
+							cellData = fomatters[ column.sType ]( cellData );
+						}
+	
+						// Search in DataTables 1.10 is string based. In 1.11 this
+						// should be altered to also allow strict type checking.
+						if ( cellData === null ) {
+							cellData = '';
+						}
+	
+						if ( typeof cellData !== 'string' && cellData.toString ) {
+							cellData = cellData.toString();
+						}
+					}
+					else {
+						cellData = '';
+					}
+	
+					// If it looks like there is an HTML entity in the string,
+					// attempt to decode it so sorting works as expected. Note that
+					// we could use a single line of jQuery to do this, but the DOM
+					// method used here is much faster http://jsperf.com/html-decode
+					if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
+						__filter_div.innerHTML = cellData;
+						cellData = __filter_div_textContent ?
+							__filter_div.textContent :
+							__filter_div.innerText;
+					}
+	
+					if ( cellData.replace ) {
+						cellData = cellData.replace(/[\r\n]/g, '');
+					}
+	
+					filterData.push( cellData );
+				}
+	
+				row._aFilterData = filterData;
+				row._sFilterRow = filterData.join('  ');
+				wasInvalidated = true;
+			}
+		}
+	
+		return wasInvalidated;
+	}
+	
+	
+	/**
+	 * Convert from the internal Hungarian notation to camelCase for external
+	 * interaction
+	 *  @param {object} obj Object to convert
+	 *  @returns {object} Inverted object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSearchToCamel ( obj )
+	{
+		return {
+			search:          obj.sSearch,
+			smart:           obj.bSmart,
+			regex:           obj.bRegex,
+			caseInsensitive: obj.bCaseInsensitive
+		};
+	}
+	
+	
+	
+	/**
+	 * Convert from camelCase notation to the internal Hungarian. We could use the
+	 * Hungarian convert function here, but this is cleaner
+	 *  @param {object} obj Object to convert
+	 *  @returns {object} Inverted object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSearchToHung ( obj )
+	{
+		return {
+			sSearch:          obj.search,
+			bSmart:           obj.smart,
+			bRegex:           obj.regex,
+			bCaseInsensitive: obj.caseInsensitive
+		};
+	}
+	
+	/**
+	 * Generate the node required for the info display
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {node} Information element
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlInfo ( settings )
+	{
+		var
+			tid = settings.sTableId,
+			nodes = settings.aanFeatures.i,
+			n = $('<div/>', {
+				'class': settings.oClasses.sInfo,
+				'id': ! nodes ? tid+'_info' : null
+			} );
+	
+		if ( ! nodes ) {
+			// Update display on each draw
+			settings.aoDrawCallback.push( {
+				"fn": _fnUpdateInfo,
+				"sName": "information"
+			} );
+	
+			n
+				.attr( 'role', 'status' )
+				.attr( 'aria-live', 'polite' );
+	
+			// Table is described by our info div
+			$(settings.nTable).attr( 'aria-describedby', tid+'_info' );
+		}
+	
+		return n[0];
+	}
+	
+	
+	/**
+	 * Update the information elements in the display
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnUpdateInfo ( settings )
+	{
+		/* Show information about the table */
+		var nodes = settings.aanFeatures.i;
+		if ( nodes.length === 0 ) {
+			return;
+		}
+	
+		var
+			lang  = settings.oLanguage,
+			start = settings._iDisplayStart+1,
+			end   = settings.fnDisplayEnd(),
+			max   = settings.fnRecordsTotal(),
+			total = settings.fnRecordsDisplay(),
+			out   = total ?
+				lang.sInfo :
+				lang.sInfoEmpty;
+	
+		if ( total !== max ) {
+			/* Record set after filtering */
+			out += ' ' + lang.sInfoFiltered;
+		}
+	
+		// Convert the macros
+		out += lang.sInfoPostFix;
+		out = _fnInfoMacros( settings, out );
+	
+		var callback = lang.fnInfoCallback;
+		if ( callback !== null ) {
+			out = callback.call( settings.oInstance,
+				settings, start, end, max, total, out
+			);
+		}
+	
+		$(nodes).html( out );
+	}
+	
+	
+	function _fnInfoMacros ( settings, str )
+	{
+		// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+		// internally
+		var
+			formatter  = settings.fnFormatNumber,
+			start      = settings._iDisplayStart+1,
+			len        = settings._iDisplayLength,
+			vis        = settings.fnRecordsDisplay(),
+			all        = len === -1;
+	
+		return str.
+			replace(/_START_/g, formatter.call( settings, start ) ).
+			replace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).
+			replace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).
+			replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
+			replace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
+			replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
+	}
+	
+	
+	
+	/**
+	 * Draw the table for the first time, adding all required features
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnInitialise ( settings )
+	{
+		var i, iLen, iAjaxStart=settings.iInitDisplayStart;
+		var columns = settings.aoColumns, column;
+		var features = settings.oFeatures;
+		var deferLoading = settings.bDeferLoading; // value modified by the draw
+	
+		/* Ensure that the table data is fully initialised */
+		if ( ! settings.bInitialised ) {
+			setTimeout( function(){ _fnInitialise( settings ); }, 200 );
+			return;
+		}
+	
+		/* Show the display HTML options */
+		_fnAddOptionsHtml( settings );
+	
+		/* Build and draw the header / footer for the table */
+		_fnBuildHead( settings );
+		_fnDrawHead( settings, settings.aoHeader );
+		_fnDrawHead( settings, settings.aoFooter );
+	
+		/* Okay to show that something is going on now */
+		_fnProcessingDisplay( settings, true );
+	
+		/* Calculate sizes for columns */
+		if ( features.bAutoWidth ) {
+			_fnCalculateColumnWidths( settings );
+		}
+	
+		for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
+			column = columns[i];
+	
+			if ( column.sWidth ) {
+				column.nTh.style.width = _fnStringToCss( column.sWidth );
+			}
+		}
+	
+		_fnCallbackFire( settings, null, 'preInit', [settings] );
+	
+		// If there is default sorting required - let's do it. The sort function
+		// will do the drawing for us. Otherwise we draw the table regardless of the
+		// Ajax source - this allows the table to look initialised for Ajax sourcing
+		// data (show 'loading' message possibly)
+		_fnReDraw( settings );
+	
+		// Server-side processing init complete is done by _fnAjaxUpdateDraw
+		var dataSrc = _fnDataSource( settings );
+		if ( dataSrc != 'ssp' || deferLoading ) {
+			// if there is an ajax source load the data
+			if ( dataSrc == 'ajax' ) {
+				_fnBuildAjax( settings, [], function(json) {
+					var aData = _fnAjaxDataSrc( settings, json );
+	
+					// Got the data - add it to the table
+					for ( i=0 ; i<aData.length ; i++ ) {
+						_fnAddData( settings, aData[i] );
+					}
+	
+					// Reset the init display for cookie saving. We've already done
+					// a filter, and therefore cleared it before. So we need to make
+					// it appear 'fresh'
+					settings.iInitDisplayStart = iAjaxStart;
+	
+					_fnReDraw( settings );
+	
+					_fnProcessingDisplay( settings, false );
+					_fnInitComplete( settings, json );
+				}, settings );
+			}
+			else {
+				_fnProcessingDisplay( settings, false );
+				_fnInitComplete( settings );
+			}
+		}
+	}
+	
+	
+	/**
+	 * Draw the table for the first time, adding all required features
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
+	 *    with client-side processing (optional)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnInitComplete ( settings, json )
+	{
+		settings._bInitComplete = true;
+	
+		// When data was added after the initialisation (data or Ajax) we need to
+		// calculate the column sizing
+		if ( json || settings.oInit.aaData ) {
+			_fnAdjustColumnSizing( settings );
+		}
+	
+		_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );
+		_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
+	}
+	
+	
+	function _fnLengthChange ( settings, val )
+	{
+		var len = parseInt( val, 10 );
+		settings._iDisplayLength = len;
+	
+		_fnLengthOverflow( settings );
+	
+		// Fire length change event
+		_fnCallbackFire( settings, null, 'length', [settings, len] );
+	}
+	
+	
+	/**
+	 * Generate the node required for user display length changing
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Display length feature node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlLength ( settings )
+	{
+		var
+			classes  = settings.oClasses,
+			tableId  = settings.sTableId,
+			menu     = settings.aLengthMenu,
+			d2       = $.isArray( menu[0] ),
+			lengths  = d2 ? menu[0] : menu,
+			language = d2 ? menu[1] : menu;
+	
+		var select = $('<select/>', {
+			'name':          tableId+'_length',
+			'aria-controls': tableId,
+			'class':         classes.sLengthSelect
+		} );
+	
+		for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
+			select[0][ i ] = new Option( language[i], lengths[i] );
+		}
+	
+		var div = $('<div><label/></div>').addClass( classes.sLength );
+		if ( ! settings.aanFeatures.l ) {
+			div[0].id = tableId+'_length';
+		}
+	
+		div.children().append(
+			settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
+		);
+	
+		// Can't use `select` variable as user might provide their own and the
+		// reference is broken by the use of outerHTML
+		$('select', div)
+			.val( settings._iDisplayLength )
+			.on( 'change.DT', function(e) {
+				_fnLengthChange( settings, $(this).val() );
+				_fnDraw( settings );
+			} );
+	
+		// Update node value whenever anything changes the table's length
+		$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {
+			if ( settings === s ) {
+				$('select', div).val( len );
+			}
+		} );
+	
+		return div[0];
+	}
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Note that most of the paging logic is done in
+	 * DataTable.ext.pager
+	 */
+	
+	/**
+	 * Generate the node required for default pagination
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {node} Pagination feature node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlPaginate ( settings )
+	{
+		var
+			type   = settings.sPaginationType,
+			plugin = DataTable.ext.pager[ type ],
+			modern = typeof plugin === 'function',
+			redraw = function( settings ) {
+				_fnDraw( settings );
+			},
+			node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
+			features = settings.aanFeatures;
+	
+		if ( ! modern ) {
+			plugin.fnInit( settings, node, redraw );
+		}
+	
+		/* Add a draw callback for the pagination on first instance, to update the paging display */
+		if ( ! features.p )
+		{
+			node.id = settings.sTableId+'_paginate';
+	
+			settings.aoDrawCallback.push( {
+				"fn": function( settings ) {
+					if ( modern ) {
+						var
+							start      = settings._iDisplayStart,
+							len        = settings._iDisplayLength,
+							visRecords = settings.fnRecordsDisplay(),
+							all        = len === -1,
+							page = all ? 0 : Math.ceil( start / len ),
+							pages = all ? 1 : Math.ceil( visRecords / len ),
+							buttons = plugin(page, pages),
+							i, ien;
+	
+						for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
+							_fnRenderer( settings, 'pageButton' )(
+								settings, features.p[i], i, buttons, page, pages
+							);
+						}
+					}
+					else {
+						plugin.fnUpdate( settings, redraw );
+					}
+				},
+				"sName": "pagination"
+			} );
+		}
+	
+		return node;
+	}
+	
+	
+	/**
+	 * Alter the display settings to change the page
+	 *  @param {object} settings DataTables settings object
+	 *  @param {string|int} action Paging action to take: "first", "previous",
+	 *    "next" or "last" or page number to jump to (integer)
+	 *  @param [bool] redraw Automatically draw the update or not
+	 *  @returns {bool} true page has changed, false - no change
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnPageChange ( settings, action, redraw )
+	{
+		var
+			start     = settings._iDisplayStart,
+			len       = settings._iDisplayLength,
+			records   = settings.fnRecordsDisplay();
+	
+		if ( records === 0 || len === -1 )
+		{
+			start = 0;
+		}
+		else if ( typeof action === "number" )
+		{
+			start = action * len;
+	
+			if ( start > records )
+			{
+				start = 0;
+			}
+		}
+		else if ( action == "first" )
+		{
+			start = 0;
+		}
+		else if ( action == "previous" )
+		{
+			start = len >= 0 ?
+				start - len :
+				0;
+	
+			if ( start < 0 )
+			{
+			  start = 0;
+			}
+		}
+		else if ( action == "next" )
+		{
+			if ( start + len < records )
+			{
+				start += len;
+			}
+		}
+		else if ( action == "last" )
+		{
+			start = Math.floor( (records-1) / len) * len;
+		}
+		else
+		{
+			_fnLog( settings, 0, "Unknown paging action: "+action, 5 );
+		}
+	
+		var changed = settings._iDisplayStart !== start;
+		settings._iDisplayStart = start;
+	
+		if ( changed ) {
+			_fnCallbackFire( settings, null, 'page', [settings] );
+	
+			if ( redraw ) {
+				_fnDraw( settings );
+			}
+		}
+	
+		return changed;
+	}
+	
+	
+	
+	/**
+	 * Generate the node required for the processing node
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Processing element
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlProcessing ( settings )
+	{
+		return $('<div/>', {
+				'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
+				'class': settings.oClasses.sProcessing
+			} )
+			.html( settings.oLanguage.sProcessing )
+			.insertBefore( settings.nTable )[0];
+	}
+	
+	
+	/**
+	 * Display or hide the processing indicator
+	 *  @param {object} settings dataTables settings object
+	 *  @param {bool} show Show the processing indicator (true) or not (false)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnProcessingDisplay ( settings, show )
+	{
+		if ( settings.oFeatures.bProcessing ) {
+			$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
+		}
+	
+		_fnCallbackFire( settings, null, 'processing', [settings, show] );
+	}
+	
+	/**
+	 * Add any control elements for the table - specifically scrolling
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Node to add to the DOM
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlTable ( settings )
+	{
+		var table = $(settings.nTable);
+	
+		// Add the ARIA grid role to the table
+		table.attr( 'role', 'grid' );
+	
+		// Scrolling from here on in
+		var scroll = settings.oScroll;
+	
+		if ( scroll.sX === '' && scroll.sY === '' ) {
+			return settings.nTable;
+		}
+	
+		var scrollX = scroll.sX;
+		var scrollY = scroll.sY;
+		var classes = settings.oClasses;
+		var caption = table.children('caption');
+		var captionSide = caption.length ? caption[0]._captionSide : null;
+		var headerClone = $( table[0].cloneNode(false) );
+		var footerClone = $( table[0].cloneNode(false) );
+		var footer = table.children('tfoot');
+		var _div = '<div/>';
+		var size = function ( s ) {
+			return !s ? null : _fnStringToCss( s );
+		};
+	
+		if ( ! footer.length ) {
+			footer = null;
+		}
+	
+		/*
+		 * The HTML structure that we want to generate in this function is:
+		 *  div - scroller
+		 *    div - scroll head
+		 *      div - scroll head inner
+		 *        table - scroll head table
+		 *          thead - thead
+		 *    div - scroll body
+		 *      table - table (master table)
+		 *        thead - thead clone for sizing
+		 *        tbody - tbody
+		 *    div - scroll foot
+		 *      div - scroll foot inner
+		 *        table - scroll foot table
+		 *          tfoot - tfoot
+		 */
+		var scroller = $( _div, { 'class': classes.sScrollWrapper } )
+			.append(
+				$(_div, { 'class': classes.sScrollHead } )
+					.css( {
+						overflow: 'hidden',
+						position: 'relative',
+						border: 0,
+						width: scrollX ? size(scrollX) : '100%'
+					} )
+					.append(
+						$(_div, { 'class': classes.sScrollHeadInner } )
+							.css( {
+								'box-sizing': 'content-box',
+								width: scroll.sXInner || '100%'
+							} )
+							.append(
+								headerClone
+									.removeAttr('id')
+									.css( 'margin-left', 0 )
+									.append( captionSide === 'top' ? caption : null )
+									.append(
+										table.children('thead')
+									)
+							)
+					)
+			)
+			.append(
+				$(_div, { 'class': classes.sScrollBody } )
+					.css( {
+						position: 'relative',
+						overflow: 'auto',
+						width: size( scrollX )
+					} )
+					.append( table )
+			);
+	
+		if ( footer ) {
+			scroller.append(
+				$(_div, { 'class': classes.sScrollFoot } )
+					.css( {
+						overflow: 'hidden',
+						border: 0,
+						width: scrollX ? size(scrollX) : '100%'
+					} )
+					.append(
+						$(_div, { 'class': classes.sScrollFootInner } )
+							.append(
+								footerClone
+									.removeAttr('id')
+									.css( 'margin-left', 0 )
+									.append( captionSide === 'bottom' ? caption : null )
+									.append(
+										table.children('tfoot')
+									)
+							)
+					)
+			);
+		}
+	
+		var children = scroller.children();
+		var scrollHead = children[0];
+		var scrollBody = children[1];
+		var scrollFoot = footer ? children[2] : null;
+	
+		// When the body is scrolled, then we also want to scroll the headers
+		if ( scrollX ) {
+			$(scrollBody).on( 'scroll.DT', function (e) {
+				var scrollLeft = this.scrollLeft;
+	
+				scrollHead.scrollLeft = scrollLeft;
+	
+				if ( footer ) {
+					scrollFoot.scrollLeft = scrollLeft;
+				}
+			} );
+		}
+	
+		$(scrollBody).css(
+			scrollY && scroll.bCollapse ? 'max-height' : 'height', 
+			scrollY
+		);
+	
+		settings.nScrollHead = scrollHead;
+		settings.nScrollBody = scrollBody;
+		settings.nScrollFoot = scrollFoot;
+	
+		// On redraw - align columns
+		settings.aoDrawCallback.push( {
+			"fn": _fnScrollDraw,
+			"sName": "scrolling"
+		} );
+	
+		return scroller[0];
+	}
+	
+	
+	
+	/**
+	 * Update the header, footer and body tables for resizing - i.e. column
+	 * alignment.
+	 *
+	 * Welcome to the most horrible function DataTables. The process that this
+	 * function follows is basically:
+	 *   1. Re-create the table inside the scrolling div
+	 *   2. Take live measurements from the DOM
+	 *   3. Apply the measurements to align the columns
+	 *   4. Clean up
+	 *
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnScrollDraw ( settings )
+	{
+		// Given that this is such a monster function, a lot of variables are use
+		// to try and keep the minimised size as small as possible
+		var
+			scroll         = settings.oScroll,
+			scrollX        = scroll.sX,
+			scrollXInner   = scroll.sXInner,
+			scrollY        = scroll.sY,
+			barWidth       = scroll.iBarWidth,
+			divHeader      = $(settings.nScrollHead),
+			divHeaderStyle = divHeader[0].style,
+			divHeaderInner = divHeader.children('div'),
+			divHeaderInnerStyle = divHeaderInner[0].style,
+			divHeaderTable = divHeaderInner.children('table'),
+			divBodyEl      = settings.nScrollBody,
+			divBody        = $(divBodyEl),
+			divBodyStyle   = divBodyEl.style,
+			divFooter      = $(settings.nScrollFoot),
+			divFooterInner = divFooter.children('div'),
+			divFooterTable = divFooterInner.children('table'),
+			header         = $(settings.nTHead),
+			table          = $(settings.nTable),
+			tableEl        = table[0],
+			tableStyle     = tableEl.style,
+			footer         = settings.nTFoot ? $(settings.nTFoot) : null,
+			browser        = settings.oBrowser,
+			ie67           = browser.bScrollOversize,
+			dtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),
+			headerTrgEls, footerTrgEls,
+			headerSrcEls, footerSrcEls,
+			headerCopy, footerCopy,
+			headerWidths=[], footerWidths=[],
+			headerContent=[], footerContent=[],
+			idx, correction, sanityWidth,
+			zeroOut = function(nSizer) {
+				var style = nSizer.style;
+				style.paddingTop = "0";
+				style.paddingBottom = "0";
+				style.borderTopWidth = "0";
+				style.borderBottomWidth = "0";
+				style.height = 0;
+			};
+	
+		// If the scrollbar visibility has changed from the last draw, we need to
+		// adjust the column sizes as the table width will have changed to account
+		// for the scrollbar
+		var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
+		
+		if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
+			settings.scrollBarVis = scrollBarVis;
+			_fnAdjustColumnSizing( settings );
+			return; // adjust column sizing will call this function again
+		}
+		else {
+			settings.scrollBarVis = scrollBarVis;
+		}
+	
+		/*
+		 * 1. Re-create the table inside the scrolling div
+		 */
+	
+		// Remove the old minimised thead and tfoot elements in the inner table
+		table.children('thead, tfoot').remove();
+	
+		if ( footer ) {
+			footerCopy = footer.clone().prependTo( table );
+			footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
+			footerSrcEls = footerCopy.find('tr');
+		}
+	
+		// Clone the current header and footer elements and then place it into the inner table
+		headerCopy = header.clone().prependTo( table );
+		headerTrgEls = header.find('tr'); // original header is in its own table
+		headerSrcEls = headerCopy.find('tr');
+		headerCopy.find('th, td').removeAttr('tabindex');
+	
+	
+		/*
+		 * 2. Take live measurements from the DOM - do not alter the DOM itself!
+		 */
+	
+		// Remove old sizing and apply the calculated column widths
+		// Get the unique column headers in the newly created (cloned) header. We want to apply the
+		// calculated sizes to this header
+		if ( ! scrollX )
+		{
+			divBodyStyle.width = '100%';
+			divHeader[0].style.width = '100%';
+		}
+	
+		$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
+			idx = _fnVisibleToColumnIndex( settings, i );
+			el.style.width = settings.aoColumns[idx].sWidth;
+		} );
+	
+		if ( footer ) {
+			_fnApplyToChildren( function(n) {
+				n.style.width = "";
+			}, footerSrcEls );
+		}
+	
+		// Size the table as a whole
+		sanityWidth = table.outerWidth();
+		if ( scrollX === "" ) {
+			// No x scrolling
+			tableStyle.width = "100%";
+	
+			// IE7 will make the width of the table when 100% include the scrollbar
+			// - which is shouldn't. When there is a scrollbar we need to take this
+			// into account.
+			if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
+				divBody.css('overflow-y') == "scroll")
+			) {
+				tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
+			}
+	
+			// Recalculate the sanity width
+			sanityWidth = table.outerWidth();
+		}
+		else if ( scrollXInner !== "" ) {
+			// legacy x scroll inner has been given - use it
+			tableStyle.width = _fnStringToCss(scrollXInner);
+	
+			// Recalculate the sanity width
+			sanityWidth = table.outerWidth();
+		}
+	
+		// Hidden header should have zero height, so remove padding and borders. Then
+		// set the width based on the real headers
+	
+		// Apply all styles in one pass
+		_fnApplyToChildren( zeroOut, headerSrcEls );
+	
+		// Read all widths in next pass
+		_fnApplyToChildren( function(nSizer) {
+			headerContent.push( nSizer.innerHTML );
+			headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+		}, headerSrcEls );
+	
+		// Apply all widths in final pass
+		_fnApplyToChildren( function(nToSize, i) {
+			// Only apply widths to the DataTables detected header cells - this
+			// prevents complex headers from having contradictory sizes applied
+			if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {
+				nToSize.style.width = headerWidths[i];
+			}
+		}, headerTrgEls );
+	
+		$(headerSrcEls).height(0);
+	
+		/* Same again with the footer if we have one */
+		if ( footer )
+		{
+			_fnApplyToChildren( zeroOut, footerSrcEls );
+	
+			_fnApplyToChildren( function(nSizer) {
+				footerContent.push( nSizer.innerHTML );
+				footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+			}, footerSrcEls );
+	
+			_fnApplyToChildren( function(nToSize, i) {
+				nToSize.style.width = footerWidths[i];
+			}, footerTrgEls );
+	
+			$(footerSrcEls).height(0);
+		}
+	
+	
+		/*
+		 * 3. Apply the measurements
+		 */
+	
+		// "Hide" the header and footer that we used for the sizing. We need to keep
+		// the content of the cell so that the width applied to the header and body
+		// both match, but we want to hide it completely. We want to also fix their
+		// width to what they currently are
+		_fnApplyToChildren( function(nSizer, i) {
+			nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>';
+			nSizer.style.width = headerWidths[i];
+		}, headerSrcEls );
+	
+		if ( footer )
+		{
+			_fnApplyToChildren( function(nSizer, i) {
+				nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+footerContent[i]+'</div>';
+				nSizer.style.width = footerWidths[i];
+			}, footerSrcEls );
+		}
+	
+		// Sanity check that the table is of a sensible width. If not then we are going to get
+		// misalignment - try to prevent this by not allowing the table to shrink below its min width
+		if ( table.outerWidth() < sanityWidth )
+		{
+			// The min width depends upon if we have a vertical scrollbar visible or not */
+			correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
+				divBody.css('overflow-y') == "scroll")) ?
+					sanityWidth+barWidth :
+					sanityWidth;
+	
+			// IE6/7 are a law unto themselves...
+			if ( ie67 && (divBodyEl.scrollHeight >
+				divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
+			) {
+				tableStyle.width = _fnStringToCss( correction-barWidth );
+			}
+	
+			// And give the user a warning that we've stopped the table getting too small
+			if ( scrollX === "" || scrollXInner !== "" ) {
+				_fnLog( settings, 1, 'Possible column misalignment', 6 );
+			}
+		}
+		else
+		{
+			correction = '100%';
+		}
+	
+		// Apply to the container elements
+		divBodyStyle.width = _fnStringToCss( correction );
+		divHeaderStyle.width = _fnStringToCss( correction );
+	
+		if ( footer ) {
+			settings.nScrollFoot.style.width = _fnStringToCss( correction );
+		}
+	
+	
+		/*
+		 * 4. Clean up
+		 */
+		if ( ! scrollY ) {
+			/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+			 * the scrollbar height from the visible display, rather than adding it on. We need to
+			 * set the height in order to sort this. Don't want to do it in any other browsers.
+			 */
+			if ( ie67 ) {
+				divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
+			}
+		}
+	
+		/* Finally set the width's of the header and footer tables */
+		var iOuterWidth = table.outerWidth();
+		divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
+		divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
+	
+		// Figure out if there are scrollbar present - if so then we need a the header and footer to
+		// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+		var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
+		var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
+		divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
+	
+		if ( footer ) {
+			divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
+			divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
+			divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
+		}
+	
+		// Correct DOM ordering for colgroup - comes before the thead
+		table.children('colgroup').insertBefore( table.children('thead') );
+	
+		/* Adjust the position of the header in case we loose the y-scrollbar */
+		divBody.scroll();
+	
+		// If sorting or filtering has occurred, jump the scrolling back to the top
+		// only if we aren't holding the position
+		if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
+			divBodyEl.scrollTop = 0;
+		}
+	}
+	
+	
+	
+	/**
+	 * Apply a given function to the display child nodes of an element array (typically
+	 * TD children of TR rows
+	 *  @param {function} fn Method to apply to the objects
+	 *  @param array {nodes} an1 List of elements to look through for display children
+	 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnApplyToChildren( fn, an1, an2 )
+	{
+		var index=0, i=0, iLen=an1.length;
+		var nNode1, nNode2;
+	
+		while ( i < iLen ) {
+			nNode1 = an1[i].firstChild;
+			nNode2 = an2 ? an2[i].firstChild : null;
+	
+			while ( nNode1 ) {
+				if ( nNode1.nodeType === 1 ) {
+					if ( an2 ) {
+						fn( nNode1, nNode2, index );
+					}
+					else {
+						fn( nNode1, index );
+					}
+	
+					index++;
+				}
+	
+				nNode1 = nNode1.nextSibling;
+				nNode2 = an2 ? nNode2.nextSibling : null;
+			}
+	
+			i++;
+		}
+	}
+	
+	
+	
+	var __re_html_remove = /<.*?>/g;
+	
+	
+	/**
+	 * Calculate the width of columns for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCalculateColumnWidths ( oSettings )
+	{
+		var
+			table = oSettings.nTable,
+			columns = oSettings.aoColumns,
+			scroll = oSettings.oScroll,
+			scrollY = scroll.sY,
+			scrollX = scroll.sX,
+			scrollXInner = scroll.sXInner,
+			columnCount = columns.length,
+			visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
+			headerCells = $('th', oSettings.nTHead),
+			tableWidthAttr = table.getAttribute('width'), // from DOM element
+			tableContainer = table.parentNode,
+			userInputs = false,
+			i, column, columnIdx, width, outerWidth,
+			browser = oSettings.oBrowser,
+			ie67 = browser.bScrollOversize;
+	
+		var styleWidth = table.style.width;
+		if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
+			tableWidthAttr = styleWidth;
+		}
+	
+		/* Convert any user input sizes into pixel sizes */
+		for ( i=0 ; i<visibleColumns.length ; i++ ) {
+			column = columns[ visibleColumns[i] ];
+	
+			if ( column.sWidth !== null ) {
+				column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
+	
+				userInputs = true;
+			}
+		}
+	
+		/* If the number of columns in the DOM equals the number that we have to
+		 * process in DataTables, then we can use the offsets that are created by
+		 * the web- browser. No custom sizes can be set in order for this to happen,
+		 * nor scrolling used
+		 */
+		if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
+		     columnCount == _fnVisbleColumns( oSettings ) &&
+		     columnCount == headerCells.length
+		) {
+			for ( i=0 ; i<columnCount ; i++ ) {
+				var colIdx = _fnVisibleToColumnIndex( oSettings, i );
+	
+				if ( colIdx !== null ) {
+					columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
+				}
+			}
+		}
+		else
+		{
+			// Otherwise construct a single row, worst case, table with the widest
+			// node in the data, assign any user defined widths, then insert it into
+			// the DOM and allow the browser to do all the hard work of calculating
+			// table widths
+			var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
+				.css( 'visibility', 'hidden' )
+				.removeAttr( 'id' );
+	
+			// Clean up the table body
+			tmpTable.find('tbody tr').remove();
+			var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
+	
+			// Clone the table header and footer - we can't use the header / footer
+			// from the cloned table, since if scrolling is active, the table's
+			// real header and footer are contained in different table tags
+			tmpTable.find('thead, tfoot').remove();
+			tmpTable
+				.append( $(oSettings.nTHead).clone() )
+				.append( $(oSettings.nTFoot).clone() );
+	
+			// Remove any assigned widths from the footer (from scrolling)
+			tmpTable.find('tfoot th, tfoot td').css('width', '');
+	
+			// Apply custom sizing to the cloned header
+			headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
+	
+			for ( i=0 ; i<visibleColumns.length ; i++ ) {
+				column = columns[ visibleColumns[i] ];
+	
+				headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
+					_fnStringToCss( column.sWidthOrig ) :
+					'';
+	
+				// For scrollX we need to force the column width otherwise the
+				// browser will collapse it. If this width is smaller than the
+				// width the column requires, then it will have no effect
+				if ( column.sWidthOrig && scrollX ) {
+					$( headerCells[i] ).append( $('<div/>').css( {
+						width: column.sWidthOrig,
+						margin: 0,
+						padding: 0,
+						border: 0,
+						height: 1
+					} ) );
+				}
+			}
+	
+			// Find the widest cell for each column and put it into the table
+			if ( oSettings.aoData.length ) {
+				for ( i=0 ; i<visibleColumns.length ; i++ ) {
+					columnIdx = visibleColumns[i];
+					column = columns[ columnIdx ];
+	
+					$( _fnGetWidestNode( oSettings, columnIdx ) )
+						.clone( false )
+						.append( column.sContentPadding )
+						.appendTo( tr );
+				}
+			}
+	
+			// Tidy the temporary table - remove name attributes so there aren't
+			// duplicated in the dom (radio elements for example)
+			$('[name]', tmpTable).removeAttr('name');
+	
+			// Table has been built, attach to the document so we can work with it.
+			// A holding element is used, positioned at the top of the container
+			// with minimal height, so it has no effect on if the container scrolls
+			// or not. Otherwise it might trigger scrolling when it actually isn't
+			// needed
+			var holder = $('<div/>').css( scrollX || scrollY ?
+					{
+						position: 'absolute',
+						top: 0,
+						left: 0,
+						height: 1,
+						right: 0,
+						overflow: 'hidden'
+					} :
+					{}
+				)
+				.append( tmpTable )
+				.appendTo( tableContainer );
+	
+			// When scrolling (X or Y) we want to set the width of the table as 
+			// appropriate. However, when not scrolling leave the table width as it
+			// is. This results in slightly different, but I think correct behaviour
+			if ( scrollX && scrollXInner ) {
+				tmpTable.width( scrollXInner );
+			}
+			else if ( scrollX ) {
+				tmpTable.css( 'width', 'auto' );
+				tmpTable.removeAttr('width');
+	
+				// If there is no width attribute or style, then allow the table to
+				// collapse
+				if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
+					tmpTable.width( tableContainer.clientWidth );
+				}
+			}
+			else if ( scrollY ) {
+				tmpTable.width( tableContainer.clientWidth );
+			}
+			else if ( tableWidthAttr ) {
+				tmpTable.width( tableWidthAttr );
+			}
+	
+			// Get the width of each column in the constructed table - we need to
+			// know the inner width (so it can be assigned to the other table's
+			// cells) and the outer width so we can calculate the full width of the
+			// table. This is safe since DataTables requires a unique cell for each
+			// column, but if ever a header can span multiple columns, this will
+			// need to be modified.
+			var total = 0;
+			for ( i=0 ; i<visibleColumns.length ; i++ ) {
+				var cell = $(headerCells[i]);
+				var border = cell.outerWidth() - cell.width();
+	
+				// Use getBounding... where possible (not IE8-) because it can give
+				// sub-pixel accuracy, which we then want to round up!
+				var bounding = browser.bBounding ?
+					Math.ceil( headerCells[i].getBoundingClientRect().width ) :
+					cell.outerWidth();
+	
+				// Total is tracked to remove any sub-pixel errors as the outerWidth
+				// of the table might not equal the total given here (IE!).
+				total += bounding;
+	
+				// Width for each column to use
+				columns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );
+			}
+	
+			table.style.width = _fnStringToCss( total );
+	
+			// Finished with the table - ditch it
+			holder.remove();
+		}
+	
+		// If there is a width attr, we want to attach an event listener which
+		// allows the table sizing to automatically adjust when the window is
+		// resized. Use the width attr rather than CSS, since we can't know if the
+		// CSS is a relative value or absolute - DOM read is always px.
+		if ( tableWidthAttr ) {
+			table.style.width = _fnStringToCss( tableWidthAttr );
+		}
+	
+		if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
+			var bindResize = function () {
+				$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
+					_fnAdjustColumnSizing( oSettings );
+				} ) );
+			};
+	
+			// IE6/7 will crash if we bind a resize event handler on page load.
+			// To be removed in 1.11 which drops IE6/7 support
+			if ( ie67 ) {
+				setTimeout( bindResize, 1000 );
+			}
+			else {
+				bindResize();
+			}
+	
+			oSettings._reszEvt = true;
+		}
+	}
+	
+	
+	/**
+	 * Throttle the calls to a function. Arguments and context are maintained for
+	 * the throttled function
+	 *  @param {function} fn Function to be called
+	 *  @param {int} [freq=200] call frequency in mS
+	 *  @returns {function} wrapped function
+	 *  @memberof DataTable#oApi
+	 */
+	var _fnThrottle = DataTable.util.throttle;
+	
+	
+	/**
+	 * Convert a CSS unit width to pixels (e.g. 2em)
+	 *  @param {string} width width to be converted
+	 *  @param {node} parent parent to get the with for (required for relative widths) - optional
+	 *  @returns {int} width in pixels
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnConvertToWidth ( width, parent )
+	{
+		if ( ! width ) {
+			return 0;
+		}
+	
+		var n = $('<div/>')
+			.css( 'width', _fnStringToCss( width ) )
+			.appendTo( parent || document.body );
+	
+		var val = n[0].offsetWidth;
+		n.remove();
+	
+		return val;
+	}
+	
+	
+	/**
+	 * Get the widest node
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} colIdx column of interest
+	 *  @returns {node} widest table node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetWidestNode( settings, colIdx )
+	{
+		var idx = _fnGetMaxLenString( settings, colIdx );
+		if ( idx < 0 ) {
+			return null;
+		}
+	
+		var data = settings.aoData[ idx ];
+		return ! data.nTr ? // Might not have been created when deferred rendering
+			$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
+			data.anCells[ colIdx ];
+	}
+	
+	
+	/**
+	 * Get the maximum strlen for each data column
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} colIdx column of interest
+	 *  @returns {string} max string length for each column
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetMaxLenString( settings, colIdx )
+	{
+		var s, max=-1, maxIdx = -1;
+	
+		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
+			s = s.replace( __re_html_remove, '' );
+			s = s.replace( /&nbsp;/g, ' ' );
+	
+			if ( s.length > max ) {
+				max = s.length;
+				maxIdx = i;
+			}
+		}
+	
+		return maxIdx;
+	}
+	
+	
+	/**
+	 * Append a CSS unit (only if required) to a string
+	 *  @param {string} value to css-ify
+	 *  @returns {string} value with css unit
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnStringToCss( s )
+	{
+		if ( s === null ) {
+			return '0px';
+		}
+	
+		if ( typeof s == 'number' ) {
+			return s < 0 ?
+				'0px' :
+				s+'px';
+		}
+	
+		// Check it has a unit character already
+		return s.match(/\d$/) ?
+			s+'px' :
+			s;
+	}
+	
+	
+	
+	function _fnSortFlatten ( settings )
+	{
+		var
+			i, iLen, k, kLen,
+			aSort = [],
+			aiOrig = [],
+			aoColumns = settings.aoColumns,
+			aDataSort, iCol, sType, srcCol,
+			fixed = settings.aaSortingFixed,
+			fixedObj = $.isPlainObject( fixed ),
+			nestedSort = [],
+			add = function ( a ) {
+				if ( a.length && ! $.isArray( a[0] ) ) {
+					// 1D array
+					nestedSort.push( a );
+				}
+				else {
+					// 2D array
+					$.merge( nestedSort, a );
+				}
+			};
+	
+		// Build the sort array, with pre-fix and post-fix options if they have been
+		// specified
+		if ( $.isArray( fixed ) ) {
+			add( fixed );
+		}
+	
+		if ( fixedObj && fixed.pre ) {
+			add( fixed.pre );
+		}
+	
+		add( settings.aaSorting );
+	
+		if (fixedObj && fixed.post ) {
+			add( fixed.post );
+		}
+	
+		for ( i=0 ; i<nestedSort.length ; i++ )
+		{
+			srcCol = nestedSort[i][0];
+			aDataSort = aoColumns[ srcCol ].aDataSort;
+	
+			for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
+			{
+				iCol = aDataSort[k];
+				sType = aoColumns[ iCol ].sType || 'string';
+	
+				if ( nestedSort[i]._idx === undefined ) {
+					nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
+				}
+	
+				aSort.push( {
+					src:       srcCol,
+					col:       iCol,
+					dir:       nestedSort[i][1],
+					index:     nestedSort[i]._idx,
+					type:      sType,
+					formatter: DataTable.ext.type.order[ sType+"-pre" ]
+				} );
+			}
+		}
+	
+		return aSort;
+	}
+	
+	/**
+	 * Change the order of the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 *  @todo This really needs split up!
+	 */
+	function _fnSort ( oSettings )
+	{
+		var
+			i, ien, iLen, j, jLen, k, kLen,
+			sDataType, nTh,
+			aiOrig = [],
+			oExtSort = DataTable.ext.type.order,
+			aoData = oSettings.aoData,
+			aoColumns = oSettings.aoColumns,
+			aDataSort, data, iCol, sType, oSort,
+			formatters = 0,
+			sortCol,
+			displayMaster = oSettings.aiDisplayMaster,
+			aSort;
+	
+		// Resolve any column types that are unknown due to addition or invalidation
+		// @todo Can this be moved into a 'data-ready' handler which is called when
+		//   data is going to be used in the table?
+		_fnColumnTypes( oSettings );
+	
+		aSort = _fnSortFlatten( oSettings );
+	
+		for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
+			sortCol = aSort[i];
+	
+			// Track if we can use the fast sort algorithm
+			if ( sortCol.formatter ) {
+				formatters++;
+			}
+	
+			// Load the data needed for the sort, for each cell
+			_fnSortData( oSettings, sortCol.col );
+		}
+	
+		/* No sorting required if server-side or no sorting array */
+		if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
+		{
+			// Create a value - key array of the current row positions such that we can use their
+			// current position during the sort, if values match, in order to perform stable sorting
+			for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
+				aiOrig[ displayMaster[i] ] = i;
+			}
+	
+			/* Do the sort - here we want multi-column sorting based on a given data source (column)
+			 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+			 * follow on it's own, but this is what we want (example two column sorting):
+			 *  fnLocalSorting = function(a,b){
+			 *    var iTest;
+			 *    iTest = oSort['string-asc']('data11', 'data12');
+			 *      if (iTest !== 0)
+			 *        return iTest;
+			 *    iTest = oSort['numeric-desc']('data21', 'data22');
+			 *    if (iTest !== 0)
+			 *      return iTest;
+			 *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+			 *  }
+			 * Basically we have a test for each sorting column, if the data in that column is equal,
+			 * test the next column. If all columns match, then we use a numeric sort on the row
+			 * positions in the original data array to provide a stable sort.
+			 *
+			 * Note - I know it seems excessive to have two sorting methods, but the first is around
+			 * 15% faster, so the second is only maintained for backwards compatibility with sorting
+			 * methods which do not have a pre-sort formatting function.
+			 */
+			if ( formatters === aSort.length ) {
+				// All sort types have formatting functions
+				displayMaster.sort( function ( a, b ) {
+					var
+						x, y, k, test, sort,
+						len=aSort.length,
+						dataA = aoData[a]._aSortData,
+						dataB = aoData[b]._aSortData;
+	
+					for ( k=0 ; k<len ; k++ ) {
+						sort = aSort[k];
+	
+						x = dataA[ sort.col ];
+						y = dataB[ sort.col ];
+	
+						test = x<y ? -1 : x>y ? 1 : 0;
+						if ( test !== 0 ) {
+							return sort.dir === 'asc' ? test : -test;
+						}
+					}
+	
+					x = aiOrig[a];
+					y = aiOrig[b];
+					return x<y ? -1 : x>y ? 1 : 0;
+				} );
+			}
+			else {
+				// Depreciated - remove in 1.11 (providing a plug-in option)
+				// Not all sort types have formatting methods, so we have to call their sorting
+				// methods.
+				displayMaster.sort( function ( a, b ) {
+					var
+						x, y, k, l, test, sort, fn,
+						len=aSort.length,
+						dataA = aoData[a]._aSortData,
+						dataB = aoData[b]._aSortData;
+	
+					for ( k=0 ; k<len ; k++ ) {
+						sort = aSort[k];
+	
+						x = dataA[ sort.col ];
+						y = dataB[ sort.col ];
+	
+						fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
+						test = fn( x, y );
+						if ( test !== 0 ) {
+							return test;
+						}
+					}
+	
+					x = aiOrig[a];
+					y = aiOrig[b];
+					return x<y ? -1 : x>y ? 1 : 0;
+				} );
+			}
+		}
+	
+		/* Tell the draw function that we have sorted the data */
+		oSettings.bSorted = true;
+	}
+	
+	
+	function _fnSortAria ( settings )
+	{
+		var label;
+		var nextSort;
+		var columns = settings.aoColumns;
+		var aSort = _fnSortFlatten( settings );
+		var oAria = settings.oLanguage.oAria;
+	
+		// ARIA attributes - need to loop all columns, to update all (removing old
+		// attributes as needed)
+		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+		{
+			var col = columns[i];
+			var asSorting = col.asSorting;
+			var sTitle = col.sTitle.replace( /<.*?>/g, "" );
+			var th = col.nTh;
+	
+			// IE7 is throwing an error when setting these properties with jQuery's
+			// attr() and removeAttr() methods...
+			th.removeAttribute('aria-sort');
+	
+			/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+			if ( col.bSortable ) {
+				if ( aSort.length > 0 && aSort[0].col == i ) {
+					th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
+					nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
+				}
+				else {
+					nextSort = asSorting[0];
+				}
+	
+				label = sTitle + ( nextSort === "asc" ?
+					oAria.sSortAscending :
+					oAria.sSortDescending
+				);
+			}
+			else {
+				label = sTitle;
+			}
+	
+			th.setAttribute('aria-label', label);
+		}
+	}
+	
+	
+	/**
+	 * Function to run on user sort request
+	 *  @param {object} settings dataTables settings object
+	 *  @param {node} attachTo node to attach the handler to
+	 *  @param {int} colIdx column sorting index
+	 *  @param {boolean} [append=false] Append the requested sort to the existing
+	 *    sort if true (i.e. multi-column sort)
+	 *  @param {function} [callback] callback function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortListener ( settings, colIdx, append, callback )
+	{
+		var col = settings.aoColumns[ colIdx ];
+		var sorting = settings.aaSorting;
+		var asSorting = col.asSorting;
+		var nextSortIdx;
+		var next = function ( a, overflow ) {
+			var idx = a._idx;
+			if ( idx === undefined ) {
+				idx = $.inArray( a[1], asSorting );
+			}
+	
+			return idx+1 < asSorting.length ?
+				idx+1 :
+				overflow ?
+					null :
+					0;
+		};
+	
+		// Convert to 2D array if needed
+		if ( typeof sorting[0] === 'number' ) {
+			sorting = settings.aaSorting = [ sorting ];
+		}
+	
+		// If appending the sort then we are multi-column sorting
+		if ( append && settings.oFeatures.bSortMulti ) {
+			// Are we already doing some kind of sort on this column?
+			var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
+	
+			if ( sortIdx !== -1 ) {
+				// Yes, modify the sort
+				nextSortIdx = next( sorting[sortIdx], true );
+	
+				if ( nextSortIdx === null && sorting.length === 1 ) {
+					nextSortIdx = 0; // can't remove sorting completely
+				}
+	
+				if ( nextSortIdx === null ) {
+					sorting.splice( sortIdx, 1 );
+				}
+				else {
+					sorting[sortIdx][1] = asSorting[ nextSortIdx ];
+					sorting[sortIdx]._idx = nextSortIdx;
+				}
+			}
+			else {
+				// No sort on this column yet
+				sorting.push( [ colIdx, asSorting[0], 0 ] );
+				sorting[sorting.length-1]._idx = 0;
+			}
+		}
+		else if ( sorting.length && sorting[0][0] == colIdx ) {
+			// Single column - already sorting on this column, modify the sort
+			nextSortIdx = next( sorting[0] );
+	
+			sorting.length = 1;
+			sorting[0][1] = asSorting[ nextSortIdx ];
+			sorting[0]._idx = nextSortIdx;
+		}
+		else {
+			// Single column - sort only on this column
+			sorting.length = 0;
+			sorting.push( [ colIdx, asSorting[0] ] );
+			sorting[0]._idx = 0;
+		}
+	
+		// Run the sort by calling a full redraw
+		_fnReDraw( settings );
+	
+		// callback used for async user interaction
+		if ( typeof callback == 'function' ) {
+			callback( settings );
+		}
+	}
+	
+	
+	/**
+	 * Attach a sort handler (click) to a node
+	 *  @param {object} settings dataTables settings object
+	 *  @param {node} attachTo node to attach the handler to
+	 *  @param {int} colIdx column sorting index
+	 *  @param {function} [callback] callback function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
+	{
+		var col = settings.aoColumns[ colIdx ];
+	
+		_fnBindAction( attachTo, {}, function (e) {
+			/* If the column is not sortable - don't to anything */
+			if ( col.bSortable === false ) {
+				return;
+			}
+	
+			// If processing is enabled use a timeout to allow the processing
+			// display to be shown - otherwise to it synchronously
+			if ( settings.oFeatures.bProcessing ) {
+				_fnProcessingDisplay( settings, true );
+	
+				setTimeout( function() {
+					_fnSortListener( settings, colIdx, e.shiftKey, callback );
+	
+					// In server-side processing, the draw callback will remove the
+					// processing display
+					if ( _fnDataSource( settings ) !== 'ssp' ) {
+						_fnProcessingDisplay( settings, false );
+					}
+				}, 0 );
+			}
+			else {
+				_fnSortListener( settings, colIdx, e.shiftKey, callback );
+			}
+		} );
+	}
+	
+	
+	/**
+	 * Set the sorting classes on table's body, Note: it is safe to call this function
+	 * when bSort and bSortClasses are false
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortingClasses( settings )
+	{
+		var oldSort = settings.aLastSort;
+		var sortClass = settings.oClasses.sSortColumn;
+		var sort = _fnSortFlatten( settings );
+		var features = settings.oFeatures;
+		var i, ien, colIdx;
+	
+		if ( features.bSort && features.bSortClasses ) {
+			// Remove old sorting classes
+			for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
+				colIdx = oldSort[i].src;
+	
+				// Remove column sorting
+				$( _pluck( settings.aoData, 'anCells', colIdx ) )
+					.removeClass( sortClass + (i<2 ? i+1 : 3) );
+			}
+	
+			// Add new column sorting
+			for ( i=0, ien=sort.length ; i<ien ; i++ ) {
+				colIdx = sort[i].src;
+	
+				$( _pluck( settings.aoData, 'anCells', colIdx ) )
+					.addClass( sortClass + (i<2 ? i+1 : 3) );
+			}
+		}
+	
+		settings.aLastSort = sort;
+	}
+	
+	
+	// Get the data to sort a column, be it from cache, fresh (populating the
+	// cache), or from a sort formatter
+	function _fnSortData( settings, idx )
+	{
+		// Custom sorting function - provided by the sort data type
+		var column = settings.aoColumns[ idx ];
+		var customSort = DataTable.ext.order[ column.sSortDataType ];
+		var customData;
+	
+		if ( customSort ) {
+			customData = customSort.call( settings.oInstance, settings, idx,
+				_fnColumnIndexToVisible( settings, idx )
+			);
+		}
+	
+		// Use / populate cache
+		var row, cellData;
+		var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
+	
+		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			row = settings.aoData[i];
+	
+			if ( ! row._aSortData ) {
+				row._aSortData = [];
+			}
+	
+			if ( ! row._aSortData[idx] || customSort ) {
+				cellData = customSort ?
+					customData[i] : // If there was a custom sort function, use data from there
+					_fnGetCellData( settings, i, idx, 'sort' );
+	
+				row._aSortData[ idx ] = formatter ?
+					formatter( cellData ) :
+					cellData;
+			}
+		}
+	}
+	
+	
+	
+	/**
+	 * Save the state of a table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSaveState ( settings )
+	{
+		if ( !settings.oFeatures.bStateSave || settings.bDestroying )
+		{
+			return;
+		}
+	
+		/* Store the interesting variables */
+		var state = {
+			time:    +new Date(),
+			start:   settings._iDisplayStart,
+			length:  settings._iDisplayLength,
+			order:   $.extend( true, [], settings.aaSorting ),
+			search:  _fnSearchToCamel( settings.oPreviousSearch ),
+			columns: $.map( settings.aoColumns, function ( col, i ) {
+				return {
+					visible: col.bVisible,
+					search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
+				};
+			} )
+		};
+	
+		_fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
+	
+		settings.oSavedState = state;
+		settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
+	}
+	
+	
+	/**
+	 * Attempt to load a saved table state
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} oInit DataTables init object so we can override settings
+	 *  @param {function} callback Callback to execute when the state has been loaded
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLoadState ( settings, oInit, callback )
+	{
+		var i, ien;
+		var columns = settings.aoColumns;
+		var loaded = function ( s ) {
+			if ( ! s || ! s.time ) {
+				callback();
+				return;
+			}
+	
+			// Allow custom and plug-in manipulation functions to alter the saved data set and
+			// cancelling of loading by returning false
+			var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );
+			if ( $.inArray( false, abStateLoad ) !== -1 ) {
+				callback();
+				return;
+			}
+	
+			// Reject old data
+			var duration = settings.iStateDuration;
+			if ( duration > 0 && s.time < +new Date() - (duration*1000) ) {
+				callback();
+				return;
+			}
+	
+			// Number of columns have changed - all bets are off, no restore of settings
+			if ( s.columns && columns.length !== s.columns.length ) {
+				callback();
+				return;
+			}
+	
+			// Store the saved state so it might be accessed at any time
+			settings.oLoadedState = $.extend( true, {}, s );
+	
+			// Restore key features - todo - for 1.11 this needs to be done by
+			// subscribed events
+			if ( s.start !== undefined ) {
+				settings._iDisplayStart    = s.start;
+				settings.iInitDisplayStart = s.start;
+			}
+			if ( s.length !== undefined ) {
+				settings._iDisplayLength   = s.length;
+			}
+	
+			// Order
+			if ( s.order !== undefined ) {
+				settings.aaSorting = [];
+				$.each( s.order, function ( i, col ) {
+					settings.aaSorting.push( col[0] >= columns.length ?
+						[ 0, col[1] ] :
+						col
+					);
+				} );
+			}
+	
+			// Search
+			if ( s.search !== undefined ) {
+				$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );
+			}
+	
+			// Columns
+			//
+			if ( s.columns ) {
+				for ( i=0, ien=s.columns.length ; i<ien ; i++ ) {
+					var col = s.columns[i];
+	
+					// Visibility
+					if ( col.visible !== undefined ) {
+						columns[i].bVisible = col.visible;
+					}
+	
+					// Search
+					if ( col.search !== undefined ) {
+						$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
+					}
+				}
+			}
+	
+			_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );
+			callback();
+		}
+	
+		if ( ! settings.oFeatures.bStateSave ) {
+			callback();
+			return;
+		}
+	
+		var state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );
+	
+		if ( state !== undefined ) {
+			loaded( state );
+		}
+		// otherwise, wait for the loaded callback to be executed
+	}
+	
+	
+	/**
+	 * Return the settings object for a particular table
+	 *  @param {node} table table we are using as a dataTable
+	 *  @returns {object} Settings object - or null if not found
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSettingsFromNode ( table )
+	{
+		var settings = DataTable.settings;
+		var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
+	
+		return idx !== -1 ?
+			settings[ idx ] :
+			null;
+	}
+	
+	
+	/**
+	 * Log an error message
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} level log error messages, or display them to the user
+	 *  @param {string} msg error message
+	 *  @param {int} tn Technical note id to get more information about the error.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLog( settings, level, msg, tn )
+	{
+		msg = 'DataTables warning: '+
+			(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
+	
+		if ( tn ) {
+			msg += '. For more information about this error, please see '+
+			'http://datatables.net/tn/'+tn;
+		}
+	
+		if ( ! level  ) {
+			// Backwards compatibility pre 1.10
+			var ext = DataTable.ext;
+			var type = ext.sErrMode || ext.errMode;
+	
+			if ( settings ) {
+				_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
+			}
+	
+			if ( type == 'alert' ) {
+				alert( msg );
+			}
+			else if ( type == 'throw' ) {
+				throw new Error(msg);
+			}
+			else if ( typeof type == 'function' ) {
+				type( settings, tn, msg );
+			}
+		}
+		else if ( window.console && console.log ) {
+			console.log( msg );
+		}
+	}
+	
+	
+	/**
+	 * See if a property is defined on one object, if so assign it to the other object
+	 *  @param {object} ret target object
+	 *  @param {object} src source object
+	 *  @param {string} name property
+	 *  @param {string} [mappedName] name to map too - optional, name used if not given
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnMap( ret, src, name, mappedName )
+	{
+		if ( $.isArray( name ) ) {
+			$.each( name, function (i, val) {
+				if ( $.isArray( val ) ) {
+					_fnMap( ret, src, val[0], val[1] );
+				}
+				else {
+					_fnMap( ret, src, val );
+				}
+			} );
+	
+			return;
+		}
+	
+		if ( mappedName === undefined ) {
+			mappedName = name;
+		}
+	
+		if ( src[name] !== undefined ) {
+			ret[mappedName] = src[name];
+		}
+	}
+	
+	
+	/**
+	 * Extend objects - very similar to jQuery.extend, but deep copy objects, and
+	 * shallow copy arrays. The reason we need to do this, is that we don't want to
+	 * deep copy array init values (such as aaSorting) since the dev wouldn't be
+	 * able to override them, but we do want to deep copy arrays.
+	 *  @param {object} out Object to extend
+	 *  @param {object} extender Object from which the properties will be applied to
+	 *      out
+	 *  @param {boolean} breakRefs If true, then arrays will be sliced to take an
+	 *      independent copy with the exception of the `data` or `aaData` parameters
+	 *      if they are present. This is so you can pass in a collection to
+	 *      DataTables and have that used as your data source without breaking the
+	 *      references
+	 *  @returns {object} out Reference, just for convenience - out === the return.
+	 *  @memberof DataTable#oApi
+	 *  @todo This doesn't take account of arrays inside the deep copied objects.
+	 */
+	function _fnExtend( out, extender, breakRefs )
+	{
+		var val;
+	
+		for ( var prop in extender ) {
+			if ( extender.hasOwnProperty(prop) ) {
+				val = extender[prop];
+	
+				if ( $.isPlainObject( val ) ) {
+					if ( ! $.isPlainObject( out[prop] ) ) {
+						out[prop] = {};
+					}
+					$.extend( true, out[prop], val );
+				}
+				else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
+					out[prop] = val.slice();
+				}
+				else {
+					out[prop] = val;
+				}
+			}
+		}
+	
+		return out;
+	}
+	
+	
+	/**
+	 * Bind an event handers to allow a click or return key to activate the callback.
+	 * This is good for accessibility since a return on the keyboard will have the
+	 * same effect as a click, if the element has focus.
+	 *  @param {element} n Element to bind the action to
+	 *  @param {object} oData Data object to pass to the triggered function
+	 *  @param {function} fn Callback function for when the event is triggered
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBindAction( n, oData, fn )
+	{
+		$(n)
+			.on( 'click.DT', oData, function (e) {
+					n.blur(); // Remove focus outline for mouse users
+					fn(e);
+				} )
+			.on( 'keypress.DT', oData, function (e){
+					if ( e.which === 13 ) {
+						e.preventDefault();
+						fn(e);
+					}
+				} )
+			.on( 'selectstart.DT', function () {
+					/* Take the brutal approach to cancelling text selection */
+					return false;
+				} );
+	}
+	
+	
+	/**
+	 * Register a callback function. Easily allows a callback function to be added to
+	 * an array store of callback functions that can then all be called together.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
+	 *  @param {function} fn Function to be called back
+	 *  @param {string} sName Identifying name for the callback (i.e. a label)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCallbackReg( oSettings, sStore, fn, sName )
+	{
+		if ( fn )
+		{
+			oSettings[sStore].push( {
+				"fn": fn,
+				"sName": sName
+			} );
+		}
+	}
+	
+	
+	/**
+	 * Fire callback functions and trigger events. Note that the loop over the
+	 * callback array store is done backwards! Further note that you do not want to
+	 * fire off triggers in time sensitive applications (for example cell creation)
+	 * as its slow.
+	 *  @param {object} settings dataTables settings object
+	 *  @param {string} callbackArr Name of the array storage for the callbacks in
+	 *      oSettings
+	 *  @param {string} eventName Name of the jQuery custom event to trigger. If
+	 *      null no trigger is fired
+	 *  @param {array} args Array of arguments to pass to the callback function /
+	 *      trigger
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCallbackFire( settings, callbackArr, eventName, args )
+	{
+		var ret = [];
+	
+		if ( callbackArr ) {
+			ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
+				return val.fn.apply( settings.oInstance, args );
+			} );
+		}
+	
+		if ( eventName !== null ) {
+			var e = $.Event( eventName+'.dt' );
+	
+			$(settings.nTable).trigger( e, args );
+	
+			ret.push( e.result );
+		}
+	
+		return ret;
+	}
+	
+	
+	function _fnLengthOverflow ( settings )
+	{
+		var
+			start = settings._iDisplayStart,
+			end = settings.fnDisplayEnd(),
+			len = settings._iDisplayLength;
+	
+		/* If we have space to show extra rows (backing up from the end point - then do so */
+		if ( start >= end )
+		{
+			start = end - len;
+		}
+	
+		// Keep the start record on the current page
+		start -= (start % len);
+	
+		if ( len === -1 || start < 0 )
+		{
+			start = 0;
+		}
+	
+		settings._iDisplayStart = start;
+	}
+	
+	
+	function _fnRenderer( settings, type )
+	{
+		var renderer = settings.renderer;
+		var host = DataTable.ext.renderer[type];
+	
+		if ( $.isPlainObject( renderer ) && renderer[type] ) {
+			// Specific renderer for this type. If available use it, otherwise use
+			// the default.
+			return host[renderer[type]] || host._;
+		}
+		else if ( typeof renderer === 'string' ) {
+			// Common renderer - if there is one available for this type use it,
+			// otherwise use the default
+			return host[renderer] || host._;
+		}
+	
+		// Use the default
+		return host._;
+	}
+	
+	
+	/**
+	 * Detect the data source being used for the table. Used to simplify the code
+	 * a little (ajax) and to make it compress a little smaller.
+	 *
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {string} Data source
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDataSource ( settings )
+	{
+		if ( settings.oFeatures.bServerSide ) {
+			return 'ssp';
+		}
+		else if ( settings.ajax || settings.sAjaxSource ) {
+			return 'ajax';
+		}
+		return 'dom';
+	}
+	
+
+	
+	
+	/**
+	 * Computed structure of the DataTables API, defined by the options passed to
+	 * `DataTable.Api.register()` when building the API.
+	 *
+	 * The structure is built in order to speed creation and extension of the Api
+	 * objects since the extensions are effectively pre-parsed.
+	 *
+	 * The array is an array of objects with the following structure, where this
+	 * base array represents the Api prototype base:
+	 *
+	 *     [
+	 *       {
+	 *         name:      'data'                -- string   - Property name
+	 *         val:       function () {},       -- function - Api method (or undefined if just an object
+	 *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
+	 *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
+	 *       },
+	 *       {
+	 *         name:     'row'
+	 *         val:       {},
+	 *         methodExt: [ ... ],
+	 *         propExt:   [
+	 *           {
+	 *             name:      'data'
+	 *             val:       function () {},
+	 *             methodExt: [ ... ],
+	 *             propExt:   [ ... ]
+	 *           },
+	 *           ...
+	 *         ]
+	 *       }
+	 *     ]
+	 *
+	 * @type {Array}
+	 * @ignore
+	 */
+	var __apiStruct = [];
+	
+	
+	/**
+	 * `Array.prototype` reference.
+	 *
+	 * @type object
+	 * @ignore
+	 */
+	var __arrayProto = Array.prototype;
+	
+	
+	/**
+	 * Abstraction for `context` parameter of the `Api` constructor to allow it to
+	 * take several different forms for ease of use.
+	 *
+	 * Each of the input parameter types will be converted to a DataTables settings
+	 * object where possible.
+	 *
+	 * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one
+	 *   of:
+	 *
+	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
+	 *     with be found and used.
+	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
+	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
+	 *   * `object` - DataTables settings object
+	 *   * `DataTables.Api` - API instance
+	 * @return {array|null} Matching DataTables settings objects. `null` or
+	 *   `undefined` is returned if no matching DataTable is found.
+	 * @ignore
+	 */
+	var _toSettings = function ( mixed )
+	{
+		var idx, jq;
+		var settings = DataTable.settings;
+		var tables = $.map( settings, function (el, i) {
+			return el.nTable;
+		} );
+	
+		if ( ! mixed ) {
+			return [];
+		}
+		else if ( mixed.nTable && mixed.oApi ) {
+			// DataTables settings object
+			return [ mixed ];
+		}
+		else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
+			// Table node
+			idx = $.inArray( mixed, tables );
+			return idx !== -1 ? [ settings[idx] ] : null;
+		}
+		else if ( mixed && typeof mixed.settings === 'function' ) {
+			return mixed.settings().toArray();
+		}
+		else if ( typeof mixed === 'string' ) {
+			// jQuery selector
+			jq = $(mixed);
+		}
+		else if ( mixed instanceof $ ) {
+			// jQuery object (also DataTables instance)
+			jq = mixed;
+		}
+	
+		if ( jq ) {
+			return jq.map( function(i) {
+				idx = $.inArray( this, tables );
+				return idx !== -1 ? settings[idx] : null;
+			} ).toArray();
+		}
+	};
+	
+	
+	/**
+	 * DataTables API class - used to control and interface with  one or more
+	 * DataTables enhanced tables.
+	 *
+	 * The API class is heavily based on jQuery, presenting a chainable interface
+	 * that you can use to interact with tables. Each instance of the API class has
+	 * a "context" - i.e. the tables that it will operate on. This could be a single
+	 * table, all tables on a page or a sub-set thereof.
+	 *
+	 * Additionally the API is designed to allow you to easily work with the data in
+	 * the tables, retrieving and manipulating it as required. This is done by
+	 * presenting the API class as an array like interface. The contents of the
+	 * array depend upon the actions requested by each method (for example
+	 * `rows().nodes()` will return an array of nodes, while `rows().data()` will
+	 * return an array of objects or arrays depending upon your table's
+	 * configuration). The API object has a number of array like methods (`push`,
+	 * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
+	 * `unique` etc) to assist your working with the data held in a table.
+	 *
+	 * Most methods (those which return an Api instance) are chainable, which means
+	 * the return from a method call also has all of the methods available that the
+	 * top level object had. For example, these two calls are equivalent:
+	 *
+	 *     // Not chained
+	 *     api.row.add( {...} );
+	 *     api.draw();
+	 *
+	 *     // Chained
+	 *     api.row.add( {...} ).draw();
+	 *
+	 * @class DataTable.Api
+	 * @param {array|object|string|jQuery} context DataTable identifier. This is
+	 *   used to define which DataTables enhanced tables this API will operate on.
+	 *   Can be one of:
+	 *
+	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
+	 *     with be found and used.
+	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
+	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
+	 *   * `object` - DataTables settings object
+	 * @param {array} [data] Data to initialise the Api instance with.
+	 *
+	 * @example
+	 *   // Direct initialisation during DataTables construction
+	 *   var api = $('#example').DataTable();
+	 *
+	 * @example
+	 *   // Initialisation using a DataTables jQuery object
+	 *   var api = $('#example').dataTable().api();
+	 *
+	 * @example
+	 *   // Initialisation as a constructor
+	 *   var api = new $.fn.DataTable.Api( 'table.dataTable' );
+	 */
+	_Api = function ( context, data )
+	{
+		if ( ! (this instanceof _Api) ) {
+			return new _Api( context, data );
+		}
+	
+		var settings = [];
+		var ctxSettings = function ( o ) {
+			var a = _toSettings( o );
+			if ( a ) {
+				settings = settings.concat( a );
+			}
+		};
+	
+		if ( $.isArray( context ) ) {
+			for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+				ctxSettings( context[i] );
+			}
+		}
+		else {
+			ctxSettings( context );
+		}
+	
+		// Remove duplicates
+		this.context = _unique( settings );
+	
+		// Initial data
+		if ( data ) {
+			$.merge( this, data );
+		}
+	
+		// selector
+		this.selector = {
+			rows: null,
+			cols: null,
+			opts: null
+		};
+	
+		_Api.extend( this, this, __apiStruct );
+	};
+	
+	DataTable.Api = _Api;
+	
+	// Don't destroy the existing prototype, just extend it. Required for jQuery 2's
+	// isPlainObject.
+	$.extend( _Api.prototype, {
+		any: function ()
+		{
+			return this.count() !== 0;
+		},
+	
+	
+		concat:  __arrayProto.concat,
+	
+	
+		context: [], // array of table settings objects
+	
+	
+		count: function ()
+		{
+			return this.flatten().length;
+		},
+	
+	
+		each: function ( fn )
+		{
+			for ( var i=0, ien=this.length ; i<ien; i++ ) {
+				fn.call( this, this[i], i, this );
+			}
+	
+			return this;
+		},
+	
+	
+		eq: function ( idx )
+		{
+			var ctx = this.context;
+	
+			return ctx.length > idx ?
+				new _Api( ctx[idx], this[idx] ) :
+				null;
+		},
+	
+	
+		filter: function ( fn )
+		{
+			var a = [];
+	
+			if ( __arrayProto.filter ) {
+				a = __arrayProto.filter.call( this, fn, this );
+			}
+			else {
+				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
+				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+					if ( fn.call( this, this[i], i, this ) ) {
+						a.push( this[i] );
+					}
+				}
+			}
+	
+			return new _Api( this.context, a );
+		},
+	
+	
+		flatten: function ()
+		{
+			var a = [];
+			return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
+		},
+	
+	
+		join:    __arrayProto.join,
+	
+	
+		indexOf: __arrayProto.indexOf || function (obj, start)
+		{
+			for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
+				if ( this[i] === obj ) {
+					return i;
+				}
+			}
+			return -1;
+		},
+	
+		iterator: function ( flatten, type, fn, alwaysNew ) {
+			var
+				a = [], ret,
+				i, ien, j, jen,
+				context = this.context,
+				rows, items, item,
+				selector = this.selector;
+	
+			// Argument shifting
+			if ( typeof flatten === 'string' ) {
+				alwaysNew = fn;
+				fn = type;
+				type = flatten;
+				flatten = false;
+			}
+	
+			for ( i=0, ien=context.length ; i<ien ; i++ ) {
+				var apiInst = new _Api( context[i] );
+	
+				if ( type === 'table' ) {
+					ret = fn.call( apiInst, context[i], i );
+	
+					if ( ret !== undefined ) {
+						a.push( ret );
+					}
+				}
+				else if ( type === 'columns' || type === 'rows' ) {
+					// this has same length as context - one entry for each table
+					ret = fn.call( apiInst, context[i], this[i], i );
+	
+					if ( ret !== undefined ) {
+						a.push( ret );
+					}
+				}
+				else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
+					// columns and rows share the same structure.
+					// 'this' is an array of column indexes for each context
+					items = this[i];
+	
+					if ( type === 'column-rows' ) {
+						rows = _selector_row_indexes( context[i], selector.opts );
+					}
+	
+					for ( j=0, jen=items.length ; j<jen ; j++ ) {
+						item = items[j];
+	
+						if ( type === 'cell' ) {
+							ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
+						}
+						else {
+							ret = fn.call( apiInst, context[i], item, i, j, rows );
+						}
+	
+						if ( ret !== undefined ) {
+							a.push( ret );
+						}
+					}
+				}
+			}
+	
+			if ( a.length || alwaysNew ) {
+				var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
+				var apiSelector = api.selector;
+				apiSelector.rows = selector.rows;
+				apiSelector.cols = selector.cols;
+				apiSelector.opts = selector.opts;
+				return api;
+			}
+			return this;
+		},
+	
+	
+		lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
+		{
+			// Bit cheeky...
+			return this.indexOf.apply( this.toArray.reverse(), arguments );
+		},
+	
+	
+		length:  0,
+	
+	
+		map: function ( fn )
+		{
+			var a = [];
+	
+			if ( __arrayProto.map ) {
+				a = __arrayProto.map.call( this, fn, this );
+			}
+			else {
+				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
+				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+					a.push( fn.call( this, this[i], i ) );
+				}
+			}
+	
+			return new _Api( this.context, a );
+		},
+	
+	
+		pluck: function ( prop )
+		{
+			return this.map( function ( el ) {
+				return el[ prop ];
+			} );
+		},
+	
+		pop:     __arrayProto.pop,
+	
+	
+		push:    __arrayProto.push,
+	
+	
+		// Does not return an API instance
+		reduce: __arrayProto.reduce || function ( fn, init )
+		{
+			return _fnReduce( this, fn, init, 0, this.length, 1 );
+		},
+	
+	
+		reduceRight: __arrayProto.reduceRight || function ( fn, init )
+		{
+			return _fnReduce( this, fn, init, this.length-1, -1, -1 );
+		},
+	
+	
+		reverse: __arrayProto.reverse,
+	
+	
+		// Object with rows, columns and opts
+		selector: null,
+	
+	
+		shift:   __arrayProto.shift,
+	
+	
+		slice: function () {
+			return new _Api( this.context, this );
+		},
+	
+	
+		sort:    __arrayProto.sort, // ? name - order?
+	
+	
+		splice:  __arrayProto.splice,
+	
+	
+		toArray: function ()
+		{
+			return __arrayProto.slice.call( this );
+		},
+	
+	
+		to$: function ()
+		{
+			return $( this );
+		},
+	
+	
+		toJQuery: function ()
+		{
+			return $( this );
+		},
+	
+	
+		unique: function ()
+		{
+			return new _Api( this.context, _unique(this) );
+		},
+	
+	
+		unshift: __arrayProto.unshift
+	} );
+	
+	
+	_Api.extend = function ( scope, obj, ext )
+	{
+		// Only extend API instances and static properties of the API
+		if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
+			return;
+		}
+	
+		var
+			i, ien,
+			j, jen,
+			struct, inner,
+			methodScoping = function ( scope, fn, struc ) {
+				return function () {
+					var ret = fn.apply( scope, arguments );
+	
+					// Method extension
+					_Api.extend( ret, ret, struc.methodExt );
+					return ret;
+				};
+			};
+	
+		for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+			struct = ext[i];
+	
+			// Value
+			obj[ struct.name ] = typeof struct.val === 'function' ?
+				methodScoping( scope, struct.val, struct ) :
+				$.isPlainObject( struct.val ) ?
+					{} :
+					struct.val;
+	
+			obj[ struct.name ].__dt_wrapper = true;
+	
+			// Property extension
+			_Api.extend( scope, obj[ struct.name ], struct.propExt );
+		}
+	};
+	
+	
+	// @todo - Is there need for an augment function?
+	// _Api.augment = function ( inst, name )
+	// {
+	// 	// Find src object in the structure from the name
+	// 	var parts = name.split('.');
+	
+	// 	_Api.extend( inst, obj );
+	// };
+	
+	
+	//     [
+	//       {
+	//         name:      'data'                -- string   - Property name
+	//         val:       function () {},       -- function - Api method (or undefined if just an object
+	//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
+	//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
+	//       },
+	//       {
+	//         name:     'row'
+	//         val:       {},
+	//         methodExt: [ ... ],
+	//         propExt:   [
+	//           {
+	//             name:      'data'
+	//             val:       function () {},
+	//             methodExt: [ ... ],
+	//             propExt:   [ ... ]
+	//           },
+	//           ...
+	//         ]
+	//       }
+	//     ]
+	
+	_Api.register = _api_register = function ( name, val )
+	{
+		if ( $.isArray( name ) ) {
+			for ( var j=0, jen=name.length ; j<jen ; j++ ) {
+				_Api.register( name[j], val );
+			}
+			return;
+		}
+	
+		var
+			i, ien,
+			heir = name.split('.'),
+			struct = __apiStruct,
+			key, method;
+	
+		var find = function ( src, name ) {
+			for ( var i=0, ien=src.length ; i<ien ; i++ ) {
+				if ( src[i].name === name ) {
+					return src[i];
+				}
+			}
+			return null;
+		};
+	
+		for ( i=0, ien=heir.length ; i<ien ; i++ ) {
+			method = heir[i].indexOf('()') !== -1;
+			key = method ?
+				heir[i].replace('()', '') :
+				heir[i];
+	
+			var src = find( struct, key );
+			if ( ! src ) {
+				src = {
+					name:      key,
+					val:       {},
+					methodExt: [],
+					propExt:   []
+				};
+				struct.push( src );
+			}
+	
+			if ( i === ien-1 ) {
+				src.val = val;
+			}
+			else {
+				struct = method ?
+					src.methodExt :
+					src.propExt;
+			}
+		}
+	};
+	
+	
+	_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
+		_Api.register( pluralName, val );
+	
+		_Api.register( singularName, function () {
+			var ret = val.apply( this, arguments );
+	
+			if ( ret === this ) {
+				// Returned item is the API instance that was passed in, return it
+				return this;
+			}
+			else if ( ret instanceof _Api ) {
+				// New API instance returned, want the value from the first item
+				// in the returned array for the singular result.
+				return ret.length ?
+					$.isArray( ret[0] ) ?
+						new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
+						ret[0] :
+					undefined;
+			}
+	
+			// Non-API return - just fire it back
+			return ret;
+		} );
+	};
+	
+	
+	/**
+	 * Selector for HTML tables. Apply the given selector to the give array of
+	 * DataTables settings objects.
+	 *
+	 * @param {string|integer} [selector] jQuery selector string or integer
+	 * @param  {array} Array of DataTables settings objects to be filtered
+	 * @return {array}
+	 * @ignore
+	 */
+	var __table_selector = function ( selector, a )
+	{
+		// Integer is used to pick out a table by index
+		if ( typeof selector === 'number' ) {
+			return [ a[ selector ] ];
+		}
+	
+		// Perform a jQuery selector on the table nodes
+		var nodes = $.map( a, function (el, i) {
+			return el.nTable;
+		} );
+	
+		return $(nodes)
+			.filter( selector )
+			.map( function (i) {
+				// Need to translate back from the table node to the settings
+				var idx = $.inArray( this, nodes );
+				return a[ idx ];
+			} )
+			.toArray();
+	};
+	
+	
+	
+	/**
+	 * Context selector for the API's context (i.e. the tables the API instance
+	 * refers to.
+	 *
+	 * @name    DataTable.Api#tables
+	 * @param {string|integer} [selector] Selector to pick which tables the iterator
+	 *   should operate on. If not given, all tables in the current context are
+	 *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to
+	 *   select multiple tables or as an integer to select a single table.
+	 * @returns {DataTable.Api} Returns a new API instance if a selector is given.
+	 */
+	_api_register( 'tables()', function ( selector ) {
+		// A new instance is created if there was a selector specified
+		return selector ?
+			new _Api( __table_selector( selector, this.context ) ) :
+			this;
+	} );
+	
+	
+	_api_register( 'table()', function ( selector ) {
+		var tables = this.tables( selector );
+		var ctx = tables.context;
+	
+		// Truncate to the first matched table
+		return ctx.length ?
+			new _Api( ctx[0] ) :
+			tables;
+	} );
+	
+	
+	_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTable;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().body()', 'table().body()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTBody;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().header()', 'table().header()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTHead;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTFoot;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().containers()', 'table().container()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTableWrapper;
+		}, 1 );
+	} );
+	
+	
+	
+	/**
+	 * Redraw the tables in the current context.
+	 */
+	_api_register( 'draw()', function ( paging ) {
+		return this.iterator( 'table', function ( settings ) {
+			if ( paging === 'page' ) {
+				_fnDraw( settings );
+			}
+			else {
+				if ( typeof paging === 'string' ) {
+					paging = paging === 'full-hold' ?
+						false :
+						true;
+				}
+	
+				_fnReDraw( settings, paging===false );
+			}
+		} );
+	} );
+	
+	
+	
+	/**
+	 * Get the current page index.
+	 *
+	 * @return {integer} Current page index (zero based)
+	 *//**
+	 * Set the current page.
+	 *
+	 * Note that if you attempt to show a page which does not exist, DataTables will
+	 * not throw an error, but rather reset the paging.
+	 *
+	 * @param {integer|string} action The paging action to take. This can be one of:
+	 *  * `integer` - The page index to jump to
+	 *  * `string` - An action to take:
+	 *    * `first` - Jump to first page.
+	 *    * `next` - Jump to the next page
+	 *    * `previous` - Jump to previous page
+	 *    * `last` - Jump to the last page.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'page()', function ( action ) {
+		if ( action === undefined ) {
+			return this.page.info().page; // not an expensive call
+		}
+	
+		// else, have an action to take on all tables
+		return this.iterator( 'table', function ( settings ) {
+			_fnPageChange( settings, action );
+		} );
+	} );
+	
+	
+	/**
+	 * Paging information for the first table in the current context.
+	 *
+	 * If you require paging information for another table, use the `table()` method
+	 * with a suitable selector.
+	 *
+	 * @return {object} Object with the following properties set:
+	 *  * `page` - Current page index (zero based - i.e. the first page is `0`)
+	 *  * `pages` - Total number of pages
+	 *  * `start` - Display index for the first record shown on the current page
+	 *  * `end` - Display index for the last record shown on the current page
+	 *  * `length` - Display length (number of records). Note that generally `start
+	 *    + length = end`, but this is not always true, for example if there are
+	 *    only 2 records to show on the final page, with a length of 10.
+	 *  * `recordsTotal` - Full data set length
+	 *  * `recordsDisplay` - Data set length once the current filtering criterion
+	 *    are applied.
+	 */
+	_api_register( 'page.info()', function ( action ) {
+		if ( this.context.length === 0 ) {
+			return undefined;
+		}
+	
+		var
+			settings   = this.context[0],
+			start      = settings._iDisplayStart,
+			len        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,
+			visRecords = settings.fnRecordsDisplay(),
+			all        = len === -1;
+	
+		return {
+			"page":           all ? 0 : Math.floor( start / len ),
+			"pages":          all ? 1 : Math.ceil( visRecords / len ),
+			"start":          start,
+			"end":            settings.fnDisplayEnd(),
+			"length":         len,
+			"recordsTotal":   settings.fnRecordsTotal(),
+			"recordsDisplay": visRecords,
+			"serverSide":     _fnDataSource( settings ) === 'ssp'
+		};
+	} );
+	
+	
+	/**
+	 * Get the current page length.
+	 *
+	 * @return {integer} Current page length. Note `-1` indicates that all records
+	 *   are to be shown.
+	 *//**
+	 * Set the current page length.
+	 *
+	 * @param {integer} Page length to set. Use `-1` to show all records.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'page.len()', function ( len ) {
+		// Note that we can't call this function 'length()' because `length`
+		// is a Javascript property of functions which defines how many arguments
+		// the function expects.
+		if ( len === undefined ) {
+			return this.context.length !== 0 ?
+				this.context[0]._iDisplayLength :
+				undefined;
+		}
+	
+		// else, set the page length
+		return this.iterator( 'table', function ( settings ) {
+			_fnLengthChange( settings, len );
+		} );
+	} );
+	
+	
+	
+	var __reload = function ( settings, holdPosition, callback ) {
+		// Use the draw event to trigger a callback
+		if ( callback ) {
+			var api = new _Api( settings );
+	
+			api.one( 'draw', function () {
+				callback( api.ajax.json() );
+			} );
+		}
+	
+		if ( _fnDataSource( settings ) == 'ssp' ) {
+			_fnReDraw( settings, holdPosition );
+		}
+		else {
+			_fnProcessingDisplay( settings, true );
+	
+			// Cancel an existing request
+			var xhr = settings.jqXHR;
+			if ( xhr && xhr.readyState !== 4 ) {
+				xhr.abort();
+			}
+	
+			// Trigger xhr
+			_fnBuildAjax( settings, [], function( json ) {
+				_fnClearTable( settings );
+	
+				var data = _fnAjaxDataSrc( settings, json );
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					_fnAddData( settings, data[i] );
+				}
+	
+				_fnReDraw( settings, holdPosition );
+				_fnProcessingDisplay( settings, false );
+			} );
+		}
+	};
+	
+	
+	/**
+	 * Get the JSON response from the last Ajax request that DataTables made to the
+	 * server. Note that this returns the JSON from the first table in the current
+	 * context.
+	 *
+	 * @return {object} JSON received from the server.
+	 */
+	_api_register( 'ajax.json()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length > 0 ) {
+			return ctx[0].json;
+		}
+	
+		// else return undefined;
+	} );
+	
+	
+	/**
+	 * Get the data submitted in the last Ajax request
+	 */
+	_api_register( 'ajax.params()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length > 0 ) {
+			return ctx[0].oAjaxData;
+		}
+	
+		// else return undefined;
+	} );
+	
+	
+	/**
+	 * Reload tables from the Ajax data source. Note that this function will
+	 * automatically re-draw the table when the remote data has been loaded.
+	 *
+	 * @param {boolean} [reset=true] Reset (default) or hold the current paging
+	 *   position. A full re-sort and re-filter is performed when this method is
+	 *   called, which is why the pagination reset is the default action.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.reload()', function ( callback, resetPaging ) {
+		return this.iterator( 'table', function (settings) {
+			__reload( settings, resetPaging===false, callback );
+		} );
+	} );
+	
+	
+	/**
+	 * Get the current Ajax URL. Note that this returns the URL from the first
+	 * table in the current context.
+	 *
+	 * @return {string} Current Ajax source URL
+	 *//**
+	 * Set the Ajax URL. Note that this will set the URL for all tables in the
+	 * current context.
+	 *
+	 * @param {string} url URL to set.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.url()', function ( url ) {
+		var ctx = this.context;
+	
+		if ( url === undefined ) {
+			// get
+			if ( ctx.length === 0 ) {
+				return undefined;
+			}
+			ctx = ctx[0];
+	
+			return ctx.ajax ?
+				$.isPlainObject( ctx.ajax ) ?
+					ctx.ajax.url :
+					ctx.ajax :
+				ctx.sAjaxSource;
+		}
+	
+		// set
+		return this.iterator( 'table', function ( settings ) {
+			if ( $.isPlainObject( settings.ajax ) ) {
+				settings.ajax.url = url;
+			}
+			else {
+				settings.ajax = url;
+			}
+			// No need to consider sAjaxSource here since DataTables gives priority
+			// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
+			// value of `sAjaxSource` redundant.
+		} );
+	} );
+	
+	
+	/**
+	 * Load data from the newly set Ajax URL. Note that this method is only
+	 * available when `ajax.url()` is used to set a URL. Additionally, this method
+	 * has the same effect as calling `ajax.reload()` but is provided for
+	 * convenience when setting a new URL. Like `ajax.reload()` it will
+	 * automatically redraw the table once the remote data has been loaded.
+	 *
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
+		// Same as a reload, but makes sense to present it for easy access after a
+		// url change
+		return this.iterator( 'table', function ( ctx ) {
+			__reload( ctx, resetPaging===false, callback );
+		} );
+	} );
+	
+	
+	
+	
+	var _selector_run = function ( type, selector, selectFn, settings, opts )
+	{
+		var
+			out = [], res,
+			a, i, ien, j, jen,
+			selectorType = typeof selector;
+	
+		// Can't just check for isArray here, as an API or jQuery instance might be
+		// given with their array like look
+		if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
+			selector = [ selector ];
+		}
+	
+		for ( i=0, ien=selector.length ; i<ien ; i++ ) {
+			// Only split on simple strings - complex expressions will be jQuery selectors
+			a = selector[i] && selector[i].split && ! selector[i].match(/[\[\(:]/) ?
+				selector[i].split(',') :
+				[ selector[i] ];
+	
+			for ( j=0, jen=a.length ; j<jen ; j++ ) {
+				res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
+	
+				if ( res && res.length ) {
+					out = out.concat( res );
+				}
+			}
+		}
+	
+		// selector extensions
+		var ext = _ext.selector[ type ];
+		if ( ext.length ) {
+			for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+				out = ext[i]( settings, opts, out );
+			}
+		}
+	
+		return _unique( out );
+	};
+	
+	
+	var _selector_opts = function ( opts )
+	{
+		if ( ! opts ) {
+			opts = {};
+		}
+	
+		// Backwards compatibility for 1.9- which used the terminology filter rather
+		// than search
+		if ( opts.filter && opts.search === undefined ) {
+			opts.search = opts.filter;
+		}
+	
+		return $.extend( {
+			search: 'none',
+			order: 'current',
+			page: 'all'
+		}, opts );
+	};
+	
+	
+	var _selector_first = function ( inst )
+	{
+		// Reduce the API instance to the first item found
+		for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
+			if ( inst[i].length > 0 ) {
+				// Assign the first element to the first item in the instance
+				// and truncate the instance and context
+				inst[0] = inst[i];
+				inst[0].length = 1;
+				inst.length = 1;
+				inst.context = [ inst.context[i] ];
+	
+				return inst;
+			}
+		}
+	
+		// Not found - return an empty instance
+		inst.length = 0;
+		return inst;
+	};
+	
+	
+	var _selector_row_indexes = function ( settings, opts )
+	{
+		var
+			i, ien, tmp, a=[],
+			displayFiltered = settings.aiDisplay,
+			displayMaster = settings.aiDisplayMaster;
+	
+		var
+			search = opts.search,  // none, applied, removed
+			order  = opts.order,   // applied, current, index (original - compatibility with 1.9)
+			page   = opts.page;    // all, current
+	
+		if ( _fnDataSource( settings ) == 'ssp' ) {
+			// In server-side processing mode, most options are irrelevant since
+			// rows not shown don't exist and the index order is the applied order
+			// Removed is a special case - for consistency just return an empty
+			// array
+			return search === 'removed' ?
+				[] :
+				_range( 0, displayMaster.length );
+		}
+		else if ( page == 'current' ) {
+			// Current page implies that order=current and fitler=applied, since it is
+			// fairly senseless otherwise, regardless of what order and search actually
+			// are
+			for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
+				a.push( displayFiltered[i] );
+			}
+		}
+		else if ( order == 'current' || order == 'applied' ) {
+			a = search == 'none' ?
+				displayMaster.slice() :                      // no search
+				search == 'applied' ?
+					displayFiltered.slice() :                // applied search
+					$.map( displayMaster, function (el, i) { // removed search
+						return $.inArray( el, displayFiltered ) === -1 ? el : null;
+					} );
+		}
+		else if ( order == 'index' || order == 'original' ) {
+			for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+				if ( search == 'none' ) {
+					a.push( i );
+				}
+				else { // applied | removed
+					tmp = $.inArray( i, displayFiltered );
+	
+					if ((tmp === -1 && search == 'removed') ||
+						(tmp >= 0   && search == 'applied') )
+					{
+						a.push( i );
+					}
+				}
+			}
+		}
+	
+		return a;
+	};
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Rows
+	 *
+	 * {}          - no selector - use all available rows
+	 * {integer}   - row aoData index
+	 * {node}      - TR node
+	 * {string}    - jQuery selector to apply to the TR elements
+	 * {array}     - jQuery array of nodes, or simply an array of TR nodes
+	 *
+	 */
+	
+	
+	var __row_selector = function ( settings, selector, opts )
+	{
+		var rows;
+		var run = function ( sel ) {
+			var selInt = _intVal( sel );
+			var i, ien;
+	
+			// Short cut - selector is a number and no options provided (default is
+			// all records, so no need to check if the index is in there, since it
+			// must be - dev error if the index doesn't exist).
+			if ( selInt !== null && ! opts ) {
+				return [ selInt ];
+			}
+	
+			if ( ! rows ) {
+				rows = _selector_row_indexes( settings, opts );
+			}
+	
+			if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
+				// Selector - integer
+				return [ selInt ];
+			}
+			else if ( sel === null || sel === undefined || sel === '' ) {
+				// Selector - none
+				return rows;
+			}
+	
+			// Selector - function
+			if ( typeof sel === 'function' ) {
+				return $.map( rows, function (idx) {
+					var row = settings.aoData[ idx ];
+					return sel( idx, row._aData, row.nTr ) ? idx : null;
+				} );
+			}
+	
+			// Get nodes in the order from the `rows` array with null values removed
+			var nodes = _removeEmpty(
+				_pluck_order( settings.aoData, rows, 'nTr' )
+			);
+	
+			// Selector - node
+			if ( sel.nodeName ) {
+				if ( sel._DT_RowIndex !== undefined ) {
+					return [ sel._DT_RowIndex ]; // Property added by DT for fast lookup
+				}
+				else if ( sel._DT_CellIndex ) {
+					return [ sel._DT_CellIndex.row ];
+				}
+				else {
+					var host = $(sel).closest('*[data-dt-row]');
+					return host.length ?
+						[ host.data('dt-row') ] :
+						[];
+				}
+			}
+	
+			// ID selector. Want to always be able to select rows by id, regardless
+			// of if the tr element has been created or not, so can't rely upon
+			// jQuery here - hence a custom implementation. This does not match
+			// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
+			// but to select it using a CSS selector engine (like Sizzle or
+			// querySelect) it would need to need to be escaped for some characters.
+			// DataTables simplifies this for row selectors since you can select
+			// only a row. A # indicates an id any anything that follows is the id -
+			// unescaped.
+			if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
+				// get row index from id
+				var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
+				if ( rowObj !== undefined ) {
+					return [ rowObj.idx ];
+				}
+	
+				// need to fall through to jQuery in case there is DOM id that
+				// matches
+			}
+	
+			// Selector - jQuery selector string, array of nodes or jQuery object/
+			// As jQuery's .filter() allows jQuery objects to be passed in filter,
+			// it also allows arrays, so this will cope with all three options
+			return $(nodes)
+				.filter( sel )
+				.map( function () {
+					return this._DT_RowIndex;
+				} )
+				.toArray();
+		};
+	
+		return _selector_run( 'row', selector, run, settings, opts );
+	};
+	
+	
+	_api_register( 'rows()', function ( selector, opts ) {
+		// argument shifting
+		if ( selector === undefined ) {
+			selector = '';
+		}
+		else if ( $.isPlainObject( selector ) ) {
+			opts = selector;
+			selector = '';
+		}
+	
+		opts = _selector_opts( opts );
+	
+		var inst = this.iterator( 'table', function ( settings ) {
+			return __row_selector( settings, selector, opts );
+		}, 1 );
+	
+		// Want argument shifting here and in __row_selector?
+		inst.selector.rows = selector;
+		inst.selector.opts = opts;
+	
+		return inst;
+	} );
+	
+	_api_register( 'rows().nodes()', function () {
+		return this.iterator( 'row', function ( settings, row ) {
+			return settings.aoData[ row ].nTr || undefined;
+		}, 1 );
+	} );
+	
+	_api_register( 'rows().data()', function () {
+		return this.iterator( true, 'rows', function ( settings, rows ) {
+			return _pluck_order( settings.aoData, rows, '_aData' );
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
+		return this.iterator( 'row', function ( settings, row ) {
+			var r = settings.aoData[ row ];
+			return type === 'search' ? r._aFilterData : r._aSortData;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
+		return this.iterator( 'row', function ( settings, row ) {
+			_fnInvalidate( settings, row, src );
+		} );
+	} );
+	
+	_api_registerPlural( 'rows().indexes()', 'row().index()', function () {
+		return this.iterator( 'row', function ( settings, row ) {
+			return row;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
+		var a = [];
+		var context = this.context;
+	
+		// `iterator` will drop undefined values, but in this case we want them
+		for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+			for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
+				var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
+				a.push( (hash === true ? '#' : '' )+ id );
+			}
+		}
+	
+		return new _Api( context, a );
+	} );
+	
+	_api_registerPlural( 'rows().remove()', 'row().remove()', function () {
+		var that = this;
+	
+		this.iterator( 'row', function ( settings, row, thatIdx ) {
+			var data = settings.aoData;
+			var rowData = data[ row ];
+			var i, ien, j, jen;
+			var loopRow, loopCells;
+	
+			data.splice( row, 1 );
+	
+			// Update the cached indexes
+			for ( i=0, ien=data.length ; i<ien ; i++ ) {
+				loopRow = data[i];
+				loopCells = loopRow.anCells;
+	
+				// Rows
+				if ( loopRow.nTr !== null ) {
+					loopRow.nTr._DT_RowIndex = i;
+				}
+	
+				// Cells
+				if ( loopCells !== null ) {
+					for ( j=0, jen=loopCells.length ; j<jen ; j++ ) {
+						loopCells[j]._DT_CellIndex.row = i;
+					}
+				}
+			}
+	
+			// Delete from the display arrays
+			_fnDeleteIndex( settings.aiDisplayMaster, row );
+			_fnDeleteIndex( settings.aiDisplay, row );
+			_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
+	
+			// Check for an 'overflow' they case for displaying the table
+			_fnLengthOverflow( settings );
+	
+			// Remove the row's ID reference if there is one
+			var id = settings.rowIdFn( rowData._aData );
+			if ( id !== undefined ) {
+				delete settings.aIds[ id ];
+			}
+		} );
+	
+		this.iterator( 'table', function ( settings ) {
+			for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+				settings.aoData[i].idx = i;
+			}
+		} );
+	
+		return this;
+	} );
+	
+	
+	_api_register( 'rows.add()', function ( rows ) {
+		var newRows = this.iterator( 'table', function ( settings ) {
+				var row, i, ien;
+				var out = [];
+	
+				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+					row = rows[i];
+	
+					if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+						out.push( _fnAddTr( settings, row )[0] );
+					}
+					else {
+						out.push( _fnAddData( settings, row ) );
+					}
+				}
+	
+				return out;
+			}, 1 );
+	
+		// Return an Api.rows() extended instance, so rows().nodes() etc can be used
+		var modRows = this.rows( -1 );
+		modRows.pop();
+		$.merge( modRows, newRows );
+	
+		return modRows;
+	} );
+	
+	
+	
+	
+	
+	/**
+	 *
+	 */
+	_api_register( 'row()', function ( selector, opts ) {
+		return _selector_first( this.rows( selector, opts ) );
+	} );
+	
+	
+	_api_register( 'row().data()', function ( data ) {
+		var ctx = this.context;
+	
+		if ( data === undefined ) {
+			// Get
+			return ctx.length && this.length ?
+				ctx[0].aoData[ this[0] ]._aData :
+				undefined;
+		}
+	
+		// Set
+		ctx[0].aoData[ this[0] ]._aData = data;
+	
+		// Automatically invalidate
+		_fnInvalidate( ctx[0], this[0], 'data' );
+	
+		return this;
+	} );
+	
+	
+	_api_register( 'row().node()', function () {
+		var ctx = this.context;
+	
+		return ctx.length && this.length ?
+			ctx[0].aoData[ this[0] ].nTr || null :
+			null;
+	} );
+	
+	
+	_api_register( 'row.add()', function ( row ) {
+		// Allow a jQuery object to be passed in - only a single row is added from
+		// it though - the first element in the set
+		if ( row instanceof $ && row.length ) {
+			row = row[0];
+		}
+	
+		var rows = this.iterator( 'table', function ( settings ) {
+			if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+				return _fnAddTr( settings, row )[0];
+			}
+			return _fnAddData( settings, row );
+		} );
+	
+		// Return an Api.rows() extended instance, with the newly added row selected
+		return this.row( rows[0] );
+	} );
+	
+	
+	
+	var __details_add = function ( ctx, row, data, klass )
+	{
+		// Convert to array of TR elements
+		var rows = [];
+		var addRow = function ( r, k ) {
+			// Recursion to allow for arrays of jQuery objects
+			if ( $.isArray( r ) || r instanceof $ ) {
+				for ( var i=0, ien=r.length ; i<ien ; i++ ) {
+					addRow( r[i], k );
+				}
+				return;
+			}
+	
+			// If we get a TR element, then just add it directly - up to the dev
+			// to add the correct number of columns etc
+			if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
+				rows.push( r );
+			}
+			else {
+				// Otherwise create a row with a wrapper
+				var created = $('<tr><td/></tr>').addClass( k );
+				$('td', created)
+					.addClass( k )
+					.html( r )
+					[0].colSpan = _fnVisbleColumns( ctx );
+	
+				rows.push( created[0] );
+			}
+		};
+	
+		addRow( data, klass );
+	
+		if ( row._details ) {
+			row._details.detach();
+		}
+	
+		row._details = $(rows);
+	
+		// If the children were already shown, that state should be retained
+		if ( row._detailsShow ) {
+			row._details.insertAfter( row.nTr );
+		}
+	};
+	
+	
+	var __details_remove = function ( api, idx )
+	{
+		var ctx = api.context;
+	
+		if ( ctx.length ) {
+			var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
+	
+			if ( row && row._details ) {
+				row._details.remove();
+	
+				row._detailsShow = undefined;
+				row._details = undefined;
+			}
+		}
+	};
+	
+	
+	var __details_display = function ( api, show ) {
+		var ctx = api.context;
+	
+		if ( ctx.length && api.length ) {
+			var row = ctx[0].aoData[ api[0] ];
+	
+			if ( row._details ) {
+				row._detailsShow = show;
+	
+				if ( show ) {
+					row._details.insertAfter( row.nTr );
+				}
+				else {
+					row._details.detach();
+				}
+	
+				__details_events( ctx[0] );
+			}
+		}
+	};
+	
+	
+	var __details_events = function ( settings )
+	{
+		var api = new _Api( settings );
+		var namespace = '.dt.DT_details';
+		var drawEvent = 'draw'+namespace;
+		var colvisEvent = 'column-visibility'+namespace;
+		var destroyEvent = 'destroy'+namespace;
+		var data = settings.aoData;
+	
+		api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
+	
+		if ( _pluck( data, '_details' ).length > 0 ) {
+			// On each draw, insert the required elements into the document
+			api.on( drawEvent, function ( e, ctx ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				api.rows( {page:'current'} ).eq(0).each( function (idx) {
+					// Internal data grab
+					var row = data[ idx ];
+	
+					if ( row._detailsShow ) {
+						row._details.insertAfter( row.nTr );
+					}
+				} );
+			} );
+	
+			// Column visibility change - update the colspan
+			api.on( colvisEvent, function ( e, ctx, idx, vis ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				// Update the colspan for the details rows (note, only if it already has
+				// a colspan)
+				var row, visible = _fnVisbleColumns( ctx );
+	
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					row = data[i];
+	
+					if ( row._details ) {
+						row._details.children('td[colspan]').attr('colspan', visible );
+					}
+				}
+			} );
+	
+			// Table destroyed - nuke any child rows
+			api.on( destroyEvent, function ( e, ctx ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					if ( data[i]._details ) {
+						__details_remove( api, i );
+					}
+				}
+			} );
+		}
+	};
+	
+	// Strings for the method names to help minification
+	var _emp = '';
+	var _child_obj = _emp+'row().child';
+	var _child_mth = _child_obj+'()';
+	
+	// data can be:
+	//  tr
+	//  string
+	//  jQuery or array of any of the above
+	_api_register( _child_mth, function ( data, klass ) {
+		var ctx = this.context;
+	
+		if ( data === undefined ) {
+			// get
+			return ctx.length && this.length ?
+				ctx[0].aoData[ this[0] ]._details :
+				undefined;
+		}
+		else if ( data === true ) {
+			// show
+			this.child.show();
+		}
+		else if ( data === false ) {
+			// remove
+			__details_remove( this );
+		}
+		else if ( ctx.length && this.length ) {
+			// set
+			__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
+		}
+	
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.show()',
+		_child_mth+'.show()' // only when `child()` was called with parameters (without
+	], function ( show ) {   // it returns an object and this method is not executed)
+		__details_display( this, true );
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.hide()',
+		_child_mth+'.hide()' // only when `child()` was called with parameters (without
+	], function () {         // it returns an object and this method is not executed)
+		__details_display( this, false );
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.remove()',
+		_child_mth+'.remove()' // only when `child()` was called with parameters (without
+	], function () {           // it returns an object and this method is not executed)
+		__details_remove( this );
+		return this;
+	} );
+	
+	
+	_api_register( _child_obj+'.isShown()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length && this.length ) {
+			// _detailsShown as false or undefined will fall through to return false
+			return ctx[0].aoData[ this[0] ]._detailsShow || false;
+		}
+		return false;
+	} );
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Columns
+	 *
+	 * {integer}           - column index (>=0 count from left, <0 count from right)
+	 * "{integer}:visIdx"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)
+	 * "{integer}:visible" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)
+	 * "{string}:name"     - column name
+	 * "{string}"          - jQuery selector on column header nodes
+	 *
+	 */
+	
+	// can be an array of these items, comma separated list, or an array of comma
+	// separated lists
+	
+	var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;
+	
+	
+	// r1 and r2 are redundant - but it means that the parameters match for the
+	// iterator callback in columns().data()
+	var __columnData = function ( settings, column, r1, r2, rows ) {
+		var a = [];
+		for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
+			a.push( _fnGetCellData( settings, rows[row], column ) );
+		}
+		return a;
+	};
+	
+	
+	var __column_selector = function ( settings, selector, opts )
+	{
+		var
+			columns = settings.aoColumns,
+			names = _pluck( columns, 'sName' ),
+			nodes = _pluck( columns, 'nTh' );
+	
+		var run = function ( s ) {
+			var selInt = _intVal( s );
+	
+			// Selector - all
+			if ( s === '' ) {
+				return _range( columns.length );
+			}
+	
+			// Selector - index
+			if ( selInt !== null ) {
+				return [ selInt >= 0 ?
+					selInt : // Count from left
+					columns.length + selInt // Count from right (+ because its a negative value)
+				];
+			}
+	
+			// Selector = function
+			if ( typeof s === 'function' ) {
+				var rows = _selector_row_indexes( settings, opts );
+	
+				return $.map( columns, function (col, idx) {
+					return s(
+							idx,
+							__columnData( settings, idx, 0, 0, rows ),
+							nodes[ idx ]
+						) ? idx : null;
+				} );
+			}
+	
+			// jQuery or string selector
+			var match = typeof s === 'string' ?
+				s.match( __re_column_selector ) :
+				'';
+	
+			if ( match ) {
+				switch( match[2] ) {
+					case 'visIdx':
+					case 'visible':
+						var idx = parseInt( match[1], 10 );
+						// Visible index given, convert to column index
+						if ( idx < 0 ) {
+							// Counting from the right
+							var visColumns = $.map( columns, function (col,i) {
+								return col.bVisible ? i : null;
+							} );
+							return [ visColumns[ visColumns.length + idx ] ];
+						}
+						// Counting from the left
+						return [ _fnVisibleToColumnIndex( settings, idx ) ];
+	
+					case 'name':
+						// match by name. `names` is column index complete and in order
+						return $.map( names, function (name, i) {
+							return name === match[1] ? i : null;
+						} );
+	
+					default:
+						return [];
+				}
+			}
+	
+			// Cell in the table body
+			if ( s.nodeName && s._DT_CellIndex ) {
+				return [ s._DT_CellIndex.column ];
+			}
+	
+			// jQuery selector on the TH elements for the columns
+			var jqResult = $( nodes )
+				.filter( s )
+				.map( function () {
+					return $.inArray( this, nodes ); // `nodes` is column index complete and in order
+				} )
+				.toArray();
+	
+			if ( jqResult.length || ! s.nodeName ) {
+				return jqResult;
+			}
+	
+			// Otherwise a node which might have a `dt-column` data attribute, or be
+			// a child or such an element
+			var host = $(s).closest('*[data-dt-column]');
+			return host.length ?
+				[ host.data('dt-column') ] :
+				[];
+		};
+	
+		return _selector_run( 'column', selector, run, settings, opts );
+	};
+	
+	
+	var __setColumnVis = function ( settings, column, vis ) {
+		var
+			cols = settings.aoColumns,
+			col  = cols[ column ],
+			data = settings.aoData,
+			row, cells, i, ien, tr;
+	
+		// Get
+		if ( vis === undefined ) {
+			return col.bVisible;
+		}
+	
+		// Set
+		// No change
+		if ( col.bVisible === vis ) {
+			return;
+		}
+	
+		if ( vis ) {
+			// Insert column
+			// Need to decide if we should use appendChild or insertBefore
+			var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
+	
+			for ( i=0, ien=data.length ; i<ien ; i++ ) {
+				tr = data[i].nTr;
+				cells = data[i].anCells;
+	
+				if ( tr ) {
+					// insertBefore can act like appendChild if 2nd arg is null
+					tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
+				}
+			}
+		}
+		else {
+			// Remove column
+			$( _pluck( settings.aoData, 'anCells', column ) ).detach();
+		}
+	
+		// Common actions
+		col.bVisible = vis;
+		_fnDrawHead( settings, settings.aoHeader );
+		_fnDrawHead( settings, settings.aoFooter );
+	
+		_fnSaveState( settings );
+	};
+	
+	
+	_api_register( 'columns()', function ( selector, opts ) {
+		// argument shifting
+		if ( selector === undefined ) {
+			selector = '';
+		}
+		else if ( $.isPlainObject( selector ) ) {
+			opts = selector;
+			selector = '';
+		}
+	
+		opts = _selector_opts( opts );
+	
+		var inst = this.iterator( 'table', function ( settings ) {
+			return __column_selector( settings, selector, opts );
+		}, 1 );
+	
+		// Want argument shifting here and in _row_selector?
+		inst.selector.cols = selector;
+		inst.selector.opts = opts;
+	
+		return inst;
+	} );
+	
+	_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].nTh;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].nTf;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().data()', 'column().data()', function () {
+		return this.iterator( 'column-rows', __columnData, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].mData;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
+		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+			return _pluck_order( settings.aoData, rows,
+				type === 'search' ? '_aFilterData' : '_aSortData', column
+			);
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
+		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+			return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
+		var ret = this.iterator( 'column', function ( settings, column ) {
+			if ( vis === undefined ) {
+				return settings.aoColumns[ column ].bVisible;
+			} // else
+			__setColumnVis( settings, column, vis );
+		} );
+	
+		// Group the column visibility changes
+		if ( vis !== undefined ) {
+			// Second loop once the first is done for events
+			this.iterator( 'column', function ( settings, column ) {
+				_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );
+			} );
+	
+			if ( calc === undefined || calc ) {
+				this.columns.adjust();
+			}
+		}
+	
+		return ret;
+	} );
+	
+	_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return type === 'visible' ?
+				_fnColumnIndexToVisible( settings, column ) :
+				column;
+		}, 1 );
+	} );
+	
+	_api_register( 'columns.adjust()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnAdjustColumnSizing( settings );
+		}, 1 );
+	} );
+	
+	_api_register( 'column.index()', function ( type, idx ) {
+		if ( this.context.length !== 0 ) {
+			var ctx = this.context[0];
+	
+			if ( type === 'fromVisible' || type === 'toData' ) {
+				return _fnVisibleToColumnIndex( ctx, idx );
+			}
+			else if ( type === 'fromData' || type === 'toVisible' ) {
+				return _fnColumnIndexToVisible( ctx, idx );
+			}
+		}
+	} );
+	
+	_api_register( 'column()', function ( selector, opts ) {
+		return _selector_first( this.columns( selector, opts ) );
+	} );
+	
+	
+	
+	var __cell_selector = function ( settings, selector, opts )
+	{
+		var data = settings.aoData;
+		var rows = _selector_row_indexes( settings, opts );
+		var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
+		var allCells = $( [].concat.apply([], cells) );
+		var row;
+		var columns = settings.aoColumns.length;
+		var a, i, ien, j, o, host;
+	
+		var run = function ( s ) {
+			var fnSelector = typeof s === 'function';
+	
+			if ( s === null || s === undefined || fnSelector ) {
+				// All cells and function selectors
+				a = [];
+	
+				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+					row = rows[i];
+	
+					for ( j=0 ; j<columns ; j++ ) {
+						o = {
+							row: row,
+							column: j
+						};
+	
+						if ( fnSelector ) {
+							// Selector - function
+							host = data[ row ];
+	
+							if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
+								a.push( o );
+							}
+						}
+						else {
+							// Selector - all
+							a.push( o );
+						}
+					}
+				}
+	
+				return a;
+			}
+			
+			// Selector - index
+			if ( $.isPlainObject( s ) ) {
+				return [s];
+			}
+	
+			// Selector - jQuery filtered cells
+			var jqResult = allCells
+				.filter( s )
+				.map( function (i, el) {
+					return { // use a new object, in case someone changes the values
+						row:    el._DT_CellIndex.row,
+						column: el._DT_CellIndex.column
+	 				};
+				} )
+				.toArray();
+	
+			if ( jqResult.length || ! s.nodeName ) {
+				return jqResult;
+			}
+	
+			// Otherwise the selector is a node, and there is one last option - the
+			// element might be a child of an element which has dt-row and dt-column
+			// data attributes
+			host = $(s).closest('*[data-dt-row]');
+			return host.length ?
+				[ {
+					row: host.data('dt-row'),
+					column: host.data('dt-column')
+				} ] :
+				[];
+		};
+	
+		return _selector_run( 'cell', selector, run, settings, opts );
+	};
+	
+	
+	
+	
+	_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
+		// Argument shifting
+		if ( $.isPlainObject( rowSelector ) ) {
+			// Indexes
+			if ( rowSelector.row === undefined ) {
+				// Selector options in first parameter
+				opts = rowSelector;
+				rowSelector = null;
+			}
+			else {
+				// Cell index objects in first parameter
+				opts = columnSelector;
+				columnSelector = null;
+			}
+		}
+		if ( $.isPlainObject( columnSelector ) ) {
+			opts = columnSelector;
+			columnSelector = null;
+		}
+	
+		// Cell selector
+		if ( columnSelector === null || columnSelector === undefined ) {
+			return this.iterator( 'table', function ( settings ) {
+				return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
+			} );
+		}
+	
+		// Row + column selector
+		var columns = this.columns( columnSelector, opts );
+		var rows = this.rows( rowSelector, opts );
+		var a, i, ien, j, jen;
+	
+		var cells = this.iterator( 'table', function ( settings, idx ) {
+			a = [];
+	
+			for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
+				for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
+					a.push( {
+						row:    rows[idx][i],
+						column: columns[idx][j]
+					} );
+				}
+			}
+	
+			return a;
+		}, 1 );
+	
+		$.extend( cells.selector, {
+			cols: columnSelector,
+			rows: rowSelector,
+			opts: opts
+		} );
+	
+		return cells;
+	} );
+	
+	
+	_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			var data = settings.aoData[ row ];
+	
+			return data && data.anCells ?
+				data.anCells[ column ] :
+				undefined;
+		}, 1 );
+	} );
+	
+	
+	_api_register( 'cells().data()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return _fnGetCellData( settings, row, column );
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
+		type = type === 'search' ? '_aFilterData' : '_aSortData';
+	
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return settings.aoData[ row ][ type ][ column ];
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return _fnGetCellData( settings, row, column, type );
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return {
+				row: row,
+				column: column,
+				columnVisible: _fnColumnIndexToVisible( settings, column )
+			};
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			_fnInvalidate( settings, row, src, column );
+		} );
+	} );
+	
+	
+	
+	_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
+		return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
+	} );
+	
+	
+	_api_register( 'cell().data()', function ( data ) {
+		var ctx = this.context;
+		var cell = this[0];
+	
+		if ( data === undefined ) {
+			// Get
+			return ctx.length && cell.length ?
+				_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
+				undefined;
+		}
+	
+		// Set
+		_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
+		_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
+	
+		return this;
+	} );
+	
+	
+	
+	/**
+	 * Get current ordering (sorting) that has been applied to the table.
+	 *
+	 * @returns {array} 2D array containing the sorting information for the first
+	 *   table in the current context. Each element in the parent array represents
+	 *   a column being sorted upon (i.e. multi-sorting with two columns would have
+	 *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
+	 *   the column index that the sorting condition applies to, the second is the
+	 *   direction of the sort (`desc` or `asc`) and, optionally, the third is the
+	 *   index of the sorting order from the `column.sorting` initialisation array.
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {integer} order Column index to sort upon.
+	 * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
+	 * @returns {DataTables.Api} this
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {array} order 1D array of sorting information to be applied.
+	 * @param {array} [...] Optional additional sorting conditions
+	 * @returns {DataTables.Api} this
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {array} order 2D array of sorting information to be applied.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'order()', function ( order, dir ) {
+		var ctx = this.context;
+	
+		if ( order === undefined ) {
+			// get
+			return ctx.length !== 0 ?
+				ctx[0].aaSorting :
+				undefined;
+		}
+	
+		// set
+		if ( typeof order === 'number' ) {
+			// Simple column / direction passed in
+			order = [ [ order, dir ] ];
+		}
+		else if ( order.length && ! $.isArray( order[0] ) ) {
+			// Arguments passed in (list of 1D arrays)
+			order = Array.prototype.slice.call( arguments );
+		}
+		// otherwise a 2D array was passed in
+	
+		return this.iterator( 'table', function ( settings ) {
+			settings.aaSorting = order.slice();
+		} );
+	} );
+	
+	
+	/**
+	 * Attach a sort listener to an element for a given column
+	 *
+	 * @param {node|jQuery|string} node Identifier for the element(s) to attach the
+	 *   listener to. This can take the form of a single DOM node, a jQuery
+	 *   collection of nodes or a jQuery selector which will identify the node(s).
+	 * @param {integer} column the column that a click on this node will sort on
+	 * @param {function} [callback] callback function when sort is run
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'order.listener()', function ( node, column, callback ) {
+		return this.iterator( 'table', function ( settings ) {
+			_fnSortAttachListener( settings, node, column, callback );
+		} );
+	} );
+	
+	
+	_api_register( 'order.fixed()', function ( set ) {
+		if ( ! set ) {
+			var ctx = this.context;
+			var fixed = ctx.length ?
+				ctx[0].aaSortingFixed :
+				undefined;
+	
+			return $.isArray( fixed ) ?
+				{ pre: fixed } :
+				fixed;
+		}
+	
+		return this.iterator( 'table', function ( settings ) {
+			settings.aaSortingFixed = $.extend( true, {}, set );
+		} );
+	} );
+	
+	
+	// Order by the selected column(s)
+	_api_register( [
+		'columns().order()',
+		'column().order()'
+	], function ( dir ) {
+		var that = this;
+	
+		return this.iterator( 'table', function ( settings, i ) {
+			var sort = [];
+	
+			$.each( that[i], function (j, col) {
+				sort.push( [ col, dir ] );
+			} );
+	
+			settings.aaSorting = sort;
+		} );
+	} );
+	
+	
+	
+	_api_register( 'search()', function ( input, regex, smart, caseInsen ) {
+		var ctx = this.context;
+	
+		if ( input === undefined ) {
+			// get
+			return ctx.length !== 0 ?
+				ctx[0].oPreviousSearch.sSearch :
+				undefined;
+		}
+	
+		// set
+		return this.iterator( 'table', function ( settings ) {
+			if ( ! settings.oFeatures.bFilter ) {
+				return;
+			}
+	
+			_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
+				"sSearch": input+"",
+				"bRegex":  regex === null ? false : regex,
+				"bSmart":  smart === null ? true  : smart,
+				"bCaseInsensitive": caseInsen === null ? true : caseInsen
+			} ), 1 );
+		} );
+	} );
+	
+	
+	_api_registerPlural(
+		'columns().search()',
+		'column().search()',
+		function ( input, regex, smart, caseInsen ) {
+			return this.iterator( 'column', function ( settings, column ) {
+				var preSearch = settings.aoPreSearchCols;
+	
+				if ( input === undefined ) {
+					// get
+					return preSearch[ column ].sSearch;
+				}
+	
+				// set
+				if ( ! settings.oFeatures.bFilter ) {
+					return;
+				}
+	
+				$.extend( preSearch[ column ], {
+					"sSearch": input+"",
+					"bRegex":  regex === null ? false : regex,
+					"bSmart":  smart === null ? true  : smart,
+					"bCaseInsensitive": caseInsen === null ? true : caseInsen
+				} );
+	
+				_fnFilterComplete( settings, settings.oPreviousSearch, 1 );
+			} );
+		}
+	);
+	
+	/*
+	 * State API methods
+	 */
+	
+	_api_register( 'state()', function () {
+		return this.context.length ?
+			this.context[0].oSavedState :
+			null;
+	} );
+	
+	
+	_api_register( 'state.clear()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			// Save an empty object
+			settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
+		} );
+	} );
+	
+	
+	_api_register( 'state.loaded()', function () {
+		return this.context.length ?
+			this.context[0].oLoadedState :
+			null;
+	} );
+	
+	
+	_api_register( 'state.save()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnSaveState( settings );
+		} );
+	} );
+	
+	
+	
+	/**
+	 * Provide a common method for plug-ins to check the version of DataTables being
+	 * used, in order to ensure compatibility.
+	 *
+	 *  @param {string} version Version string to check for, in the format "X.Y.Z".
+	 *    Note that the formats "X" and "X.Y" are also acceptable.
+	 *  @returns {boolean} true if this version of DataTables is greater or equal to
+	 *    the required version, or false if this version of DataTales is not
+	 *    suitable
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
+	 */
+	DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
+	{
+		var aThis = DataTable.version.split('.');
+		var aThat = version.split('.');
+		var iThis, iThat;
+	
+		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
+			iThis = parseInt( aThis[i], 10 ) || 0;
+			iThat = parseInt( aThat[i], 10 ) || 0;
+	
+			// Parts are the same, keep comparing
+			if (iThis === iThat) {
+				continue;
+			}
+	
+			// Parts are different, return immediately
+			return iThis > iThat;
+		}
+	
+		return true;
+	};
+	
+	
+	/**
+	 * Check if a `<table>` node is a DataTable table already or not.
+	 *
+	 *  @param {node|jquery|string} table Table node, jQuery object or jQuery
+	 *      selector for the table to test. Note that if more than more than one
+	 *      table is passed on, only the first will be checked
+	 *  @returns {boolean} true the table given is a DataTable, or false otherwise
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
+	 *      $('#example').dataTable();
+	 *    }
+	 */
+	DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
+	{
+		var t = $(table).get(0);
+		var is = false;
+	
+		if ( table instanceof DataTable.Api ) {
+			return true;
+		}
+	
+		$.each( DataTable.settings, function (i, o) {
+			var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
+			var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
+	
+			if ( o.nTable === t || head === t || foot === t ) {
+				is = true;
+			}
+		} );
+	
+		return is;
+	};
+	
+	
+	/**
+	 * Get all DataTable tables that have been initialised - optionally you can
+	 * select to get only currently visible tables.
+	 *
+	 *  @param {boolean} [visible=false] Flag to indicate if you want all (default)
+	 *    or visible tables only.
+	 *  @returns {array} Array of `table` nodes (not DataTable instances) which are
+	 *    DataTables
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    $.each( $.fn.dataTable.tables(true), function () {
+	 *      $(table).DataTable().columns.adjust();
+	 *    } );
+	 */
+	DataTable.tables = DataTable.fnTables = function ( visible )
+	{
+		var api = false;
+	
+		if ( $.isPlainObject( visible ) ) {
+			api = visible.api;
+			visible = visible.visible;
+		}
+	
+		var a = $.map( DataTable.settings, function (o) {
+			if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
+				return o.nTable;
+			}
+		} );
+	
+		return api ?
+			new _Api( a ) :
+			a;
+	};
+	
+	
+	/**
+	 * Convert from camel case parameters to Hungarian notation. This is made public
+	 * for the extensions to provide the same ability as DataTables core to accept
+	 * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
+	 * parameters.
+	 *
+	 *  @param {object} src The model object which holds all parameters that can be
+	 *    mapped.
+	 *  @param {object} user The object to convert from camel case to Hungarian.
+	 *  @param {boolean} force When set to `true`, properties which already have a
+	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
+	 *    won't be.
+	 */
+	DataTable.camelToHungarian = _fnCamelToHungarian;
+	
+	
+	
+	/**
+	 *
+	 */
+	_api_register( '$()', function ( selector, opts ) {
+		var
+			rows   = this.rows( opts ).nodes(), // Get all rows
+			jqRows = $(rows);
+	
+		return $( [].concat(
+			jqRows.filter( selector ).toArray(),
+			jqRows.find( selector ).toArray()
+		) );
+	} );
+	
+	
+	// jQuery functions to operate on the tables
+	$.each( [ 'on', 'one', 'off' ], function (i, key) {
+		_api_register( key+'()', function ( /* event, handler */ ) {
+			var args = Array.prototype.slice.call(arguments);
+	
+			// Add the `dt` namespace automatically if it isn't already present
+			args[0] = $.map( args[0].split( /\s/ ), function ( e ) {
+				return ! e.match(/\.dt\b/) ?
+					e+'.dt' :
+					e;
+				} ).join( ' ' );
+	
+			var inst = $( this.tables().nodes() );
+			inst[key].apply( inst, args );
+			return this;
+		} );
+	} );
+	
+	
+	_api_register( 'clear()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnClearTable( settings );
+		} );
+	} );
+	
+	
+	_api_register( 'settings()', function () {
+		return new _Api( this.context, this.context );
+	} );
+	
+	
+	_api_register( 'init()', function () {
+		var ctx = this.context;
+		return ctx.length ? ctx[0].oInit : null;
+	} );
+	
+	
+	_api_register( 'data()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			return _pluck( settings.aoData, '_aData' );
+		} ).flatten();
+	} );
+	
+	
+	_api_register( 'destroy()', function ( remove ) {
+		remove = remove || false;
+	
+		return this.iterator( 'table', function ( settings ) {
+			var orig      = settings.nTableWrapper.parentNode;
+			var classes   = settings.oClasses;
+			var table     = settings.nTable;
+			var tbody     = settings.nTBody;
+			var thead     = settings.nTHead;
+			var tfoot     = settings.nTFoot;
+			var jqTable   = $(table);
+			var jqTbody   = $(tbody);
+			var jqWrapper = $(settings.nTableWrapper);
+			var rows      = $.map( settings.aoData, function (r) { return r.nTr; } );
+			var i, ien;
+	
+			// Flag to note that the table is currently being destroyed - no action
+			// should be taken
+			settings.bDestroying = true;
+	
+			// Fire off the destroy callbacks for plug-ins etc
+			_fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
+	
+			// If not being removed from the document, make all columns visible
+			if ( ! remove ) {
+				new _Api( settings ).columns().visible( true );
+			}
+	
+			// Blitz all `DT` namespaced events (these are internal events, the
+			// lowercase, `dt` events are user subscribed and they are responsible
+			// for removing them
+			jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');
+			$(window).off('.DT-'+settings.sInstance);
+	
+			// When scrolling we had to break the table up - restore it
+			if ( table != thead.parentNode ) {
+				jqTable.children('thead').detach();
+				jqTable.append( thead );
+			}
+	
+			if ( tfoot && table != tfoot.parentNode ) {
+				jqTable.children('tfoot').detach();
+				jqTable.append( tfoot );
+			}
+	
+			settings.aaSorting = [];
+			settings.aaSortingFixed = [];
+			_fnSortingClasses( settings );
+	
+			$( rows ).removeClass( settings.asStripeClasses.join(' ') );
+	
+			$('th, td', thead).removeClass( classes.sSortable+' '+
+				classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
+			);
+	
+			if ( settings.bJUI ) {
+				$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();
+				$('th, td', thead).each( function () {
+					var wrapper = $('div.'+classes.sSortJUIWrapper, this);
+					$(this).append( wrapper.contents() );
+					wrapper.detach();
+				} );
+			}
+	
+			// Add the TR elements back into the table in their original order
+			jqTbody.children().detach();
+			jqTbody.append( rows );
+	
+			// Remove the DataTables generated nodes, events and classes
+			var removedMethod = remove ? 'remove' : 'detach';
+			jqTable[ removedMethod ]();
+			jqWrapper[ removedMethod ]();
+	
+			// If we need to reattach the table to the document
+			if ( ! remove && orig ) {
+				// insertBefore acts like appendChild if !arg[1]
+				orig.insertBefore( table, settings.nTableReinsertBefore );
+	
+				// Restore the width of the original table - was read from the style property,
+				// so we can restore directly to that
+				jqTable
+					.css( 'width', settings.sDestroyWidth )
+					.removeClass( classes.sTable );
+	
+				// If the were originally stripe classes - then we add them back here.
+				// Note this is not fool proof (for example if not all rows had stripe
+				// classes - but it's a good effort without getting carried away
+				ien = settings.asDestroyStripes.length;
+	
+				if ( ien ) {
+					jqTbody.children().each( function (i) {
+						$(this).addClass( settings.asDestroyStripes[i % ien] );
+					} );
+				}
+			}
+	
+			/* Remove the settings object from the settings array */
+			var idx = $.inArray( settings, DataTable.settings );
+			if ( idx !== -1 ) {
+				DataTable.settings.splice( idx, 1 );
+			}
+		} );
+	} );
+	
+	
+	// Add the `every()` method for rows, columns and cells in a compact form
+	$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
+		_api_register( type+'s().every()', function ( fn ) {
+			var opts = this.selector.opts;
+			var api = this;
+	
+			return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
+				// Rows and columns:
+				//  arg1 - index
+				//  arg2 - table counter
+				//  arg3 - loop counter
+				//  arg4 - undefined
+				// Cells:
+				//  arg1 - row index
+				//  arg2 - column index
+				//  arg3 - table counter
+				//  arg4 - loop counter
+				fn.call(
+					api[ type ](
+						arg1,
+						type==='cell' ? arg2 : opts,
+						type==='cell' ? opts : undefined
+					),
+					arg1, arg2, arg3, arg4
+				);
+			} );
+		} );
+	} );
+	
+	
+	// i18n method for extensions to be able to use the language object from the
+	// DataTable
+	_api_register( 'i18n()', function ( token, def, plural ) {
+		var ctx = this.context[0];
+		var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
+	
+		if ( resolved === undefined ) {
+			resolved = def;
+		}
+	
+		if ( plural !== undefined && $.isPlainObject( resolved ) ) {
+			resolved = resolved[ plural ] !== undefined ?
+				resolved[ plural ] :
+				resolved._;
+		}
+	
+		return resolved.replace( '%d', plural ); // nb: plural might be undefined,
+	} );
+
+	/**
+	 * Version string for plug-ins to check compatibility. Allowed format is
+	 * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
+	 * only for non-release builds. See http://semver.org/ for more information.
+	 *  @member
+	 *  @type string
+	 *  @default Version number
+	 */
+	DataTable.version = "1.10.15";
+
+	/**
+	 * Private data store, containing all of the settings objects that are
+	 * created for the tables on a given page.
+	 *
+	 * Note that the `DataTable.settings` object is aliased to
+	 * `jQuery.fn.dataTableExt` through which it may be accessed and
+	 * manipulated, or `jQuery.fn.dataTable.settings`.
+	 *  @member
+	 *  @type array
+	 *  @default []
+	 *  @private
+	 */
+	DataTable.settings = [];
+
+	/**
+	 * Object models container, for the various models that DataTables has
+	 * available to it. These models define the objects that are used to hold
+	 * the active state and configuration of the table.
+	 *  @namespace
+	 */
+	DataTable.models = {};
+	
+	
+	
+	/**
+	 * Template object for the way in which DataTables holds information about
+	 * search information for the global filter and individual column filters.
+	 *  @namespace
+	 */
+	DataTable.models.oSearch = {
+		/**
+		 * Flag to indicate if the filtering should be case insensitive or not
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bCaseInsensitive": true,
+	
+		/**
+		 * Applied search term
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 */
+		"sSearch": "",
+	
+		/**
+		 * Flag to indicate if the search term should be interpreted as a
+		 * regular expression (true) or not (false) and therefore and special
+		 * regex characters escaped.
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bRegex": false,
+	
+		/**
+		 * Flag to indicate if DataTables is to use its smart filtering or not.
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bSmart": true
+	};
+	
+	
+	
+	
+	/**
+	 * Template object for the way in which DataTables holds information about
+	 * each individual row. This is the object format used for the settings
+	 * aoData array.
+	 *  @namespace
+	 */
+	DataTable.models.oRow = {
+		/**
+		 * TR element for the row
+		 *  @type node
+		 *  @default null
+		 */
+		"nTr": null,
+	
+		/**
+		 * Array of TD elements for each row. This is null until the row has been
+		 * created.
+		 *  @type array nodes
+		 *  @default []
+		 */
+		"anCells": null,
+	
+		/**
+		 * Data object from the original data source for the row. This is either
+		 * an array if using the traditional form of DataTables, or an object if
+		 * using mData options. The exact type will depend on the passed in
+		 * data from the data source, or will be an array if using DOM a data
+		 * source.
+		 *  @type array|object
+		 *  @default []
+		 */
+		"_aData": [],
+	
+		/**
+		 * Sorting data cache - this array is ostensibly the same length as the
+		 * number of columns (although each index is generated only as it is
+		 * needed), and holds the data that is used for sorting each column in the
+		 * row. We do this cache generation at the start of the sort in order that
+		 * the formatting of the sort data need be done only once for each cell
+		 * per sort. This array should not be read from or written to by anything
+		 * other than the master sorting methods.
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_aSortData": null,
+	
+		/**
+		 * Per cell filtering data cache. As per the sort data cache, used to
+		 * increase the performance of the filtering in DataTables
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_aFilterData": null,
+	
+		/**
+		 * Filtering data cache. This is the same as the cell filtering cache, but
+		 * in this case a string rather than an array. This is easily computed with
+		 * a join on `_aFilterData`, but is provided as a cache so the join isn't
+		 * needed on every search (memory traded for performance)
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_sFilterRow": null,
+	
+		/**
+		 * Cache of the class name that DataTables has applied to the row, so we
+		 * can quickly look at this variable rather than needing to do a DOM check
+		 * on className for the nTr property.
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *  @private
+		 */
+		"_sRowStripe": "",
+	
+		/**
+		 * Denote if the original data source was from the DOM, or the data source
+		 * object. This is used for invalidating data, so DataTables can
+		 * automatically read data from the original source, unless uninstructed
+		 * otherwise.
+		 *  @type string
+		 *  @default null
+		 *  @private
+		 */
+		"src": null,
+	
+		/**
+		 * Index in the aoData array. This saves an indexOf lookup when we have the
+		 * object, but want to know the index
+		 *  @type integer
+		 *  @default -1
+		 *  @private
+		 */
+		"idx": -1
+	};
+	
+	
+	/**
+	 * Template object for the column information object in DataTables. This object
+	 * is held in the settings aoColumns array and contains all the information that
+	 * DataTables needs about each individual column.
+	 *
+	 * Note that this object is related to {@link DataTable.defaults.column}
+	 * but this one is the internal data store for DataTables's cache of columns.
+	 * It should NOT be manipulated outside of DataTables. Any configuration should
+	 * be done through the initialisation options.
+	 *  @namespace
+	 */
+	DataTable.models.oColumn = {
+		/**
+		 * Column index. This could be worked out on-the-fly with $.inArray, but it
+		 * is faster to just hold it as a variable
+		 *  @type integer
+		 *  @default null
+		 */
+		"idx": null,
+	
+		/**
+		 * A list of the columns that sorting should occur on when this column
+		 * is sorted. That this property is an array allows multi-column sorting
+		 * to be defined for a column (for example first name / last name columns
+		 * would benefit from this). The values are integers pointing to the
+		 * columns to be sorted on (typically it will be a single integer pointing
+		 * at itself, but that doesn't need to be the case).
+		 *  @type array
+		 */
+		"aDataSort": null,
+	
+		/**
+		 * Define the sorting directions that are applied to the column, in sequence
+		 * as the column is repeatedly sorted upon - i.e. the first value is used
+		 * as the sorting direction when the column if first sorted (clicked on).
+		 * Sort it again (click again) and it will move on to the next index.
+		 * Repeat until loop.
+		 *  @type array
+		 */
+		"asSorting": null,
+	
+		/**
+		 * Flag to indicate if the column is searchable, and thus should be included
+		 * in the filtering or not.
+		 *  @type boolean
+		 */
+		"bSearchable": null,
+	
+		/**
+		 * Flag to indicate if the column is sortable or not.
+		 *  @type boolean
+		 */
+		"bSortable": null,
+	
+		/**
+		 * Flag to indicate if the column is currently visible in the table or not
+		 *  @type boolean
+		 */
+		"bVisible": null,
+	
+		/**
+		 * Store for manual type assignment using the `column.type` option. This
+		 * is held in store so we can manipulate the column's `sType` property.
+		 *  @type string
+		 *  @default null
+		 *  @private
+		 */
+		"_sManualType": null,
+	
+		/**
+		 * Flag to indicate if HTML5 data attributes should be used as the data
+		 * source for filtering or sorting. True is either are.
+		 *  @type boolean
+		 *  @default false
+		 *  @private
+		 */
+		"_bAttrSrc": false,
+	
+		/**
+		 * Developer definable function that is called whenever a cell is created (Ajax source,
+		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+		 * allowing you to modify the DOM element (add background colour for example) when the
+		 * element is available.
+		 *  @type function
+		 *  @param {element} nTd The TD node that has been created
+		 *  @param {*} sData The Data for the cell
+		 *  @param {array|object} oData The data for the whole row
+		 *  @param {int} iRow The row index for the aoData data store
+		 *  @default null
+		 */
+		"fnCreatedCell": null,
+	
+		/**
+		 * Function to get data from a cell in a column. You should <b>never</b>
+		 * access data directly through _aData internally in DataTables - always use
+		 * the method attached to this property. It allows mData to function as
+		 * required. This function is automatically assigned by the column
+		 * initialisation method
+		 *  @type function
+		 *  @param {array|object} oData The data array/object for the array
+		 *    (i.e. aoData[]._aData)
+		 *  @param {string} sSpecific The specific data type you want to get -
+		 *    'display', 'type' 'filter' 'sort'
+		 *  @returns {*} The data for the cell from the given row's data
+		 *  @default null
+		 */
+		"fnGetData": null,
+	
+		/**
+		 * Function to set data for a cell in the column. You should <b>never</b>
+		 * set the data directly to _aData internally in DataTables - always use
+		 * this method. It allows mData to function as required. This function
+		 * is automatically assigned by the column initialisation method
+		 *  @type function
+		 *  @param {array|object} oData The data array/object for the array
+		 *    (i.e. aoData[]._aData)
+		 *  @param {*} sValue Value to set
+		 *  @default null
+		 */
+		"fnSetData": null,
+	
+		/**
+		 * Property to read the value for the cells in the column from the data
+		 * source array / object. If null, then the default content is used, if a
+		 * function is given then the return from the function is used.
+		 *  @type function|int|string|null
+		 *  @default null
+		 */
+		"mData": null,
+	
+		/**
+		 * Partner property to mData which is used (only when defined) to get
+		 * the data - i.e. it is basically the same as mData, but without the
+		 * 'set' option, and also the data fed to it is the result from mData.
+		 * This is the rendering method to match the data method of mData.
+		 *  @type function|int|string|null
+		 *  @default null
+		 */
+		"mRender": null,
+	
+		/**
+		 * Unique header TH/TD element for this column - this is what the sorting
+		 * listener is attached to (if sorting is enabled.)
+		 *  @type node
+		 *  @default null
+		 */
+		"nTh": null,
+	
+		/**
+		 * Unique footer TH/TD element for this column (if there is one). Not used
+		 * in DataTables as such, but can be used for plug-ins to reference the
+		 * footer for each column.
+		 *  @type node
+		 *  @default null
+		 */
+		"nTf": null,
+	
+		/**
+		 * The class to apply to all TD elements in the table's TBODY for the column
+		 *  @type string
+		 *  @default null
+		 */
+		"sClass": null,
+	
+		/**
+		 * When DataTables calculates the column widths to assign to each column,
+		 * it finds the longest string in each column and then constructs a
+		 * temporary table and reads the widths from that. The problem with this
+		 * is that "mmm" is much wider then "iiii", but the latter is a longer
+		 * string - thus the calculation can go wrong (doing it properly and putting
+		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
+		 * a "work around" we provide this option. It will append its value to the
+		 * text that is found to be the longest string for the column - i.e. padding.
+		 *  @type string
+		 */
+		"sContentPadding": null,
+	
+		/**
+		 * Allows a default value to be given for a column's data, and will be used
+		 * whenever a null data source is encountered (this can be because mData
+		 * is set to null, or because the data source itself is null).
+		 *  @type string
+		 *  @default null
+		 */
+		"sDefaultContent": null,
+	
+		/**
+		 * Name for the column, allowing reference to the column by name as well as
+		 * by index (needs a lookup to work by name).
+		 *  @type string
+		 */
+		"sName": null,
+	
+		/**
+		 * Custom sorting data type - defines which of the available plug-ins in
+		 * afnSortData the custom sorting will use - if any is defined.
+		 *  @type string
+		 *  @default std
+		 */
+		"sSortDataType": 'std',
+	
+		/**
+		 * Class to be applied to the header element when sorting on this column
+		 *  @type string
+		 *  @default null
+		 */
+		"sSortingClass": null,
+	
+		/**
+		 * Class to be applied to the header element when sorting on this column -
+		 * when jQuery UI theming is used.
+		 *  @type string
+		 *  @default null
+		 */
+		"sSortingClassJUI": null,
+	
+		/**
+		 * Title of the column - what is seen in the TH element (nTh).
+		 *  @type string
+		 */
+		"sTitle": null,
+	
+		/**
+		 * Column sorting and filtering type
+		 *  @type string
+		 *  @default null
+		 */
+		"sType": null,
+	
+		/**
+		 * Width of the column
+		 *  @type string
+		 *  @default null
+		 */
+		"sWidth": null,
+	
+		/**
+		 * Width of the column when it was first "encountered"
+		 *  @type string
+		 *  @default null
+		 */
+		"sWidthOrig": null
+	};
+	
+	
+	/*
+	 * Developer note: The properties of the object below are given in Hungarian
+	 * notation, that was used as the interface for DataTables prior to v1.10, however
+	 * from v1.10 onwards the primary interface is camel case. In order to avoid
+	 * breaking backwards compatibility utterly with this change, the Hungarian
+	 * version is still, internally the primary interface, but is is not documented
+	 * - hence the @name tags in each doc comment. This allows a Javascript function
+	 * to create a map from Hungarian notation to camel case (going the other direction
+	 * would require each property to be listed, which would at around 3K to the size
+	 * of DataTables, while this method is about a 0.5K hit.
+	 *
+	 * Ultimately this does pave the way for Hungarian notation to be dropped
+	 * completely, but that is a massive amount of work and will break current
+	 * installs (therefore is on-hold until v2).
+	 */
+	
+	/**
+	 * Initialisation options that can be given to DataTables at initialisation
+	 * time.
+	 *  @namespace
+	 */
+	DataTable.defaults = {
+		/**
+		 * An array of data to use for the table, passed in at initialisation which
+		 * will be used in preference to any data which is already in the DOM. This is
+		 * particularly useful for constructing tables purely in Javascript, for
+		 * example with a custom Ajax call.
+		 *  @type array
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.data
+		 *
+		 *  @example
+		 *    // Using a 2D array data source
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "data": [
+		 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+		 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+		 *        ],
+		 *        "columns": [
+		 *          { "title": "Engine" },
+		 *          { "title": "Browser" },
+		 *          { "title": "Platform" },
+		 *          { "title": "Version" },
+		 *          { "title": "Grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using an array of objects as a data source (`data`)
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "data": [
+		 *          {
+		 *            "engine":   "Trident",
+		 *            "browser":  "Internet Explorer 4.0",
+		 *            "platform": "Win 95+",
+		 *            "version":  4,
+		 *            "grade":    "X"
+		 *          },
+		 *          {
+		 *            "engine":   "Trident",
+		 *            "browser":  "Internet Explorer 5.0",
+		 *            "platform": "Win 95+",
+		 *            "version":  5,
+		 *            "grade":    "C"
+		 *          }
+		 *        ],
+		 *        "columns": [
+		 *          { "title": "Engine",   "data": "engine" },
+		 *          { "title": "Browser",  "data": "browser" },
+		 *          { "title": "Platform", "data": "platform" },
+		 *          { "title": "Version",  "data": "version" },
+		 *          { "title": "Grade",    "data": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"aaData": null,
+	
+	
+		/**
+		 * If ordering is enabled, then DataTables will perform a first pass sort on
+		 * initialisation. You can define which column(s) the sort is performed
+		 * upon, and the sorting direction, with this variable. The `sorting` array
+		 * should contain an array for each column to be sorted initially containing
+		 * the column's index and a direction string ('asc' or 'desc').
+		 *  @type array
+		 *  @default [[0,'asc']]
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.order
+		 *
+		 *  @example
+		 *    // Sort by 3rd column first, and then 4th column
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "order": [[2,'asc'], [3,'desc']]
+		 *      } );
+		 *    } );
+		 *
+		 *    // No initial sorting
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "order": []
+		 *      } );
+		 *    } );
+		 */
+		"aaSorting": [[0,'asc']],
+	
+	
+		/**
+		 * This parameter is basically identical to the `sorting` parameter, but
+		 * cannot be overridden by user interaction with the table. What this means
+		 * is that you could have a column (visible or hidden) which the sorting
+		 * will always be forced on first - any sorting after that (from the user)
+		 * will then be performed as required. This can be useful for grouping rows
+		 * together.
+		 *  @type array
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.orderFixed
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "orderFixed": [[0,'asc']]
+		 *      } );
+		 *    } )
+		 */
+		"aaSortingFixed": [],
+	
+	
+		/**
+		 * DataTables can be instructed to load data to display in the table from a
+		 * Ajax source. This option defines how that Ajax call is made and where to.
+		 *
+		 * The `ajax` property has three different modes of operation, depending on
+		 * how it is defined. These are:
+		 *
+		 * * `string` - Set the URL from where the data should be loaded from.
+		 * * `object` - Define properties for `jQuery.ajax`.
+		 * * `function` - Custom data get function
+		 *
+		 * `string`
+		 * --------
+		 *
+		 * As a string, the `ajax` property simply defines the URL from which
+		 * DataTables will load data.
+		 *
+		 * `object`
+		 * --------
+		 *
+		 * As an object, the parameters in the object are passed to
+		 * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
+		 * of the Ajax request. DataTables has a number of default parameters which
+		 * you can override using this option. Please refer to the jQuery
+		 * documentation for a full description of the options available, although
+		 * the following parameters provide additional options in DataTables or
+		 * require special consideration:
+		 *
+		 * * `data` - As with jQuery, `data` can be provided as an object, but it
+		 *   can also be used as a function to manipulate the data DataTables sends
+		 *   to the server. The function takes a single parameter, an object of
+		 *   parameters with the values that DataTables has readied for sending. An
+		 *   object may be returned which will be merged into the DataTables
+		 *   defaults, or you can add the items to the object that was passed in and
+		 *   not return anything from the function. This supersedes `fnServerParams`
+		 *   from DataTables 1.9-.
+		 *
+		 * * `dataSrc` - By default DataTables will look for the property `data` (or
+		 *   `aaData` for compatibility with DataTables 1.9-) when obtaining data
+		 *   from an Ajax source or for server-side processing - this parameter
+		 *   allows that property to be changed. You can use Javascript dotted
+		 *   object notation to get a data source for multiple levels of nesting, or
+		 *   it my be used as a function. As a function it takes a single parameter,
+		 *   the JSON returned from the server, which can be manipulated as
+		 *   required, with the returned value being that used by DataTables as the
+		 *   data source for the table. This supersedes `sAjaxDataProp` from
+		 *   DataTables 1.9-.
+		 *
+		 * * `success` - Should not be overridden it is used internally in
+		 *   DataTables. To manipulate / transform the data returned by the server
+		 *   use `ajax.dataSrc`, or use `ajax` as a function (see below).
+		 *
+		 * `function`
+		 * ----------
+		 *
+		 * As a function, making the Ajax call is left up to yourself allowing
+		 * complete control of the Ajax request. Indeed, if desired, a method other
+		 * than Ajax could be used to obtain the required data, such as Web storage
+		 * or an AIR database.
+		 *
+		 * The function is given four parameters and no return is required. The
+		 * parameters are:
+		 *
+		 * 1. _object_ - Data to send to the server
+		 * 2. _function_ - Callback function that must be executed when the required
+		 *    data has been obtained. That data should be passed into the callback
+		 *    as the only parameter
+		 * 3. _object_ - DataTables settings object for the table
+		 *
+		 * Note that this supersedes `fnServerData` from DataTables 1.9-.
+		 *
+		 *  @type string|object|function
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.ajax
+		 *  @since 1.10.0
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax.
+		 *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
+		 *   $('#example').dataTable( {
+		 *     "ajax": "data.json"
+		 *   } );
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax, using `dataSrc` to change
+		 *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": "tableData"
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax, using `dataSrc` to read data
+		 *   // from a plain array rather than an array in an object
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": ""
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Manipulate the data returned from the server - add a link to data
+		 *   // (note this can, should, be done using `render` for the column - this
+		 *   // is just a simple example of how the data can be manipulated).
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": function ( json ) {
+		 *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {
+		 *           json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
+		 *         }
+		 *         return json;
+		 *       }
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Add data to the request
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "data": function ( d ) {
+		 *         return {
+		 *           "extra_search": $('#extra').val()
+		 *         };
+		 *       }
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Send request as POST
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "type": "POST"
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Get the data from localStorage (could interface with a form for
+		 *   // adding, editing and removing rows).
+		 *   $('#example').dataTable( {
+		 *     "ajax": function (data, callback, settings) {
+		 *       callback(
+		 *         JSON.parse( localStorage.getItem('dataTablesData') )
+		 *       );
+		 *     }
+		 *   } );
+		 */
+		"ajax": null,
+	
+	
+		/**
+		 * This parameter allows you to readily specify the entries in the length drop
+		 * down menu that DataTables shows when pagination is enabled. It can be
+		 * either a 1D array of options which will be used for both the displayed
+		 * option and the value, or a 2D array which will use the array in the first
+		 * position as the value, and the array in the second position as the
+		 * displayed options (useful for language strings such as 'All').
+		 *
+		 * Note that the `pageLength` property will be automatically set to the
+		 * first value given in this array, unless `pageLength` is also provided.
+		 *  @type array
+		 *  @default [ 10, 25, 50, 100 ]
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.lengthMenu
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
+		 *      } );
+		 *    } );
+		 */
+		"aLengthMenu": [ 10, 25, 50, 100 ],
+	
+	
+		/**
+		 * The `columns` option in the initialisation parameter allows you to define
+		 * details about the way individual columns behave. For a full list of
+		 * column options that can be set, please see
+		 * {@link DataTable.defaults.column}. Note that if you use `columns` to
+		 * define your columns, you must have an entry in the array for every single
+		 * column that you have in your table (these can be null if you don't which
+		 * to specify any options).
+		 *  @member
+		 *
+		 *  @name DataTable.defaults.column
+		 */
+		"aoColumns": null,
+	
+		/**
+		 * Very similar to `columns`, `columnDefs` allows you to target a specific
+		 * column, multiple columns, or all columns, using the `targets` property of
+		 * each object in the array. This allows great flexibility when creating
+		 * tables, as the `columnDefs` arrays can be of any length, targeting the
+		 * columns you specifically want. `columnDefs` may use any of the column
+		 * options available: {@link DataTable.defaults.column}, but it _must_
+		 * have `targets` defined in each object in the array. Values in the `targets`
+		 * array may be:
+		 *   <ul>
+		 *     <li>a string - class name will be matched on the TH for the column</li>
+		 *     <li>0 or a positive integer - column index counting from the left</li>
+		 *     <li>a negative integer - column index counting from the right</li>
+		 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
+		 *   </ul>
+		 *  @member
+		 *
+		 *  @name DataTable.defaults.columnDefs
+		 */
+		"aoColumnDefs": null,
+	
+	
+		/**
+		 * Basically the same as `search`, this parameter defines the individual column
+		 * filtering state at initialisation time. The array must be of the same size
+		 * as the number of columns, and each element be an object with the parameters
+		 * `search` and `escapeRegex` (the latter is optional). 'null' is also
+		 * accepted and the default will be used.
+		 *  @type array
+		 *  @default []
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.searchCols
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "searchCols": [
+		 *          null,
+		 *          { "search": "My filter" },
+		 *          null,
+		 *          { "search": "^[0-9]", "escapeRegex": false }
+		 *        ]
+		 *      } );
+		 *    } )
+		 */
+		"aoSearchCols": [],
+	
+	
+		/**
+		 * An array of CSS classes that should be applied to displayed rows. This
+		 * array may be of any length, and DataTables will apply each class
+		 * sequentially, looping when required.
+		 *  @type array
+		 *  @default null <i>Will take the values determined by the `oClasses.stripe*`
+		 *    options</i>
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.stripeClasses
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+		 *      } );
+		 *    } )
+		 */
+		"asStripeClasses": null,
+	
+	
+		/**
+		 * Enable or disable automatic column width calculation. This can be disabled
+		 * as an optimisation (it takes some time to calculate the widths) if the
+		 * tables widths are passed in using `columns`.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.autoWidth
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "autoWidth": false
+		 *      } );
+		 *    } );
+		 */
+		"bAutoWidth": true,
+	
+	
+		/**
+		 * Deferred rendering can provide DataTables with a huge speed boost when you
+		 * are using an Ajax or JS data source for the table. This option, when set to
+		 * true, will cause DataTables to defer the creation of the table elements for
+		 * each row until they are needed for a draw - saving a significant amount of
+		 * time.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.deferRender
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajax": "sources/arrays.txt",
+		 *        "deferRender": true
+		 *      } );
+		 *    } );
+		 */
+		"bDeferRender": false,
+	
+	
+		/**
+		 * Replace a DataTable which matches the given selector and replace it with
+		 * one which has the properties of the new initialisation object passed. If no
+		 * table matches the selector, then the new DataTable will be constructed as
+		 * per normal.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.destroy
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "srollY": "200px",
+		 *        "paginate": false
+		 *      } );
+		 *
+		 *      // Some time later....
+		 *      $('#example').dataTable( {
+		 *        "filter": false,
+		 *        "destroy": true
+		 *      } );
+		 *    } );
+		 */
+		"bDestroy": false,
+	
+	
+		/**
+		 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+		 * that it allows the end user to input multiple words (space separated) and
+		 * will match a row containing those words, even if not in the order that was
+		 * specified (this allow matching across multiple columns). Note that if you
+		 * wish to use filtering in DataTables this must remain 'true' - to remove the
+		 * default filtering input box and retain filtering abilities, please use
+		 * {@link DataTable.defaults.dom}.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.searching
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "searching": false
+		 *      } );
+		 *    } );
+		 */
+		"bFilter": true,
+	
+	
+		/**
+		 * Enable or disable the table information display. This shows information
+		 * about the data that is currently visible on the page, including information
+		 * about filtered data if that action is being performed.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.info
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "info": false
+		 *      } );
+		 *    } );
+		 */
+		"bInfo": true,
+	
+	
+		/**
+		 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
+		 * slightly different and additional mark-up from what DataTables has
+		 * traditionally used).
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.jQueryUI
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "jQueryUI": true
+		 *      } );
+		 *    } );
+		 */
+		"bJQueryUI": false,
+	
+	
+		/**
+		 * Allows the end user to select the size of a formatted page from a select
+		 * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.lengthChange
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "lengthChange": false
+		 *      } );
+		 *    } );
+		 */
+		"bLengthChange": true,
+	
+	
+		/**
+		 * Enable or disable pagination.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.paging
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "paging": false
+		 *      } );
+		 *    } );
+		 */
+		"bPaginate": true,
+	
+	
+		/**
+		 * Enable or disable the display of a 'processing' indicator when the table is
+		 * being processed (e.g. a sort). This is particularly useful for tables with
+		 * large amounts of data where it can take a noticeable amount of time to sort
+		 * the entries.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.processing
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "processing": true
+		 *      } );
+		 *    } );
+		 */
+		"bProcessing": false,
+	
+	
+		/**
+		 * Retrieve the DataTables object for the given selector. Note that if the
+		 * table has already been initialised, this parameter will cause DataTables
+		 * to simply return the object that has already been set up - it will not take
+		 * account of any changes you might have made to the initialisation object
+		 * passed to DataTables (setting this parameter to true is an acknowledgement
+		 * that you understand this). `destroy` can be used to reinitialise a table if
+		 * you need.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.retrieve
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      initTable();
+		 *      tableActions();
+		 *    } );
+		 *
+		 *    function initTable ()
+		 *    {
+		 *      return $('#example').dataTable( {
+		 *        "scrollY": "200px",
+		 *        "paginate": false,
+		 *        "retrieve": true
+		 *      } );
+		 *    }
+		 *
+		 *    function tableActions ()
+		 *    {
+		 *      var table = initTable();
+		 *      // perform API operations with oTable
+		 *    }
+		 */
+		"bRetrieve": false,
+	
+	
+		/**
+		 * When vertical (y) scrolling is enabled, DataTables will force the height of
+		 * the table's viewport to the given height at all times (useful for layout).
+		 * However, this can look odd when filtering data down to a small data set,
+		 * and the footer is left "floating" further down. This parameter (when
+		 * enabled) will cause DataTables to collapse the table's viewport down when
+		 * the result set will fit within the given Y height.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.scrollCollapse
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollY": "200",
+		 *        "scrollCollapse": true
+		 *      } );
+		 *    } );
+		 */
+		"bScrollCollapse": false,
+	
+	
+		/**
+		 * Configure DataTables to use server-side processing. Note that the
+		 * `ajax` parameter must also be given in order to give DataTables a
+		 * source to obtain the required data for each draw.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverSide
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "xhr.php"
+		 *      } );
+		 *    } );
+		 */
+		"bServerSide": false,
+	
+	
+		/**
+		 * Enable or disable sorting of columns. Sorting of individual columns can be
+		 * disabled by the `sortable` option for each column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.ordering
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "ordering": false
+		 *      } );
+		 *    } );
+		 */
+		"bSort": true,
+	
+	
+		/**
+		 * Enable or display DataTables' ability to sort multiple columns at the
+		 * same time (activated by shift-click by the user).
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.orderMulti
+		 *
+		 *  @example
+		 *    // Disable multiple column sorting ability
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "orderMulti": false
+		 *      } );
+		 *    } );
+		 */
+		"bSortMulti": true,
+	
+	
+		/**
+		 * Allows control over whether DataTables should use the top (true) unique
+		 * cell that is found for a single column, or the bottom (false - default).
+		 * This is useful when using complex headers.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.orderCellsTop
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "orderCellsTop": true
+		 *      } );
+		 *    } );
+		 */
+		"bSortCellsTop": false,
+	
+	
+		/**
+		 * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
+		 * `sorting\_3` to the columns which are currently being sorted on. This is
+		 * presented as a feature switch as it can increase processing time (while
+		 * classes are removed and added) so for large data sets you might want to
+		 * turn this off.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.orderClasses
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "orderClasses": false
+		 *      } );
+		 *    } );
+		 */
+		"bSortClasses": true,
+	
+	
+		/**
+		 * Enable or disable state saving. When enabled HTML5 `localStorage` will be
+		 * used to save table display information such as pagination information,
+		 * display length, filtering and sorting. As such when the end user reloads
+		 * the page the display display will match what thy had previously set up.
+		 *
+		 * Due to the use of `localStorage` the default state saving is not supported
+		 * in IE6 or 7. If state saving is required in those browsers, use
+		 * `stateSaveCallback` to provide a storage solution such as cookies.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.stateSave
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true
+		 *      } );
+		 *    } );
+		 */
+		"bStateSave": false,
+	
+	
+		/**
+		 * This function is called when a TR element is created (and all TD child
+		 * elements have been inserted), or registered if using a DOM source, allowing
+		 * manipulation of the TR element (adding classes etc).
+		 *  @type function
+		 *  @param {node} row "TR" element for the current row
+		 *  @param {array} data Raw data array for this row
+		 *  @param {int} dataIndex The index of this row in the internal aoData array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.createdRow
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "createdRow": function( row, data, dataIndex ) {
+		 *          // Bold the grade for all 'A' grade browsers
+		 *          if ( data[4] == "A" )
+		 *          {
+		 *            $('td:eq(4)', row).html( '<b>A</b>' );
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnCreatedRow": null,
+	
+	
+		/**
+		 * This function is called on every 'draw' event, and allows you to
+		 * dynamically modify any aspect you want about the created DOM.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.drawCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "drawCallback": function( settings ) {
+		 *          alert( 'DataTables has redrawn the table' );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnDrawCallback": null,
+	
+	
+		/**
+		 * Identical to fnHeaderCallback() but for the table footer this function
+		 * allows you to modify the table footer on every 'draw' event.
+		 *  @type function
+		 *  @param {node} foot "TR" element for the footer
+		 *  @param {array} data Full table data (as derived from the original HTML)
+		 *  @param {int} start Index for the current display starting point in the
+		 *    display array
+		 *  @param {int} end Index for the current display ending point in the
+		 *    display array
+		 *  @param {array int} display Index array to translate the visual position
+		 *    to the full data array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.footerCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "footerCallback": function( tfoot, data, start, end, display ) {
+		 *          tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnFooterCallback": null,
+	
+	
+		/**
+		 * When rendering large numbers in the information element for the table
+		 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+		 * to have a comma separator for the 'thousands' units (e.g. 1 million is
+		 * rendered as "1,000,000") to help readability for the end user. This
+		 * function will override the default method DataTables uses.
+		 *  @type function
+		 *  @member
+		 *  @param {int} toFormat number to be formatted
+		 *  @returns {string} formatted string for DataTables to show the number
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.formatNumber
+		 *
+		 *  @example
+		 *    // Format a number using a single quote for the separator (note that
+		 *    // this can also be done with the language.thousands option)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "formatNumber": function ( toFormat ) {
+		 *          return toFormat.toString().replace(
+		 *            /\B(?=(\d{3})+(?!\d))/g, "'"
+		 *          );
+		 *        };
+		 *      } );
+		 *    } );
+		 */
+		"fnFormatNumber": function ( toFormat ) {
+			return toFormat.toString().replace(
+				/\B(?=(\d{3})+(?!\d))/g,
+				this.oLanguage.sThousands
+			);
+		},
+	
+	
+		/**
+		 * This function is called on every 'draw' event, and allows you to
+		 * dynamically modify the header row. This can be used to calculate and
+		 * display useful information about the table.
+		 *  @type function
+		 *  @param {node} head "TR" element for the header
+		 *  @param {array} data Full table data (as derived from the original HTML)
+		 *  @param {int} start Index for the current display starting point in the
+		 *    display array
+		 *  @param {int} end Index for the current display ending point in the
+		 *    display array
+		 *  @param {array int} display Index array to translate the visual position
+		 *    to the full data array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.headerCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "fheaderCallback": function( head, data, start, end, display ) {
+		 *          head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnHeaderCallback": null,
+	
+	
+		/**
+		 * The information element can be used to convey information about the current
+		 * state of the table. Although the internationalisation options presented by
+		 * DataTables are quite capable of dealing with most customisations, there may
+		 * be times where you wish to customise the string further. This callback
+		 * allows you to do exactly that.
+		 *  @type function
+		 *  @param {object} oSettings DataTables settings object
+		 *  @param {int} start Starting position in data for the draw
+		 *  @param {int} end End position in data for the draw
+		 *  @param {int} max Total number of rows in the table (regardless of
+		 *    filtering)
+		 *  @param {int} total Total number of rows in the data set, after filtering
+		 *  @param {string} pre The string that DataTables has formatted using it's
+		 *    own rules
+		 *  @returns {string} The string to be displayed in the information element.
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.infoCallback
+		 *
+		 *  @example
+		 *    $('#example').dataTable( {
+		 *      "infoCallback": function( settings, start, end, max, total, pre ) {
+		 *        return start +" to "+ end;
+		 *      }
+		 *    } );
+		 */
+		"fnInfoCallback": null,
+	
+	
+		/**
+		 * Called when the table has been initialised. Normally DataTables will
+		 * initialise sequentially and there will be no need for this function,
+		 * however, this does not hold true when using external language information
+		 * since that is obtained using an async XHR call.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} json The JSON object request from the server - only
+		 *    present if client-side Ajax sourced data is used
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.initComplete
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "initComplete": function(settings, json) {
+		 *          alert( 'DataTables has finished its initialisation.' );
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnInitComplete": null,
+	
+	
+		/**
+		 * Called at the very start of each table draw and can be used to cancel the
+		 * draw by returning false, any other return (including undefined) results in
+		 * the full draw occurring).
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @returns {boolean} False will cancel the draw, anything else (including no
+		 *    return) will allow it to complete.
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.preDrawCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "preDrawCallback": function( settings ) {
+		 *          if ( $('#test').val() == 1 ) {
+		 *            return false;
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnPreDrawCallback": null,
+	
+	
+		/**
+		 * This function allows you to 'post process' each row after it have been
+		 * generated for each table draw, but before it is rendered on screen. This
+		 * function might be used for setting the row class name etc.
+		 *  @type function
+		 *  @param {node} row "TR" element for the current row
+		 *  @param {array} data Raw data array for this row
+		 *  @param {int} displayIndex The display index for the current table draw
+		 *  @param {int} displayIndexFull The index of the data in the full list of
+		 *    rows (after filtering)
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.rowCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
+		 *          // Bold the grade for all 'A' grade browsers
+		 *          if ( data[4] == "A" ) {
+		 *            $('td:eq(4)', row).html( '<b>A</b>' );
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnRowCallback": null,
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * This parameter allows you to override the default function which obtains
+		 * the data from the server so something more suitable for your application.
+		 * For example you could use POST data, or pull information from a Gears or
+		 * AIR database.
+		 *  @type function
+		 *  @member
+		 *  @param {string} source HTTP source to obtain the data from (`ajax`)
+		 *  @param {array} data A key/value pair object containing the data to send
+		 *    to the server
+		 *  @param {function} callback to be called on completion of the data get
+		 *    process that will draw the data on the page.
+		 *  @param {object} settings DataTables settings object
+		 *
+		 *  @dtopt Callbacks
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverData
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"fnServerData": null,
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 *  It is often useful to send extra data to the server when making an Ajax
+		 * request - for example custom filtering information, and this callback
+		 * function makes it trivial to send extra information to the server. The
+		 * passed in parameter is the data set that has been constructed by
+		 * DataTables, and you can add to this or modify it as you require.
+		 *  @type function
+		 *  @param {array} data Data array (array of objects which are name/value
+		 *    pairs) that has been constructed by DataTables and will be sent to the
+		 *    server. In the case of Ajax sourced data with server-side processing
+		 *    this will be an empty array, for server-side processing there will be a
+		 *    significant number of parameters!
+		 *  @returns {undefined} Ensure that you modify the data array passed in,
+		 *    as this is passed by reference.
+		 *
+		 *  @dtopt Callbacks
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverParams
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"fnServerParams": null,
+	
+	
+		/**
+		 * Load the table state. With this function you can define from where, and how, the
+		 * state of a table is loaded. By default DataTables will load from `localStorage`
+		 * but you might wish to use a server-side database or cookies.
+		 *  @type function
+		 *  @member
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} callback Callback that can be executed when done. It
+		 *    should be passed the loaded state object.
+		 *  @return {object} The DataTables state object to be loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoadCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadCallback": function (settings, callback) {
+		 *          $.ajax( {
+		 *            "url": "/state_load",
+		 *            "dataType": "json",
+		 *            "success": function (json) {
+		 *              callback( json );
+		 *            }
+		 *          } );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoadCallback": function ( settings ) {
+			try {
+				return JSON.parse(
+					(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
+						'DataTables_'+settings.sInstance+'_'+location.pathname
+					)
+				);
+			} catch (e) {}
+		},
+	
+	
+		/**
+		 * Callback which allows modification of the saved state prior to loading that state.
+		 * This callback is called when the table is loading state from the stored data, but
+		 * prior to the settings object being modified by the saved state. Note that for
+		 * plug-in authors, you should use the `stateLoadParams` event to load parameters for
+		 * a plug-in.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object that is to be loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoadParams
+		 *
+		 *  @example
+		 *    // Remove a saved filter, so filtering is never loaded
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadParams": function (settings, data) {
+		 *          data.oSearch.sSearch = "";
+		 *        }
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Disallow state loading by returning false
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadParams": function (settings, data) {
+		 *          return false;
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoadParams": null,
+	
+	
+		/**
+		 * Callback that is called when the state has been loaded from the state saving method
+		 * and the DataTables settings object has been modified as a result of the loaded state.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object that was loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoaded
+		 *
+		 *  @example
+		 *    // Show an alert with the filtering value that was saved
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoaded": function (settings, data) {
+		 *          alert( 'Saved filter was: '+data.oSearch.sSearch );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoaded": null,
+	
+	
+		/**
+		 * Save the table state. This function allows you to define where and how the state
+		 * information for the table is stored By default DataTables will use `localStorage`
+		 * but you might wish to use a server-side database or cookies.
+		 *  @type function
+		 *  @member
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object to be saved
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateSaveCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateSaveCallback": function (settings, data) {
+		 *          // Send an Ajax request to the server with the state object
+		 *          $.ajax( {
+		 *            "url": "/state_save",
+		 *            "data": data,
+		 *            "dataType": "json",
+		 *            "method": "POST"
+		 *            "success": function () {}
+		 *          } );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateSaveCallback": function ( settings, data ) {
+			try {
+				(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
+					'DataTables_'+settings.sInstance+'_'+location.pathname,
+					JSON.stringify( data )
+				);
+			} catch (e) {}
+		},
+	
+	
+		/**
+		 * Callback which allows modification of the state to be saved. Called when the table
+		 * has changed state a new state save is required. This method allows modification of
+		 * the state saving object prior to actually doing the save, including addition or
+		 * other state properties or modification. Note that for plug-in authors, you should
+		 * use the `stateSaveParams` event to save parameters for a plug-in.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object to be saved
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateSaveParams
+		 *
+		 *  @example
+		 *    // Remove a saved filter, so filtering is never saved
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateSaveParams": function (settings, data) {
+		 *          data.oSearch.sSearch = "";
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateSaveParams": null,
+	
+	
+		/**
+		 * Duration for which the saved state information is considered valid. After this period
+		 * has elapsed the state will be returned to the default.
+		 * Value is given in seconds.
+		 *  @type int
+		 *  @default 7200 <i>(2 hours)</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.stateDuration
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateDuration": 60*60*24; // 1 day
+		 *      } );
+		 *    } )
+		 */
+		"iStateDuration": 7200,
+	
+	
+		/**
+		 * When enabled DataTables will not make a request to the server for the first
+		 * page draw - rather it will use the data already on the page (no sorting etc
+		 * will be applied to it), thus saving on an XHR at load time. `deferLoading`
+		 * is used to indicate that deferred loading is required, but it is also used
+		 * to tell DataTables how many records there are in the full table (allowing
+		 * the information element and pagination to be displayed correctly). In the case
+		 * where a filtering is applied to the table on initial load, this can be
+		 * indicated by giving the parameter as an array, where the first element is
+		 * the number of records available after filtering and the second element is the
+		 * number of records without filtering (allowing the table information element
+		 * to be shown correctly).
+		 *  @type int | array
+		 *  @default null
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.deferLoading
+		 *
+		 *  @example
+		 *    // 57 records available in the table, no filtering applied
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "scripts/server_processing.php",
+		 *        "deferLoading": 57
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "scripts/server_processing.php",
+		 *        "deferLoading": [ 57, 100 ],
+		 *        "search": {
+		 *          "search": "my_filter"
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"iDeferLoading": null,
+	
+	
+		/**
+		 * Number of rows to display on a single page when using pagination. If
+		 * feature enabled (`lengthChange`) then the end user will be able to override
+		 * this to a custom setting using a pop-up menu.
+		 *  @type int
+		 *  @default 10
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.pageLength
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "pageLength": 50
+		 *      } );
+		 *    } )
+		 */
+		"iDisplayLength": 10,
+	
+	
+		/**
+		 * Define the starting point for data display when using DataTables with
+		 * pagination. Note that this parameter is the number of records, rather than
+		 * the page number, so if you have 10 records per page and want to start on
+		 * the third page, it should be "20".
+		 *  @type int
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.displayStart
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "displayStart": 20
+		 *      } );
+		 *    } )
+		 */
+		"iDisplayStart": 0,
+	
+	
+		/**
+		 * By default DataTables allows keyboard navigation of the table (sorting, paging,
+		 * and filtering) by adding a `tabindex` attribute to the required elements. This
+		 * allows you to tab through the controls and press the enter key to activate them.
+		 * The tabindex is default 0, meaning that the tab follows the flow of the document.
+		 * You can overrule this using this parameter if you wish. Use a value of -1 to
+		 * disable built-in keyboard navigation.
+		 *  @type int
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.tabIndex
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "tabIndex": 1
+		 *      } );
+		 *    } );
+		 */
+		"iTabIndex": 0,
+	
+	
+		/**
+		 * Classes that DataTables assigns to the various components and features
+		 * that it adds to the HTML table. This allows classes to be configured
+		 * during initialisation in addition to through the static
+		 * {@link DataTable.ext.oStdClasses} object).
+		 *  @namespace
+		 *  @name DataTable.defaults.classes
+		 */
+		"oClasses": {},
+	
+	
+		/**
+		 * All strings that DataTables uses in the user interface that it creates
+		 * are defined in this object, allowing you to modified them individually or
+		 * completely replace them all as required.
+		 *  @namespace
+		 *  @name DataTable.defaults.language
+		 */
+		"oLanguage": {
+			/**
+			 * Strings that are used for WAI-ARIA labels and controls only (these are not
+			 * actually visible on the page, but will be read by screenreaders, and thus
+			 * must be internationalised as well).
+			 *  @namespace
+			 *  @name DataTable.defaults.language.aria
+			 */
+			"oAria": {
+				/**
+				 * ARIA label that is added to the table headers when the column may be
+				 * sorted ascending by activing the column (click or return when focused).
+				 * Note that the column header is prefixed to this string.
+				 *  @type string
+				 *  @default : activate to sort column ascending
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.aria.sortAscending
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "aria": {
+				 *            "sortAscending": " - click/return to sort ascending"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sSortAscending": ": activate to sort column ascending",
+	
+				/**
+				 * ARIA label that is added to the table headers when the column may be
+				 * sorted descending by activing the column (click or return when focused).
+				 * Note that the column header is prefixed to this string.
+				 *  @type string
+				 *  @default : activate to sort column ascending
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.aria.sortDescending
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "aria": {
+				 *            "sortDescending": " - click/return to sort descending"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sSortDescending": ": activate to sort column descending"
+			},
+	
+			/**
+			 * Pagination string used by DataTables for the built-in pagination
+			 * control types.
+			 *  @namespace
+			 *  @name DataTable.defaults.language.paginate
+			 */
+			"oPaginate": {
+				/**
+				 * Text to use when using the 'full_numbers' type of pagination for the
+				 * button to take the user to the first page.
+				 *  @type string
+				 *  @default First
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.first
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "first": "First page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sFirst": "First",
+	
+	
+				/**
+				 * Text to use when using the 'full_numbers' type of pagination for the
+				 * button to take the user to the last page.
+				 *  @type string
+				 *  @default Last
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.last
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "last": "Last page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sLast": "Last",
+	
+	
+				/**
+				 * Text to use for the 'next' pagination button (to take the user to the
+				 * next page).
+				 *  @type string
+				 *  @default Next
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.next
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "next": "Next page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sNext": "Next",
+	
+	
+				/**
+				 * Text to use for the 'previous' pagination button (to take the user to
+				 * the previous page).
+				 *  @type string
+				 *  @default Previous
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.previous
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "previous": "Previous page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sPrevious": "Previous"
+			},
+	
+			/**
+			 * This string is shown in preference to `zeroRecords` when the table is
+			 * empty of data (regardless of filtering). Note that this is an optional
+			 * parameter - if it is not given, the value of `zeroRecords` will be used
+			 * instead (either the default or given value).
+			 *  @type string
+			 *  @default No data available in table
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.emptyTable
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "emptyTable": "No data available in table"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sEmptyTable": "No data available in table",
+	
+	
+			/**
+			 * This string gives information to the end user about the information
+			 * that is current on display on the page. The following tokens can be
+			 * used in the string and will be dynamically replaced as the table
+			 * display updates. This tokens can be placed anywhere in the string, or
+			 * removed as needed by the language requires:
+			 *
+			 * * `\_START\_` - Display index of the first record on the current page
+			 * * `\_END\_` - Display index of the last record on the current page
+			 * * `\_TOTAL\_` - Number of records in the table after filtering
+			 * * `\_MAX\_` - Number of records in the table without filtering
+			 * * `\_PAGE\_` - Current page number
+			 * * `\_PAGES\_` - Total number of pages of data in the table
+			 *
+			 *  @type string
+			 *  @default Showing _START_ to _END_ of _TOTAL_ entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.info
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "info": "Showing page _PAGE_ of _PAGES_"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+	
+	
+			/**
+			 * Display information string for when the table is empty. Typically the
+			 * format of this string should match `info`.
+			 *  @type string
+			 *  @default Showing 0 to 0 of 0 entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoEmpty
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoEmpty": "No entries to show"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoEmpty": "Showing 0 to 0 of 0 entries",
+	
+	
+			/**
+			 * When a user filters the information in a table, this string is appended
+			 * to the information (`info`) to give an idea of how strong the filtering
+			 * is. The variable _MAX_ is dynamically updated.
+			 *  @type string
+			 *  @default (filtered from _MAX_ total entries)
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoFiltered
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoFiltered": " - filtering from _MAX_ records"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoFiltered": "(filtered from _MAX_ total entries)",
+	
+	
+			/**
+			 * If can be useful to append extra information to the info string at times,
+			 * and this variable does exactly that. This information will be appended to
+			 * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
+			 * being used) at all times.
+			 *  @type string
+			 *  @default <i>Empty string</i>
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoPostFix
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoPostFix": "All records shown are derived from real information."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoPostFix": "",
+	
+	
+			/**
+			 * This decimal place operator is a little different from the other
+			 * language options since DataTables doesn't output floating point
+			 * numbers, so it won't ever use this for display of a number. Rather,
+			 * what this parameter does is modify the sort methods of the table so
+			 * that numbers which are in a format which has a character other than
+			 * a period (`.`) as a decimal place will be sorted numerically.
+			 *
+			 * Note that numbers with different decimal places cannot be shown in
+			 * the same table and still be sortable, the table must be consistent.
+			 * However, multiple different tables on the page can use different
+			 * decimal place characters.
+			 *  @type string
+			 *  @default 
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.decimal
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "decimal": ","
+			 *          "thousands": "."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sDecimal": "",
+	
+	
+			/**
+			 * DataTables has a build in number formatter (`formatNumber`) which is
+			 * used to format large numbers that are used in the table information.
+			 * By default a comma is used, but this can be trivially changed to any
+			 * character you wish with this parameter.
+			 *  @type string
+			 *  @default ,
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.thousands
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "thousands": "'"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sThousands": ",",
+	
+	
+			/**
+			 * Detail the action that will be taken when the drop down menu for the
+			 * pagination length option is changed. The '_MENU_' variable is replaced
+			 * with a default select list of 10, 25, 50 and 100, and can be replaced
+			 * with a custom select box if required.
+			 *  @type string
+			 *  @default Show _MENU_ entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.lengthMenu
+			 *
+			 *  @example
+			 *    // Language change only
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "lengthMenu": "Display _MENU_ records"
+			 *        }
+			 *      } );
+			 *    } );
+			 *
+			 *  @example
+			 *    // Language and options change
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "lengthMenu": 'Display <select>'+
+			 *            '<option value="10">10</option>'+
+			 *            '<option value="20">20</option>'+
+			 *            '<option value="30">30</option>'+
+			 *            '<option value="40">40</option>'+
+			 *            '<option value="50">50</option>'+
+			 *            '<option value="-1">All</option>'+
+			 *            '</select> records'
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sLengthMenu": "Show _MENU_ entries",
+	
+	
+			/**
+			 * When using Ajax sourced data and during the first draw when DataTables is
+			 * gathering the data, this message is shown in an empty row in the table to
+			 * indicate to the end user the the data is being loaded. Note that this
+			 * parameter is not used when loading data by server-side processing, just
+			 * Ajax sourced data with client-side processing.
+			 *  @type string
+			 *  @default Loading...
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.loadingRecords
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "loadingRecords": "Please wait - loading..."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sLoadingRecords": "Loading...",
+	
+	
+			/**
+			 * Text which is displayed when the table is processing a user action
+			 * (usually a sort command or similar).
+			 *  @type string
+			 *  @default Processing...
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.processing
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "processing": "DataTables is currently busy"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sProcessing": "Processing...",
+	
+	
+			/**
+			 * Details the actions that will be taken when the user types into the
+			 * filtering input text box. The variable "_INPUT_", if used in the string,
+			 * is replaced with the HTML text box for the filtering input allowing
+			 * control over where it appears in the string. If "_INPUT_" is not given
+			 * then the input box is appended to the string automatically.
+			 *  @type string
+			 *  @default Search:
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.search
+			 *
+			 *  @example
+			 *    // Input text box will be appended at the end automatically
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "search": "Filter records:"
+			 *        }
+			 *      } );
+			 *    } );
+			 *
+			 *  @example
+			 *    // Specify where the filter should appear
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "search": "Apply filter _INPUT_ to table"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sSearch": "Search:",
+	
+	
+			/**
+			 * Assign a `placeholder` attribute to the search `input` element
+			 *  @type string
+			 *  @default 
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.searchPlaceholder
+			 */
+			"sSearchPlaceholder": "",
+	
+	
+			/**
+			 * All of the language information can be stored in a file on the
+			 * server-side, which DataTables will look up if this parameter is passed.
+			 * It must store the URL of the language file, which is in a JSON format,
+			 * and the object has the same properties as the oLanguage object in the
+			 * initialiser object (i.e. the above parameters). Please refer to one of
+			 * the example language files to see how this works in action.
+			 *  @type string
+			 *  @default <i>Empty string - i.e. disabled</i>
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.url
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sUrl": "",
+	
+	
+			/**
+			 * Text shown inside the table records when the is no information to be
+			 * displayed after filtering. `emptyTable` is shown when there is simply no
+			 * information in the table at all (regardless of filtering).
+			 *  @type string
+			 *  @default No matching records found
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.zeroRecords
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "zeroRecords": "No records to display"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sZeroRecords": "No matching records found"
+		},
+	
+	
+		/**
+		 * This parameter allows you to have define the global filtering state at
+		 * initialisation time. As an object the `search` parameter must be
+		 * defined, but all other parameters are optional. When `regex` is true,
+		 * the search string will be treated as a regular expression, when false
+		 * (default) it will be treated as a straight string. When `smart`
+		 * DataTables will use it's smart filtering methods (to word match at
+		 * any point in the data), when false this will not be done.
+		 *  @namespace
+		 *  @extends DataTable.models.oSearch
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.search
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "search": {"search": "Initial search"}
+		 *      } );
+		 *    } )
+		 */
+		"oSearch": $.extend( {}, DataTable.models.oSearch ),
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * By default DataTables will look for the property `data` (or `aaData` for
+		 * compatibility with DataTables 1.9-) when obtaining data from an Ajax
+		 * source or for server-side processing - this parameter allows that
+		 * property to be changed. You can use Javascript dotted object notation to
+		 * get a data source for multiple levels of nesting.
+		 *  @type string
+		 *  @default data
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.ajaxDataProp
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sAjaxDataProp": "data",
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * You can instruct DataTables to load data from an external
+		 * source using this parameter (use aData if you want to pass data in you
+		 * already have). Simply provide a url a JSON object can be obtained from.
+		 *  @type string
+		 *  @default null
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.ajaxSource
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sAjaxSource": null,
+	
+	
+		/**
+		 * This initialisation variable allows you to specify exactly where in the
+		 * DOM you want DataTables to inject the various controls it adds to the page
+		 * (for example you might want the pagination controls at the top of the
+		 * table). DIV elements (with or without a custom class) can also be added to
+		 * aid styling. The follow syntax is used:
+		 *   <ul>
+		 *     <li>The following options are allowed:
+		 *       <ul>
+		 *         <li>'l' - Length changing</li>
+		 *         <li>'f' - Filtering input</li>
+		 *         <li>'t' - The table!</li>
+		 *         <li>'i' - Information</li>
+		 *         <li>'p' - Pagination</li>
+		 *         <li>'r' - pRocessing</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>The following constants are allowed:
+		 *       <ul>
+		 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
+		 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>The following syntax is expected:
+		 *       <ul>
+		 *         <li>'&lt;' and '&gt;' - div elements</li>
+		 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
+		 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>Examples:
+		 *       <ul>
+		 *         <li>'&lt;"wrapper"flipt&gt;'</li>
+		 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
+		 *       </ul>
+		 *     </li>
+		 *   </ul>
+		 *  @type string
+		 *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
+		 *    <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.dom
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
+		 *      } );
+		 *    } );
+		 */
+		"sDom": "lfrtip",
+	
+	
+		/**
+		 * Search delay option. This will throttle full table searches that use the
+		 * DataTables provided search input element (it does not effect calls to
+		 * `dt-api search()`, providing a delay before the search is made.
+		 *  @type integer
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.searchDelay
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "searchDelay": 200
+		 *      } );
+		 *    } )
+		 */
+		"searchDelay": null,
+	
+	
+		/**
+		 * DataTables features six different built-in options for the buttons to
+		 * display for pagination control:
+		 *
+		 * * `numbers` - Page number buttons only
+		 * * `simple` - 'Previous' and 'Next' buttons only
+		 * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
+		 * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
+		 * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers
+		 * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers
+		 *  
+		 * Further methods can be added using {@link DataTable.ext.oPagination}.
+		 *  @type string
+		 *  @default simple_numbers
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.pagingType
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "pagingType": "full_numbers"
+		 *      } );
+		 *    } )
+		 */
+		"sPaginationType": "simple_numbers",
+	
+	
+		/**
+		 * Enable horizontal scrolling. When a table is too wide to fit into a
+		 * certain layout, or you have a large number of columns in the table, you
+		 * can enable x-scrolling to show the table in a viewport, which can be
+		 * scrolled. This property can be `true` which will allow the table to
+		 * scroll horizontally when needed, or any CSS unit, or a number (in which
+		 * case it will be treated as a pixel measurement). Setting as simply `true`
+		 * is recommended.
+		 *  @type boolean|string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.scrollX
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollX": true,
+		 *        "scrollCollapse": true
+		 *      } );
+		 *    } );
+		 */
+		"sScrollX": "",
+	
+	
+		/**
+		 * This property can be used to force a DataTable to use more width than it
+		 * might otherwise do when x-scrolling is enabled. For example if you have a
+		 * table which requires to be well spaced, this parameter is useful for
+		 * "over-sizing" the table, and thus forcing scrolling. This property can by
+		 * any CSS unit, or a number (in which case it will be treated as a pixel
+		 * measurement).
+		 *  @type string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.scrollXInner
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollX": "100%",
+		 *        "scrollXInner": "110%"
+		 *      } );
+		 *    } );
+		 */
+		"sScrollXInner": "",
+	
+	
+		/**
+		 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+		 * to the given height, and enable scrolling for any data which overflows the
+		 * current viewport. This can be used as an alternative to paging to display
+		 * a lot of data in a small area (although paging and scrolling can both be
+		 * enabled at the same time). This property can be any CSS unit, or a number
+		 * (in which case it will be treated as a pixel measurement).
+		 *  @type string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.scrollY
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollY": "200px",
+		 *        "paginate": false
+		 *      } );
+		 *    } );
+		 */
+		"sScrollY": "",
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * Set the HTTP method that is used to make the Ajax call for server-side
+		 * processing or Ajax sourced data.
+		 *  @type string
+		 *  @default GET
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverMethod
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sServerMethod": "GET",
+	
+	
+		/**
+		 * DataTables makes use of renderers when displaying HTML elements for
+		 * a table. These renderers can be added or modified by plug-ins to
+		 * generate suitable mark-up for a site. For example the Bootstrap
+		 * integration plug-in for DataTables uses a paging button renderer to
+		 * display pagination buttons in the mark-up required by Bootstrap.
+		 *
+		 * For further information about the renderers available see
+		 * DataTable.ext.renderer
+		 *  @type string|object
+		 *  @default null
+		 *
+		 *  @name DataTable.defaults.renderer
+		 *
+		 */
+		"renderer": null,
+	
+	
+		/**
+		 * Set the data property name that DataTables should use to get a row's id
+		 * to set as the `id` property in the node.
+		 *  @type string
+		 *  @default DT_RowId
+		 *
+		 *  @name DataTable.defaults.rowId
+		 */
+		"rowId": "DT_RowId"
+	};
+	
+	_fnHungarianMap( DataTable.defaults );
+	
+	
+	
+	/*
+	 * Developer note - See note in model.defaults.js about the use of Hungarian
+	 * notation and camel case.
+	 */
+	
+	/**
+	 * Column options that can be given to DataTables at initialisation time.
+	 *  @namespace
+	 */
+	DataTable.defaults.column = {
+		/**
+		 * Define which column(s) an order will occur on for this column. This
+		 * allows a column's ordering to take multiple columns into account when
+		 * doing a sort or use the data from a different column. For example first
+		 * name / last name columns make sense to do a multi-column sort over the
+		 * two columns.
+		 *  @type array|int
+		 *  @default null <i>Takes the value of the column index automatically</i>
+		 *
+		 *  @name DataTable.defaults.column.orderData
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderData": [ 0, 1 ], "targets": [ 0 ] },
+		 *          { "orderData": [ 1, 0 ], "targets": [ 1 ] },
+		 *          { "orderData": 2, "targets": [ 2 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "orderData": [ 0, 1 ] },
+		 *          { "orderData": [ 1, 0 ] },
+		 *          { "orderData": 2 },
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"aDataSort": null,
+		"iDataSort": -1,
+	
+	
+		/**
+		 * You can control the default ordering direction, and even alter the
+		 * behaviour of the sort handler (i.e. only allow ascending ordering etc)
+		 * using this parameter.
+		 *  @type array
+		 *  @default [ 'asc', 'desc' ]
+		 *
+		 *  @name DataTable.defaults.column.orderSequence
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderSequence": [ "asc" ], "targets": [ 1 ] },
+		 *          { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
+		 *          { "orderSequence": [ "desc" ], "targets": [ 3 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          { "orderSequence": [ "asc" ] },
+		 *          { "orderSequence": [ "desc", "asc", "asc" ] },
+		 *          { "orderSequence": [ "desc" ] },
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"asSorting": [ 'asc', 'desc' ],
+	
+	
+		/**
+		 * Enable or disable filtering on the data in this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.searchable
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "searchable": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "searchable": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bSearchable": true,
+	
+	
+		/**
+		 * Enable or disable ordering on this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.orderable
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderable": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "orderable": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bSortable": true,
+	
+	
+		/**
+		 * Enable or disable the display of this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.visible
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "visible": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "visible": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bVisible": true,
+	
+	
+		/**
+		 * Developer definable function that is called whenever a cell is created (Ajax source,
+		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+		 * allowing you to modify the DOM element (add background colour for example) when the
+		 * element is available.
+		 *  @type function
+		 *  @param {element} td The TD node that has been created
+		 *  @param {*} cellData The Data for the cell
+		 *  @param {array|object} rowData The data for the whole row
+		 *  @param {int} row The row index for the aoData data store
+		 *  @param {int} col The column index for aoColumns
+		 *
+		 *  @name DataTable.defaults.column.createdCell
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [3],
+		 *          "createdCell": function (td, cellData, rowData, row, col) {
+		 *            if ( cellData == "1.7" ) {
+		 *              $(td).css('color', 'blue')
+		 *            }
+		 *          }
+		 *        } ]
+		 *      });
+		 *    } );
+		 */
+		"fnCreatedCell": null,
+	
+	
+		/**
+		 * This parameter has been replaced by `data` in DataTables to ensure naming
+		 * consistency. `dataProp` can still be used, as there is backwards
+		 * compatibility in DataTables for this option, but it is strongly
+		 * recommended that you use `data` in preference to `dataProp`.
+		 *  @name DataTable.defaults.column.dataProp
+		 */
+	
+	
+		/**
+		 * This property can be used to read data from any data source property,
+		 * including deeply nested objects / properties. `data` can be given in a
+		 * number of different ways which effect its behaviour:
+		 *
+		 * * `integer` - treated as an array index for the data source. This is the
+		 *   default that DataTables uses (incrementally increased for each column).
+		 * * `string` - read an object property from the data source. There are
+		 *   three 'special' options that can be used in the string to alter how
+		 *   DataTables reads the data from the source object:
+		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
+		 *      Javascript to read from nested objects, so to can the options
+		 *      specified in `data`. For example: `browser.version` or
+		 *      `browser.name`. If your object parameter name contains a period, use
+		 *      `\\` to escape it - i.e. `first\\.name`.
+		 *    * `[]` - Array notation. DataTables can automatically combine data
+		 *      from and array source, joining the data with the characters provided
+		 *      between the two brackets. For example: `name[, ]` would provide a
+		 *      comma-space separated list from the source array. If no characters
+		 *      are provided between the brackets, the original array source is
+		 *      returned.
+		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
+		 *      execute a function of the name given. For example: `browser()` for a
+		 *      simple function on the data source, `browser.version()` for a
+		 *      function in a nested property or even `browser().version` to get an
+		 *      object property if the function called returns an object. Note that
+		 *      function notation is recommended for use in `render` rather than
+		 *      `data` as it is much simpler to use as a renderer.
+		 * * `null` - use the original data source for the row rather than plucking
+		 *   data directly from it. This action has effects on two other
+		 *   initialisation options:
+		 *    * `defaultContent` - When null is given as the `data` option and
+		 *      `defaultContent` is specified for the column, the value defined by
+		 *      `defaultContent` will be used for the cell.
+		 *    * `render` - When null is used for the `data` option and the `render`
+		 *      option is specified for the column, the whole data source for the
+		 *      row is used for the renderer.
+		 * * `function` - the function given will be executed whenever DataTables
+		 *   needs to set or get the data for a cell in the column. The function
+		 *   takes three parameters:
+		 *    * Parameters:
+		 *      * `{array|object}` The data source for the row
+		 *      * `{string}` The type call data requested - this will be 'set' when
+		 *        setting data or 'filter', 'display', 'type', 'sort' or undefined
+		 *        when gathering data. Note that when `undefined` is given for the
+		 *        type DataTables expects to get the raw data for the object back<
+		 *      * `{*}` Data to set when the second parameter is 'set'.
+		 *    * Return:
+		 *      * The return value from the function is not required when 'set' is
+		 *        the type of call, but otherwise the return is what will be used
+		 *        for the data requested.
+		 *
+		 * Note that `data` is a getter and setter option. If you just require
+		 * formatting of data for output, you will likely want to use `render` which
+		 * is simply a getter and thus simpler to use.
+		 *
+		 * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
+		 * name change reflects the flexibility of this property and is consistent
+		 * with the naming of mRender. If 'mDataProp' is given, then it will still
+		 * be used by DataTables, as it automatically maps the old name to the new
+		 * if required.
+		 *
+		 *  @type string|int|function|null
+		 *  @default null <i>Use automatically calculated column index</i>
+		 *
+		 *  @name DataTable.defaults.column.data
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Read table data from objects
+		 *    // JSON structure for each row:
+		 *    //   {
+		 *    //      "engine": {value},
+		 *    //      "browser": {value},
+		 *    //      "platform": {value},
+		 *    //      "version": {value},
+		 *    //      "grade": {value}
+		 *    //   }
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/objects.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          { "data": "platform" },
+		 *          { "data": "version" },
+		 *          { "data": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Read information from deeply nested objects
+		 *    // JSON structure for each row:
+		 *    //   {
+		 *    //      "engine": {value},
+		 *    //      "browser": {value},
+		 *    //      "platform": {
+		 *    //         "inner": {value}
+		 *    //      },
+		 *    //      "details": [
+		 *    //         {value}, {value}
+		 *    //      ]
+		 *    //   }
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/deep.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          { "data": "platform.inner" },
+		 *          { "data": "platform.details.0" },
+		 *          { "data": "platform.details.1" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `data` as a function to provide different information for
+		 *    // sorting, filtering and display. In this case, currency (price)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": function ( source, type, val ) {
+		 *            if (type === 'set') {
+		 *              source.price = val;
+		 *              // Store the computed dislay and filter values for efficiency
+		 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
+		 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+		 *              return;
+		 *            }
+		 *            else if (type === 'display') {
+		 *              return source.price_display;
+		 *            }
+		 *            else if (type === 'filter') {
+		 *              return source.price_filter;
+		 *            }
+		 *            // 'sort', 'type' and undefined all just use the integer
+		 *            return source.price;
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using default content
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null,
+		 *          "defaultContent": "Click to edit"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using array notation - outputting a list from an array
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": "name[, ]"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 */
+		"mData": null,
+	
+	
+		/**
+		 * This property is the rendering partner to `data` and it is suggested that
+		 * when you want to manipulate data for display (including filtering,
+		 * sorting etc) without altering the underlying data for the table, use this
+		 * property. `render` can be considered to be the the read only companion to
+		 * `data` which is read / write (then as such more complex). Like `data`
+		 * this option can be given in a number of different ways to effect its
+		 * behaviour:
+		 *
+		 * * `integer` - treated as an array index for the data source. This is the
+		 *   default that DataTables uses (incrementally increased for each column).
+		 * * `string` - read an object property from the data source. There are
+		 *   three 'special' options that can be used in the string to alter how
+		 *   DataTables reads the data from the source object:
+		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
+		 *      Javascript to read from nested objects, so to can the options
+		 *      specified in `data`. For example: `browser.version` or
+		 *      `browser.name`. If your object parameter name contains a period, use
+		 *      `\\` to escape it - i.e. `first\\.name`.
+		 *    * `[]` - Array notation. DataTables can automatically combine data
+		 *      from and array source, joining the data with the characters provided
+		 *      between the two brackets. For example: `name[, ]` would provide a
+		 *      comma-space separated list from the source array. If no characters
+		 *      are provided between the brackets, the original array source is
+		 *      returned.
+		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
+		 *      execute a function of the name given. For example: `browser()` for a
+		 *      simple function on the data source, `browser.version()` for a
+		 *      function in a nested property or even `browser().version` to get an
+		 *      object property if the function called returns an object.
+		 * * `object` - use different data for the different data types requested by
+		 *   DataTables ('filter', 'display', 'type' or 'sort'). The property names
+		 *   of the object is the data type the property refers to and the value can
+		 *   defined using an integer, string or function using the same rules as
+		 *   `render` normally does. Note that an `_` option _must_ be specified.
+		 *   This is the default value to use if you haven't specified a value for
+		 *   the data type requested by DataTables.
+		 * * `function` - the function given will be executed whenever DataTables
+		 *   needs to set or get the data for a cell in the column. The function
+		 *   takes three parameters:
+		 *    * Parameters:
+		 *      * {array|object} The data source for the row (based on `data`)
+		 *      * {string} The type call data requested - this will be 'filter',
+		 *        'display', 'type' or 'sort'.
+		 *      * {array|object} The full data source for the row (not based on
+		 *        `data`)
+		 *    * Return:
+		 *      * The return value from the function is what will be used for the
+		 *        data requested.
+		 *
+		 *  @type string|int|function|object|null
+		 *  @default null Use the data source value.
+		 *
+		 *  @name DataTable.defaults.column.render
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Create a comma separated list from an array of objects
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/deep.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          {
+		 *            "data": "platform",
+		 *            "render": "[, ].name"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Execute a function to obtain data
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null, // Use the full data source object for the renderer's source
+		 *          "render": "browserName()"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // As an object, extracting different data for the different types
+		 *    // This would be used with a data source such as:
+		 *    //   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
+		 *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
+		 *    // (which has both forms) is used for filtering for if a user inputs either format, while
+		 *    // the formatted phone number is the one that is shown in the table.
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null, // Use the full data source object for the renderer's source
+		 *          "render": {
+		 *            "_": "phone",
+		 *            "filter": "phone_filter",
+		 *            "display": "phone_display"
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Use as a function to create a link from the data source
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": "download_link",
+		 *          "render": function ( data, type, full ) {
+		 *            return '<a href="'+data+'">Download</a>';
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 */
+		"mRender": null,
+	
+	
+		/**
+		 * Change the cell type created for the column - either TD cells or TH cells. This
+		 * can be useful as TH cells have semantic meaning in the table body, allowing them
+		 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+		 *  @type string
+		 *  @default td
+		 *
+		 *  @name DataTable.defaults.column.cellType
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Make the first column use TH cells
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "cellType": "th"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 */
+		"sCellType": "td",
+	
+	
+		/**
+		 * Class to give to each cell in this column.
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *
+		 *  @name DataTable.defaults.column.class
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "class": "my_class", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "class": "my_class" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sClass": "",
+	
+		/**
+		 * When DataTables calculates the column widths to assign to each column,
+		 * it finds the longest string in each column and then constructs a
+		 * temporary table and reads the widths from that. The problem with this
+		 * is that "mmm" is much wider then "iiii", but the latter is a longer
+		 * string - thus the calculation can go wrong (doing it properly and putting
+		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
+		 * a "work around" we provide this option. It will append its value to the
+		 * text that is found to be the longest string for the column - i.e. padding.
+		 * Generally you shouldn't need this!
+		 *  @type string
+		 *  @default <i>Empty string<i>
+		 *
+		 *  @name DataTable.defaults.column.contentPadding
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          {
+		 *            "contentPadding": "mmm"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sContentPadding": "",
+	
+	
+		/**
+		 * Allows a default value to be given for a column's data, and will be used
+		 * whenever a null data source is encountered (this can be because `data`
+		 * is set to null, or because the data source itself is null).
+		 *  @type string
+		 *  @default null
+		 *
+		 *  @name DataTable.defaults.column.defaultContent
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          {
+		 *            "data": null,
+		 *            "defaultContent": "Edit",
+		 *            "targets": [ -1 ]
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          {
+		 *            "data": null,
+		 *            "defaultContent": "Edit"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sDefaultContent": null,
+	
+	
+		/**
+		 * This parameter is only used in DataTables' server-side processing. It can
+		 * be exceptionally useful to know what columns are being displayed on the
+		 * client side, and to map these to database fields. When defined, the names
+		 * also allow DataTables to reorder information from the server if it comes
+		 * back in an unexpected order (i.e. if you switch your columns around on the
+		 * client-side, your server-side code does not also need updating).
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *
+		 *  @name DataTable.defaults.column.name
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "name": "engine", "targets": [ 0 ] },
+		 *          { "name": "browser", "targets": [ 1 ] },
+		 *          { "name": "platform", "targets": [ 2 ] },
+		 *          { "name": "version", "targets": [ 3 ] },
+		 *          { "name": "grade", "targets": [ 4 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "name": "engine" },
+		 *          { "name": "browser" },
+		 *          { "name": "platform" },
+		 *          { "name": "version" },
+		 *          { "name": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sName": "",
+	
+	
+		/**
+		 * Defines a data source type for the ordering which can be used to read
+		 * real-time information from the table (updating the internally cached
+		 * version) prior to ordering. This allows ordering to occur on user
+		 * editable elements such as form inputs.
+		 *  @type string
+		 *  @default std
+		 *
+		 *  @name DataTable.defaults.column.orderDataType
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
+		 *          { "type": "numeric", "targets": [ 3 ] },
+		 *          { "orderDataType": "dom-select", "targets": [ 4 ] },
+		 *          { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          { "orderDataType": "dom-text" },
+		 *          { "orderDataType": "dom-text", "type": "numeric" },
+		 *          { "orderDataType": "dom-select" },
+		 *          { "orderDataType": "dom-checkbox" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sSortDataType": "std",
+	
+	
+		/**
+		 * The title of this column.
+		 *  @type string
+		 *  @default null <i>Derived from the 'TH' value for this column in the
+		 *    original HTML table.</i>
+		 *
+		 *  @name DataTable.defaults.column.title
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "title": "My column title", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "title": "My column title" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sTitle": null,
+	
+	
+		/**
+		 * The type allows you to specify how the data for this column will be
+		 * ordered. Four types (string, numeric, date and html (which will strip
+		 * HTML tags before ordering)) are currently available. Note that only date
+		 * formats understood by Javascript's Date() object will be accepted as type
+		 * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
+		 * 'numeric', 'date' or 'html' (by default). Further types can be adding
+		 * through plug-ins.
+		 *  @type string
+		 *  @default null <i>Auto-detected from raw data</i>
+		 *
+		 *  @name DataTable.defaults.column.type
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "type": "html", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "type": "html" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sType": null,
+	
+	
+		/**
+		 * Defining the width of the column, this parameter may take any CSS value
+		 * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
+		 * been given a specific width through this interface ensuring that the table
+		 * remains readable.
+		 *  @type string
+		 *  @default null <i>Automatic</i>
+		 *
+		 *  @name DataTable.defaults.column.width
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "width": "20%", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "width": "20%" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sWidth": null
+	};
+	
+	_fnHungarianMap( DataTable.defaults.column );
+	
+	
+	
+	/**
+	 * DataTables settings object - this holds all the information needed for a
+	 * given table, including configuration, data and current application of the
+	 * table options. DataTables does not have a single instance for each DataTable
+	 * with the settings attached to that instance, but rather instances of the
+	 * DataTable "class" are created on-the-fly as needed (typically by a
+	 * $().dataTable() call) and the settings object is then applied to that
+	 * instance.
+	 *
+	 * Note that this object is related to {@link DataTable.defaults} but this
+	 * one is the internal data store for DataTables's cache of columns. It should
+	 * NOT be manipulated outside of DataTables. Any configuration should be done
+	 * through the initialisation options.
+	 *  @namespace
+	 *  @todo Really should attach the settings object to individual instances so we
+	 *    don't need to create new instances on each $().dataTable() call (if the
+	 *    table already exists). It would also save passing oSettings around and
+	 *    into every single function. However, this is a very significant
+	 *    architecture change for DataTables and will almost certainly break
+	 *    backwards compatibility with older installations. This is something that
+	 *    will be done in 2.0.
+	 */
+	DataTable.models.oSettings = {
+		/**
+		 * Primary features of DataTables and their enablement state.
+		 *  @namespace
+		 */
+		"oFeatures": {
+	
+			/**
+			 * Flag to say if DataTables should automatically try to calculate the
+			 * optimum table and columns widths (true) or not (false).
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bAutoWidth": null,
+	
+			/**
+			 * Delay the creation of TR and TD elements until they are actually
+			 * needed by a driven page draw. This can give a significant speed
+			 * increase for Ajax source and Javascript source data, but makes no
+			 * difference at all fro DOM and server-side processing tables.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bDeferRender": null,
+	
+			/**
+			 * Enable filtering on the table or not. Note that if this is disabled
+			 * then there is no filtering at all on the table, including fnFilter.
+			 * To just remove the filtering input use sDom and remove the 'f' option.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bFilter": null,
+	
+			/**
+			 * Table information element (the 'Showing x of y records' div) enable
+			 * flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bInfo": null,
+	
+			/**
+			 * Present a user control allowing the end user to change the page size
+			 * when pagination is enabled.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bLengthChange": null,
+	
+			/**
+			 * Pagination enabled or not. Note that if this is disabled then length
+			 * changing must also be disabled.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bPaginate": null,
+	
+			/**
+			 * Processing indicator enable flag whenever DataTables is enacting a
+			 * user request - typically an Ajax request for server-side processing.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bProcessing": null,
+	
+			/**
+			 * Server-side processing enabled flag - when enabled DataTables will
+			 * get all data from the server for every draw - there is no filtering,
+			 * sorting or paging done on the client-side.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bServerSide": null,
+	
+			/**
+			 * Sorting enablement flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSort": null,
+	
+			/**
+			 * Multi-column sorting
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSortMulti": null,
+	
+			/**
+			 * Apply a class to the columns which are being sorted to provide a
+			 * visual highlight or not. This can slow things down when enabled since
+			 * there is a lot of DOM interaction.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSortClasses": null,
+	
+			/**
+			 * State saving enablement flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bStateSave": null
+		},
+	
+	
+		/**
+		 * Scrolling settings for a table.
+		 *  @namespace
+		 */
+		"oScroll": {
+			/**
+			 * When the table is shorter in height than sScrollY, collapse the
+			 * table container down to the height of the table (when true).
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bCollapse": null,
+	
+			/**
+			 * Width of the scrollbar for the web-browser's platform. Calculated
+			 * during table initialisation.
+			 *  @type int
+			 *  @default 0
+			 */
+			"iBarWidth": 0,
+	
+			/**
+			 * Viewport width for horizontal scrolling. Horizontal scrolling is
+			 * disabled if an empty string.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 */
+			"sX": null,
+	
+			/**
+			 * Width to expand the table to when using x-scrolling. Typically you
+			 * should not need to use this.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 *  @deprecated
+			 */
+			"sXInner": null,
+	
+			/**
+			 * Viewport height for vertical scrolling. Vertical scrolling is disabled
+			 * if an empty string.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 */
+			"sY": null
+		},
+	
+		/**
+		 * Language information for the table.
+		 *  @namespace
+		 *  @extends DataTable.defaults.oLanguage
+		 */
+		"oLanguage": {
+			/**
+			 * Information callback function. See
+			 * {@link DataTable.defaults.fnInfoCallback}
+			 *  @type function
+			 *  @default null
+			 */
+			"fnInfoCallback": null
+		},
+	
+		/**
+		 * Browser support parameters
+		 *  @namespace
+		 */
+		"oBrowser": {
+			/**
+			 * Indicate if the browser incorrectly calculates width:100% inside a
+			 * scrolling element (IE6/7)
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bScrollOversize": false,
+	
+			/**
+			 * Determine if the vertical scrollbar is on the right or left of the
+			 * scrolling container - needed for rtl language layout, although not
+			 * all browsers move the scrollbar (Safari).
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bScrollbarLeft": false,
+	
+			/**
+			 * Flag for if `getBoundingClientRect` is fully supported or not
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bBounding": false,
+	
+			/**
+			 * Browser scrollbar width
+			 *  @type integer
+			 *  @default 0
+			 */
+			"barWidth": 0
+		},
+	
+	
+		"ajax": null,
+	
+	
+		/**
+		 * Array referencing the nodes which are used for the features. The
+		 * parameters of this object match what is allowed by sDom - i.e.
+		 *   <ul>
+		 *     <li>'l' - Length changing</li>
+		 *     <li>'f' - Filtering input</li>
+		 *     <li>'t' - The table!</li>
+		 *     <li>'i' - Information</li>
+		 *     <li>'p' - Pagination</li>
+		 *     <li>'r' - pRocessing</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aanFeatures": [],
+	
+		/**
+		 * Store data information - see {@link DataTable.models.oRow} for detailed
+		 * information.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoData": [],
+	
+		/**
+		 * Array of indexes which are in the current display (after filtering etc)
+		 *  @type array
+		 *  @default []
+		 */
+		"aiDisplay": [],
+	
+		/**
+		 * Array of indexes for display - no filtering
+		 *  @type array
+		 *  @default []
+		 */
+		"aiDisplayMaster": [],
+	
+		/**
+		 * Map of row ids to data indexes
+		 *  @type object
+		 *  @default {}
+		 */
+		"aIds": {},
+	
+		/**
+		 * Store information about each column that is in use
+		 *  @type array
+		 *  @default []
+		 */
+		"aoColumns": [],
+	
+		/**
+		 * Store information about the table's header
+		 *  @type array
+		 *  @default []
+		 */
+		"aoHeader": [],
+	
+		/**
+		 * Store information about the table's footer
+		 *  @type array
+		 *  @default []
+		 */
+		"aoFooter": [],
+	
+		/**
+		 * Store the applied global search information in case we want to force a
+		 * research or compare the old search to a new one.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @namespace
+		 *  @extends DataTable.models.oSearch
+		 */
+		"oPreviousSearch": {},
+	
+		/**
+		 * Store the applied search for each column - see
+		 * {@link DataTable.models.oSearch} for the format that is used for the
+		 * filtering information for each column.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoPreSearchCols": [],
+	
+		/**
+		 * Sorting that is applied to the table. Note that the inner arrays are
+		 * used in the following manner:
+		 * <ul>
+		 *   <li>Index 0 - column number</li>
+		 *   <li>Index 1 - current sorting direction</li>
+		 * </ul>
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @todo These inner arrays should really be objects
+		 */
+		"aaSorting": null,
+	
+		/**
+		 * Sorting that is always applied to the table (i.e. prefixed in front of
+		 * aaSorting).
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"aaSortingFixed": [],
+	
+		/**
+		 * Classes to use for the striping of a table.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"asStripeClasses": null,
+	
+		/**
+		 * If restoring a table - we should restore its striping classes as well
+		 *  @type array
+		 *  @default []
+		 */
+		"asDestroyStripes": [],
+	
+		/**
+		 * If restoring a table - we should restore its width
+		 *  @type int
+		 *  @default 0
+		 */
+		"sDestroyWidth": 0,
+	
+		/**
+		 * Callback functions array for every time a row is inserted (i.e. on a draw).
+		 *  @type array
+		 *  @default []
+		 */
+		"aoRowCallback": [],
+	
+		/**
+		 * Callback functions for the header on each draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoHeaderCallback": [],
+	
+		/**
+		 * Callback function for the footer on each draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoFooterCallback": [],
+	
+		/**
+		 * Array of callback functions for draw callback functions
+		 *  @type array
+		 *  @default []
+		 */
+		"aoDrawCallback": [],
+	
+		/**
+		 * Array of callback functions for row created function
+		 *  @type array
+		 *  @default []
+		 */
+		"aoRowCreatedCallback": [],
+	
+		/**
+		 * Callback functions for just before the table is redrawn. A return of
+		 * false will be used to cancel the draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoPreDrawCallback": [],
+	
+		/**
+		 * Callback functions for when the table has been initialised.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoInitComplete": [],
+	
+	
+		/**
+		 * Callbacks for modifying the settings to be stored for state saving, prior to
+		 * saving state.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateSaveParams": [],
+	
+		/**
+		 * Callbacks for modifying the settings that have been stored for state saving
+		 * prior to using the stored values to restore the state.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoadParams": [],
+	
+		/**
+		 * Callbacks for operating on the settings object once the saved state has been
+		 * loaded
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoaded": [],
+	
+		/**
+		 * Cache the table ID for quick access
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 */
+		"sTableId": "",
+	
+		/**
+		 * The TABLE node for the main table
+		 *  @type node
+		 *  @default null
+		 */
+		"nTable": null,
+	
+		/**
+		 * Permanent ref to the thead element
+		 *  @type node
+		 *  @default null
+		 */
+		"nTHead": null,
+	
+		/**
+		 * Permanent ref to the tfoot element - if it exists
+		 *  @type node
+		 *  @default null
+		 */
+		"nTFoot": null,
+	
+		/**
+		 * Permanent ref to the tbody element
+		 *  @type node
+		 *  @default null
+		 */
+		"nTBody": null,
+	
+		/**
+		 * Cache the wrapper node (contains all DataTables controlled elements)
+		 *  @type node
+		 *  @default null
+		 */
+		"nTableWrapper": null,
+	
+		/**
+		 * Indicate if when using server-side processing the loading of data
+		 * should be deferred until the second draw.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bDeferLoading": false,
+	
+		/**
+		 * Indicate if all required information has been read in
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bInitialised": false,
+	
+		/**
+		 * Information about open rows. Each object in the array has the parameters
+		 * 'nTr' and 'nParent'
+		 *  @type array
+		 *  @default []
+		 */
+		"aoOpenRows": [],
+	
+		/**
+		 * Dictate the positioning of DataTables' control elements - see
+		 * {@link DataTable.model.oInit.sDom}.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default null
+		 */
+		"sDom": null,
+	
+		/**
+		 * Search delay (in mS)
+		 *  @type integer
+		 *  @default null
+		 */
+		"searchDelay": null,
+	
+		/**
+		 * Which type of pagination should be used.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default two_button
+		 */
+		"sPaginationType": "two_button",
+	
+		/**
+		 * The state duration (for `stateSave`) in seconds.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type int
+		 *  @default 0
+		 */
+		"iStateDuration": 0,
+	
+		/**
+		 * Array of callback functions for state saving. Each array element is an
+		 * object with the following parameters:
+		 *   <ul>
+		 *     <li>function:fn - function to call. Takes two parameters, oSettings
+		 *       and the JSON string to save that has been thus far created. Returns
+		 *       a JSON string to be inserted into a json object
+		 *       (i.e. '"param": [ 0, 1, 2]')</li>
+		 *     <li>string:sName - name of callback</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateSave": [],
+	
+		/**
+		 * Array of callback functions for state loading. Each array element is an
+		 * object with the following parameters:
+		 *   <ul>
+		 *     <li>function:fn - function to call. Takes two parameters, oSettings
+		 *       and the object stored. May return false to cancel state loading</li>
+		 *     <li>string:sName - name of callback</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoad": [],
+	
+		/**
+		 * State that was saved. Useful for back reference
+		 *  @type object
+		 *  @default null
+		 */
+		"oSavedState": null,
+	
+		/**
+		 * State that was loaded. Useful for back reference
+		 *  @type object
+		 *  @default null
+		 */
+		"oLoadedState": null,
+	
+		/**
+		 * Source url for AJAX data for the table.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default null
+		 */
+		"sAjaxSource": null,
+	
+		/**
+		 * Property from a given object from which to read the table data from. This
+		 * can be an empty string (when not server-side processing), in which case
+		 * it is  assumed an an array is given directly.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 */
+		"sAjaxDataProp": null,
+	
+		/**
+		 * Note if draw should be blocked while getting data
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bAjaxDataGet": true,
+	
+		/**
+		 * The last jQuery XHR object that was used for server-side data gathering.
+		 * This can be used for working with the XHR information in one of the
+		 * callbacks
+		 *  @type object
+		 *  @default null
+		 */
+		"jqXHR": null,
+	
+		/**
+		 * JSON returned from the server in the last Ajax request
+		 *  @type object
+		 *  @default undefined
+		 */
+		"json": undefined,
+	
+		/**
+		 * Data submitted as part of the last Ajax request
+		 *  @type object
+		 *  @default undefined
+		 */
+		"oAjaxData": undefined,
+	
+		/**
+		 * Function to get the server-side data.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type function
+		 */
+		"fnServerData": null,
+	
+		/**
+		 * Functions which are called prior to sending an Ajax request so extra
+		 * parameters can easily be sent to the server
+		 *  @type array
+		 *  @default []
+		 */
+		"aoServerParams": [],
+	
+		/**
+		 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
+		 * required).
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 */
+		"sServerMethod": null,
+	
+		/**
+		 * Format numbers for display.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type function
+		 */
+		"fnFormatNumber": null,
+	
+		/**
+		 * List of options that can be used for the user selectable length menu.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"aLengthMenu": null,
+	
+		/**
+		 * Counter for the draws that the table does. Also used as a tracker for
+		 * server-side processing
+		 *  @type int
+		 *  @default 0
+		 */
+		"iDraw": 0,
+	
+		/**
+		 * Indicate if a redraw is being done - useful for Ajax
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bDrawing": false,
+	
+		/**
+		 * Draw index (iDraw) of the last error when parsing the returned data
+		 *  @type int
+		 *  @default -1
+		 */
+		"iDrawError": -1,
+	
+		/**
+		 * Paging display length
+		 *  @type int
+		 *  @default 10
+		 */
+		"_iDisplayLength": 10,
+	
+		/**
+		 * Paging start point - aiDisplay index
+		 *  @type int
+		 *  @default 0
+		 */
+		"_iDisplayStart": 0,
+	
+		/**
+		 * Server-side processing - number of records in the result set
+		 * (i.e. before filtering), Use fnRecordsTotal rather than
+		 * this property to get the value of the number of records, regardless of
+		 * the server-side processing setting.
+		 *  @type int
+		 *  @default 0
+		 *  @private
+		 */
+		"_iRecordsTotal": 0,
+	
+		/**
+		 * Server-side processing - number of records in the current display set
+		 * (i.e. after filtering). Use fnRecordsDisplay rather than
+		 * this property to get the value of the number of records, regardless of
+		 * the server-side processing setting.
+		 *  @type boolean
+		 *  @default 0
+		 *  @private
+		 */
+		"_iRecordsDisplay": 0,
+	
+		/**
+		 * Flag to indicate if jQuery UI marking and classes should be used.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type boolean
+		 */
+		"bJUI": null,
+	
+		/**
+		 * The classes to use for the table
+		 *  @type object
+		 *  @default {}
+		 */
+		"oClasses": {},
+	
+		/**
+		 * Flag attached to the settings object so you can check in the draw
+		 * callback if filtering has been done in the draw. Deprecated in favour of
+		 * events.
+		 *  @type boolean
+		 *  @default false
+		 *  @deprecated
+		 */
+		"bFiltered": false,
+	
+		/**
+		 * Flag attached to the settings object so you can check in the draw
+		 * callback if sorting has been done in the draw. Deprecated in favour of
+		 * events.
+		 *  @type boolean
+		 *  @default false
+		 *  @deprecated
+		 */
+		"bSorted": false,
+	
+		/**
+		 * Indicate that if multiple rows are in the header and there is more than
+		 * one unique cell per column, if the top one (true) or bottom one (false)
+		 * should be used for sorting / title by DataTables.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type boolean
+		 */
+		"bSortCellsTop": null,
+	
+		/**
+		 * Initialisation object that is used for the table
+		 *  @type object
+		 *  @default null
+		 */
+		"oInit": null,
+	
+		/**
+		 * Destroy callback functions - for plug-ins to attach themselves to the
+		 * destroy so they can clean up markup and events.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoDestroyCallback": [],
+	
+	
+		/**
+		 * Get the number of records in the current record set, before filtering
+		 *  @type function
+		 */
+		"fnRecordsTotal": function ()
+		{
+			return _fnDataSource( this ) == 'ssp' ?
+				this._iRecordsTotal * 1 :
+				this.aiDisplayMaster.length;
+		},
+	
+		/**
+		 * Get the number of records in the current record set, after filtering
+		 *  @type function
+		 */
+		"fnRecordsDisplay": function ()
+		{
+			return _fnDataSource( this ) == 'ssp' ?
+				this._iRecordsDisplay * 1 :
+				this.aiDisplay.length;
+		},
+	
+		/**
+		 * Get the display end point - aiDisplay index
+		 *  @type function
+		 */
+		"fnDisplayEnd": function ()
+		{
+			var
+				len      = this._iDisplayLength,
+				start    = this._iDisplayStart,
+				calc     = start + len,
+				records  = this.aiDisplay.length,
+				features = this.oFeatures,
+				paginate = features.bPaginate;
+	
+			if ( features.bServerSide ) {
+				return paginate === false || len === -1 ?
+					start + records :
+					Math.min( start+len, this._iRecordsDisplay );
+			}
+			else {
+				return ! paginate || calc>records || len===-1 ?
+					records :
+					calc;
+			}
+		},
+	
+		/**
+		 * The DataTables object for this table
+		 *  @type object
+		 *  @default null
+		 */
+		"oInstance": null,
+	
+		/**
+		 * Unique identifier for each instance of the DataTables object. If there
+		 * is an ID on the table node, then it takes that value, otherwise an
+		 * incrementing internal counter is used.
+		 *  @type string
+		 *  @default null
+		 */
+		"sInstance": null,
+	
+		/**
+		 * tabindex attribute value that is added to DataTables control elements, allowing
+		 * keyboard navigation of the table and its controls.
+		 */
+		"iTabIndex": 0,
+	
+		/**
+		 * DIV container for the footer scrolling table if scrolling
+		 */
+		"nScrollHead": null,
+	
+		/**
+		 * DIV container for the footer scrolling table if scrolling
+		 */
+		"nScrollFoot": null,
+	
+		/**
+		 * Last applied sort
+		 *  @type array
+		 *  @default []
+		 */
+		"aLastSort": [],
+	
+		/**
+		 * Stored plug-in instances
+		 *  @type object
+		 *  @default {}
+		 */
+		"oPlugins": {},
+	
+		/**
+		 * Function used to get a row's id from the row's data
+		 *  @type function
+		 *  @default null
+		 */
+		"rowIdFn": null,
+	
+		/**
+		 * Data location where to store a row's id
+		 *  @type string
+		 *  @default null
+		 */
+		"rowId": null
+	};
+
+	/**
+	 * Extension object for DataTables that is used to provide all extension
+	 * options.
+	 *
+	 * Note that the `DataTable.ext` object is available through
+	 * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
+	 * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
+	 *  @namespace
+	 *  @extends DataTable.models.ext
+	 */
+	
+	
+	/**
+	 * DataTables extensions
+	 * 
+	 * This namespace acts as a collection area for plug-ins that can be used to
+	 * extend DataTables capabilities. Indeed many of the build in methods
+	 * use this method to provide their own capabilities (sorting methods for
+	 * example).
+	 *
+	 * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
+	 * reasons
+	 *
+	 *  @namespace
+	 */
+	DataTable.ext = _ext = {
+		/**
+		 * Buttons. For use with the Buttons extension for DataTables. This is
+		 * defined here so other extensions can define buttons regardless of load
+		 * order. It is _not_ used by DataTables core.
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		buttons: {},
+	
+	
+		/**
+		 * Element class names
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		classes: {},
+	
+	
+		/**
+		 * DataTables build type (expanded by the download builder)
+		 *
+		 *  @type string
+		 */
+		builder: "-source-",
+	
+	
+		/**
+		 * Error reporting.
+		 * 
+		 * How should DataTables report an error. Can take the value 'alert',
+		 * 'throw', 'none' or a function.
+		 *
+		 *  @type string|function
+		 *  @default alert
+		 */
+		errMode: "alert",
+	
+	
+		/**
+		 * Feature plug-ins.
+		 * 
+		 * This is an array of objects which describe the feature plug-ins that are
+		 * available to DataTables. These feature plug-ins are then available for
+		 * use through the `dom` initialisation option.
+		 * 
+		 * Each feature plug-in is described by an object which must have the
+		 * following properties:
+		 * 
+		 * * `fnInit` - function that is used to initialise the plug-in,
+		 * * `cFeature` - a character so the feature can be enabled by the `dom`
+		 *   instillation option. This is case sensitive.
+		 *
+		 * The `fnInit` function has the following input parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 *
+		 * And the following return is expected:
+		 * 
+		 * * {node|null} The element which contains your feature. Note that the
+		 *   return may also be void if your plug-in does not require to inject any
+		 *   DOM elements into DataTables control (`dom`) - for example this might
+		 *   be useful when developing a plug-in which allows table control via
+		 *   keyboard entry
+		 *
+		 *  @type array
+		 *
+		 *  @example
+		 *    $.fn.dataTable.ext.features.push( {
+		 *      "fnInit": function( oSettings ) {
+		 *        return new TableTools( { "oDTSettings": oSettings } );
+		 *      },
+		 *      "cFeature": "T"
+		 *    } );
+		 */
+		feature: [],
+	
+	
+		/**
+		 * Row searching.
+		 * 
+		 * This method of searching is complimentary to the default type based
+		 * searching, and a lot more comprehensive as it allows you complete control
+		 * over the searching logic. Each element in this array is a function
+		 * (parameters described below) that is called for every row in the table,
+		 * and your logic decides if it should be included in the searching data set
+		 * or not.
+		 *
+		 * Searching functions have the following input parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 * 2. `{array|object}` Data for the row to be processed (same as the
+		 *    original format that was passed in as the data source, or an array
+		 *    from a DOM data source
+		 * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
+		 *    can be useful to retrieve the `TR` element if you need DOM interaction.
+		 *
+		 * And the following return is expected:
+		 *
+		 * * {boolean} Include the row in the searched result set (true) or not
+		 *   (false)
+		 *
+		 * Note that as with the main search ability in DataTables, technically this
+		 * is "filtering", since it is subtractive. However, for consistency in
+		 * naming we call it searching here.
+		 *
+		 *  @type array
+		 *  @default []
+		 *
+		 *  @example
+		 *    // The following example shows custom search being applied to the
+		 *    // fourth column (i.e. the data[3] index) based on two input values
+		 *    // from the end-user, matching the data in a certain range.
+		 *    $.fn.dataTable.ext.search.push(
+		 *      function( settings, data, dataIndex ) {
+		 *        var min = document.getElementById('min').value * 1;
+		 *        var max = document.getElementById('max').value * 1;
+		 *        var version = data[3] == "-" ? 0 : data[3]*1;
+		 *
+		 *        if ( min == "" && max == "" ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min == "" && version < max ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min < version && "" == max ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min < version && version < max ) {
+		 *          return true;
+		 *        }
+		 *        return false;
+		 *      }
+		 *    );
+		 */
+		search: [],
+	
+	
+		/**
+		 * Selector extensions
+		 *
+		 * The `selector` option can be used to extend the options available for the
+		 * selector modifier options (`selector-modifier` object data type) that
+		 * each of the three built in selector types offer (row, column and cell +
+		 * their plural counterparts). For example the Select extension uses this
+		 * mechanism to provide an option to select only rows, columns and cells
+		 * that have been marked as selected by the end user (`{selected: true}`),
+		 * which can be used in conjunction with the existing built in selector
+		 * options.
+		 *
+		 * Each property is an array to which functions can be pushed. The functions
+		 * take three attributes:
+		 *
+		 * * Settings object for the host table
+		 * * Options object (`selector-modifier` object type)
+		 * * Array of selected item indexes
+		 *
+		 * The return is an array of the resulting item indexes after the custom
+		 * selector has been applied.
+		 *
+		 *  @type object
+		 */
+		selector: {
+			cell: [],
+			column: [],
+			row: []
+		},
+	
+	
+		/**
+		 * Internal functions, exposed for used in plug-ins.
+		 * 
+		 * Please note that you should not need to use the internal methods for
+		 * anything other than a plug-in (and even then, try to avoid if possible).
+		 * The internal function may change between releases.
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		internal: {},
+	
+	
+		/**
+		 * Legacy configuration options. Enable and disable legacy options that
+		 * are available in DataTables.
+		 *
+		 *  @type object
+		 */
+		legacy: {
+			/**
+			 * Enable / disable DataTables 1.9 compatible server-side processing
+			 * requests
+			 *
+			 *  @type boolean
+			 *  @default null
+			 */
+			ajax: null
+		},
+	
+	
+		/**
+		 * Pagination plug-in methods.
+		 * 
+		 * Each entry in this object is a function and defines which buttons should
+		 * be shown by the pagination rendering method that is used for the table:
+		 * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
+		 * buttons are displayed in the document, while the functions here tell it
+		 * what buttons to display. This is done by returning an array of button
+		 * descriptions (what each button will do).
+		 *
+		 * Pagination types (the four built in options and any additional plug-in
+		 * options defined here) can be used through the `paginationType`
+		 * initialisation parameter.
+		 *
+		 * The functions defined take two parameters:
+		 *
+		 * 1. `{int} page` The current page index
+		 * 2. `{int} pages` The number of pages in the table
+		 *
+		 * Each function is expected to return an array where each element of the
+		 * array can be one of:
+		 *
+		 * * `first` - Jump to first page when activated
+		 * * `last` - Jump to last page when activated
+		 * * `previous` - Show previous page when activated
+		 * * `next` - Show next page when activated
+		 * * `{int}` - Show page of the index given
+		 * * `{array}` - A nested array containing the above elements to add a
+		 *   containing 'DIV' element (might be useful for styling).
+		 *
+		 * Note that DataTables v1.9- used this object slightly differently whereby
+		 * an object with two functions would be defined for each plug-in. That
+		 * ability is still supported by DataTables 1.10+ to provide backwards
+		 * compatibility, but this option of use is now decremented and no longer
+		 * documented in DataTables 1.10+.
+		 *
+		 *  @type object
+		 *  @default {}
+		 *
+		 *  @example
+		 *    // Show previous, next and current page buttons only
+		 *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
+		 *      return [ 'previous', page, 'next' ];
+		 *    };
+		 */
+		pager: {},
+	
+	
+		renderer: {
+			pageButton: {},
+			header: {}
+		},
+	
+	
+		/**
+		 * Ordering plug-ins - custom data source
+		 * 
+		 * The extension options for ordering of data available here is complimentary
+		 * to the default type based ordering that DataTables typically uses. It
+		 * allows much greater control over the the data that is being used to
+		 * order a column, but is necessarily therefore more complex.
+		 * 
+		 * This type of ordering is useful if you want to do ordering based on data
+		 * live from the DOM (for example the contents of an 'input' element) rather
+		 * than just the static string that DataTables knows of.
+		 * 
+		 * The way these plug-ins work is that you create an array of the values you
+		 * wish to be ordering for the column in question and then return that
+		 * array. The data in the array much be in the index order of the rows in
+		 * the table (not the currently ordering order!). Which order data gathering
+		 * function is run here depends on the `dt-init columns.orderDataType`
+		 * parameter that is used for the column (if any).
+		 *
+		 * The functions defined take two parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 * 2. `{int}` Target column index
+		 *
+		 * Each function is expected to return an array:
+		 *
+		 * * `{array}` Data for the column to be ordering upon
+		 *
+		 *  @type array
+		 *
+		 *  @example
+		 *    // Ordering using `input` node values
+		 *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )
+		 *    {
+		 *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
+		 *        return $('input', td).val();
+		 *      } );
+		 *    }
+		 */
+		order: {},
+	
+	
+		/**
+		 * Type based plug-ins.
+		 *
+		 * Each column in DataTables has a type assigned to it, either by automatic
+		 * detection or by direct assignment using the `type` option for the column.
+		 * The type of a column will effect how it is ordering and search (plug-ins
+		 * can also make use of the column type if required).
+		 *
+		 * @namespace
+		 */
+		type: {
+			/**
+			 * Type detection functions.
+			 *
+			 * The functions defined in this object are used to automatically detect
+			 * a column's type, making initialisation of DataTables super easy, even
+			 * when complex data is in the table.
+			 *
+			 * The functions defined take two parameters:
+			 *
+		     *  1. `{*}` Data from the column cell to be analysed
+		     *  2. `{settings}` DataTables settings object. This can be used to
+		     *     perform context specific type detection - for example detection
+		     *     based on language settings such as using a comma for a decimal
+		     *     place. Generally speaking the options from the settings will not
+		     *     be required
+			 *
+			 * Each function is expected to return:
+			 *
+			 * * `{string|null}` Data type detected, or null if unknown (and thus
+			 *   pass it on to the other type detection functions.
+			 *
+			 *  @type array
+			 *
+			 *  @example
+			 *    // Currency type detection plug-in:
+			 *    $.fn.dataTable.ext.type.detect.push(
+			 *      function ( data, settings ) {
+			 *        // Check the numeric part
+			 *        if ( ! $.isNumeric( data.substring(1) ) ) {
+			 *          return null;
+			 *        }
+			 *
+			 *        // Check prefixed by currency
+			 *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
+			 *          return 'currency';
+			 *        }
+			 *        return null;
+			 *      }
+			 *    );
+			 */
+			detect: [],
+	
+	
+			/**
+			 * Type based search formatting.
+			 *
+			 * The type based searching functions can be used to pre-format the
+			 * data to be search on. For example, it can be used to strip HTML
+			 * tags or to de-format telephone numbers for numeric only searching.
+			 *
+			 * Note that is a search is not defined for a column of a given type,
+			 * no search formatting will be performed.
+			 * 
+			 * Pre-processing of searching data plug-ins - When you assign the sType
+			 * for a column (or have it automatically detected for you by DataTables
+			 * or a type detection plug-in), you will typically be using this for
+			 * custom sorting, but it can also be used to provide custom searching
+			 * by allowing you to pre-processing the data and returning the data in
+			 * the format that should be searched upon. This is done by adding
+			 * functions this object with a parameter name which matches the sType
+			 * for that target column. This is the corollary of <i>afnSortData</i>
+			 * for searching data.
+			 *
+			 * The functions defined take a single parameter:
+			 *
+		     *  1. `{*}` Data from the column cell to be prepared for searching
+			 *
+			 * Each function is expected to return:
+			 *
+			 * * `{string|null}` Formatted string that will be used for the searching.
+			 *
+			 *  @type object
+			 *  @default {}
+			 *
+			 *  @example
+			 *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
+			 *      return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
+			 *    }
+			 */
+			search: {},
+	
+	
+			/**
+			 * Type based ordering.
+			 *
+			 * The column type tells DataTables what ordering to apply to the table
+			 * when a column is sorted upon. The order for each type that is defined,
+			 * is defined by the functions available in this object.
+			 *
+			 * Each ordering option can be described by three properties added to
+			 * this object:
+			 *
+			 * * `{type}-pre` - Pre-formatting function
+			 * * `{type}-asc` - Ascending order function
+			 * * `{type}-desc` - Descending order function
+			 *
+			 * All three can be used together, only `{type}-pre` or only
+			 * `{type}-asc` and `{type}-desc` together. It is generally recommended
+			 * that only `{type}-pre` is used, as this provides the optimal
+			 * implementation in terms of speed, although the others are provided
+			 * for compatibility with existing Javascript sort functions.
+			 *
+			 * `{type}-pre`: Functions defined take a single parameter:
+			 *
+		     *  1. `{*}` Data from the column cell to be prepared for ordering
+			 *
+			 * And return:
+			 *
+			 * * `{*}` Data to be sorted upon
+			 *
+			 * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
+			 * functions, taking two parameters:
+			 *
+		     *  1. `{*}` Data to compare to the second parameter
+		     *  2. `{*}` Data to compare to the first parameter
+			 *
+			 * And returning:
+			 *
+			 * * `{*}` Ordering match: <0 if first parameter should be sorted lower
+			 *   than the second parameter, ===0 if the two parameters are equal and
+			 *   >0 if the first parameter should be sorted height than the second
+			 *   parameter.
+			 * 
+			 *  @type object
+			 *  @default {}
+			 *
+			 *  @example
+			 *    // Numeric ordering of formatted numbers with a pre-formatter
+			 *    $.extend( $.fn.dataTable.ext.type.order, {
+			 *      "string-pre": function(x) {
+			 *        a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
+			 *        return parseFloat( a );
+			 *      }
+			 *    } );
+			 *
+			 *  @example
+			 *    // Case-sensitive string ordering, with no pre-formatting method
+			 *    $.extend( $.fn.dataTable.ext.order, {
+			 *      "string-case-asc": function(x,y) {
+			 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+			 *      },
+			 *      "string-case-desc": function(x,y) {
+			 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+			 *      }
+			 *    } );
+			 */
+			order: {}
+		},
+	
+		/**
+		 * Unique DataTables instance counter
+		 *
+		 * @type int
+		 * @private
+		 */
+		_unique: 0,
+	
+	
+		//
+		// Depreciated
+		// The following properties are retained for backwards compatiblity only.
+		// The should not be used in new projects and will be removed in a future
+		// version
+		//
+	
+		/**
+		 * Version check function.
+		 *  @type function
+		 *  @depreciated Since 1.10
+		 */
+		fnVersionCheck: DataTable.fnVersionCheck,
+	
+	
+		/**
+		 * Index for what 'this' index API functions should use
+		 *  @type int
+		 *  @deprecated Since v1.10
+		 */
+		iApiIndex: 0,
+	
+	
+		/**
+		 * jQuery UI class container
+		 *  @type object
+		 *  @deprecated Since v1.10
+		 */
+		oJUIClasses: {},
+	
+	
+		/**
+		 * Software version
+		 *  @type string
+		 *  @deprecated Since v1.10
+		 */
+		sVersion: DataTable.version
+	};
+	
+	
+	//
+	// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
+	//
+	$.extend( _ext, {
+		afnFiltering: _ext.search,
+		aTypes:       _ext.type.detect,
+		ofnSearch:    _ext.type.search,
+		oSort:        _ext.type.order,
+		afnSortData:  _ext.order,
+		aoFeatures:   _ext.feature,
+		oApi:         _ext.internal,
+		oStdClasses:  _ext.classes,
+		oPagination:  _ext.pager
+	} );
+	
+	
+	$.extend( DataTable.ext.classes, {
+		"sTable": "dataTable",
+		"sNoFooter": "no-footer",
+	
+		/* Paging buttons */
+		"sPageButton": "paginate_button",
+		"sPageButtonActive": "current",
+		"sPageButtonDisabled": "disabled",
+	
+		/* Striping classes */
+		"sStripeOdd": "odd",
+		"sStripeEven": "even",
+	
+		/* Empty row */
+		"sRowEmpty": "dataTables_empty",
+	
+		/* Features */
+		"sWrapper": "dataTables_wrapper",
+		"sFilter": "dataTables_filter",
+		"sInfo": "dataTables_info",
+		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+		"sLength": "dataTables_length",
+		"sProcessing": "dataTables_processing",
+	
+		/* Sorting */
+		"sSortAsc": "sorting_asc",
+		"sSortDesc": "sorting_desc",
+		"sSortable": "sorting", /* Sortable in both directions */
+		"sSortableAsc": "sorting_asc_disabled",
+		"sSortableDesc": "sorting_desc_disabled",
+		"sSortableNone": "sorting_disabled",
+		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+	
+		/* Filtering */
+		"sFilterInput": "",
+	
+		/* Page length */
+		"sLengthSelect": "",
+	
+		/* Scrolling */
+		"sScrollWrapper": "dataTables_scroll",
+		"sScrollHead": "dataTables_scrollHead",
+		"sScrollHeadInner": "dataTables_scrollHeadInner",
+		"sScrollBody": "dataTables_scrollBody",
+		"sScrollFoot": "dataTables_scrollFoot",
+		"sScrollFootInner": "dataTables_scrollFootInner",
+	
+		/* Misc */
+		"sHeaderTH": "",
+		"sFooterTH": "",
+	
+		// Deprecated
+		"sSortJUIAsc": "",
+		"sSortJUIDesc": "",
+		"sSortJUI": "",
+		"sSortJUIAscAllowed": "",
+		"sSortJUIDescAllowed": "",
+		"sSortJUIWrapper": "",
+		"sSortIcon": "",
+		"sJUIHeader": "",
+		"sJUIFooter": ""
+	} );
+	
+	
+	(function() {
+	
+	// Reused strings for better compression. Closure compiler appears to have a
+	// weird edge case where it is trying to expand strings rather than use the
+	// variable version. This results in about 200 bytes being added, for very
+	// little preference benefit since it this run on script load only.
+	var _empty = '';
+	_empty = '';
+	
+	var _stateDefault = _empty + 'ui-state-default';
+	var _sortIcon     = _empty + 'css_right ui-icon ui-icon-';
+	var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';
+	
+	$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {
+		/* Full numbers paging buttons */
+		"sPageButton":         "fg-button ui-button "+_stateDefault,
+		"sPageButtonActive":   "ui-state-disabled",
+		"sPageButtonDisabled": "ui-state-disabled",
+	
+		/* Features */
+		"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+			"ui-buttonset-multi paging_", /* Note that the type is postfixed */
+	
+		/* Sorting */
+		"sSortAsc":            _stateDefault+" sorting_asc",
+		"sSortDesc":           _stateDefault+" sorting_desc",
+		"sSortable":           _stateDefault+" sorting",
+		"sSortableAsc":        _stateDefault+" sorting_asc_disabled",
+		"sSortableDesc":       _stateDefault+" sorting_desc_disabled",
+		"sSortableNone":       _stateDefault+" sorting_disabled",
+		"sSortJUIAsc":         _sortIcon+"triangle-1-n",
+		"sSortJUIDesc":        _sortIcon+"triangle-1-s",
+		"sSortJUI":            _sortIcon+"carat-2-n-s",
+		"sSortJUIAscAllowed":  _sortIcon+"carat-1-n",
+		"sSortJUIDescAllowed": _sortIcon+"carat-1-s",
+		"sSortJUIWrapper":     "DataTables_sort_wrapper",
+		"sSortIcon":           "DataTables_sort_icon",
+	
+		/* Scrolling */
+		"sScrollHead": "dataTables_scrollHead "+_stateDefault,
+		"sScrollFoot": "dataTables_scrollFoot "+_stateDefault,
+	
+		/* Misc */
+		"sHeaderTH":  _stateDefault,
+		"sFooterTH":  _stateDefault,
+		"sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr",
+		"sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br"
+	} );
+	
+	}());
+	
+	
+	
+	var extPagination = DataTable.ext.pager;
+	
+	function _numbers ( page, pages ) {
+		var
+			numbers = [],
+			buttons = extPagination.numbers_length,
+			half = Math.floor( buttons / 2 ),
+			i = 1;
+	
+		if ( pages <= buttons ) {
+			numbers = _range( 0, pages );
+		}
+		else if ( page <= half ) {
+			numbers = _range( 0, buttons-2 );
+			numbers.push( 'ellipsis' );
+			numbers.push( pages-1 );
+		}
+		else if ( page >= pages - 1 - half ) {
+			numbers = _range( pages-(buttons-2), pages );
+			numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
+			numbers.splice( 0, 0, 0 );
+		}
+		else {
+			numbers = _range( page-half+2, page+half-1 );
+			numbers.push( 'ellipsis' );
+			numbers.push( pages-1 );
+			numbers.splice( 0, 0, 'ellipsis' );
+			numbers.splice( 0, 0, 0 );
+		}
+	
+		numbers.DT_el = 'span';
+		return numbers;
+	}
+	
+	
+	$.extend( extPagination, {
+		simple: function ( page, pages ) {
+			return [ 'previous', 'next' ];
+		},
+	
+		full: function ( page, pages ) {
+			return [  'first', 'previous', 'next', 'last' ];
+		},
+	
+		numbers: function ( page, pages ) {
+			return [ _numbers(page, pages) ];
+		},
+	
+		simple_numbers: function ( page, pages ) {
+			return [ 'previous', _numbers(page, pages), 'next' ];
+		},
+	
+		full_numbers: function ( page, pages ) {
+			return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
+		},
+		
+		first_last_numbers: function (page, pages) {
+	 		return ['first', _numbers(page, pages), 'last'];
+	 	},
+	
+		// For testing and plug-ins to use
+		_numbers: _numbers,
+	
+		// Number of number buttons (including ellipsis) to show. _Must be odd!_
+		numbers_length: 7
+	} );
+	
+	
+	$.extend( true, DataTable.ext.renderer, {
+		pageButton: {
+			_: function ( settings, host, idx, buttons, page, pages ) {
+				var classes = settings.oClasses;
+				var lang = settings.oLanguage.oPaginate;
+				var aria = settings.oLanguage.oAria.paginate || {};
+				var btnDisplay, btnClass, counter=0;
+	
+				var attach = function( container, buttons ) {
+					var i, ien, node, button;
+					var clickHandler = function ( e ) {
+						_fnPageChange( settings, e.data.action, true );
+					};
+	
+					for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+						button = buttons[i];
+	
+						if ( $.isArray( button ) ) {
+							var inner = $( '<'+(button.DT_el || 'div')+'/>' )
+								.appendTo( container );
+							attach( inner, button );
+						}
+						else {
+							btnDisplay = null;
+							btnClass = '';
+	
+							switch ( button ) {
+								case 'ellipsis':
+									container.append('<span class="ellipsis">&#x2026;</span>');
+									break;
+	
+								case 'first':
+									btnDisplay = lang.sFirst;
+									btnClass = button + (page > 0 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'previous':
+									btnDisplay = lang.sPrevious;
+									btnClass = button + (page > 0 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'next':
+									btnDisplay = lang.sNext;
+									btnClass = button + (page < pages-1 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'last':
+									btnDisplay = lang.sLast;
+									btnClass = button + (page < pages-1 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								default:
+									btnDisplay = button + 1;
+									btnClass = page === button ?
+										classes.sPageButtonActive : '';
+									break;
+							}
+	
+							if ( btnDisplay !== null ) {
+								node = $('<a>', {
+										'class': classes.sPageButton+' '+btnClass,
+										'aria-controls': settings.sTableId,
+										'aria-label': aria[ button ],
+										'data-dt-idx': counter,
+										'tabindex': settings.iTabIndex,
+										'id': idx === 0 && typeof button === 'string' ?
+											settings.sTableId +'_'+ button :
+											null
+									} )
+									.html( btnDisplay )
+									.appendTo( container );
+	
+								_fnBindAction(
+									node, {action: button}, clickHandler
+								);
+	
+								counter++;
+							}
+						}
+					}
+				};
+	
+				// IE9 throws an 'unknown error' if document.activeElement is used
+				// inside an iframe or frame. Try / catch the error. Not good for
+				// accessibility, but neither are frames.
+				var activeEl;
+	
+				try {
+					// Because this approach is destroying and recreating the paging
+					// elements, focus is lost on the select button which is bad for
+					// accessibility. So we want to restore focus once the draw has
+					// completed
+					activeEl = $(host).find(document.activeElement).data('dt-idx');
+				}
+				catch (e) {}
+	
+				attach( $(host).empty(), buttons );
+	
+				if ( activeEl !== undefined ) {
+					$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+				}
+			}
+		}
+	} );
+	
+	
+	
+	// Built in type detection. See model.ext.aTypes for information about
+	// what is required from this methods.
+	$.extend( DataTable.ext.type.detect, [
+		// Plain numbers - first since V8 detects some plain numbers as dates
+		// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _isNumber( d, decimal ) ? 'num'+decimal : null;
+		},
+	
+		// Dates (only those recognised by the browser's Date.parse)
+		function ( d, settings )
+		{
+			// V8 tries _very_ hard to make a string passed into `Date.parse()`
+			// valid, so we need to use a regex to restrict date formats. Use a
+			// plug-in for anything other than ISO8601 style strings
+			if ( d && !(d instanceof Date) && ! _re_date.test(d) ) {
+				return null;
+			}
+			var parsed = Date.parse(d);
+			return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
+		},
+	
+		// Formatted numbers
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
+		},
+	
+		// HTML numeric
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
+		},
+	
+		// HTML numeric, formatted
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
+		},
+	
+		// HTML (this is strict checking - there must be html)
+		function ( d, settings )
+		{
+			return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
+				'html' : null;
+		}
+	] );
+	
+	
+	
+	// Filter formatting functions. See model.ext.ofnSearch for information about
+	// what is required from these methods.
+	// 
+	// Note that additional search methods are added for the html numbers and
+	// html formatted numbers by `_addNumericSort()` when we know what the decimal
+	// place is
+	
+	
+	$.extend( DataTable.ext.type.search, {
+		html: function ( data ) {
+			return _empty(data) ?
+				data :
+				typeof data === 'string' ?
+					data
+						.replace( _re_new_lines, " " )
+						.replace( _re_html, "" ) :
+					'';
+		},
+	
+		string: function ( data ) {
+			return _empty(data) ?
+				data :
+				typeof data === 'string' ?
+					data.replace( _re_new_lines, " " ) :
+					data;
+		}
+	} );
+	
+	
+	
+	var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
+		if ( d !== 0 && (!d || d === '-') ) {
+			return -Infinity;
+		}
+	
+		// If a decimal place other than `.` is used, it needs to be given to the
+		// function so we can detect it and replace with a `.` which is the only
+		// decimal place Javascript recognises - it is not locale aware.
+		if ( decimalPlace ) {
+			d = _numToDecimal( d, decimalPlace );
+		}
+	
+		if ( d.replace ) {
+			if ( re1 ) {
+				d = d.replace( re1, '' );
+			}
+	
+			if ( re2 ) {
+				d = d.replace( re2, '' );
+			}
+		}
+	
+		return d * 1;
+	};
+	
+	
+	// Add the numeric 'deformatting' functions for sorting and search. This is done
+	// in a function to provide an easy ability for the language options to add
+	// additional methods if a non-period decimal place is used.
+	function _addNumericSort ( decimalPlace ) {
+		$.each(
+			{
+				// Plain numbers
+				"num": function ( d ) {
+					return __numericReplace( d, decimalPlace );
+				},
+	
+				// Formatted numbers
+				"num-fmt": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_formatted_numeric );
+				},
+	
+				// HTML numeric
+				"html-num": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_html );
+				},
+	
+				// HTML numeric, formatted
+				"html-num-fmt": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
+				}
+			},
+			function ( key, fn ) {
+				// Add the ordering method
+				_ext.type.order[ key+decimalPlace+'-pre' ] = fn;
+	
+				// For HTML types add a search formatter that will strip the HTML
+				if ( key.match(/^html\-/) ) {
+					_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
+				}
+			}
+		);
+	}
+	
+	
+	// Default sort methods
+	$.extend( _ext.type.order, {
+		// Dates
+		"date-pre": function ( d ) {
+			return Date.parse( d ) || -Infinity;
+		},
+	
+		// html
+		"html-pre": function ( a ) {
+			return _empty(a) ?
+				'' :
+				a.replace ?
+					a.replace( /<.*?>/g, "" ).toLowerCase() :
+					a+'';
+		},
+	
+		// string
+		"string-pre": function ( a ) {
+			// This is a little complex, but faster than always calling toString,
+			// http://jsperf.com/tostring-v-check
+			return _empty(a) ?
+				'' :
+				typeof a === 'string' ?
+					a.toLowerCase() :
+					! a.toString ?
+						'' :
+						a.toString();
+		},
+	
+		// string-asc and -desc are retained only for compatibility with the old
+		// sort methods
+		"string-asc": function ( x, y ) {
+			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+		},
+	
+		"string-desc": function ( x, y ) {
+			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+		}
+	} );
+	
+	
+	// Numeric sorting types - order doesn't matter here
+	_addNumericSort( '' );
+	
+	
+	$.extend( true, DataTable.ext.renderer, {
+		header: {
+			_: function ( settings, cell, column, classes ) {
+				// No additional mark-up required
+				// Attach a sort listener to update on sort - note that using the
+				// `DT` namespace will allow the event to be removed automatically
+				// on destroy, while the `dt` namespaced event is the one we are
+				// listening for
+				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+					if ( settings !== ctx ) { // need to check this this is the host
+						return;               // table, not a nested one
+					}
+	
+					var colIdx = column.idx;
+	
+					cell
+						.removeClass(
+							column.sSortingClass +' '+
+							classes.sSortAsc +' '+
+							classes.sSortDesc
+						)
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortDesc :
+								column.sSortingClass
+						);
+				} );
+			},
+	
+			jqueryui: function ( settings, cell, column, classes ) {
+				$('<div/>')
+					.addClass( classes.sSortJUIWrapper )
+					.append( cell.contents() )
+					.append( $('<span/>')
+						.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
+					)
+					.appendTo( cell );
+	
+				// Attach a sort listener to update on sort
+				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+					if ( settings !== ctx ) {
+						return;
+					}
+	
+					var colIdx = column.idx;
+	
+					cell
+						.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortDesc :
+								column.sSortingClass
+						);
+	
+					cell
+						.find( 'span.'+classes.sSortIcon )
+						.removeClass(
+							classes.sSortJUIAsc +" "+
+							classes.sSortJUIDesc +" "+
+							classes.sSortJUI +" "+
+							classes.sSortJUIAscAllowed +" "+
+							classes.sSortJUIDescAllowed
+						)
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortJUIDesc :
+								column.sSortingClassJUI
+						);
+				} );
+			}
+		}
+	} );
+	
+	/*
+	 * Public helper functions. These aren't used internally by DataTables, or
+	 * called by any of the options passed into DataTables, but they can be used
+	 * externally by developers working with DataTables. They are helper functions
+	 * to make working with DataTables a little bit easier.
+	 */
+	
+	var __htmlEscapeEntities = function ( d ) {
+		return typeof d === 'string' ?
+			d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
+			d;
+	};
+	
+	/**
+	 * Helpers for `columns.render`.
+	 *
+	 * The options defined here can be used with the `columns.render` initialisation
+	 * option to provide a display renderer. The following functions are defined:
+	 *
+	 * * `number` - Will format numeric data (defined by `columns.data`) for
+	 *   display, retaining the original unformatted data for sorting and filtering.
+	 *   It takes 5 parameters:
+	 *   * `string` - Thousands grouping separator
+	 *   * `string` - Decimal point indicator
+	 *   * `integer` - Number of decimal points to show
+	 *   * `string` (optional) - Prefix.
+	 *   * `string` (optional) - Postfix (/suffix).
+	 * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
+	 *   parameters.
+	 *
+	 * @example
+	 *   // Column definition using the number renderer
+	 *   {
+	 *     data: "salary",
+	 *     render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
+	 *   }
+	 *
+	 * @namespace
+	 */
+	DataTable.render = {
+		number: function ( thousands, decimal, precision, prefix, postfix ) {
+			return {
+				display: function ( d ) {
+					if ( typeof d !== 'number' && typeof d !== 'string' ) {
+						return d;
+					}
+	
+					var negative = d < 0 ? '-' : '';
+					var flo = parseFloat( d );
+	
+					// If NaN then there isn't much formatting that we can do - just
+					// return immediately, escaping any HTML (this was supposed to
+					// be a number after all)
+					if ( isNaN( flo ) ) {
+						return __htmlEscapeEntities( d );
+					}
+	
+					flo = flo.toFixed( precision );
+					d = Math.abs( flo );
+	
+					var intPart = parseInt( d, 10 );
+					var floatPart = precision ?
+						decimal+(d - intPart).toFixed( precision ).substring( 2 ):
+						'';
+	
+					return negative + (prefix||'') +
+						intPart.toString().replace(
+							/\B(?=(\d{3})+(?!\d))/g, thousands
+						) +
+						floatPart +
+						(postfix||'');
+				}
+			};
+		},
+	
+		text: function () {
+			return {
+				display: __htmlEscapeEntities
+			};
+		}
+	};
+	
+	
+	/*
+	 * This is really a good bit rubbish this method of exposing the internal methods
+	 * publicly... - To be fixed in 2.0 using methods on the prototype
+	 */
+	
+	
+	/**
+	 * Create a wrapper function for exporting an internal functions to an external API.
+	 *  @param {string} fn API function name
+	 *  @returns {function} wrapped function
+	 *  @memberof DataTable#internal
+	 */
+	function _fnExternApiFunc (fn)
+	{
+		return function() {
+			var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
+				Array.prototype.slice.call(arguments)
+			);
+			return DataTable.ext.internal[fn].apply( this, args );
+		};
+	}
+	
+	
+	/**
+	 * Reference to internal functions for use by plug-in developers. Note that
+	 * these methods are references to internal functions and are considered to be
+	 * private. If you use these methods, be aware that they are liable to change
+	 * between versions.
+	 *  @namespace
+	 */
+	$.extend( DataTable.ext.internal, {
+		_fnExternApiFunc: _fnExternApiFunc,
+		_fnBuildAjax: _fnBuildAjax,
+		_fnAjaxUpdate: _fnAjaxUpdate,
+		_fnAjaxParameters: _fnAjaxParameters,
+		_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
+		_fnAjaxDataSrc: _fnAjaxDataSrc,
+		_fnAddColumn: _fnAddColumn,
+		_fnColumnOptions: _fnColumnOptions,
+		_fnAdjustColumnSizing: _fnAdjustColumnSizing,
+		_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
+		_fnColumnIndexToVisible: _fnColumnIndexToVisible,
+		_fnVisbleColumns: _fnVisbleColumns,
+		_fnGetColumns: _fnGetColumns,
+		_fnColumnTypes: _fnColumnTypes,
+		_fnApplyColumnDefs: _fnApplyColumnDefs,
+		_fnHungarianMap: _fnHungarianMap,
+		_fnCamelToHungarian: _fnCamelToHungarian,
+		_fnLanguageCompat: _fnLanguageCompat,
+		_fnBrowserDetect: _fnBrowserDetect,
+		_fnAddData: _fnAddData,
+		_fnAddTr: _fnAddTr,
+		_fnNodeToDataIndex: _fnNodeToDataIndex,
+		_fnNodeToColumnIndex: _fnNodeToColumnIndex,
+		_fnGetCellData: _fnGetCellData,
+		_fnSetCellData: _fnSetCellData,
+		_fnSplitObjNotation: _fnSplitObjNotation,
+		_fnGetObjectDataFn: _fnGetObjectDataFn,
+		_fnSetObjectDataFn: _fnSetObjectDataFn,
+		_fnGetDataMaster: _fnGetDataMaster,
+		_fnClearTable: _fnClearTable,
+		_fnDeleteIndex: _fnDeleteIndex,
+		_fnInvalidate: _fnInvalidate,
+		_fnGetRowElements: _fnGetRowElements,
+		_fnCreateTr: _fnCreateTr,
+		_fnBuildHead: _fnBuildHead,
+		_fnDrawHead: _fnDrawHead,
+		_fnDraw: _fnDraw,
+		_fnReDraw: _fnReDraw,
+		_fnAddOptionsHtml: _fnAddOptionsHtml,
+		_fnDetectHeader: _fnDetectHeader,
+		_fnGetUniqueThs: _fnGetUniqueThs,
+		_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
+		_fnFilterComplete: _fnFilterComplete,
+		_fnFilterCustom: _fnFilterCustom,
+		_fnFilterColumn: _fnFilterColumn,
+		_fnFilter: _fnFilter,
+		_fnFilterCreateSearch: _fnFilterCreateSearch,
+		_fnEscapeRegex: _fnEscapeRegex,
+		_fnFilterData: _fnFilterData,
+		_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
+		_fnUpdateInfo: _fnUpdateInfo,
+		_fnInfoMacros: _fnInfoMacros,
+		_fnInitialise: _fnInitialise,
+		_fnInitComplete: _fnInitComplete,
+		_fnLengthChange: _fnLengthChange,
+		_fnFeatureHtmlLength: _fnFeatureHtmlLength,
+		_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
+		_fnPageChange: _fnPageChange,
+		_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
+		_fnProcessingDisplay: _fnProcessingDisplay,
+		_fnFeatureHtmlTable: _fnFeatureHtmlTable,
+		_fnScrollDraw: _fnScrollDraw,
+		_fnApplyToChildren: _fnApplyToChildren,
+		_fnCalculateColumnWidths: _fnCalculateColumnWidths,
+		_fnThrottle: _fnThrottle,
+		_fnConvertToWidth: _fnConvertToWidth,
+		_fnGetWidestNode: _fnGetWidestNode,
+		_fnGetMaxLenString: _fnGetMaxLenString,
+		_fnStringToCss: _fnStringToCss,
+		_fnSortFlatten: _fnSortFlatten,
+		_fnSort: _fnSort,
+		_fnSortAria: _fnSortAria,
+		_fnSortListener: _fnSortListener,
+		_fnSortAttachListener: _fnSortAttachListener,
+		_fnSortingClasses: _fnSortingClasses,
+		_fnSortData: _fnSortData,
+		_fnSaveState: _fnSaveState,
+		_fnLoadState: _fnLoadState,
+		_fnSettingsFromNode: _fnSettingsFromNode,
+		_fnLog: _fnLog,
+		_fnMap: _fnMap,
+		_fnBindAction: _fnBindAction,
+		_fnCallbackReg: _fnCallbackReg,
+		_fnCallbackFire: _fnCallbackFire,
+		_fnLengthOverflow: _fnLengthOverflow,
+		_fnRenderer: _fnRenderer,
+		_fnDataSource: _fnDataSource,
+		_fnRowAttributes: _fnRowAttributes,
+		_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
+		                                // in 1.10, so this dead-end function is
+		                                // added to prevent errors
+	} );
+	
+
+	// jQuery access
+	$.fn.dataTable = DataTable;
+
+	// Provide access to the host jQuery object (circular reference)
+	DataTable.$ = $;
+
+	// Legacy aliases
+	$.fn.dataTableSettings = DataTable.settings;
+	$.fn.dataTableExt = DataTable.ext;
+
+	// With a capital `D` we return a DataTables API instance rather than a
+	// jQuery object
+	$.fn.DataTable = function ( opts ) {
+		return $(this).dataTable( opts ).api();
+	};
+
+	// All properties that are available to $.fn.dataTable should also be
+	// available on $.fn.DataTable
+	$.each( DataTable, function ( prop, val ) {
+		$.fn.DataTable[ prop ] = val;
+	} );
+
+
+	// Information about events fired by DataTables - for documentation.
+	/**
+	 * Draw event, fired whenever the table is redrawn on the page, at the same
+	 * point as fnDrawCallback. This may be useful for binding events or
+	 * performing calculations when the table is altered at all.
+	 *  @name DataTable#draw.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Search event, fired when the searching applied to the table (using the
+	 * built-in global search, or column filters) is altered.
+	 *  @name DataTable#search.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Page change event, fired when the paging of the table is altered.
+	 *  @name DataTable#page.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Order event, fired when the ordering applied to the table is altered.
+	 *  @name DataTable#order.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * DataTables initialisation complete event, fired when the table is fully
+	 * drawn, including Ajax data loaded, if Ajax data is required.
+	 *  @name DataTable#init.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The JSON object request from the server - only
+	 *    present if client-side Ajax sourced data is used</li></ol>
+	 */
+
+	/**
+	 * State save event, fired when the table has changed state a new state save
+	 * is required. This event allows modification of the state saving object
+	 * prior to actually doing the save, including addition or other state
+	 * properties (for plug-ins) or modification of a DataTables core property.
+	 *  @name DataTable#stateSaveParams.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The state information to be saved
+	 */
+
+	/**
+	 * State load event, fired when the table is loading state from the stored
+	 * data, but prior to the settings object being modified by the saved state
+	 * - allowing modification of the saved state is required or loading of
+	 * state for a plug-in.
+	 *  @name DataTable#stateLoadParams.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The saved state information
+	 */
+
+	/**
+	 * State loaded event, fired when state has been loaded from stored data and
+	 * the settings object has been modified by the loaded data.
+	 *  @name DataTable#stateLoaded.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The saved state information
+	 */
+
+	/**
+	 * Processing event, fired when DataTables is doing some kind of processing
+	 * (be it, order, searcg or anything else). It can be used to indicate to
+	 * the end user that there is something happening, or that something has
+	 * finished.
+	 *  @name DataTable#processing.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {boolean} bShow Flag for if DataTables is doing processing or not
+	 */
+
+	/**
+	 * Ajax (XHR) event, fired whenever an Ajax request is completed from a
+	 * request to made to the server for new data. This event is called before
+	 * DataTables processed the returned data, so it can also be used to pre-
+	 * process the data returned from the server, if needed.
+	 *
+	 * Note that this trigger is called in `fnServerData`, if you override
+	 * `fnServerData` and which to use this event, you need to trigger it in you
+	 * success function.
+	 *  @name DataTable#xhr.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {object} json JSON returned from the server
+	 *
+	 *  @example
+	 *     // Use a custom property returned from the server in another DOM element
+	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+	 *       $('#status').html( json.status );
+	 *     } );
+	 *
+	 *  @example
+	 *     // Pre-process the data returned from the server
+	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+	 *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
+	 *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
+	 *       }
+	 *       // Note no return - manipulate the data directly in the JSON object.
+	 *     } );
+	 */
+
+	/**
+	 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
+	 * or passing the bDestroy:true parameter in the initialisation object. This
+	 * can be used to remove bound events, added DOM nodes, etc.
+	 *  @name DataTable#destroy.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Page length change event, fired when number of records to show on each
+	 * page (the length) is changed.
+	 *  @name DataTable#length.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {integer} len New length
+	 */
+
+	/**
+	 * Column sizing has changed.
+	 *  @name DataTable#column-sizing.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Column visibility has changed.
+	 *  @name DataTable#column-visibility.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {int} column Column index
+	 *  @param {bool} vis `false` if column now hidden, or `true` if visible
+	 */
+
+	return $.fn.dataTable;
+}));
diff --git a/vendor/datatables/1.10.15/js/jquery.dataTables.min.js b/vendor/datatables/1.10.15/js/jquery.dataTables.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc969eefbb0f11750978439689a0d9771064e121
--- /dev/null
+++ b/vendor/datatables/1.10.15/js/jquery.dataTables.min.js
@@ -0,0 +1,167 @@
+/*!
+ DataTables 1.10.15
+ ©2008-2017 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
+d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&fb(a)}function gb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&J(m.models.oSearch,a[b])}function hb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"===typeof b&&!h.isArray(b)&&(a.aDataSort=[b])}function ib(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
+top:1,left:1,width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function jb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==
+e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=
+e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(hb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};
+b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=
+d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Z(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ma(a);s(a,null,"column-sizing",[a])}function $(a,b){var c=na(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function aa(a,b){var c=na(a,"bVisible"),c=h.inArray(b,
+c);return-1!==c?c:null}function ba(a){var b=0;h.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==h(d.nTh).css("display")&&b++});return b}function na(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,r;e=0;for(f=b.length;e<f;e++)if(l=b[e],r=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){r[i]===k&&(r[i]=B(a,i,e,"type"));
+q=d[g](r[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function kb(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&
+d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function oa(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,
+f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(K(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function lb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}
+function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function R(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=R(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);
+for(var i=0,n=j.length;i<n;i++){f=j[i].match(ca);g=j[i].match(V);if(f){j[i]=j[i].replace(ca,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function S(a){if(h.isPlainObject(a))return S(a._);
+if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ca);j=e[i].match(V);if(g){e[i]=e[i].replace(ca,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,
+""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(ca,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return D(a.aoData,"_aData")}function pa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function qa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function da(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
+c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],r=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
+-1!==c&&(c=a.substring(c+1),S(a)(d,b.getAttribute(c)))}},m=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(S(j.mData._)(d,n),r(j.mData.sort,a),r(j.mData.type,a),r(j.mData.filter,a)):q?(j._setter||(j._setter=S(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)m(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)m(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&S(a.rowId)(d,b);return{data:d,cells:e}}
+function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||H.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:H.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
+n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}s(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?sa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function mb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
+h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,n);i&&ea(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
+if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function fa(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
+for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function O(a){var b=s(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
+-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!nb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var r=d[c%e];q._sRowStripe!=r&&(h(l).removeClass(q._sRowStripe).addClass(r),q._sRowStripe=r)}s(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
+f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:ba(a),"class":a.oClasses.sRowEmpty}).html(c))[0];s(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,i]);s(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));s(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;
+c.bSort&&ob(a);d?ga(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function pb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,k=0;k<f.length;k++){g=null;j=f[k];if("<"==j){i=h("<div/>")[0];
+n=f[k+1];if("'"==n||'"'==n){l="";for(q=2;f[k+q]!=n;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=qb(a);else if("f"==j&&d.bFilter)g=rb(a);else if("r"==j&&d.bProcessing)g=sb(a);else if("t"==j)g=tb(a);else if("i"==j&&d.bInfo)g=ub(a);else if("p"==
+j&&d.bPaginate)g=vb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function ea(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,k;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
+q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;k=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:k},a[f+g].nTr=d}e=e.nextSibling}}}function ta(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],ea(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ua(a,b,c){s(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
+e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){s(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&K(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=s(a,null,"xhr",
+[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?K(a,0,"Invalid JSON response",1):4===b.readyState&&K(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;s(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function nb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
+!0),ua(a,wb(a),function(b){xb(a,b)}),!1):!0}function wb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,k=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var r=function(a,b){j.push({name:a,value:b})};r("sEcho",a.iDraw);r("iColumns",c);r("sColumns",D(b,"sName").join(","));r("iDisplayStart",g);r("iDisplayLength",i);var ra={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
+l=f[g],i="function"==typeof n.mData?"function":n.mData,ra.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),r("mDataProp_"+g,i),d.bFilter&&(r("sSearch_"+g,l.sSearch),r("bRegex_"+g,l.bRegex),r("bSearchable_"+g,n.bSearchable)),d.bSort&&r("bSortable_"+g,n.bSortable);d.bFilter&&(r("sSearch",e.sSearch),r("bRegex",e.bRegex));d.bSort&&(h.each(k,function(a,b){ra.order.push({column:b.col,dir:b.dir});r("iSortCol_"+a,b.col);r("sSortDir_"+
+a,b.dir)}),r("iSortingCols",k.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:ra:b?j:ra}function xb(a,b){var c=va(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}pa(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||
+wa(a,b);a.bAjaxDataGet=!0;C(a,!1)}function va(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?R(c)(b):b}function rb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
+"":this.value;b!=e.sSearch&&(ga(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Qa(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});
+return b[0]}function ga(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){yb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)zb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);Ab(a)}else f(b);a.bFiltered=!0;s(a,null,"search",[a])}function Ab(a){for(var b=
+m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function zb(a,b,c,d,e,f){if(""!==b){for(var g=[],j=a.aiDisplay,d=Ra(b,d,e,f),e=0;e<j.length;e++)b=a.aoData[j[e]]._aFilterData[c],d.test(b)&&g.push(j[e]);a.aiDisplay=g}}function yb(a,b,c,d,e,f){var d=Ra(b,d,e,f),f=a.oPreviousSearch.sSearch,g=a.aiDisplayMaster,j,e=[];0!==m.ext.search.length&&(c=!0);j=Bb(a);if(0>=b.length)a.aiDisplay=
+g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)d.test(a.aoData[b[c]]._sFilterRow)&&e.push(b[c]);a.aiDisplay=e}}function Ra(a,b,c,d){a=b?a:Sa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function Bb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;
+d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(xa.innerHTML=i,i=$b?xa.textContent:xa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}function Cb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,
+caseInsensitive:a.bCaseInsensitive}}function Db(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function ub(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Eb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Eb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Fb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Fb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
+f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ha(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){pb(a);mb(a);fa(a,a.aoHeader);fa(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=v(f.sWidth));s(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ua(a,[],function(c){var f=va(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=
+d;T(a);C(a,!1);wa(a,c)},a):(C(a,!1),wa(a))}else setTimeout(function(){ha(a)},200)}function wa(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&Z(a);s(a,null,"plugin-init",[a,b]);s(a,"aoInitComplete","init",[a,b])}function Ta(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Ua(a);s(a,null,"length",[a,c])}function qb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=
+new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Ta(a,h(this).val());O(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function vb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("<div/>").addClass(a.oClasses.sPaging+
+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Va(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&
+(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:K(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(s(a,null,"page",[a]),c&&O(a));return b}function sb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");
+s(a,null,"processing",[a,b])}function tb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",
+{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
+0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],r=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(r.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=r;a.aoDrawCallback.push({fn:ma,sName:"scrolling"});return i[0]}function ma(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
+j=a.nScrollBody,l=h(j),q=j.style,r=h(a.nScrollFoot).children("div"),m=r.children("table"),p=h(a.nTHead),o=h(a.nTable),t=o[0],s=t.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,U=x.bScrollOversize,ac=D(a.aoColumns,"nTh"),P,L,Q,w,Wa=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==L&&a.scrollBarVis!==k)a.scrollBarVis=L,Z(a);else{a.scrollBarVis=L;o.children("thead, tfoot").remove();
+u&&(Q=u.clone().prependTo(o),P=u.find("tr"),Q=Q.find("tr"));w=p.clone().prependTo(o);p=p.find("tr");L=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ta(a,w),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});u&&I(function(a){a.style.width=""},Q);f=o.outerWidth();if(""===c){s.width="100%";if(U&&(o.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(o.outerWidth()-b);f=o.outerWidth()}else""!==d&&(s.width=
+v(d),f=o.outerWidth());I(C,L);I(function(a){z.push(a.innerHTML);Wa.push(v(h(a).css("width")))},L);I(function(a,b){if(h.inArray(a,ac)!==-1)a.style.width=Wa[b]},p);h(L).height(0);u&&(I(C,Q),I(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},Q),I(function(a,b){a.style.width=y[b]},P),h(Q).height(0));I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+z[b]+"</div>";a.style.width=Wa[b]},L);u&&I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
+A[b]+"</div>";a.style.width=y[b]},Q);if(o.outerWidth()<f){P=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(U&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(P-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else P="100%";q.width=v(P);g.width=v(P);u&&(a.nScrollFoot.style.width=v(P));!e&&U&&(q.height=v(t.offsetHeight+b));c=o.outerWidth();n[0].style.width=v(c);i.width=v(c);d=o.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
+(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=v(c),r[0].style.width=v(c),r[0].style[e]=d?b+"px":"0px");o.children("colgroup").insertBefore(o.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function I(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
+e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=na(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,r=!1,m,p,o=a.oBrowser,d=o.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)p=c[i[m]],null!==p.sWidth&&(p.sWidth=Gb(p.sWidthOrig,k),r=!0);if(d||!r&&!f&&!e&&j==ba(a)&&j==n.length)for(m=0;m<j;m++)i=$(a,m),null!==i&&(c[i].sWidth=v(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var t=h("<tr/>").appendTo(j.find("tbody"));
+j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=ta(a,j.find("thead")[0]);for(m=0;m<i.length;m++)p=c[i[m]],n[m].style.width=null!==p.sWidthOrig&&""!==p.sWidthOrig?v(p.sWidthOrig):"",p.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:p.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)r=i[m],p=c[r],h(Hb(a,r)).clone(!1).append(p.sContentPadding).appendTo(t);h("[name]",
+j).removeAttr("name");p=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=o.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=v(k-g);b.style.width=v(e);p.remove()}l&&(b.style.width=
+v(l));if((l||f)&&!a._reszEvt)b=function(){h(E).on("resize.DT-"+a.sInstance,Qa(function(){Z(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function Gb(a,b){if(!a)return 0;var c=h("<div/>").css("width",v(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Hb(a,b){var c=Ib(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Ib(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(bc,
+""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||
+"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function ob(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Jb(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=
+0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Kb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,
+"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Xa(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,
+D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=a.aoColumns[c];Ya(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Xa(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Xa(a,c,b.shiftKey,d))})}
+function ya(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Jb(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,aa(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],
+c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function za(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Cb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Cb(a.aoPreSearchCols[d])}})};s(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
+b)}}function Lb(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=s(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
+k&&h.extend(a.oPreviousSearch,Db(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Db(g.search))}s(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function Aa(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function K(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&s(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Mb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
+h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Ya(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function s(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ua(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ia(a,b){var c=[],c=Nb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,
+c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function fb(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Za)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Za)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Ob(a){return function(){var b=
+[Aa(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(Aa(this[x.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
+function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ma(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};
+this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
+return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Aa(this[x.iApiIndex])};
+this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in m.ext.internal)e&&(this[e]=Ob(e));this.each(function(){var e={},g=1<d?Mb(e,a,!0):
+a,j=0,i,e=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())K(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{gb(l);hb(l.column);J(l,l,!0);J(l.column,l.column,!0);J(l,h.extend(g,q.data()));var r=m.settings,j=0;for(i=r.length;j<i;j++){var p=r[j];if(p.nTable==this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){var t=g.bRetrieve!==k?g.bRetrieve:l.bRetrieve;if(c||t)return p.oInstance;if(g.bDestroy!==k?g.bDestroy:l.bDestroy){p.oInstance.fnDestroy();
+break}else{K(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){r.splice(j,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+m.ext._unique++;var o=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:e,sTableId:e});o.nTable=this;o.oApi=b.internal;o.oInit=g;r.push(o);o.oInstance=1===b.length?b:q.dataTable();gb(g);g.oLanguage&&Fa(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=h.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);
+g=Mb(h.extend(!0,{},l),g);F(o.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(o,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],
+["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);F(o.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(o.oLanguage,g,"fnInfoCallback");z(o,"aoDrawCallback",g.fnDrawCallback,"user");z(o,"aoServerParams",g.fnServerParams,"user");z(o,"aoStateSaveParams",g.fnStateSaveParams,"user");z(o,"aoStateLoadParams",g.fnStateLoadParams,"user");z(o,"aoStateLoaded",g.fnStateLoaded,
+"user");z(o,"aoRowCallback",g.fnRowCallback,"user");z(o,"aoRowCreatedCallback",g.fnCreatedRow,"user");z(o,"aoHeaderCallback",g.fnHeaderCallback,"user");z(o,"aoFooterCallback",g.fnFooterCallback,"user");z(o,"aoInitComplete",g.fnInitComplete,"user");z(o,"aoPreDrawCallback",g.fnPreDrawCallback,"user");o.rowIdFn=R(g.rowId);ib(o);var u=o.oClasses;g.bJQueryUI?(h.extend(u,m.ext.oJUIClasses,g.oClasses),g.sDom===l.sDom&&"lfrtip"===l.sDom&&(o.sDom='<"H"lfr>t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&
+!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(u,m.ext.classes,g.oClasses);q.addClass(u.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=g.iDisplayStart,o._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(o.bDeferLoading=!0,e=h.isArray(g.iDeferLoading),o._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,o._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var v=o.oLanguage;h.extend(!0,v,g.oLanguage);v.sUrl&&(h.ajax({dataType:"json",url:v.sUrl,success:function(a){Fa(a);
+J(l.oLanguage,a);h.extend(true,v,a);ha(o)},error:function(){ha(o)}}),n=!0);null===g.asStripeClasses&&(o.asStripeClasses=[u.sStripeOdd,u.sStripeEven]);var e=o.asStripeClasses,x=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(e,function(a){return x.hasClass(a)}))&&(h("tbody tr",this).removeClass(e.join(" ")),o.asDestroyStripes=e.slice());e=[];r=this.getElementsByTagName("thead");0!==r.length&&(ea(o.aoHeader,r[0]),e=ta(o));if(null===g.aoColumns){r=[];j=0;for(i=e.length;j<i;j++)r.push(null)}else r=
+g.aoColumns;j=0;for(i=r.length;j<i;j++)Ga(o,e?e[j]:null);kb(o,g.aoColumnDefs,r,function(a,b){la(o,a,b)});if(x.length){var w=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(x[0]).children("th, td").each(function(a,b){var c=o.aoColumns[a];if(c.mData===a){var d=w(b,"sort")||w(b,"order"),e=w(b,"filter")||w(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};la(o,a)}}})}var U=o.oFeatures,
+e=function(){if(g.aaSorting===k){var a=o.aaSorting;j=0;for(i=a.length;j<i;j++)a[j][1]=o.aoColumns[j].asSorting[0]}ya(o);U.bSort&&z(o,"aoDrawCallback",function(){if(o.bSorted){var a=W(o),b={};h.each(a,function(a,c){b[c.src]=c.dir});s(o,null,"order",[o,a,b]);Kb(o)}});z(o,"aoDrawCallback",function(){(o.bSorted||y(o)==="ssp"||U.bDeferRender)&&ya(o)},"sc");var a=q.children("caption").each(function(){this._captionSide=h(this).css("caption-side")}),b=q.children("thead");b.length===0&&(b=h("<thead/>").appendTo(q));
+o.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("<tbody/>").appendTo(q));o.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(o.oScroll.sX!==""||o.oScroll.sY!==""))b=h("<tfoot/>").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);else if(b.length>0){o.nTFoot=b[0];ea(o.aoFooter,o.nTFoot)}if(g.aaData)for(j=0;j<g.aaData.length;j++)N(o,g.aaData[j]);else(o.bDeferLoading||y(o)=="dom")&&oa(o,h(o.nTBody).children("tr"));o.aiDisplay=o.aiDisplayMaster.slice();
+o.bInitialised=true;n===false&&ha(o)};g.bStateSave?(U.bStateSave=!0,z(o,"aoDrawCallback",za,"state_save"),Lb(o,g,e)):e()}});b=null;return this},x,t,p,u,$a={},Pb=/[\r\n]/g,Ca=/<.*?>/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Za=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Qb=function(a){var b=parseInt(a,10);return!isNaN(b)&&
+isFinite(a)?b:null},Rb=function(a,b){$a[b]||($a[b]=RegExp(Sa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace($a[b],"."):a},ab=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Rb(a,b));c&&d&&(a=a.replace(Za,""));return!isNaN(parseFloat(a))&&isFinite(a)},Sb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:ab(a.replace(Ca,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<
+f;e++)a[e]&&d.push(a[e][b]);return d},ja=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Tb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},sa=function(a){var b;a:{if(!(2>a.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();
+b=[];var e=a.length,f,g=0,d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b};m.util={throttle:function(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,h=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,h)},c)):(d=g,a.apply(b,h))}},escapeRegex:function(a){return a.replace(dc,"\\$1")}};var A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ca=/\[.*?\]$/,V=/\(\)$/,Sa=m.util.escapeRegex,xa=h("<div>")[0],$b=xa.textContent!==k,bc=
+/<.*?>/g,Qa=m.util.throttle,Ub=[],w=Array.prototype,ec=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};t=function(a,b){if(!(this instanceof
+t))return new t(a,b);var c=[],d=function(a){(a=ec(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=sa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};t.extend(this,this,Ub)};m.Api=t;h.extend(t.prototype,{any:function(){return 0!==this.count()},concat:w.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=
+this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,b)},flatten:function(){var a=[];return new t(this.context,a.concat.apply(a,this.toArray()))},join:w.join,indexOf:w.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,n,l=this.context,
+m,p,u=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var s=new t(l[g]);if("table"===b)f=c.call(s,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(s,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){p=this[g];"column-rows"===b&&(m=Da(l[g],u.opts));i=0;for(n=p.length;i<n;i++)f=p[i],f="cell"===b?c.call(s,l[g],f.row,f.column,g,i):c.call(s,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new t(l,a?
+e.concat.apply([],e):e),b=a.selector,b.rows=u.rows,b.cols=u.cols,b.opts=u.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return jb(this,a,b,0,this.length,
+1)},reduceRight:w.reduceRight||function(a,b){return jb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,slice:function(){return new t(this.context,this)},sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new t(this.context,sa(this))},unshift:w.unshift});t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=
+b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=p=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)t.register(a[c],b);else for(var e=a.split("."),f=Ub,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=
+f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=u=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?new t(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,
+d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});u("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});u("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});u("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});u("tables().footer()",
+"table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});u("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Va(b,a)})});p("page.info()",function(){if(0===
+this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:k:this.iterator("table",function(b){Ta(b,a)})});var Vb=function(a,b,c){if(c){var d=new t(a);
+d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ua(a,[],function(c){pa(a);for(var c=va(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,b){return this.iterator("table",function(c){Vb(c,!1===b,a)})});p("ajax.url()",function(a){var b=
+this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Vb(c,!1===b,a)})});var bb=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split&&!b[i].match(/[\[\(:]/)?b[i].split(","):
+[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=x.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return sa(f)},cb=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},db=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,
+d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};
+p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=cb(b),c=this.iterator("table",function(c){var e=b,f;return bb("row",a,function(a){var b=Qb(a);if(b!==null&&!e)return[b];f||(f=Da(c,e));if(b!==null&&h.inArray(b,f)!==-1)return[b];if(a===null||a===k||a==="")return f;if(typeof a==="function")return h.map(f,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Tb(ja(c.aoData,f,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];
+b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){var i=c.aIds[a.replace(/^#/,"")];if(i!==k)return[i.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ja(a.aoData,b,"_aData")},
+1)});u("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});u("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){da(b,c,a)})});u("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});u("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<
+g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new t(c,b)});u("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<n;i++)l[i]._DT_CellIndex.row=g}qa(b.aiDisplayMaster,c);qa(b.aiDisplay,c);qa(a[d],c,!1);Ua(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});
+this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(oa(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return db(this.rows(a,b))});p("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:
+k;b[0].aoData[this[0]]._aData=a;da(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?oa(b,a)[0]:N(b,a)});return this.row(b[0])});var eb=function(a,b){var c=a.context;if(c.length&&(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=
+k,c._details=k},Wb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new t(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",
+function(a,b){if(e===b)for(var c,d=ba(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&eb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)eb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,
+b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ba(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Wb(this,!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Wb(this,!1);
+return this});p(["row().child.remove()","row().child().remove()"],function(){eb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var fc=/^([^:]+):(name|visIdx|visible)$/,Xb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=cb(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,
+j=D(g,"sName"),i=D(g,"nTh");return bb("column",e,function(a){var b=Qb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Xb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(fc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(j,function(a,b){return a===
+k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",
+function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Xb,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()",
+"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!==a){if(a){var m=h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(n=j.length;i<n;i++)l=j[i].nTr,f=j[i].anCells,l&&l.insertBefore(f[c],f[m]||null)}else h(D(b.aoData,"anCells",c)).detach();
+g.bVisible=a;fa(b,b.aoHeader);fa(b,b.aoFooter);za(b)}});a!==k&&(this.iterator("column",function(c,e){s(c,null,"column-visibility",[c,e,a,b])}),(b===k||b)&&this.columns.adjust());return c});u("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?aa(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){Z(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===
+a||"toData"===a)return $(c,b);if("fromData"===a||"toVisible"===a)return aa(c,b)}});p("column()",function(a,b){return db(this.columns(a,b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=cb(c),f=b.aoData,g=Da(b,e),j=Tb(ja(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,p,u,t,s,v;return bb("cell",d,function(a){var c=typeof a==="function";
+if(a===null||a===k||c){m=[];p=0;for(u=g.length;p<u;p++){l=g[p];for(t=0;t<n;t++){s={row:l,column:t};if(c){v=f[l];a(s,B(b,l,t),v.anCells?v.anCells[t]:null)&&m.push(s)}else m.push(s)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!a.nodeName)return c;v=h(a).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},b,e)});var d=this.columns(b,c),e=this.rows(a,
+c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});u("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});u("cells().cache()","cell().cache()",function(a){a=
+"search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});u("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});u("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:aa(a,c)}},1)});u("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){da(b,c,a,d)})});p("cell()",
+function(a,b,c){return db(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;lb(b[0],c[0].row,c[0].column,a);da(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:a.length&&!h.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});
+p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,b,c,d){var e=
+this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&ga(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});u("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?
+!0:c,bCaseInsensitive:null===d?!0:d}),ga(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){za(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),
+a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof m.Api)return!0;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,
+function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new t(c):c};m.camelToHungarian=J;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",
+function(a){pa(a)})});p("settings()",function(){return new t(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),
+p;b.bDestroying=!0;s(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];ya(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+
+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column",
+"row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=R(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.15";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,
+_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults=
+{aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
+this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
+sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
+Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
+bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
+aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
+aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=
+this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=x={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
+header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
+sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
+sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Yb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
+m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting",sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",
+sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Yb+" ui-corner-tl ui-corner-tr",sJUIFooter:Yb+" ui-corner-bl ui-corner-br"});var Nb=m.ext.pager;h.extend(Nb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ia(a,
+b)]},simple_numbers:function(a,b){return["previous",ia(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ia(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ia(a,b),"last"]},_numbers:ia,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},m,l,p=0,r=function(b,d){var k,t,u,s,v=function(b){Va(a,b.data.action,true)};k=0;for(t=d.length;k<t;k++){s=d[k];if(h.isArray(s)){u=
+h("<"+(s.DT_el||"div")+"/>").appendTo(b);r(u,s)}else{m=null;l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":m=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":m=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":m=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":m=j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:m=s+1;l=e===s?g.sPageButtonActive:""}if(m!==null){u=h("<a>",{"class":g.sPageButton+
+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":p,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(m).appendTo(b);Ya(u,{action:s},v);p++}}}},t;try{t=h(b).find(H.activeElement).data("dt-idx")}catch(u){}r(h(b).empty(),d);t!==k&&h(b).find("[data-dt-idx="+t+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!cc.test(a))return null;var b=Date.parse(a);
+return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Pb," ").replace(Ca,""):""},string:function(a){return M(a)?
+a:"string"===typeof a?a.replace(Pb," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Rb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||-Infinity},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<
+b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});fb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);
+h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Zb=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,
+"&quot;"):a};m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Zb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Zb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Ob,_fnBuildAjax:ua,_fnAjaxUpdate:nb,_fnAjaxParameters:wb,_fnAjaxUpdateDraw:xb,
+_fnAjaxDataSrc:va,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:Z,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:aa,_fnVisbleColumns:ba,_fnGetColumns:na,_fnColumnTypes:Ia,_fnApplyColumnDefs:kb,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:ib,_fnAddData:N,_fnAddTr:oa,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:lb,
+_fnSplitObjNotation:La,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:Ma,_fnClearTable:pa,_fnDeleteIndex:qa,_fnInvalidate:da,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:mb,_fnDrawHead:fa,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:pb,_fnDetectHeader:ea,_fnGetUniqueThs:ta,_fnFeatureHtmlFilter:rb,_fnFilterComplete:ga,_fnFilterCustom:Ab,_fnFilterColumn:zb,_fnFilter:yb,_fnFilterCreateSearch:Ra,_fnEscapeRegex:Sa,_fnFilterData:Bb,_fnFeatureHtmlInfo:ub,_fnUpdateInfo:Eb,_fnInfoMacros:Fb,_fnInitialise:ha,
+_fnInitComplete:wa,_fnLengthChange:Ta,_fnFeatureHtmlLength:qb,_fnFeatureHtmlPaginate:vb,_fnPageChange:Va,_fnFeatureHtmlProcessing:sb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:tb,_fnScrollDraw:ma,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:Qa,_fnConvertToWidth:Gb,_fnGetWidestNode:Hb,_fnGetMaxLenString:Ib,_fnStringToCss:v,_fnSortFlatten:W,_fnSort:ob,_fnSortAria:Kb,_fnSortListener:Xa,_fnSortAttachListener:Oa,_fnSortingClasses:ya,_fnSortData:Jb,_fnSaveState:za,_fnLoadState:Lb,_fnSettingsFromNode:Aa,
+_fnLog:K,_fnMap:F,_fnBindAction:Ya,_fnCallbackReg:z,_fnCallbackFire:s,_fnLengthOverflow:Ua,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.css
new file mode 100644
index 0000000000000000000000000000000000000000..9bb8f256f2bdf91427b395d11650e96aab1ef95e
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.css
@@ -0,0 +1,13 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face {
+  font-family: 'Font Awesome 5 Brands';
+  font-style: normal;
+  font-weight: normal;
+  src: url("../webfonts/fa-brands-400.eot");
+  src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
+
+.fab {
+  font-family: 'Font Awesome 5 Brands'; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.min.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..ed2fd883a87f41011f3fa9d5a4e2d0ee4861e219
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-brands.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}
\ No newline at end of file
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.css
new file mode 100644
index 0000000000000000000000000000000000000000..fd63e09a85169016813ec4e51c8c0cb3a35c88cd
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.css
@@ -0,0 +1,14 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 400;
+  src: url("../webfonts/fa-regular-400.eot");
+  src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
+
+.far {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 400; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.min.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..3ba65019fc83dc22f0bdf237def895de10448cb0
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-regular.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400}
\ No newline at end of file
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.css
new file mode 100644
index 0000000000000000000000000000000000000000..d00e85ac142d861aea9d96f94cb01c99f61ea2dd
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.css
@@ -0,0 +1,15 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 900;
+  src: url("../webfonts/fa-solid-900.eot");
+  src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
+
+.fa,
+.fas {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 900; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.min.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..9064419d001e505494c3dea7f77c460c5b83f9d0
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fa-solid.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900}
\ No newline at end of file
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.css
new file mode 100644
index 0000000000000000000000000000000000000000..1eb14f5249eadfa1d88fcd6b3aa8ad541b5e3fa9
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.css
@@ -0,0 +1,2855 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,
+.fas,
+.far,
+.fal,
+.fab {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  text-rendering: auto;
+  line-height: 1; }
+
+.fa-lg {
+  font-size: 1.33333em;
+  line-height: 0.75em;
+  vertical-align: -.0667em; }
+
+.fa-xs {
+  font-size: .75em; }
+
+.fa-sm {
+  font-size: .875em; }
+
+.fa-1x {
+  font-size: 1em; }
+
+.fa-2x {
+  font-size: 2em; }
+
+.fa-3x {
+  font-size: 3em; }
+
+.fa-4x {
+  font-size: 4em; }
+
+.fa-5x {
+  font-size: 5em; }
+
+.fa-6x {
+  font-size: 6em; }
+
+.fa-7x {
+  font-size: 7em; }
+
+.fa-8x {
+  font-size: 8em; }
+
+.fa-9x {
+  font-size: 9em; }
+
+.fa-10x {
+  font-size: 10em; }
+
+.fa-fw {
+  text-align: center;
+  width: 1.25em; }
+
+.fa-ul {
+  list-style-type: none;
+  margin-left: 2.5em;
+  padding-left: 0; }
+  .fa-ul > li {
+    position: relative; }
+
+.fa-li {
+  left: -2em;
+  position: absolute;
+  text-align: center;
+  width: 2em;
+  line-height: inherit; }
+
+.fa-border {
+  border: solid 0.08em #eee;
+  border-radius: .1em;
+  padding: .2em .25em .15em; }
+
+.fa-pull-left {
+  float: left; }
+
+.fa-pull-right {
+  float: right; }
+
+.fa.fa-pull-left,
+.fas.fa-pull-left,
+.far.fa-pull-left,
+.fal.fa-pull-left,
+.fab.fa-pull-left {
+  margin-right: .3em; }
+
+.fa.fa-pull-right,
+.fas.fa-pull-right,
+.far.fa-pull-right,
+.fal.fa-pull-right,
+.fab.fa-pull-right {
+  margin-left: .3em; }
+
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+          animation: fa-spin 2s infinite linear; }
+
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+          animation: fa-spin 1s infinite steps(8); }
+
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+  -webkit-transform: rotate(90deg);
+          transform: rotate(90deg); }
+
+.fa-rotate-180 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+  -webkit-transform: rotate(180deg);
+          transform: rotate(180deg); }
+
+.fa-rotate-270 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+  -webkit-transform: rotate(270deg);
+          transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+  -webkit-transform: scale(-1, 1);
+          transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(1, -1);
+          transform: scale(1, -1); }
+
+.fa-flip-horizontal.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(-1, -1);
+          transform: scale(-1, -1); }
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  -webkit-filter: none;
+          filter: none; }
+
+.fa-stack {
+  display: inline-block;
+  height: 2em;
+  line-height: 2em;
+  position: relative;
+  vertical-align: middle;
+  width: 2em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+  left: 0;
+  position: absolute;
+  text-align: center;
+  width: 100%; }
+
+.fa-stack-1x {
+  line-height: inherit; }
+
+.fa-stack-2x {
+  font-size: 2em; }
+
+.fa-inverse {
+  color: #fff; }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+.fa-500px:before {
+  content: "\f26e"; }
+
+.fa-accessible-icon:before {
+  content: "\f368"; }
+
+.fa-accusoft:before {
+  content: "\f369"; }
+
+.fa-address-book:before {
+  content: "\f2b9"; }
+
+.fa-address-card:before {
+  content: "\f2bb"; }
+
+.fa-adjust:before {
+  content: "\f042"; }
+
+.fa-adn:before {
+  content: "\f170"; }
+
+.fa-adversal:before {
+  content: "\f36a"; }
+
+.fa-affiliatetheme:before {
+  content: "\f36b"; }
+
+.fa-algolia:before {
+  content: "\f36c"; }
+
+.fa-align-center:before {
+  content: "\f037"; }
+
+.fa-align-justify:before {
+  content: "\f039"; }
+
+.fa-align-left:before {
+  content: "\f036"; }
+
+.fa-align-right:before {
+  content: "\f038"; }
+
+.fa-allergies:before {
+  content: "\f461"; }
+
+.fa-amazon:before {
+  content: "\f270"; }
+
+.fa-amazon-pay:before {
+  content: "\f42c"; }
+
+.fa-ambulance:before {
+  content: "\f0f9"; }
+
+.fa-american-sign-language-interpreting:before {
+  content: "\f2a3"; }
+
+.fa-amilia:before {
+  content: "\f36d"; }
+
+.fa-anchor:before {
+  content: "\f13d"; }
+
+.fa-android:before {
+  content: "\f17b"; }
+
+.fa-angellist:before {
+  content: "\f209"; }
+
+.fa-angle-double-down:before {
+  content: "\f103"; }
+
+.fa-angle-double-left:before {
+  content: "\f100"; }
+
+.fa-angle-double-right:before {
+  content: "\f101"; }
+
+.fa-angle-double-up:before {
+  content: "\f102"; }
+
+.fa-angle-down:before {
+  content: "\f107"; }
+
+.fa-angle-left:before {
+  content: "\f104"; }
+
+.fa-angle-right:before {
+  content: "\f105"; }
+
+.fa-angle-up:before {
+  content: "\f106"; }
+
+.fa-angrycreative:before {
+  content: "\f36e"; }
+
+.fa-angular:before {
+  content: "\f420"; }
+
+.fa-app-store:before {
+  content: "\f36f"; }
+
+.fa-app-store-ios:before {
+  content: "\f370"; }
+
+.fa-apper:before {
+  content: "\f371"; }
+
+.fa-apple:before {
+  content: "\f179"; }
+
+.fa-apple-pay:before {
+  content: "\f415"; }
+
+.fa-archive:before {
+  content: "\f187"; }
+
+.fa-arrow-alt-circle-down:before {
+  content: "\f358"; }
+
+.fa-arrow-alt-circle-left:before {
+  content: "\f359"; }
+
+.fa-arrow-alt-circle-right:before {
+  content: "\f35a"; }
+
+.fa-arrow-alt-circle-up:before {
+  content: "\f35b"; }
+
+.fa-arrow-circle-down:before {
+  content: "\f0ab"; }
+
+.fa-arrow-circle-left:before {
+  content: "\f0a8"; }
+
+.fa-arrow-circle-right:before {
+  content: "\f0a9"; }
+
+.fa-arrow-circle-up:before {
+  content: "\f0aa"; }
+
+.fa-arrow-down:before {
+  content: "\f063"; }
+
+.fa-arrow-left:before {
+  content: "\f060"; }
+
+.fa-arrow-right:before {
+  content: "\f061"; }
+
+.fa-arrow-up:before {
+  content: "\f062"; }
+
+.fa-arrows-alt:before {
+  content: "\f0b2"; }
+
+.fa-arrows-alt-h:before {
+  content: "\f337"; }
+
+.fa-arrows-alt-v:before {
+  content: "\f338"; }
+
+.fa-assistive-listening-systems:before {
+  content: "\f2a2"; }
+
+.fa-asterisk:before {
+  content: "\f069"; }
+
+.fa-asymmetrik:before {
+  content: "\f372"; }
+
+.fa-at:before {
+  content: "\f1fa"; }
+
+.fa-audible:before {
+  content: "\f373"; }
+
+.fa-audio-description:before {
+  content: "\f29e"; }
+
+.fa-autoprefixer:before {
+  content: "\f41c"; }
+
+.fa-avianex:before {
+  content: "\f374"; }
+
+.fa-aviato:before {
+  content: "\f421"; }
+
+.fa-aws:before {
+  content: "\f375"; }
+
+.fa-backward:before {
+  content: "\f04a"; }
+
+.fa-balance-scale:before {
+  content: "\f24e"; }
+
+.fa-ban:before {
+  content: "\f05e"; }
+
+.fa-band-aid:before {
+  content: "\f462"; }
+
+.fa-bandcamp:before {
+  content: "\f2d5"; }
+
+.fa-barcode:before {
+  content: "\f02a"; }
+
+.fa-bars:before {
+  content: "\f0c9"; }
+
+.fa-baseball-ball:before {
+  content: "\f433"; }
+
+.fa-basketball-ball:before {
+  content: "\f434"; }
+
+.fa-bath:before {
+  content: "\f2cd"; }
+
+.fa-battery-empty:before {
+  content: "\f244"; }
+
+.fa-battery-full:before {
+  content: "\f240"; }
+
+.fa-battery-half:before {
+  content: "\f242"; }
+
+.fa-battery-quarter:before {
+  content: "\f243"; }
+
+.fa-battery-three-quarters:before {
+  content: "\f241"; }
+
+.fa-bed:before {
+  content: "\f236"; }
+
+.fa-beer:before {
+  content: "\f0fc"; }
+
+.fa-behance:before {
+  content: "\f1b4"; }
+
+.fa-behance-square:before {
+  content: "\f1b5"; }
+
+.fa-bell:before {
+  content: "\f0f3"; }
+
+.fa-bell-slash:before {
+  content: "\f1f6"; }
+
+.fa-bicycle:before {
+  content: "\f206"; }
+
+.fa-bimobject:before {
+  content: "\f378"; }
+
+.fa-binoculars:before {
+  content: "\f1e5"; }
+
+.fa-birthday-cake:before {
+  content: "\f1fd"; }
+
+.fa-bitbucket:before {
+  content: "\f171"; }
+
+.fa-bitcoin:before {
+  content: "\f379"; }
+
+.fa-bity:before {
+  content: "\f37a"; }
+
+.fa-black-tie:before {
+  content: "\f27e"; }
+
+.fa-blackberry:before {
+  content: "\f37b"; }
+
+.fa-blind:before {
+  content: "\f29d"; }
+
+.fa-blogger:before {
+  content: "\f37c"; }
+
+.fa-blogger-b:before {
+  content: "\f37d"; }
+
+.fa-bluetooth:before {
+  content: "\f293"; }
+
+.fa-bluetooth-b:before {
+  content: "\f294"; }
+
+.fa-bold:before {
+  content: "\f032"; }
+
+.fa-bolt:before {
+  content: "\f0e7"; }
+
+.fa-bomb:before {
+  content: "\f1e2"; }
+
+.fa-book:before {
+  content: "\f02d"; }
+
+.fa-bookmark:before {
+  content: "\f02e"; }
+
+.fa-bowling-ball:before {
+  content: "\f436"; }
+
+.fa-box:before {
+  content: "\f466"; }
+
+.fa-box-open:before {
+  content: "\f49e"; }
+
+.fa-boxes:before {
+  content: "\f468"; }
+
+.fa-braille:before {
+  content: "\f2a1"; }
+
+.fa-briefcase:before {
+  content: "\f0b1"; }
+
+.fa-briefcase-medical:before {
+  content: "\f469"; }
+
+.fa-btc:before {
+  content: "\f15a"; }
+
+.fa-bug:before {
+  content: "\f188"; }
+
+.fa-building:before {
+  content: "\f1ad"; }
+
+.fa-bullhorn:before {
+  content: "\f0a1"; }
+
+.fa-bullseye:before {
+  content: "\f140"; }
+
+.fa-burn:before {
+  content: "\f46a"; }
+
+.fa-buromobelexperte:before {
+  content: "\f37f"; }
+
+.fa-bus:before {
+  content: "\f207"; }
+
+.fa-buysellads:before {
+  content: "\f20d"; }
+
+.fa-calculator:before {
+  content: "\f1ec"; }
+
+.fa-calendar:before {
+  content: "\f133"; }
+
+.fa-calendar-alt:before {
+  content: "\f073"; }
+
+.fa-calendar-check:before {
+  content: "\f274"; }
+
+.fa-calendar-minus:before {
+  content: "\f272"; }
+
+.fa-calendar-plus:before {
+  content: "\f271"; }
+
+.fa-calendar-times:before {
+  content: "\f273"; }
+
+.fa-camera:before {
+  content: "\f030"; }
+
+.fa-camera-retro:before {
+  content: "\f083"; }
+
+.fa-capsules:before {
+  content: "\f46b"; }
+
+.fa-car:before {
+  content: "\f1b9"; }
+
+.fa-caret-down:before {
+  content: "\f0d7"; }
+
+.fa-caret-left:before {
+  content: "\f0d9"; }
+
+.fa-caret-right:before {
+  content: "\f0da"; }
+
+.fa-caret-square-down:before {
+  content: "\f150"; }
+
+.fa-caret-square-left:before {
+  content: "\f191"; }
+
+.fa-caret-square-right:before {
+  content: "\f152"; }
+
+.fa-caret-square-up:before {
+  content: "\f151"; }
+
+.fa-caret-up:before {
+  content: "\f0d8"; }
+
+.fa-cart-arrow-down:before {
+  content: "\f218"; }
+
+.fa-cart-plus:before {
+  content: "\f217"; }
+
+.fa-cc-amazon-pay:before {
+  content: "\f42d"; }
+
+.fa-cc-amex:before {
+  content: "\f1f3"; }
+
+.fa-cc-apple-pay:before {
+  content: "\f416"; }
+
+.fa-cc-diners-club:before {
+  content: "\f24c"; }
+
+.fa-cc-discover:before {
+  content: "\f1f2"; }
+
+.fa-cc-jcb:before {
+  content: "\f24b"; }
+
+.fa-cc-mastercard:before {
+  content: "\f1f1"; }
+
+.fa-cc-paypal:before {
+  content: "\f1f4"; }
+
+.fa-cc-stripe:before {
+  content: "\f1f5"; }
+
+.fa-cc-visa:before {
+  content: "\f1f0"; }
+
+.fa-centercode:before {
+  content: "\f380"; }
+
+.fa-certificate:before {
+  content: "\f0a3"; }
+
+.fa-chart-area:before {
+  content: "\f1fe"; }
+
+.fa-chart-bar:before {
+  content: "\f080"; }
+
+.fa-chart-line:before {
+  content: "\f201"; }
+
+.fa-chart-pie:before {
+  content: "\f200"; }
+
+.fa-check:before {
+  content: "\f00c"; }
+
+.fa-check-circle:before {
+  content: "\f058"; }
+
+.fa-check-square:before {
+  content: "\f14a"; }
+
+.fa-chess:before {
+  content: "\f439"; }
+
+.fa-chess-bishop:before {
+  content: "\f43a"; }
+
+.fa-chess-board:before {
+  content: "\f43c"; }
+
+.fa-chess-king:before {
+  content: "\f43f"; }
+
+.fa-chess-knight:before {
+  content: "\f441"; }
+
+.fa-chess-pawn:before {
+  content: "\f443"; }
+
+.fa-chess-queen:before {
+  content: "\f445"; }
+
+.fa-chess-rook:before {
+  content: "\f447"; }
+
+.fa-chevron-circle-down:before {
+  content: "\f13a"; }
+
+.fa-chevron-circle-left:before {
+  content: "\f137"; }
+
+.fa-chevron-circle-right:before {
+  content: "\f138"; }
+
+.fa-chevron-circle-up:before {
+  content: "\f139"; }
+
+.fa-chevron-down:before {
+  content: "\f078"; }
+
+.fa-chevron-left:before {
+  content: "\f053"; }
+
+.fa-chevron-right:before {
+  content: "\f054"; }
+
+.fa-chevron-up:before {
+  content: "\f077"; }
+
+.fa-child:before {
+  content: "\f1ae"; }
+
+.fa-chrome:before {
+  content: "\f268"; }
+
+.fa-circle:before {
+  content: "\f111"; }
+
+.fa-circle-notch:before {
+  content: "\f1ce"; }
+
+.fa-clipboard:before {
+  content: "\f328"; }
+
+.fa-clipboard-check:before {
+  content: "\f46c"; }
+
+.fa-clipboard-list:before {
+  content: "\f46d"; }
+
+.fa-clock:before {
+  content: "\f017"; }
+
+.fa-clone:before {
+  content: "\f24d"; }
+
+.fa-closed-captioning:before {
+  content: "\f20a"; }
+
+.fa-cloud:before {
+  content: "\f0c2"; }
+
+.fa-cloud-download-alt:before {
+  content: "\f381"; }
+
+.fa-cloud-upload-alt:before {
+  content: "\f382"; }
+
+.fa-cloudscale:before {
+  content: "\f383"; }
+
+.fa-cloudsmith:before {
+  content: "\f384"; }
+
+.fa-cloudversify:before {
+  content: "\f385"; }
+
+.fa-code:before {
+  content: "\f121"; }
+
+.fa-code-branch:before {
+  content: "\f126"; }
+
+.fa-codepen:before {
+  content: "\f1cb"; }
+
+.fa-codiepie:before {
+  content: "\f284"; }
+
+.fa-coffee:before {
+  content: "\f0f4"; }
+
+.fa-cog:before {
+  content: "\f013"; }
+
+.fa-cogs:before {
+  content: "\f085"; }
+
+.fa-columns:before {
+  content: "\f0db"; }
+
+.fa-comment:before {
+  content: "\f075"; }
+
+.fa-comment-alt:before {
+  content: "\f27a"; }
+
+.fa-comment-dots:before {
+  content: "\f4ad"; }
+
+.fa-comment-slash:before {
+  content: "\f4b3"; }
+
+.fa-comments:before {
+  content: "\f086"; }
+
+.fa-compass:before {
+  content: "\f14e"; }
+
+.fa-compress:before {
+  content: "\f066"; }
+
+.fa-connectdevelop:before {
+  content: "\f20e"; }
+
+.fa-contao:before {
+  content: "\f26d"; }
+
+.fa-copy:before {
+  content: "\f0c5"; }
+
+.fa-copyright:before {
+  content: "\f1f9"; }
+
+.fa-couch:before {
+  content: "\f4b8"; }
+
+.fa-cpanel:before {
+  content: "\f388"; }
+
+.fa-creative-commons:before {
+  content: "\f25e"; }
+
+.fa-credit-card:before {
+  content: "\f09d"; }
+
+.fa-crop:before {
+  content: "\f125"; }
+
+.fa-crosshairs:before {
+  content: "\f05b"; }
+
+.fa-css3:before {
+  content: "\f13c"; }
+
+.fa-css3-alt:before {
+  content: "\f38b"; }
+
+.fa-cube:before {
+  content: "\f1b2"; }
+
+.fa-cubes:before {
+  content: "\f1b3"; }
+
+.fa-cut:before {
+  content: "\f0c4"; }
+
+.fa-cuttlefish:before {
+  content: "\f38c"; }
+
+.fa-d-and-d:before {
+  content: "\f38d"; }
+
+.fa-dashcube:before {
+  content: "\f210"; }
+
+.fa-database:before {
+  content: "\f1c0"; }
+
+.fa-deaf:before {
+  content: "\f2a4"; }
+
+.fa-delicious:before {
+  content: "\f1a5"; }
+
+.fa-deploydog:before {
+  content: "\f38e"; }
+
+.fa-deskpro:before {
+  content: "\f38f"; }
+
+.fa-desktop:before {
+  content: "\f108"; }
+
+.fa-deviantart:before {
+  content: "\f1bd"; }
+
+.fa-diagnoses:before {
+  content: "\f470"; }
+
+.fa-digg:before {
+  content: "\f1a6"; }
+
+.fa-digital-ocean:before {
+  content: "\f391"; }
+
+.fa-discord:before {
+  content: "\f392"; }
+
+.fa-discourse:before {
+  content: "\f393"; }
+
+.fa-dna:before {
+  content: "\f471"; }
+
+.fa-dochub:before {
+  content: "\f394"; }
+
+.fa-docker:before {
+  content: "\f395"; }
+
+.fa-dollar-sign:before {
+  content: "\f155"; }
+
+.fa-dolly:before {
+  content: "\f472"; }
+
+.fa-dolly-flatbed:before {
+  content: "\f474"; }
+
+.fa-donate:before {
+  content: "\f4b9"; }
+
+.fa-dot-circle:before {
+  content: "\f192"; }
+
+.fa-dove:before {
+  content: "\f4ba"; }
+
+.fa-download:before {
+  content: "\f019"; }
+
+.fa-draft2digital:before {
+  content: "\f396"; }
+
+.fa-dribbble:before {
+  content: "\f17d"; }
+
+.fa-dribbble-square:before {
+  content: "\f397"; }
+
+.fa-dropbox:before {
+  content: "\f16b"; }
+
+.fa-drupal:before {
+  content: "\f1a9"; }
+
+.fa-dyalog:before {
+  content: "\f399"; }
+
+.fa-earlybirds:before {
+  content: "\f39a"; }
+
+.fa-edge:before {
+  content: "\f282"; }
+
+.fa-edit:before {
+  content: "\f044"; }
+
+.fa-eject:before {
+  content: "\f052"; }
+
+.fa-elementor:before {
+  content: "\f430"; }
+
+.fa-ellipsis-h:before {
+  content: "\f141"; }
+
+.fa-ellipsis-v:before {
+  content: "\f142"; }
+
+.fa-ember:before {
+  content: "\f423"; }
+
+.fa-empire:before {
+  content: "\f1d1"; }
+
+.fa-envelope:before {
+  content: "\f0e0"; }
+
+.fa-envelope-open:before {
+  content: "\f2b6"; }
+
+.fa-envelope-square:before {
+  content: "\f199"; }
+
+.fa-envira:before {
+  content: "\f299"; }
+
+.fa-eraser:before {
+  content: "\f12d"; }
+
+.fa-erlang:before {
+  content: "\f39d"; }
+
+.fa-ethereum:before {
+  content: "\f42e"; }
+
+.fa-etsy:before {
+  content: "\f2d7"; }
+
+.fa-euro-sign:before {
+  content: "\f153"; }
+
+.fa-exchange-alt:before {
+  content: "\f362"; }
+
+.fa-exclamation:before {
+  content: "\f12a"; }
+
+.fa-exclamation-circle:before {
+  content: "\f06a"; }
+
+.fa-exclamation-triangle:before {
+  content: "\f071"; }
+
+.fa-expand:before {
+  content: "\f065"; }
+
+.fa-expand-arrows-alt:before {
+  content: "\f31e"; }
+
+.fa-expeditedssl:before {
+  content: "\f23e"; }
+
+.fa-external-link-alt:before {
+  content: "\f35d"; }
+
+.fa-external-link-square-alt:before {
+  content: "\f360"; }
+
+.fa-eye:before {
+  content: "\f06e"; }
+
+.fa-eye-dropper:before {
+  content: "\f1fb"; }
+
+.fa-eye-slash:before {
+  content: "\f070"; }
+
+.fa-facebook:before {
+  content: "\f09a"; }
+
+.fa-facebook-f:before {
+  content: "\f39e"; }
+
+.fa-facebook-messenger:before {
+  content: "\f39f"; }
+
+.fa-facebook-square:before {
+  content: "\f082"; }
+
+.fa-fast-backward:before {
+  content: "\f049"; }
+
+.fa-fast-forward:before {
+  content: "\f050"; }
+
+.fa-fax:before {
+  content: "\f1ac"; }
+
+.fa-female:before {
+  content: "\f182"; }
+
+.fa-fighter-jet:before {
+  content: "\f0fb"; }
+
+.fa-file:before {
+  content: "\f15b"; }
+
+.fa-file-alt:before {
+  content: "\f15c"; }
+
+.fa-file-archive:before {
+  content: "\f1c6"; }
+
+.fa-file-audio:before {
+  content: "\f1c7"; }
+
+.fa-file-code:before {
+  content: "\f1c9"; }
+
+.fa-file-excel:before {
+  content: "\f1c3"; }
+
+.fa-file-image:before {
+  content: "\f1c5"; }
+
+.fa-file-medical:before {
+  content: "\f477"; }
+
+.fa-file-medical-alt:before {
+  content: "\f478"; }
+
+.fa-file-pdf:before {
+  content: "\f1c1"; }
+
+.fa-file-powerpoint:before {
+  content: "\f1c4"; }
+
+.fa-file-video:before {
+  content: "\f1c8"; }
+
+.fa-file-word:before {
+  content: "\f1c2"; }
+
+.fa-film:before {
+  content: "\f008"; }
+
+.fa-filter:before {
+  content: "\f0b0"; }
+
+.fa-fire:before {
+  content: "\f06d"; }
+
+.fa-fire-extinguisher:before {
+  content: "\f134"; }
+
+.fa-firefox:before {
+  content: "\f269"; }
+
+.fa-first-aid:before {
+  content: "\f479"; }
+
+.fa-first-order:before {
+  content: "\f2b0"; }
+
+.fa-firstdraft:before {
+  content: "\f3a1"; }
+
+.fa-flag:before {
+  content: "\f024"; }
+
+.fa-flag-checkered:before {
+  content: "\f11e"; }
+
+.fa-flask:before {
+  content: "\f0c3"; }
+
+.fa-flickr:before {
+  content: "\f16e"; }
+
+.fa-flipboard:before {
+  content: "\f44d"; }
+
+.fa-fly:before {
+  content: "\f417"; }
+
+.fa-folder:before {
+  content: "\f07b"; }
+
+.fa-folder-open:before {
+  content: "\f07c"; }
+
+.fa-font:before {
+  content: "\f031"; }
+
+.fa-font-awesome:before {
+  content: "\f2b4"; }
+
+.fa-font-awesome-alt:before {
+  content: "\f35c"; }
+
+.fa-font-awesome-flag:before {
+  content: "\f425"; }
+
+.fa-fonticons:before {
+  content: "\f280"; }
+
+.fa-fonticons-fi:before {
+  content: "\f3a2"; }
+
+.fa-football-ball:before {
+  content: "\f44e"; }
+
+.fa-fort-awesome:before {
+  content: "\f286"; }
+
+.fa-fort-awesome-alt:before {
+  content: "\f3a3"; }
+
+.fa-forumbee:before {
+  content: "\f211"; }
+
+.fa-forward:before {
+  content: "\f04e"; }
+
+.fa-foursquare:before {
+  content: "\f180"; }
+
+.fa-free-code-camp:before {
+  content: "\f2c5"; }
+
+.fa-freebsd:before {
+  content: "\f3a4"; }
+
+.fa-frown:before {
+  content: "\f119"; }
+
+.fa-futbol:before {
+  content: "\f1e3"; }
+
+.fa-gamepad:before {
+  content: "\f11b"; }
+
+.fa-gavel:before {
+  content: "\f0e3"; }
+
+.fa-gem:before {
+  content: "\f3a5"; }
+
+.fa-genderless:before {
+  content: "\f22d"; }
+
+.fa-get-pocket:before {
+  content: "\f265"; }
+
+.fa-gg:before {
+  content: "\f260"; }
+
+.fa-gg-circle:before {
+  content: "\f261"; }
+
+.fa-gift:before {
+  content: "\f06b"; }
+
+.fa-git:before {
+  content: "\f1d3"; }
+
+.fa-git-square:before {
+  content: "\f1d2"; }
+
+.fa-github:before {
+  content: "\f09b"; }
+
+.fa-github-alt:before {
+  content: "\f113"; }
+
+.fa-github-square:before {
+  content: "\f092"; }
+
+.fa-gitkraken:before {
+  content: "\f3a6"; }
+
+.fa-gitlab:before {
+  content: "\f296"; }
+
+.fa-gitter:before {
+  content: "\f426"; }
+
+.fa-glass-martini:before {
+  content: "\f000"; }
+
+.fa-glide:before {
+  content: "\f2a5"; }
+
+.fa-glide-g:before {
+  content: "\f2a6"; }
+
+.fa-globe:before {
+  content: "\f0ac"; }
+
+.fa-gofore:before {
+  content: "\f3a7"; }
+
+.fa-golf-ball:before {
+  content: "\f450"; }
+
+.fa-goodreads:before {
+  content: "\f3a8"; }
+
+.fa-goodreads-g:before {
+  content: "\f3a9"; }
+
+.fa-google:before {
+  content: "\f1a0"; }
+
+.fa-google-drive:before {
+  content: "\f3aa"; }
+
+.fa-google-play:before {
+  content: "\f3ab"; }
+
+.fa-google-plus:before {
+  content: "\f2b3"; }
+
+.fa-google-plus-g:before {
+  content: "\f0d5"; }
+
+.fa-google-plus-square:before {
+  content: "\f0d4"; }
+
+.fa-google-wallet:before {
+  content: "\f1ee"; }
+
+.fa-graduation-cap:before {
+  content: "\f19d"; }
+
+.fa-gratipay:before {
+  content: "\f184"; }
+
+.fa-grav:before {
+  content: "\f2d6"; }
+
+.fa-gripfire:before {
+  content: "\f3ac"; }
+
+.fa-grunt:before {
+  content: "\f3ad"; }
+
+.fa-gulp:before {
+  content: "\f3ae"; }
+
+.fa-h-square:before {
+  content: "\f0fd"; }
+
+.fa-hacker-news:before {
+  content: "\f1d4"; }
+
+.fa-hacker-news-square:before {
+  content: "\f3af"; }
+
+.fa-hand-holding:before {
+  content: "\f4bd"; }
+
+.fa-hand-holding-heart:before {
+  content: "\f4be"; }
+
+.fa-hand-holding-usd:before {
+  content: "\f4c0"; }
+
+.fa-hand-lizard:before {
+  content: "\f258"; }
+
+.fa-hand-paper:before {
+  content: "\f256"; }
+
+.fa-hand-peace:before {
+  content: "\f25b"; }
+
+.fa-hand-point-down:before {
+  content: "\f0a7"; }
+
+.fa-hand-point-left:before {
+  content: "\f0a5"; }
+
+.fa-hand-point-right:before {
+  content: "\f0a4"; }
+
+.fa-hand-point-up:before {
+  content: "\f0a6"; }
+
+.fa-hand-pointer:before {
+  content: "\f25a"; }
+
+.fa-hand-rock:before {
+  content: "\f255"; }
+
+.fa-hand-scissors:before {
+  content: "\f257"; }
+
+.fa-hand-spock:before {
+  content: "\f259"; }
+
+.fa-hands:before {
+  content: "\f4c2"; }
+
+.fa-hands-helping:before {
+  content: "\f4c4"; }
+
+.fa-handshake:before {
+  content: "\f2b5"; }
+
+.fa-hashtag:before {
+  content: "\f292"; }
+
+.fa-hdd:before {
+  content: "\f0a0"; }
+
+.fa-heading:before {
+  content: "\f1dc"; }
+
+.fa-headphones:before {
+  content: "\f025"; }
+
+.fa-heart:before {
+  content: "\f004"; }
+
+.fa-heartbeat:before {
+  content: "\f21e"; }
+
+.fa-hips:before {
+  content: "\f452"; }
+
+.fa-hire-a-helper:before {
+  content: "\f3b0"; }
+
+.fa-history:before {
+  content: "\f1da"; }
+
+.fa-hockey-puck:before {
+  content: "\f453"; }
+
+.fa-home:before {
+  content: "\f015"; }
+
+.fa-hooli:before {
+  content: "\f427"; }
+
+.fa-hospital:before {
+  content: "\f0f8"; }
+
+.fa-hospital-alt:before {
+  content: "\f47d"; }
+
+.fa-hospital-symbol:before {
+  content: "\f47e"; }
+
+.fa-hotjar:before {
+  content: "\f3b1"; }
+
+.fa-hourglass:before {
+  content: "\f254"; }
+
+.fa-hourglass-end:before {
+  content: "\f253"; }
+
+.fa-hourglass-half:before {
+  content: "\f252"; }
+
+.fa-hourglass-start:before {
+  content: "\f251"; }
+
+.fa-houzz:before {
+  content: "\f27c"; }
+
+.fa-html5:before {
+  content: "\f13b"; }
+
+.fa-hubspot:before {
+  content: "\f3b2"; }
+
+.fa-i-cursor:before {
+  content: "\f246"; }
+
+.fa-id-badge:before {
+  content: "\f2c1"; }
+
+.fa-id-card:before {
+  content: "\f2c2"; }
+
+.fa-id-card-alt:before {
+  content: "\f47f"; }
+
+.fa-image:before {
+  content: "\f03e"; }
+
+.fa-images:before {
+  content: "\f302"; }
+
+.fa-imdb:before {
+  content: "\f2d8"; }
+
+.fa-inbox:before {
+  content: "\f01c"; }
+
+.fa-indent:before {
+  content: "\f03c"; }
+
+.fa-industry:before {
+  content: "\f275"; }
+
+.fa-info:before {
+  content: "\f129"; }
+
+.fa-info-circle:before {
+  content: "\f05a"; }
+
+.fa-instagram:before {
+  content: "\f16d"; }
+
+.fa-internet-explorer:before {
+  content: "\f26b"; }
+
+.fa-ioxhost:before {
+  content: "\f208"; }
+
+.fa-italic:before {
+  content: "\f033"; }
+
+.fa-itunes:before {
+  content: "\f3b4"; }
+
+.fa-itunes-note:before {
+  content: "\f3b5"; }
+
+.fa-jenkins:before {
+  content: "\f3b6"; }
+
+.fa-joget:before {
+  content: "\f3b7"; }
+
+.fa-joomla:before {
+  content: "\f1aa"; }
+
+.fa-js:before {
+  content: "\f3b8"; }
+
+.fa-js-square:before {
+  content: "\f3b9"; }
+
+.fa-jsfiddle:before {
+  content: "\f1cc"; }
+
+.fa-key:before {
+  content: "\f084"; }
+
+.fa-keyboard:before {
+  content: "\f11c"; }
+
+.fa-keycdn:before {
+  content: "\f3ba"; }
+
+.fa-kickstarter:before {
+  content: "\f3bb"; }
+
+.fa-kickstarter-k:before {
+  content: "\f3bc"; }
+
+.fa-korvue:before {
+  content: "\f42f"; }
+
+.fa-language:before {
+  content: "\f1ab"; }
+
+.fa-laptop:before {
+  content: "\f109"; }
+
+.fa-laravel:before {
+  content: "\f3bd"; }
+
+.fa-lastfm:before {
+  content: "\f202"; }
+
+.fa-lastfm-square:before {
+  content: "\f203"; }
+
+.fa-leaf:before {
+  content: "\f06c"; }
+
+.fa-leanpub:before {
+  content: "\f212"; }
+
+.fa-lemon:before {
+  content: "\f094"; }
+
+.fa-less:before {
+  content: "\f41d"; }
+
+.fa-level-down-alt:before {
+  content: "\f3be"; }
+
+.fa-level-up-alt:before {
+  content: "\f3bf"; }
+
+.fa-life-ring:before {
+  content: "\f1cd"; }
+
+.fa-lightbulb:before {
+  content: "\f0eb"; }
+
+.fa-line:before {
+  content: "\f3c0"; }
+
+.fa-link:before {
+  content: "\f0c1"; }
+
+.fa-linkedin:before {
+  content: "\f08c"; }
+
+.fa-linkedin-in:before {
+  content: "\f0e1"; }
+
+.fa-linode:before {
+  content: "\f2b8"; }
+
+.fa-linux:before {
+  content: "\f17c"; }
+
+.fa-lira-sign:before {
+  content: "\f195"; }
+
+.fa-list:before {
+  content: "\f03a"; }
+
+.fa-list-alt:before {
+  content: "\f022"; }
+
+.fa-list-ol:before {
+  content: "\f0cb"; }
+
+.fa-list-ul:before {
+  content: "\f0ca"; }
+
+.fa-location-arrow:before {
+  content: "\f124"; }
+
+.fa-lock:before {
+  content: "\f023"; }
+
+.fa-lock-open:before {
+  content: "\f3c1"; }
+
+.fa-long-arrow-alt-down:before {
+  content: "\f309"; }
+
+.fa-long-arrow-alt-left:before {
+  content: "\f30a"; }
+
+.fa-long-arrow-alt-right:before {
+  content: "\f30b"; }
+
+.fa-long-arrow-alt-up:before {
+  content: "\f30c"; }
+
+.fa-low-vision:before {
+  content: "\f2a8"; }
+
+.fa-lyft:before {
+  content: "\f3c3"; }
+
+.fa-magento:before {
+  content: "\f3c4"; }
+
+.fa-magic:before {
+  content: "\f0d0"; }
+
+.fa-magnet:before {
+  content: "\f076"; }
+
+.fa-male:before {
+  content: "\f183"; }
+
+.fa-map:before {
+  content: "\f279"; }
+
+.fa-map-marker:before {
+  content: "\f041"; }
+
+.fa-map-marker-alt:before {
+  content: "\f3c5"; }
+
+.fa-map-pin:before {
+  content: "\f276"; }
+
+.fa-map-signs:before {
+  content: "\f277"; }
+
+.fa-mars:before {
+  content: "\f222"; }
+
+.fa-mars-double:before {
+  content: "\f227"; }
+
+.fa-mars-stroke:before {
+  content: "\f229"; }
+
+.fa-mars-stroke-h:before {
+  content: "\f22b"; }
+
+.fa-mars-stroke-v:before {
+  content: "\f22a"; }
+
+.fa-maxcdn:before {
+  content: "\f136"; }
+
+.fa-medapps:before {
+  content: "\f3c6"; }
+
+.fa-medium:before {
+  content: "\f23a"; }
+
+.fa-medium-m:before {
+  content: "\f3c7"; }
+
+.fa-medkit:before {
+  content: "\f0fa"; }
+
+.fa-medrt:before {
+  content: "\f3c8"; }
+
+.fa-meetup:before {
+  content: "\f2e0"; }
+
+.fa-meh:before {
+  content: "\f11a"; }
+
+.fa-mercury:before {
+  content: "\f223"; }
+
+.fa-microchip:before {
+  content: "\f2db"; }
+
+.fa-microphone:before {
+  content: "\f130"; }
+
+.fa-microphone-slash:before {
+  content: "\f131"; }
+
+.fa-microsoft:before {
+  content: "\f3ca"; }
+
+.fa-minus:before {
+  content: "\f068"; }
+
+.fa-minus-circle:before {
+  content: "\f056"; }
+
+.fa-minus-square:before {
+  content: "\f146"; }
+
+.fa-mix:before {
+  content: "\f3cb"; }
+
+.fa-mixcloud:before {
+  content: "\f289"; }
+
+.fa-mizuni:before {
+  content: "\f3cc"; }
+
+.fa-mobile:before {
+  content: "\f10b"; }
+
+.fa-mobile-alt:before {
+  content: "\f3cd"; }
+
+.fa-modx:before {
+  content: "\f285"; }
+
+.fa-monero:before {
+  content: "\f3d0"; }
+
+.fa-money-bill-alt:before {
+  content: "\f3d1"; }
+
+.fa-moon:before {
+  content: "\f186"; }
+
+.fa-motorcycle:before {
+  content: "\f21c"; }
+
+.fa-mouse-pointer:before {
+  content: "\f245"; }
+
+.fa-music:before {
+  content: "\f001"; }
+
+.fa-napster:before {
+  content: "\f3d2"; }
+
+.fa-neuter:before {
+  content: "\f22c"; }
+
+.fa-newspaper:before {
+  content: "\f1ea"; }
+
+.fa-nintendo-switch:before {
+  content: "\f418"; }
+
+.fa-node:before {
+  content: "\f419"; }
+
+.fa-node-js:before {
+  content: "\f3d3"; }
+
+.fa-notes-medical:before {
+  content: "\f481"; }
+
+.fa-npm:before {
+  content: "\f3d4"; }
+
+.fa-ns8:before {
+  content: "\f3d5"; }
+
+.fa-nutritionix:before {
+  content: "\f3d6"; }
+
+.fa-object-group:before {
+  content: "\f247"; }
+
+.fa-object-ungroup:before {
+  content: "\f248"; }
+
+.fa-odnoklassniki:before {
+  content: "\f263"; }
+
+.fa-odnoklassniki-square:before {
+  content: "\f264"; }
+
+.fa-opencart:before {
+  content: "\f23d"; }
+
+.fa-openid:before {
+  content: "\f19b"; }
+
+.fa-opera:before {
+  content: "\f26a"; }
+
+.fa-optin-monster:before {
+  content: "\f23c"; }
+
+.fa-osi:before {
+  content: "\f41a"; }
+
+.fa-outdent:before {
+  content: "\f03b"; }
+
+.fa-page4:before {
+  content: "\f3d7"; }
+
+.fa-pagelines:before {
+  content: "\f18c"; }
+
+.fa-paint-brush:before {
+  content: "\f1fc"; }
+
+.fa-palfed:before {
+  content: "\f3d8"; }
+
+.fa-pallet:before {
+  content: "\f482"; }
+
+.fa-paper-plane:before {
+  content: "\f1d8"; }
+
+.fa-paperclip:before {
+  content: "\f0c6"; }
+
+.fa-parachute-box:before {
+  content: "\f4cd"; }
+
+.fa-paragraph:before {
+  content: "\f1dd"; }
+
+.fa-paste:before {
+  content: "\f0ea"; }
+
+.fa-patreon:before {
+  content: "\f3d9"; }
+
+.fa-pause:before {
+  content: "\f04c"; }
+
+.fa-pause-circle:before {
+  content: "\f28b"; }
+
+.fa-paw:before {
+  content: "\f1b0"; }
+
+.fa-paypal:before {
+  content: "\f1ed"; }
+
+.fa-pen-square:before {
+  content: "\f14b"; }
+
+.fa-pencil-alt:before {
+  content: "\f303"; }
+
+.fa-people-carry:before {
+  content: "\f4ce"; }
+
+.fa-percent:before {
+  content: "\f295"; }
+
+.fa-periscope:before {
+  content: "\f3da"; }
+
+.fa-phabricator:before {
+  content: "\f3db"; }
+
+.fa-phoenix-framework:before {
+  content: "\f3dc"; }
+
+.fa-phone:before {
+  content: "\f095"; }
+
+.fa-phone-slash:before {
+  content: "\f3dd"; }
+
+.fa-phone-square:before {
+  content: "\f098"; }
+
+.fa-phone-volume:before {
+  content: "\f2a0"; }
+
+.fa-php:before {
+  content: "\f457"; }
+
+.fa-pied-piper:before {
+  content: "\f2ae"; }
+
+.fa-pied-piper-alt:before {
+  content: "\f1a8"; }
+
+.fa-pied-piper-pp:before {
+  content: "\f1a7"; }
+
+.fa-piggy-bank:before {
+  content: "\f4d3"; }
+
+.fa-pills:before {
+  content: "\f484"; }
+
+.fa-pinterest:before {
+  content: "\f0d2"; }
+
+.fa-pinterest-p:before {
+  content: "\f231"; }
+
+.fa-pinterest-square:before {
+  content: "\f0d3"; }
+
+.fa-plane:before {
+  content: "\f072"; }
+
+.fa-play:before {
+  content: "\f04b"; }
+
+.fa-play-circle:before {
+  content: "\f144"; }
+
+.fa-playstation:before {
+  content: "\f3df"; }
+
+.fa-plug:before {
+  content: "\f1e6"; }
+
+.fa-plus:before {
+  content: "\f067"; }
+
+.fa-plus-circle:before {
+  content: "\f055"; }
+
+.fa-plus-square:before {
+  content: "\f0fe"; }
+
+.fa-podcast:before {
+  content: "\f2ce"; }
+
+.fa-poo:before {
+  content: "\f2fe"; }
+
+.fa-pound-sign:before {
+  content: "\f154"; }
+
+.fa-power-off:before {
+  content: "\f011"; }
+
+.fa-prescription-bottle:before {
+  content: "\f485"; }
+
+.fa-prescription-bottle-alt:before {
+  content: "\f486"; }
+
+.fa-print:before {
+  content: "\f02f"; }
+
+.fa-procedures:before {
+  content: "\f487"; }
+
+.fa-product-hunt:before {
+  content: "\f288"; }
+
+.fa-pushed:before {
+  content: "\f3e1"; }
+
+.fa-puzzle-piece:before {
+  content: "\f12e"; }
+
+.fa-python:before {
+  content: "\f3e2"; }
+
+.fa-qq:before {
+  content: "\f1d6"; }
+
+.fa-qrcode:before {
+  content: "\f029"; }
+
+.fa-question:before {
+  content: "\f128"; }
+
+.fa-question-circle:before {
+  content: "\f059"; }
+
+.fa-quidditch:before {
+  content: "\f458"; }
+
+.fa-quinscape:before {
+  content: "\f459"; }
+
+.fa-quora:before {
+  content: "\f2c4"; }
+
+.fa-quote-left:before {
+  content: "\f10d"; }
+
+.fa-quote-right:before {
+  content: "\f10e"; }
+
+.fa-random:before {
+  content: "\f074"; }
+
+.fa-ravelry:before {
+  content: "\f2d9"; }
+
+.fa-react:before {
+  content: "\f41b"; }
+
+.fa-readme:before {
+  content: "\f4d5"; }
+
+.fa-rebel:before {
+  content: "\f1d0"; }
+
+.fa-recycle:before {
+  content: "\f1b8"; }
+
+.fa-red-river:before {
+  content: "\f3e3"; }
+
+.fa-reddit:before {
+  content: "\f1a1"; }
+
+.fa-reddit-alien:before {
+  content: "\f281"; }
+
+.fa-reddit-square:before {
+  content: "\f1a2"; }
+
+.fa-redo:before {
+  content: "\f01e"; }
+
+.fa-redo-alt:before {
+  content: "\f2f9"; }
+
+.fa-registered:before {
+  content: "\f25d"; }
+
+.fa-rendact:before {
+  content: "\f3e4"; }
+
+.fa-renren:before {
+  content: "\f18b"; }
+
+.fa-reply:before {
+  content: "\f3e5"; }
+
+.fa-reply-all:before {
+  content: "\f122"; }
+
+.fa-replyd:before {
+  content: "\f3e6"; }
+
+.fa-resolving:before {
+  content: "\f3e7"; }
+
+.fa-retweet:before {
+  content: "\f079"; }
+
+.fa-ribbon:before {
+  content: "\f4d6"; }
+
+.fa-road:before {
+  content: "\f018"; }
+
+.fa-rocket:before {
+  content: "\f135"; }
+
+.fa-rocketchat:before {
+  content: "\f3e8"; }
+
+.fa-rockrms:before {
+  content: "\f3e9"; }
+
+.fa-rss:before {
+  content: "\f09e"; }
+
+.fa-rss-square:before {
+  content: "\f143"; }
+
+.fa-ruble-sign:before {
+  content: "\f158"; }
+
+.fa-rupee-sign:before {
+  content: "\f156"; }
+
+.fa-safari:before {
+  content: "\f267"; }
+
+.fa-sass:before {
+  content: "\f41e"; }
+
+.fa-save:before {
+  content: "\f0c7"; }
+
+.fa-schlix:before {
+  content: "\f3ea"; }
+
+.fa-scribd:before {
+  content: "\f28a"; }
+
+.fa-search:before {
+  content: "\f002"; }
+
+.fa-search-minus:before {
+  content: "\f010"; }
+
+.fa-search-plus:before {
+  content: "\f00e"; }
+
+.fa-searchengin:before {
+  content: "\f3eb"; }
+
+.fa-seedling:before {
+  content: "\f4d8"; }
+
+.fa-sellcast:before {
+  content: "\f2da"; }
+
+.fa-sellsy:before {
+  content: "\f213"; }
+
+.fa-server:before {
+  content: "\f233"; }
+
+.fa-servicestack:before {
+  content: "\f3ec"; }
+
+.fa-share:before {
+  content: "\f064"; }
+
+.fa-share-alt:before {
+  content: "\f1e0"; }
+
+.fa-share-alt-square:before {
+  content: "\f1e1"; }
+
+.fa-share-square:before {
+  content: "\f14d"; }
+
+.fa-shekel-sign:before {
+  content: "\f20b"; }
+
+.fa-shield-alt:before {
+  content: "\f3ed"; }
+
+.fa-ship:before {
+  content: "\f21a"; }
+
+.fa-shipping-fast:before {
+  content: "\f48b"; }
+
+.fa-shirtsinbulk:before {
+  content: "\f214"; }
+
+.fa-shopping-bag:before {
+  content: "\f290"; }
+
+.fa-shopping-basket:before {
+  content: "\f291"; }
+
+.fa-shopping-cart:before {
+  content: "\f07a"; }
+
+.fa-shower:before {
+  content: "\f2cc"; }
+
+.fa-sign:before {
+  content: "\f4d9"; }
+
+.fa-sign-in-alt:before {
+  content: "\f2f6"; }
+
+.fa-sign-language:before {
+  content: "\f2a7"; }
+
+.fa-sign-out-alt:before {
+  content: "\f2f5"; }
+
+.fa-signal:before {
+  content: "\f012"; }
+
+.fa-simplybuilt:before {
+  content: "\f215"; }
+
+.fa-sistrix:before {
+  content: "\f3ee"; }
+
+.fa-sitemap:before {
+  content: "\f0e8"; }
+
+.fa-skyatlas:before {
+  content: "\f216"; }
+
+.fa-skype:before {
+  content: "\f17e"; }
+
+.fa-slack:before {
+  content: "\f198"; }
+
+.fa-slack-hash:before {
+  content: "\f3ef"; }
+
+.fa-sliders-h:before {
+  content: "\f1de"; }
+
+.fa-slideshare:before {
+  content: "\f1e7"; }
+
+.fa-smile:before {
+  content: "\f118"; }
+
+.fa-smoking:before {
+  content: "\f48d"; }
+
+.fa-snapchat:before {
+  content: "\f2ab"; }
+
+.fa-snapchat-ghost:before {
+  content: "\f2ac"; }
+
+.fa-snapchat-square:before {
+  content: "\f2ad"; }
+
+.fa-snowflake:before {
+  content: "\f2dc"; }
+
+.fa-sort:before {
+  content: "\f0dc"; }
+
+.fa-sort-alpha-down:before {
+  content: "\f15d"; }
+
+.fa-sort-alpha-up:before {
+  content: "\f15e"; }
+
+.fa-sort-amount-down:before {
+  content: "\f160"; }
+
+.fa-sort-amount-up:before {
+  content: "\f161"; }
+
+.fa-sort-down:before {
+  content: "\f0dd"; }
+
+.fa-sort-numeric-down:before {
+  content: "\f162"; }
+
+.fa-sort-numeric-up:before {
+  content: "\f163"; }
+
+.fa-sort-up:before {
+  content: "\f0de"; }
+
+.fa-soundcloud:before {
+  content: "\f1be"; }
+
+.fa-space-shuttle:before {
+  content: "\f197"; }
+
+.fa-speakap:before {
+  content: "\f3f3"; }
+
+.fa-spinner:before {
+  content: "\f110"; }
+
+.fa-spotify:before {
+  content: "\f1bc"; }
+
+.fa-square:before {
+  content: "\f0c8"; }
+
+.fa-square-full:before {
+  content: "\f45c"; }
+
+.fa-stack-exchange:before {
+  content: "\f18d"; }
+
+.fa-stack-overflow:before {
+  content: "\f16c"; }
+
+.fa-star:before {
+  content: "\f005"; }
+
+.fa-star-half:before {
+  content: "\f089"; }
+
+.fa-staylinked:before {
+  content: "\f3f5"; }
+
+.fa-steam:before {
+  content: "\f1b6"; }
+
+.fa-steam-square:before {
+  content: "\f1b7"; }
+
+.fa-steam-symbol:before {
+  content: "\f3f6"; }
+
+.fa-step-backward:before {
+  content: "\f048"; }
+
+.fa-step-forward:before {
+  content: "\f051"; }
+
+.fa-stethoscope:before {
+  content: "\f0f1"; }
+
+.fa-sticker-mule:before {
+  content: "\f3f7"; }
+
+.fa-sticky-note:before {
+  content: "\f249"; }
+
+.fa-stop:before {
+  content: "\f04d"; }
+
+.fa-stop-circle:before {
+  content: "\f28d"; }
+
+.fa-stopwatch:before {
+  content: "\f2f2"; }
+
+.fa-strava:before {
+  content: "\f428"; }
+
+.fa-street-view:before {
+  content: "\f21d"; }
+
+.fa-strikethrough:before {
+  content: "\f0cc"; }
+
+.fa-stripe:before {
+  content: "\f429"; }
+
+.fa-stripe-s:before {
+  content: "\f42a"; }
+
+.fa-studiovinari:before {
+  content: "\f3f8"; }
+
+.fa-stumbleupon:before {
+  content: "\f1a4"; }
+
+.fa-stumbleupon-circle:before {
+  content: "\f1a3"; }
+
+.fa-subscript:before {
+  content: "\f12c"; }
+
+.fa-subway:before {
+  content: "\f239"; }
+
+.fa-suitcase:before {
+  content: "\f0f2"; }
+
+.fa-sun:before {
+  content: "\f185"; }
+
+.fa-superpowers:before {
+  content: "\f2dd"; }
+
+.fa-superscript:before {
+  content: "\f12b"; }
+
+.fa-supple:before {
+  content: "\f3f9"; }
+
+.fa-sync:before {
+  content: "\f021"; }
+
+.fa-sync-alt:before {
+  content: "\f2f1"; }
+
+.fa-syringe:before {
+  content: "\f48e"; }
+
+.fa-table:before {
+  content: "\f0ce"; }
+
+.fa-table-tennis:before {
+  content: "\f45d"; }
+
+.fa-tablet:before {
+  content: "\f10a"; }
+
+.fa-tablet-alt:before {
+  content: "\f3fa"; }
+
+.fa-tablets:before {
+  content: "\f490"; }
+
+.fa-tachometer-alt:before {
+  content: "\f3fd"; }
+
+.fa-tag:before {
+  content: "\f02b"; }
+
+.fa-tags:before {
+  content: "\f02c"; }
+
+.fa-tape:before {
+  content: "\f4db"; }
+
+.fa-tasks:before {
+  content: "\f0ae"; }
+
+.fa-taxi:before {
+  content: "\f1ba"; }
+
+.fa-telegram:before {
+  content: "\f2c6"; }
+
+.fa-telegram-plane:before {
+  content: "\f3fe"; }
+
+.fa-tencent-weibo:before {
+  content: "\f1d5"; }
+
+.fa-terminal:before {
+  content: "\f120"; }
+
+.fa-text-height:before {
+  content: "\f034"; }
+
+.fa-text-width:before {
+  content: "\f035"; }
+
+.fa-th:before {
+  content: "\f00a"; }
+
+.fa-th-large:before {
+  content: "\f009"; }
+
+.fa-th-list:before {
+  content: "\f00b"; }
+
+.fa-themeisle:before {
+  content: "\f2b2"; }
+
+.fa-thermometer:before {
+  content: "\f491"; }
+
+.fa-thermometer-empty:before {
+  content: "\f2cb"; }
+
+.fa-thermometer-full:before {
+  content: "\f2c7"; }
+
+.fa-thermometer-half:before {
+  content: "\f2c9"; }
+
+.fa-thermometer-quarter:before {
+  content: "\f2ca"; }
+
+.fa-thermometer-three-quarters:before {
+  content: "\f2c8"; }
+
+.fa-thumbs-down:before {
+  content: "\f165"; }
+
+.fa-thumbs-up:before {
+  content: "\f164"; }
+
+.fa-thumbtack:before {
+  content: "\f08d"; }
+
+.fa-ticket-alt:before {
+  content: "\f3ff"; }
+
+.fa-times:before {
+  content: "\f00d"; }
+
+.fa-times-circle:before {
+  content: "\f057"; }
+
+.fa-tint:before {
+  content: "\f043"; }
+
+.fa-toggle-off:before {
+  content: "\f204"; }
+
+.fa-toggle-on:before {
+  content: "\f205"; }
+
+.fa-trademark:before {
+  content: "\f25c"; }
+
+.fa-train:before {
+  content: "\f238"; }
+
+.fa-transgender:before {
+  content: "\f224"; }
+
+.fa-transgender-alt:before {
+  content: "\f225"; }
+
+.fa-trash:before {
+  content: "\f1f8"; }
+
+.fa-trash-alt:before {
+  content: "\f2ed"; }
+
+.fa-tree:before {
+  content: "\f1bb"; }
+
+.fa-trello:before {
+  content: "\f181"; }
+
+.fa-tripadvisor:before {
+  content: "\f262"; }
+
+.fa-trophy:before {
+  content: "\f091"; }
+
+.fa-truck:before {
+  content: "\f0d1"; }
+
+.fa-truck-loading:before {
+  content: "\f4de"; }
+
+.fa-truck-moving:before {
+  content: "\f4df"; }
+
+.fa-tty:before {
+  content: "\f1e4"; }
+
+.fa-tumblr:before {
+  content: "\f173"; }
+
+.fa-tumblr-square:before {
+  content: "\f174"; }
+
+.fa-tv:before {
+  content: "\f26c"; }
+
+.fa-twitch:before {
+  content: "\f1e8"; }
+
+.fa-twitter:before {
+  content: "\f099"; }
+
+.fa-twitter-square:before {
+  content: "\f081"; }
+
+.fa-typo3:before {
+  content: "\f42b"; }
+
+.fa-uber:before {
+  content: "\f402"; }
+
+.fa-uikit:before {
+  content: "\f403"; }
+
+.fa-umbrella:before {
+  content: "\f0e9"; }
+
+.fa-underline:before {
+  content: "\f0cd"; }
+
+.fa-undo:before {
+  content: "\f0e2"; }
+
+.fa-undo-alt:before {
+  content: "\f2ea"; }
+
+.fa-uniregistry:before {
+  content: "\f404"; }
+
+.fa-universal-access:before {
+  content: "\f29a"; }
+
+.fa-university:before {
+  content: "\f19c"; }
+
+.fa-unlink:before {
+  content: "\f127"; }
+
+.fa-unlock:before {
+  content: "\f09c"; }
+
+.fa-unlock-alt:before {
+  content: "\f13e"; }
+
+.fa-untappd:before {
+  content: "\f405"; }
+
+.fa-upload:before {
+  content: "\f093"; }
+
+.fa-usb:before {
+  content: "\f287"; }
+
+.fa-user:before {
+  content: "\f007"; }
+
+.fa-user-circle:before {
+  content: "\f2bd"; }
+
+.fa-user-md:before {
+  content: "\f0f0"; }
+
+.fa-user-plus:before {
+  content: "\f234"; }
+
+.fa-user-secret:before {
+  content: "\f21b"; }
+
+.fa-user-times:before {
+  content: "\f235"; }
+
+.fa-users:before {
+  content: "\f0c0"; }
+
+.fa-ussunnah:before {
+  content: "\f407"; }
+
+.fa-utensil-spoon:before {
+  content: "\f2e5"; }
+
+.fa-utensils:before {
+  content: "\f2e7"; }
+
+.fa-vaadin:before {
+  content: "\f408"; }
+
+.fa-venus:before {
+  content: "\f221"; }
+
+.fa-venus-double:before {
+  content: "\f226"; }
+
+.fa-venus-mars:before {
+  content: "\f228"; }
+
+.fa-viacoin:before {
+  content: "\f237"; }
+
+.fa-viadeo:before {
+  content: "\f2a9"; }
+
+.fa-viadeo-square:before {
+  content: "\f2aa"; }
+
+.fa-vial:before {
+  content: "\f492"; }
+
+.fa-vials:before {
+  content: "\f493"; }
+
+.fa-viber:before {
+  content: "\f409"; }
+
+.fa-video:before {
+  content: "\f03d"; }
+
+.fa-video-slash:before {
+  content: "\f4e2"; }
+
+.fa-vimeo:before {
+  content: "\f40a"; }
+
+.fa-vimeo-square:before {
+  content: "\f194"; }
+
+.fa-vimeo-v:before {
+  content: "\f27d"; }
+
+.fa-vine:before {
+  content: "\f1ca"; }
+
+.fa-vk:before {
+  content: "\f189"; }
+
+.fa-vnv:before {
+  content: "\f40b"; }
+
+.fa-volleyball-ball:before {
+  content: "\f45f"; }
+
+.fa-volume-down:before {
+  content: "\f027"; }
+
+.fa-volume-off:before {
+  content: "\f026"; }
+
+.fa-volume-up:before {
+  content: "\f028"; }
+
+.fa-vuejs:before {
+  content: "\f41f"; }
+
+.fa-warehouse:before {
+  content: "\f494"; }
+
+.fa-weibo:before {
+  content: "\f18a"; }
+
+.fa-weight:before {
+  content: "\f496"; }
+
+.fa-weixin:before {
+  content: "\f1d7"; }
+
+.fa-whatsapp:before {
+  content: "\f232"; }
+
+.fa-whatsapp-square:before {
+  content: "\f40c"; }
+
+.fa-wheelchair:before {
+  content: "\f193"; }
+
+.fa-whmcs:before {
+  content: "\f40d"; }
+
+.fa-wifi:before {
+  content: "\f1eb"; }
+
+.fa-wikipedia-w:before {
+  content: "\f266"; }
+
+.fa-window-close:before {
+  content: "\f410"; }
+
+.fa-window-maximize:before {
+  content: "\f2d0"; }
+
+.fa-window-minimize:before {
+  content: "\f2d1"; }
+
+.fa-window-restore:before {
+  content: "\f2d2"; }
+
+.fa-windows:before {
+  content: "\f17a"; }
+
+.fa-wine-glass:before {
+  content: "\f4e3"; }
+
+.fa-won-sign:before {
+  content: "\f159"; }
+
+.fa-wordpress:before {
+  content: "\f19a"; }
+
+.fa-wordpress-simple:before {
+  content: "\f411"; }
+
+.fa-wpbeginner:before {
+  content: "\f297"; }
+
+.fa-wpexplorer:before {
+  content: "\f2de"; }
+
+.fa-wpforms:before {
+  content: "\f298"; }
+
+.fa-wrench:before {
+  content: "\f0ad"; }
+
+.fa-x-ray:before {
+  content: "\f497"; }
+
+.fa-xbox:before {
+  content: "\f412"; }
+
+.fa-xing:before {
+  content: "\f168"; }
+
+.fa-xing-square:before {
+  content: "\f169"; }
+
+.fa-y-combinator:before {
+  content: "\f23b"; }
+
+.fa-yahoo:before {
+  content: "\f19e"; }
+
+.fa-yandex:before {
+  content: "\f413"; }
+
+.fa-yandex-international:before {
+  content: "\f414"; }
+
+.fa-yelp:before {
+  content: "\f1e9"; }
+
+.fa-yen-sign:before {
+  content: "\f157"; }
+
+.fa-yoast:before {
+  content: "\f2b1"; }
+
+.fa-youtube:before {
+  content: "\f167"; }
+
+.fa-youtube-square:before {
+  content: "\f431"; }
+
+.sr-only {
+  border: 0;
+  clip: rect(0, 0, 0, 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  clip: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  position: static;
+  width: auto; }
+@font-face {
+  font-family: 'Font Awesome 5 Brands';
+  font-style: normal;
+  font-weight: normal;
+  src: url("../webfonts/fa-brands-400.eot");
+  src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
+
+.fab {
+  font-family: 'Font Awesome 5 Brands'; }
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 400;
+  src: url("../webfonts/fa-regular-400.eot");
+  src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
+
+.far {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 400; }
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 900;
+  src: url("../webfonts/fa-solid-900.eot");
+  src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
+
+.fa,
+.fas {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 900; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.min.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..7bc802201517ea555addd66a0d528f5c7fdb1d2f
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome-all.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}
\ No newline at end of file
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.css
new file mode 100644
index 0000000000000000000000000000000000000000..c67ed1884bfb6478fba9edfde2c5cc82cffe4230
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.css
@@ -0,0 +1,2825 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,
+.fas,
+.far,
+.fal,
+.fab {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  text-rendering: auto;
+  line-height: 1; }
+
+.fa-lg {
+  font-size: 1.33333em;
+  line-height: 0.75em;
+  vertical-align: -.0667em; }
+
+.fa-xs {
+  font-size: .75em; }
+
+.fa-sm {
+  font-size: .875em; }
+
+.fa-1x {
+  font-size: 1em; }
+
+.fa-2x {
+  font-size: 2em; }
+
+.fa-3x {
+  font-size: 3em; }
+
+.fa-4x {
+  font-size: 4em; }
+
+.fa-5x {
+  font-size: 5em; }
+
+.fa-6x {
+  font-size: 6em; }
+
+.fa-7x {
+  font-size: 7em; }
+
+.fa-8x {
+  font-size: 8em; }
+
+.fa-9x {
+  font-size: 9em; }
+
+.fa-10x {
+  font-size: 10em; }
+
+.fa-fw {
+  text-align: center;
+  width: 1.25em; }
+
+.fa-ul {
+  list-style-type: none;
+  margin-left: 2.5em;
+  padding-left: 0; }
+  .fa-ul > li {
+    position: relative; }
+
+.fa-li {
+  left: -2em;
+  position: absolute;
+  text-align: center;
+  width: 2em;
+  line-height: inherit; }
+
+.fa-border {
+  border: solid 0.08em #eee;
+  border-radius: .1em;
+  padding: .2em .25em .15em; }
+
+.fa-pull-left {
+  float: left; }
+
+.fa-pull-right {
+  float: right; }
+
+.fa.fa-pull-left,
+.fas.fa-pull-left,
+.far.fa-pull-left,
+.fal.fa-pull-left,
+.fab.fa-pull-left {
+  margin-right: .3em; }
+
+.fa.fa-pull-right,
+.fas.fa-pull-right,
+.far.fa-pull-right,
+.fal.fa-pull-right,
+.fab.fa-pull-right {
+  margin-left: .3em; }
+
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+          animation: fa-spin 2s infinite linear; }
+
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+          animation: fa-spin 1s infinite steps(8); }
+
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+  -webkit-transform: rotate(90deg);
+          transform: rotate(90deg); }
+
+.fa-rotate-180 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+  -webkit-transform: rotate(180deg);
+          transform: rotate(180deg); }
+
+.fa-rotate-270 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+  -webkit-transform: rotate(270deg);
+          transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+  -webkit-transform: scale(-1, 1);
+          transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(1, -1);
+          transform: scale(1, -1); }
+
+.fa-flip-horizontal.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(-1, -1);
+          transform: scale(-1, -1); }
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  -webkit-filter: none;
+          filter: none; }
+
+.fa-stack {
+  display: inline-block;
+  height: 2em;
+  line-height: 2em;
+  position: relative;
+  vertical-align: middle;
+  width: 2em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+  left: 0;
+  position: absolute;
+  text-align: center;
+  width: 100%; }
+
+.fa-stack-1x {
+  line-height: inherit; }
+
+.fa-stack-2x {
+  font-size: 2em; }
+
+.fa-inverse {
+  color: #fff; }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+.fa-500px:before {
+  content: "\f26e"; }
+
+.fa-accessible-icon:before {
+  content: "\f368"; }
+
+.fa-accusoft:before {
+  content: "\f369"; }
+
+.fa-address-book:before {
+  content: "\f2b9"; }
+
+.fa-address-card:before {
+  content: "\f2bb"; }
+
+.fa-adjust:before {
+  content: "\f042"; }
+
+.fa-adn:before {
+  content: "\f170"; }
+
+.fa-adversal:before {
+  content: "\f36a"; }
+
+.fa-affiliatetheme:before {
+  content: "\f36b"; }
+
+.fa-algolia:before {
+  content: "\f36c"; }
+
+.fa-align-center:before {
+  content: "\f037"; }
+
+.fa-align-justify:before {
+  content: "\f039"; }
+
+.fa-align-left:before {
+  content: "\f036"; }
+
+.fa-align-right:before {
+  content: "\f038"; }
+
+.fa-allergies:before {
+  content: "\f461"; }
+
+.fa-amazon:before {
+  content: "\f270"; }
+
+.fa-amazon-pay:before {
+  content: "\f42c"; }
+
+.fa-ambulance:before {
+  content: "\f0f9"; }
+
+.fa-american-sign-language-interpreting:before {
+  content: "\f2a3"; }
+
+.fa-amilia:before {
+  content: "\f36d"; }
+
+.fa-anchor:before {
+  content: "\f13d"; }
+
+.fa-android:before {
+  content: "\f17b"; }
+
+.fa-angellist:before {
+  content: "\f209"; }
+
+.fa-angle-double-down:before {
+  content: "\f103"; }
+
+.fa-angle-double-left:before {
+  content: "\f100"; }
+
+.fa-angle-double-right:before {
+  content: "\f101"; }
+
+.fa-angle-double-up:before {
+  content: "\f102"; }
+
+.fa-angle-down:before {
+  content: "\f107"; }
+
+.fa-angle-left:before {
+  content: "\f104"; }
+
+.fa-angle-right:before {
+  content: "\f105"; }
+
+.fa-angle-up:before {
+  content: "\f106"; }
+
+.fa-angrycreative:before {
+  content: "\f36e"; }
+
+.fa-angular:before {
+  content: "\f420"; }
+
+.fa-app-store:before {
+  content: "\f36f"; }
+
+.fa-app-store-ios:before {
+  content: "\f370"; }
+
+.fa-apper:before {
+  content: "\f371"; }
+
+.fa-apple:before {
+  content: "\f179"; }
+
+.fa-apple-pay:before {
+  content: "\f415"; }
+
+.fa-archive:before {
+  content: "\f187"; }
+
+.fa-arrow-alt-circle-down:before {
+  content: "\f358"; }
+
+.fa-arrow-alt-circle-left:before {
+  content: "\f359"; }
+
+.fa-arrow-alt-circle-right:before {
+  content: "\f35a"; }
+
+.fa-arrow-alt-circle-up:before {
+  content: "\f35b"; }
+
+.fa-arrow-circle-down:before {
+  content: "\f0ab"; }
+
+.fa-arrow-circle-left:before {
+  content: "\f0a8"; }
+
+.fa-arrow-circle-right:before {
+  content: "\f0a9"; }
+
+.fa-arrow-circle-up:before {
+  content: "\f0aa"; }
+
+.fa-arrow-down:before {
+  content: "\f063"; }
+
+.fa-arrow-left:before {
+  content: "\f060"; }
+
+.fa-arrow-right:before {
+  content: "\f061"; }
+
+.fa-arrow-up:before {
+  content: "\f062"; }
+
+.fa-arrows-alt:before {
+  content: "\f0b2"; }
+
+.fa-arrows-alt-h:before {
+  content: "\f337"; }
+
+.fa-arrows-alt-v:before {
+  content: "\f338"; }
+
+.fa-assistive-listening-systems:before {
+  content: "\f2a2"; }
+
+.fa-asterisk:before {
+  content: "\f069"; }
+
+.fa-asymmetrik:before {
+  content: "\f372"; }
+
+.fa-at:before {
+  content: "\f1fa"; }
+
+.fa-audible:before {
+  content: "\f373"; }
+
+.fa-audio-description:before {
+  content: "\f29e"; }
+
+.fa-autoprefixer:before {
+  content: "\f41c"; }
+
+.fa-avianex:before {
+  content: "\f374"; }
+
+.fa-aviato:before {
+  content: "\f421"; }
+
+.fa-aws:before {
+  content: "\f375"; }
+
+.fa-backward:before {
+  content: "\f04a"; }
+
+.fa-balance-scale:before {
+  content: "\f24e"; }
+
+.fa-ban:before {
+  content: "\f05e"; }
+
+.fa-band-aid:before {
+  content: "\f462"; }
+
+.fa-bandcamp:before {
+  content: "\f2d5"; }
+
+.fa-barcode:before {
+  content: "\f02a"; }
+
+.fa-bars:before {
+  content: "\f0c9"; }
+
+.fa-baseball-ball:before {
+  content: "\f433"; }
+
+.fa-basketball-ball:before {
+  content: "\f434"; }
+
+.fa-bath:before {
+  content: "\f2cd"; }
+
+.fa-battery-empty:before {
+  content: "\f244"; }
+
+.fa-battery-full:before {
+  content: "\f240"; }
+
+.fa-battery-half:before {
+  content: "\f242"; }
+
+.fa-battery-quarter:before {
+  content: "\f243"; }
+
+.fa-battery-three-quarters:before {
+  content: "\f241"; }
+
+.fa-bed:before {
+  content: "\f236"; }
+
+.fa-beer:before {
+  content: "\f0fc"; }
+
+.fa-behance:before {
+  content: "\f1b4"; }
+
+.fa-behance-square:before {
+  content: "\f1b5"; }
+
+.fa-bell:before {
+  content: "\f0f3"; }
+
+.fa-bell-slash:before {
+  content: "\f1f6"; }
+
+.fa-bicycle:before {
+  content: "\f206"; }
+
+.fa-bimobject:before {
+  content: "\f378"; }
+
+.fa-binoculars:before {
+  content: "\f1e5"; }
+
+.fa-birthday-cake:before {
+  content: "\f1fd"; }
+
+.fa-bitbucket:before {
+  content: "\f171"; }
+
+.fa-bitcoin:before {
+  content: "\f379"; }
+
+.fa-bity:before {
+  content: "\f37a"; }
+
+.fa-black-tie:before {
+  content: "\f27e"; }
+
+.fa-blackberry:before {
+  content: "\f37b"; }
+
+.fa-blind:before {
+  content: "\f29d"; }
+
+.fa-blogger:before {
+  content: "\f37c"; }
+
+.fa-blogger-b:before {
+  content: "\f37d"; }
+
+.fa-bluetooth:before {
+  content: "\f293"; }
+
+.fa-bluetooth-b:before {
+  content: "\f294"; }
+
+.fa-bold:before {
+  content: "\f032"; }
+
+.fa-bolt:before {
+  content: "\f0e7"; }
+
+.fa-bomb:before {
+  content: "\f1e2"; }
+
+.fa-book:before {
+  content: "\f02d"; }
+
+.fa-bookmark:before {
+  content: "\f02e"; }
+
+.fa-bowling-ball:before {
+  content: "\f436"; }
+
+.fa-box:before {
+  content: "\f466"; }
+
+.fa-box-open:before {
+  content: "\f49e"; }
+
+.fa-boxes:before {
+  content: "\f468"; }
+
+.fa-braille:before {
+  content: "\f2a1"; }
+
+.fa-briefcase:before {
+  content: "\f0b1"; }
+
+.fa-briefcase-medical:before {
+  content: "\f469"; }
+
+.fa-btc:before {
+  content: "\f15a"; }
+
+.fa-bug:before {
+  content: "\f188"; }
+
+.fa-building:before {
+  content: "\f1ad"; }
+
+.fa-bullhorn:before {
+  content: "\f0a1"; }
+
+.fa-bullseye:before {
+  content: "\f140"; }
+
+.fa-burn:before {
+  content: "\f46a"; }
+
+.fa-buromobelexperte:before {
+  content: "\f37f"; }
+
+.fa-bus:before {
+  content: "\f207"; }
+
+.fa-buysellads:before {
+  content: "\f20d"; }
+
+.fa-calculator:before {
+  content: "\f1ec"; }
+
+.fa-calendar:before {
+  content: "\f133"; }
+
+.fa-calendar-alt:before {
+  content: "\f073"; }
+
+.fa-calendar-check:before {
+  content: "\f274"; }
+
+.fa-calendar-minus:before {
+  content: "\f272"; }
+
+.fa-calendar-plus:before {
+  content: "\f271"; }
+
+.fa-calendar-times:before {
+  content: "\f273"; }
+
+.fa-camera:before {
+  content: "\f030"; }
+
+.fa-camera-retro:before {
+  content: "\f083"; }
+
+.fa-capsules:before {
+  content: "\f46b"; }
+
+.fa-car:before {
+  content: "\f1b9"; }
+
+.fa-caret-down:before {
+  content: "\f0d7"; }
+
+.fa-caret-left:before {
+  content: "\f0d9"; }
+
+.fa-caret-right:before {
+  content: "\f0da"; }
+
+.fa-caret-square-down:before {
+  content: "\f150"; }
+
+.fa-caret-square-left:before {
+  content: "\f191"; }
+
+.fa-caret-square-right:before {
+  content: "\f152"; }
+
+.fa-caret-square-up:before {
+  content: "\f151"; }
+
+.fa-caret-up:before {
+  content: "\f0d8"; }
+
+.fa-cart-arrow-down:before {
+  content: "\f218"; }
+
+.fa-cart-plus:before {
+  content: "\f217"; }
+
+.fa-cc-amazon-pay:before {
+  content: "\f42d"; }
+
+.fa-cc-amex:before {
+  content: "\f1f3"; }
+
+.fa-cc-apple-pay:before {
+  content: "\f416"; }
+
+.fa-cc-diners-club:before {
+  content: "\f24c"; }
+
+.fa-cc-discover:before {
+  content: "\f1f2"; }
+
+.fa-cc-jcb:before {
+  content: "\f24b"; }
+
+.fa-cc-mastercard:before {
+  content: "\f1f1"; }
+
+.fa-cc-paypal:before {
+  content: "\f1f4"; }
+
+.fa-cc-stripe:before {
+  content: "\f1f5"; }
+
+.fa-cc-visa:before {
+  content: "\f1f0"; }
+
+.fa-centercode:before {
+  content: "\f380"; }
+
+.fa-certificate:before {
+  content: "\f0a3"; }
+
+.fa-chart-area:before {
+  content: "\f1fe"; }
+
+.fa-chart-bar:before {
+  content: "\f080"; }
+
+.fa-chart-line:before {
+  content: "\f201"; }
+
+.fa-chart-pie:before {
+  content: "\f200"; }
+
+.fa-check:before {
+  content: "\f00c"; }
+
+.fa-check-circle:before {
+  content: "\f058"; }
+
+.fa-check-square:before {
+  content: "\f14a"; }
+
+.fa-chess:before {
+  content: "\f439"; }
+
+.fa-chess-bishop:before {
+  content: "\f43a"; }
+
+.fa-chess-board:before {
+  content: "\f43c"; }
+
+.fa-chess-king:before {
+  content: "\f43f"; }
+
+.fa-chess-knight:before {
+  content: "\f441"; }
+
+.fa-chess-pawn:before {
+  content: "\f443"; }
+
+.fa-chess-queen:before {
+  content: "\f445"; }
+
+.fa-chess-rook:before {
+  content: "\f447"; }
+
+.fa-chevron-circle-down:before {
+  content: "\f13a"; }
+
+.fa-chevron-circle-left:before {
+  content: "\f137"; }
+
+.fa-chevron-circle-right:before {
+  content: "\f138"; }
+
+.fa-chevron-circle-up:before {
+  content: "\f139"; }
+
+.fa-chevron-down:before {
+  content: "\f078"; }
+
+.fa-chevron-left:before {
+  content: "\f053"; }
+
+.fa-chevron-right:before {
+  content: "\f054"; }
+
+.fa-chevron-up:before {
+  content: "\f077"; }
+
+.fa-child:before {
+  content: "\f1ae"; }
+
+.fa-chrome:before {
+  content: "\f268"; }
+
+.fa-circle:before {
+  content: "\f111"; }
+
+.fa-circle-notch:before {
+  content: "\f1ce"; }
+
+.fa-clipboard:before {
+  content: "\f328"; }
+
+.fa-clipboard-check:before {
+  content: "\f46c"; }
+
+.fa-clipboard-list:before {
+  content: "\f46d"; }
+
+.fa-clock:before {
+  content: "\f017"; }
+
+.fa-clone:before {
+  content: "\f24d"; }
+
+.fa-closed-captioning:before {
+  content: "\f20a"; }
+
+.fa-cloud:before {
+  content: "\f0c2"; }
+
+.fa-cloud-download-alt:before {
+  content: "\f381"; }
+
+.fa-cloud-upload-alt:before {
+  content: "\f382"; }
+
+.fa-cloudscale:before {
+  content: "\f383"; }
+
+.fa-cloudsmith:before {
+  content: "\f384"; }
+
+.fa-cloudversify:before {
+  content: "\f385"; }
+
+.fa-code:before {
+  content: "\f121"; }
+
+.fa-code-branch:before {
+  content: "\f126"; }
+
+.fa-codepen:before {
+  content: "\f1cb"; }
+
+.fa-codiepie:before {
+  content: "\f284"; }
+
+.fa-coffee:before {
+  content: "\f0f4"; }
+
+.fa-cog:before {
+  content: "\f013"; }
+
+.fa-cogs:before {
+  content: "\f085"; }
+
+.fa-columns:before {
+  content: "\f0db"; }
+
+.fa-comment:before {
+  content: "\f075"; }
+
+.fa-comment-alt:before {
+  content: "\f27a"; }
+
+.fa-comment-dots:before {
+  content: "\f4ad"; }
+
+.fa-comment-slash:before {
+  content: "\f4b3"; }
+
+.fa-comments:before {
+  content: "\f086"; }
+
+.fa-compass:before {
+  content: "\f14e"; }
+
+.fa-compress:before {
+  content: "\f066"; }
+
+.fa-connectdevelop:before {
+  content: "\f20e"; }
+
+.fa-contao:before {
+  content: "\f26d"; }
+
+.fa-copy:before {
+  content: "\f0c5"; }
+
+.fa-copyright:before {
+  content: "\f1f9"; }
+
+.fa-couch:before {
+  content: "\f4b8"; }
+
+.fa-cpanel:before {
+  content: "\f388"; }
+
+.fa-creative-commons:before {
+  content: "\f25e"; }
+
+.fa-credit-card:before {
+  content: "\f09d"; }
+
+.fa-crop:before {
+  content: "\f125"; }
+
+.fa-crosshairs:before {
+  content: "\f05b"; }
+
+.fa-css3:before {
+  content: "\f13c"; }
+
+.fa-css3-alt:before {
+  content: "\f38b"; }
+
+.fa-cube:before {
+  content: "\f1b2"; }
+
+.fa-cubes:before {
+  content: "\f1b3"; }
+
+.fa-cut:before {
+  content: "\f0c4"; }
+
+.fa-cuttlefish:before {
+  content: "\f38c"; }
+
+.fa-d-and-d:before {
+  content: "\f38d"; }
+
+.fa-dashcube:before {
+  content: "\f210"; }
+
+.fa-database:before {
+  content: "\f1c0"; }
+
+.fa-deaf:before {
+  content: "\f2a4"; }
+
+.fa-delicious:before {
+  content: "\f1a5"; }
+
+.fa-deploydog:before {
+  content: "\f38e"; }
+
+.fa-deskpro:before {
+  content: "\f38f"; }
+
+.fa-desktop:before {
+  content: "\f108"; }
+
+.fa-deviantart:before {
+  content: "\f1bd"; }
+
+.fa-diagnoses:before {
+  content: "\f470"; }
+
+.fa-digg:before {
+  content: "\f1a6"; }
+
+.fa-digital-ocean:before {
+  content: "\f391"; }
+
+.fa-discord:before {
+  content: "\f392"; }
+
+.fa-discourse:before {
+  content: "\f393"; }
+
+.fa-dna:before {
+  content: "\f471"; }
+
+.fa-dochub:before {
+  content: "\f394"; }
+
+.fa-docker:before {
+  content: "\f395"; }
+
+.fa-dollar-sign:before {
+  content: "\f155"; }
+
+.fa-dolly:before {
+  content: "\f472"; }
+
+.fa-dolly-flatbed:before {
+  content: "\f474"; }
+
+.fa-donate:before {
+  content: "\f4b9"; }
+
+.fa-dot-circle:before {
+  content: "\f192"; }
+
+.fa-dove:before {
+  content: "\f4ba"; }
+
+.fa-download:before {
+  content: "\f019"; }
+
+.fa-draft2digital:before {
+  content: "\f396"; }
+
+.fa-dribbble:before {
+  content: "\f17d"; }
+
+.fa-dribbble-square:before {
+  content: "\f397"; }
+
+.fa-dropbox:before {
+  content: "\f16b"; }
+
+.fa-drupal:before {
+  content: "\f1a9"; }
+
+.fa-dyalog:before {
+  content: "\f399"; }
+
+.fa-earlybirds:before {
+  content: "\f39a"; }
+
+.fa-edge:before {
+  content: "\f282"; }
+
+.fa-edit:before {
+  content: "\f044"; }
+
+.fa-eject:before {
+  content: "\f052"; }
+
+.fa-elementor:before {
+  content: "\f430"; }
+
+.fa-ellipsis-h:before {
+  content: "\f141"; }
+
+.fa-ellipsis-v:before {
+  content: "\f142"; }
+
+.fa-ember:before {
+  content: "\f423"; }
+
+.fa-empire:before {
+  content: "\f1d1"; }
+
+.fa-envelope:before {
+  content: "\f0e0"; }
+
+.fa-envelope-open:before {
+  content: "\f2b6"; }
+
+.fa-envelope-square:before {
+  content: "\f199"; }
+
+.fa-envira:before {
+  content: "\f299"; }
+
+.fa-eraser:before {
+  content: "\f12d"; }
+
+.fa-erlang:before {
+  content: "\f39d"; }
+
+.fa-ethereum:before {
+  content: "\f42e"; }
+
+.fa-etsy:before {
+  content: "\f2d7"; }
+
+.fa-euro-sign:before {
+  content: "\f153"; }
+
+.fa-exchange-alt:before {
+  content: "\f362"; }
+
+.fa-exclamation:before {
+  content: "\f12a"; }
+
+.fa-exclamation-circle:before {
+  content: "\f06a"; }
+
+.fa-exclamation-triangle:before {
+  content: "\f071"; }
+
+.fa-expand:before {
+  content: "\f065"; }
+
+.fa-expand-arrows-alt:before {
+  content: "\f31e"; }
+
+.fa-expeditedssl:before {
+  content: "\f23e"; }
+
+.fa-external-link-alt:before {
+  content: "\f35d"; }
+
+.fa-external-link-square-alt:before {
+  content: "\f360"; }
+
+.fa-eye:before {
+  content: "\f06e"; }
+
+.fa-eye-dropper:before {
+  content: "\f1fb"; }
+
+.fa-eye-slash:before {
+  content: "\f070"; }
+
+.fa-facebook:before {
+  content: "\f09a"; }
+
+.fa-facebook-f:before {
+  content: "\f39e"; }
+
+.fa-facebook-messenger:before {
+  content: "\f39f"; }
+
+.fa-facebook-square:before {
+  content: "\f082"; }
+
+.fa-fast-backward:before {
+  content: "\f049"; }
+
+.fa-fast-forward:before {
+  content: "\f050"; }
+
+.fa-fax:before {
+  content: "\f1ac"; }
+
+.fa-female:before {
+  content: "\f182"; }
+
+.fa-fighter-jet:before {
+  content: "\f0fb"; }
+
+.fa-file:before {
+  content: "\f15b"; }
+
+.fa-file-alt:before {
+  content: "\f15c"; }
+
+.fa-file-archive:before {
+  content: "\f1c6"; }
+
+.fa-file-audio:before {
+  content: "\f1c7"; }
+
+.fa-file-code:before {
+  content: "\f1c9"; }
+
+.fa-file-excel:before {
+  content: "\f1c3"; }
+
+.fa-file-image:before {
+  content: "\f1c5"; }
+
+.fa-file-medical:before {
+  content: "\f477"; }
+
+.fa-file-medical-alt:before {
+  content: "\f478"; }
+
+.fa-file-pdf:before {
+  content: "\f1c1"; }
+
+.fa-file-powerpoint:before {
+  content: "\f1c4"; }
+
+.fa-file-video:before {
+  content: "\f1c8"; }
+
+.fa-file-word:before {
+  content: "\f1c2"; }
+
+.fa-film:before {
+  content: "\f008"; }
+
+.fa-filter:before {
+  content: "\f0b0"; }
+
+.fa-fire:before {
+  content: "\f06d"; }
+
+.fa-fire-extinguisher:before {
+  content: "\f134"; }
+
+.fa-firefox:before {
+  content: "\f269"; }
+
+.fa-first-aid:before {
+  content: "\f479"; }
+
+.fa-first-order:before {
+  content: "\f2b0"; }
+
+.fa-firstdraft:before {
+  content: "\f3a1"; }
+
+.fa-flag:before {
+  content: "\f024"; }
+
+.fa-flag-checkered:before {
+  content: "\f11e"; }
+
+.fa-flask:before {
+  content: "\f0c3"; }
+
+.fa-flickr:before {
+  content: "\f16e"; }
+
+.fa-flipboard:before {
+  content: "\f44d"; }
+
+.fa-fly:before {
+  content: "\f417"; }
+
+.fa-folder:before {
+  content: "\f07b"; }
+
+.fa-folder-open:before {
+  content: "\f07c"; }
+
+.fa-font:before {
+  content: "\f031"; }
+
+.fa-font-awesome:before {
+  content: "\f2b4"; }
+
+.fa-font-awesome-alt:before {
+  content: "\f35c"; }
+
+.fa-font-awesome-flag:before {
+  content: "\f425"; }
+
+.fa-fonticons:before {
+  content: "\f280"; }
+
+.fa-fonticons-fi:before {
+  content: "\f3a2"; }
+
+.fa-football-ball:before {
+  content: "\f44e"; }
+
+.fa-fort-awesome:before {
+  content: "\f286"; }
+
+.fa-fort-awesome-alt:before {
+  content: "\f3a3"; }
+
+.fa-forumbee:before {
+  content: "\f211"; }
+
+.fa-forward:before {
+  content: "\f04e"; }
+
+.fa-foursquare:before {
+  content: "\f180"; }
+
+.fa-free-code-camp:before {
+  content: "\f2c5"; }
+
+.fa-freebsd:before {
+  content: "\f3a4"; }
+
+.fa-frown:before {
+  content: "\f119"; }
+
+.fa-futbol:before {
+  content: "\f1e3"; }
+
+.fa-gamepad:before {
+  content: "\f11b"; }
+
+.fa-gavel:before {
+  content: "\f0e3"; }
+
+.fa-gem:before {
+  content: "\f3a5"; }
+
+.fa-genderless:before {
+  content: "\f22d"; }
+
+.fa-get-pocket:before {
+  content: "\f265"; }
+
+.fa-gg:before {
+  content: "\f260"; }
+
+.fa-gg-circle:before {
+  content: "\f261"; }
+
+.fa-gift:before {
+  content: "\f06b"; }
+
+.fa-git:before {
+  content: "\f1d3"; }
+
+.fa-git-square:before {
+  content: "\f1d2"; }
+
+.fa-github:before {
+  content: "\f09b"; }
+
+.fa-github-alt:before {
+  content: "\f113"; }
+
+.fa-github-square:before {
+  content: "\f092"; }
+
+.fa-gitkraken:before {
+  content: "\f3a6"; }
+
+.fa-gitlab:before {
+  content: "\f296"; }
+
+.fa-gitter:before {
+  content: "\f426"; }
+
+.fa-glass-martini:before {
+  content: "\f000"; }
+
+.fa-glide:before {
+  content: "\f2a5"; }
+
+.fa-glide-g:before {
+  content: "\f2a6"; }
+
+.fa-globe:before {
+  content: "\f0ac"; }
+
+.fa-gofore:before {
+  content: "\f3a7"; }
+
+.fa-golf-ball:before {
+  content: "\f450"; }
+
+.fa-goodreads:before {
+  content: "\f3a8"; }
+
+.fa-goodreads-g:before {
+  content: "\f3a9"; }
+
+.fa-google:before {
+  content: "\f1a0"; }
+
+.fa-google-drive:before {
+  content: "\f3aa"; }
+
+.fa-google-play:before {
+  content: "\f3ab"; }
+
+.fa-google-plus:before {
+  content: "\f2b3"; }
+
+.fa-google-plus-g:before {
+  content: "\f0d5"; }
+
+.fa-google-plus-square:before {
+  content: "\f0d4"; }
+
+.fa-google-wallet:before {
+  content: "\f1ee"; }
+
+.fa-graduation-cap:before {
+  content: "\f19d"; }
+
+.fa-gratipay:before {
+  content: "\f184"; }
+
+.fa-grav:before {
+  content: "\f2d6"; }
+
+.fa-gripfire:before {
+  content: "\f3ac"; }
+
+.fa-grunt:before {
+  content: "\f3ad"; }
+
+.fa-gulp:before {
+  content: "\f3ae"; }
+
+.fa-h-square:before {
+  content: "\f0fd"; }
+
+.fa-hacker-news:before {
+  content: "\f1d4"; }
+
+.fa-hacker-news-square:before {
+  content: "\f3af"; }
+
+.fa-hand-holding:before {
+  content: "\f4bd"; }
+
+.fa-hand-holding-heart:before {
+  content: "\f4be"; }
+
+.fa-hand-holding-usd:before {
+  content: "\f4c0"; }
+
+.fa-hand-lizard:before {
+  content: "\f258"; }
+
+.fa-hand-paper:before {
+  content: "\f256"; }
+
+.fa-hand-peace:before {
+  content: "\f25b"; }
+
+.fa-hand-point-down:before {
+  content: "\f0a7"; }
+
+.fa-hand-point-left:before {
+  content: "\f0a5"; }
+
+.fa-hand-point-right:before {
+  content: "\f0a4"; }
+
+.fa-hand-point-up:before {
+  content: "\f0a6"; }
+
+.fa-hand-pointer:before {
+  content: "\f25a"; }
+
+.fa-hand-rock:before {
+  content: "\f255"; }
+
+.fa-hand-scissors:before {
+  content: "\f257"; }
+
+.fa-hand-spock:before {
+  content: "\f259"; }
+
+.fa-hands:before {
+  content: "\f4c2"; }
+
+.fa-hands-helping:before {
+  content: "\f4c4"; }
+
+.fa-handshake:before {
+  content: "\f2b5"; }
+
+.fa-hashtag:before {
+  content: "\f292"; }
+
+.fa-hdd:before {
+  content: "\f0a0"; }
+
+.fa-heading:before {
+  content: "\f1dc"; }
+
+.fa-headphones:before {
+  content: "\f025"; }
+
+.fa-heart:before {
+  content: "\f004"; }
+
+.fa-heartbeat:before {
+  content: "\f21e"; }
+
+.fa-hips:before {
+  content: "\f452"; }
+
+.fa-hire-a-helper:before {
+  content: "\f3b0"; }
+
+.fa-history:before {
+  content: "\f1da"; }
+
+.fa-hockey-puck:before {
+  content: "\f453"; }
+
+.fa-home:before {
+  content: "\f015"; }
+
+.fa-hooli:before {
+  content: "\f427"; }
+
+.fa-hospital:before {
+  content: "\f0f8"; }
+
+.fa-hospital-alt:before {
+  content: "\f47d"; }
+
+.fa-hospital-symbol:before {
+  content: "\f47e"; }
+
+.fa-hotjar:before {
+  content: "\f3b1"; }
+
+.fa-hourglass:before {
+  content: "\f254"; }
+
+.fa-hourglass-end:before {
+  content: "\f253"; }
+
+.fa-hourglass-half:before {
+  content: "\f252"; }
+
+.fa-hourglass-start:before {
+  content: "\f251"; }
+
+.fa-houzz:before {
+  content: "\f27c"; }
+
+.fa-html5:before {
+  content: "\f13b"; }
+
+.fa-hubspot:before {
+  content: "\f3b2"; }
+
+.fa-i-cursor:before {
+  content: "\f246"; }
+
+.fa-id-badge:before {
+  content: "\f2c1"; }
+
+.fa-id-card:before {
+  content: "\f2c2"; }
+
+.fa-id-card-alt:before {
+  content: "\f47f"; }
+
+.fa-image:before {
+  content: "\f03e"; }
+
+.fa-images:before {
+  content: "\f302"; }
+
+.fa-imdb:before {
+  content: "\f2d8"; }
+
+.fa-inbox:before {
+  content: "\f01c"; }
+
+.fa-indent:before {
+  content: "\f03c"; }
+
+.fa-industry:before {
+  content: "\f275"; }
+
+.fa-info:before {
+  content: "\f129"; }
+
+.fa-info-circle:before {
+  content: "\f05a"; }
+
+.fa-instagram:before {
+  content: "\f16d"; }
+
+.fa-internet-explorer:before {
+  content: "\f26b"; }
+
+.fa-ioxhost:before {
+  content: "\f208"; }
+
+.fa-italic:before {
+  content: "\f033"; }
+
+.fa-itunes:before {
+  content: "\f3b4"; }
+
+.fa-itunes-note:before {
+  content: "\f3b5"; }
+
+.fa-jenkins:before {
+  content: "\f3b6"; }
+
+.fa-joget:before {
+  content: "\f3b7"; }
+
+.fa-joomla:before {
+  content: "\f1aa"; }
+
+.fa-js:before {
+  content: "\f3b8"; }
+
+.fa-js-square:before {
+  content: "\f3b9"; }
+
+.fa-jsfiddle:before {
+  content: "\f1cc"; }
+
+.fa-key:before {
+  content: "\f084"; }
+
+.fa-keyboard:before {
+  content: "\f11c"; }
+
+.fa-keycdn:before {
+  content: "\f3ba"; }
+
+.fa-kickstarter:before {
+  content: "\f3bb"; }
+
+.fa-kickstarter-k:before {
+  content: "\f3bc"; }
+
+.fa-korvue:before {
+  content: "\f42f"; }
+
+.fa-language:before {
+  content: "\f1ab"; }
+
+.fa-laptop:before {
+  content: "\f109"; }
+
+.fa-laravel:before {
+  content: "\f3bd"; }
+
+.fa-lastfm:before {
+  content: "\f202"; }
+
+.fa-lastfm-square:before {
+  content: "\f203"; }
+
+.fa-leaf:before {
+  content: "\f06c"; }
+
+.fa-leanpub:before {
+  content: "\f212"; }
+
+.fa-lemon:before {
+  content: "\f094"; }
+
+.fa-less:before {
+  content: "\f41d"; }
+
+.fa-level-down-alt:before {
+  content: "\f3be"; }
+
+.fa-level-up-alt:before {
+  content: "\f3bf"; }
+
+.fa-life-ring:before {
+  content: "\f1cd"; }
+
+.fa-lightbulb:before {
+  content: "\f0eb"; }
+
+.fa-line:before {
+  content: "\f3c0"; }
+
+.fa-link:before {
+  content: "\f0c1"; }
+
+.fa-linkedin:before {
+  content: "\f08c"; }
+
+.fa-linkedin-in:before {
+  content: "\f0e1"; }
+
+.fa-linode:before {
+  content: "\f2b8"; }
+
+.fa-linux:before {
+  content: "\f17c"; }
+
+.fa-lira-sign:before {
+  content: "\f195"; }
+
+.fa-list:before {
+  content: "\f03a"; }
+
+.fa-list-alt:before {
+  content: "\f022"; }
+
+.fa-list-ol:before {
+  content: "\f0cb"; }
+
+.fa-list-ul:before {
+  content: "\f0ca"; }
+
+.fa-location-arrow:before {
+  content: "\f124"; }
+
+.fa-lock:before {
+  content: "\f023"; }
+
+.fa-lock-open:before {
+  content: "\f3c1"; }
+
+.fa-long-arrow-alt-down:before {
+  content: "\f309"; }
+
+.fa-long-arrow-alt-left:before {
+  content: "\f30a"; }
+
+.fa-long-arrow-alt-right:before {
+  content: "\f30b"; }
+
+.fa-long-arrow-alt-up:before {
+  content: "\f30c"; }
+
+.fa-low-vision:before {
+  content: "\f2a8"; }
+
+.fa-lyft:before {
+  content: "\f3c3"; }
+
+.fa-magento:before {
+  content: "\f3c4"; }
+
+.fa-magic:before {
+  content: "\f0d0"; }
+
+.fa-magnet:before {
+  content: "\f076"; }
+
+.fa-male:before {
+  content: "\f183"; }
+
+.fa-map:before {
+  content: "\f279"; }
+
+.fa-map-marker:before {
+  content: "\f041"; }
+
+.fa-map-marker-alt:before {
+  content: "\f3c5"; }
+
+.fa-map-pin:before {
+  content: "\f276"; }
+
+.fa-map-signs:before {
+  content: "\f277"; }
+
+.fa-mars:before {
+  content: "\f222"; }
+
+.fa-mars-double:before {
+  content: "\f227"; }
+
+.fa-mars-stroke:before {
+  content: "\f229"; }
+
+.fa-mars-stroke-h:before {
+  content: "\f22b"; }
+
+.fa-mars-stroke-v:before {
+  content: "\f22a"; }
+
+.fa-maxcdn:before {
+  content: "\f136"; }
+
+.fa-medapps:before {
+  content: "\f3c6"; }
+
+.fa-medium:before {
+  content: "\f23a"; }
+
+.fa-medium-m:before {
+  content: "\f3c7"; }
+
+.fa-medkit:before {
+  content: "\f0fa"; }
+
+.fa-medrt:before {
+  content: "\f3c8"; }
+
+.fa-meetup:before {
+  content: "\f2e0"; }
+
+.fa-meh:before {
+  content: "\f11a"; }
+
+.fa-mercury:before {
+  content: "\f223"; }
+
+.fa-microchip:before {
+  content: "\f2db"; }
+
+.fa-microphone:before {
+  content: "\f130"; }
+
+.fa-microphone-slash:before {
+  content: "\f131"; }
+
+.fa-microsoft:before {
+  content: "\f3ca"; }
+
+.fa-minus:before {
+  content: "\f068"; }
+
+.fa-minus-circle:before {
+  content: "\f056"; }
+
+.fa-minus-square:before {
+  content: "\f146"; }
+
+.fa-mix:before {
+  content: "\f3cb"; }
+
+.fa-mixcloud:before {
+  content: "\f289"; }
+
+.fa-mizuni:before {
+  content: "\f3cc"; }
+
+.fa-mobile:before {
+  content: "\f10b"; }
+
+.fa-mobile-alt:before {
+  content: "\f3cd"; }
+
+.fa-modx:before {
+  content: "\f285"; }
+
+.fa-monero:before {
+  content: "\f3d0"; }
+
+.fa-money-bill-alt:before {
+  content: "\f3d1"; }
+
+.fa-moon:before {
+  content: "\f186"; }
+
+.fa-motorcycle:before {
+  content: "\f21c"; }
+
+.fa-mouse-pointer:before {
+  content: "\f245"; }
+
+.fa-music:before {
+  content: "\f001"; }
+
+.fa-napster:before {
+  content: "\f3d2"; }
+
+.fa-neuter:before {
+  content: "\f22c"; }
+
+.fa-newspaper:before {
+  content: "\f1ea"; }
+
+.fa-nintendo-switch:before {
+  content: "\f418"; }
+
+.fa-node:before {
+  content: "\f419"; }
+
+.fa-node-js:before {
+  content: "\f3d3"; }
+
+.fa-notes-medical:before {
+  content: "\f481"; }
+
+.fa-npm:before {
+  content: "\f3d4"; }
+
+.fa-ns8:before {
+  content: "\f3d5"; }
+
+.fa-nutritionix:before {
+  content: "\f3d6"; }
+
+.fa-object-group:before {
+  content: "\f247"; }
+
+.fa-object-ungroup:before {
+  content: "\f248"; }
+
+.fa-odnoklassniki:before {
+  content: "\f263"; }
+
+.fa-odnoklassniki-square:before {
+  content: "\f264"; }
+
+.fa-opencart:before {
+  content: "\f23d"; }
+
+.fa-openid:before {
+  content: "\f19b"; }
+
+.fa-opera:before {
+  content: "\f26a"; }
+
+.fa-optin-monster:before {
+  content: "\f23c"; }
+
+.fa-osi:before {
+  content: "\f41a"; }
+
+.fa-outdent:before {
+  content: "\f03b"; }
+
+.fa-page4:before {
+  content: "\f3d7"; }
+
+.fa-pagelines:before {
+  content: "\f18c"; }
+
+.fa-paint-brush:before {
+  content: "\f1fc"; }
+
+.fa-palfed:before {
+  content: "\f3d8"; }
+
+.fa-pallet:before {
+  content: "\f482"; }
+
+.fa-paper-plane:before {
+  content: "\f1d8"; }
+
+.fa-paperclip:before {
+  content: "\f0c6"; }
+
+.fa-parachute-box:before {
+  content: "\f4cd"; }
+
+.fa-paragraph:before {
+  content: "\f1dd"; }
+
+.fa-paste:before {
+  content: "\f0ea"; }
+
+.fa-patreon:before {
+  content: "\f3d9"; }
+
+.fa-pause:before {
+  content: "\f04c"; }
+
+.fa-pause-circle:before {
+  content: "\f28b"; }
+
+.fa-paw:before {
+  content: "\f1b0"; }
+
+.fa-paypal:before {
+  content: "\f1ed"; }
+
+.fa-pen-square:before {
+  content: "\f14b"; }
+
+.fa-pencil-alt:before {
+  content: "\f303"; }
+
+.fa-people-carry:before {
+  content: "\f4ce"; }
+
+.fa-percent:before {
+  content: "\f295"; }
+
+.fa-periscope:before {
+  content: "\f3da"; }
+
+.fa-phabricator:before {
+  content: "\f3db"; }
+
+.fa-phoenix-framework:before {
+  content: "\f3dc"; }
+
+.fa-phone:before {
+  content: "\f095"; }
+
+.fa-phone-slash:before {
+  content: "\f3dd"; }
+
+.fa-phone-square:before {
+  content: "\f098"; }
+
+.fa-phone-volume:before {
+  content: "\f2a0"; }
+
+.fa-php:before {
+  content: "\f457"; }
+
+.fa-pied-piper:before {
+  content: "\f2ae"; }
+
+.fa-pied-piper-alt:before {
+  content: "\f1a8"; }
+
+.fa-pied-piper-pp:before {
+  content: "\f1a7"; }
+
+.fa-piggy-bank:before {
+  content: "\f4d3"; }
+
+.fa-pills:before {
+  content: "\f484"; }
+
+.fa-pinterest:before {
+  content: "\f0d2"; }
+
+.fa-pinterest-p:before {
+  content: "\f231"; }
+
+.fa-pinterest-square:before {
+  content: "\f0d3"; }
+
+.fa-plane:before {
+  content: "\f072"; }
+
+.fa-play:before {
+  content: "\f04b"; }
+
+.fa-play-circle:before {
+  content: "\f144"; }
+
+.fa-playstation:before {
+  content: "\f3df"; }
+
+.fa-plug:before {
+  content: "\f1e6"; }
+
+.fa-plus:before {
+  content: "\f067"; }
+
+.fa-plus-circle:before {
+  content: "\f055"; }
+
+.fa-plus-square:before {
+  content: "\f0fe"; }
+
+.fa-podcast:before {
+  content: "\f2ce"; }
+
+.fa-poo:before {
+  content: "\f2fe"; }
+
+.fa-pound-sign:before {
+  content: "\f154"; }
+
+.fa-power-off:before {
+  content: "\f011"; }
+
+.fa-prescription-bottle:before {
+  content: "\f485"; }
+
+.fa-prescription-bottle-alt:before {
+  content: "\f486"; }
+
+.fa-print:before {
+  content: "\f02f"; }
+
+.fa-procedures:before {
+  content: "\f487"; }
+
+.fa-product-hunt:before {
+  content: "\f288"; }
+
+.fa-pushed:before {
+  content: "\f3e1"; }
+
+.fa-puzzle-piece:before {
+  content: "\f12e"; }
+
+.fa-python:before {
+  content: "\f3e2"; }
+
+.fa-qq:before {
+  content: "\f1d6"; }
+
+.fa-qrcode:before {
+  content: "\f029"; }
+
+.fa-question:before {
+  content: "\f128"; }
+
+.fa-question-circle:before {
+  content: "\f059"; }
+
+.fa-quidditch:before {
+  content: "\f458"; }
+
+.fa-quinscape:before {
+  content: "\f459"; }
+
+.fa-quora:before {
+  content: "\f2c4"; }
+
+.fa-quote-left:before {
+  content: "\f10d"; }
+
+.fa-quote-right:before {
+  content: "\f10e"; }
+
+.fa-random:before {
+  content: "\f074"; }
+
+.fa-ravelry:before {
+  content: "\f2d9"; }
+
+.fa-react:before {
+  content: "\f41b"; }
+
+.fa-readme:before {
+  content: "\f4d5"; }
+
+.fa-rebel:before {
+  content: "\f1d0"; }
+
+.fa-recycle:before {
+  content: "\f1b8"; }
+
+.fa-red-river:before {
+  content: "\f3e3"; }
+
+.fa-reddit:before {
+  content: "\f1a1"; }
+
+.fa-reddit-alien:before {
+  content: "\f281"; }
+
+.fa-reddit-square:before {
+  content: "\f1a2"; }
+
+.fa-redo:before {
+  content: "\f01e"; }
+
+.fa-redo-alt:before {
+  content: "\f2f9"; }
+
+.fa-registered:before {
+  content: "\f25d"; }
+
+.fa-rendact:before {
+  content: "\f3e4"; }
+
+.fa-renren:before {
+  content: "\f18b"; }
+
+.fa-reply:before {
+  content: "\f3e5"; }
+
+.fa-reply-all:before {
+  content: "\f122"; }
+
+.fa-replyd:before {
+  content: "\f3e6"; }
+
+.fa-resolving:before {
+  content: "\f3e7"; }
+
+.fa-retweet:before {
+  content: "\f079"; }
+
+.fa-ribbon:before {
+  content: "\f4d6"; }
+
+.fa-road:before {
+  content: "\f018"; }
+
+.fa-rocket:before {
+  content: "\f135"; }
+
+.fa-rocketchat:before {
+  content: "\f3e8"; }
+
+.fa-rockrms:before {
+  content: "\f3e9"; }
+
+.fa-rss:before {
+  content: "\f09e"; }
+
+.fa-rss-square:before {
+  content: "\f143"; }
+
+.fa-ruble-sign:before {
+  content: "\f158"; }
+
+.fa-rupee-sign:before {
+  content: "\f156"; }
+
+.fa-safari:before {
+  content: "\f267"; }
+
+.fa-sass:before {
+  content: "\f41e"; }
+
+.fa-save:before {
+  content: "\f0c7"; }
+
+.fa-schlix:before {
+  content: "\f3ea"; }
+
+.fa-scribd:before {
+  content: "\f28a"; }
+
+.fa-search:before {
+  content: "\f002"; }
+
+.fa-search-minus:before {
+  content: "\f010"; }
+
+.fa-search-plus:before {
+  content: "\f00e"; }
+
+.fa-searchengin:before {
+  content: "\f3eb"; }
+
+.fa-seedling:before {
+  content: "\f4d8"; }
+
+.fa-sellcast:before {
+  content: "\f2da"; }
+
+.fa-sellsy:before {
+  content: "\f213"; }
+
+.fa-server:before {
+  content: "\f233"; }
+
+.fa-servicestack:before {
+  content: "\f3ec"; }
+
+.fa-share:before {
+  content: "\f064"; }
+
+.fa-share-alt:before {
+  content: "\f1e0"; }
+
+.fa-share-alt-square:before {
+  content: "\f1e1"; }
+
+.fa-share-square:before {
+  content: "\f14d"; }
+
+.fa-shekel-sign:before {
+  content: "\f20b"; }
+
+.fa-shield-alt:before {
+  content: "\f3ed"; }
+
+.fa-ship:before {
+  content: "\f21a"; }
+
+.fa-shipping-fast:before {
+  content: "\f48b"; }
+
+.fa-shirtsinbulk:before {
+  content: "\f214"; }
+
+.fa-shopping-bag:before {
+  content: "\f290"; }
+
+.fa-shopping-basket:before {
+  content: "\f291"; }
+
+.fa-shopping-cart:before {
+  content: "\f07a"; }
+
+.fa-shower:before {
+  content: "\f2cc"; }
+
+.fa-sign:before {
+  content: "\f4d9"; }
+
+.fa-sign-in-alt:before {
+  content: "\f2f6"; }
+
+.fa-sign-language:before {
+  content: "\f2a7"; }
+
+.fa-sign-out-alt:before {
+  content: "\f2f5"; }
+
+.fa-signal:before {
+  content: "\f012"; }
+
+.fa-simplybuilt:before {
+  content: "\f215"; }
+
+.fa-sistrix:before {
+  content: "\f3ee"; }
+
+.fa-sitemap:before {
+  content: "\f0e8"; }
+
+.fa-skyatlas:before {
+  content: "\f216"; }
+
+.fa-skype:before {
+  content: "\f17e"; }
+
+.fa-slack:before {
+  content: "\f198"; }
+
+.fa-slack-hash:before {
+  content: "\f3ef"; }
+
+.fa-sliders-h:before {
+  content: "\f1de"; }
+
+.fa-slideshare:before {
+  content: "\f1e7"; }
+
+.fa-smile:before {
+  content: "\f118"; }
+
+.fa-smoking:before {
+  content: "\f48d"; }
+
+.fa-snapchat:before {
+  content: "\f2ab"; }
+
+.fa-snapchat-ghost:before {
+  content: "\f2ac"; }
+
+.fa-snapchat-square:before {
+  content: "\f2ad"; }
+
+.fa-snowflake:before {
+  content: "\f2dc"; }
+
+.fa-sort:before {
+  content: "\f0dc"; }
+
+.fa-sort-alpha-down:before {
+  content: "\f15d"; }
+
+.fa-sort-alpha-up:before {
+  content: "\f15e"; }
+
+.fa-sort-amount-down:before {
+  content: "\f160"; }
+
+.fa-sort-amount-up:before {
+  content: "\f161"; }
+
+.fa-sort-down:before {
+  content: "\f0dd"; }
+
+.fa-sort-numeric-down:before {
+  content: "\f162"; }
+
+.fa-sort-numeric-up:before {
+  content: "\f163"; }
+
+.fa-sort-up:before {
+  content: "\f0de"; }
+
+.fa-soundcloud:before {
+  content: "\f1be"; }
+
+.fa-space-shuttle:before {
+  content: "\f197"; }
+
+.fa-speakap:before {
+  content: "\f3f3"; }
+
+.fa-spinner:before {
+  content: "\f110"; }
+
+.fa-spotify:before {
+  content: "\f1bc"; }
+
+.fa-square:before {
+  content: "\f0c8"; }
+
+.fa-square-full:before {
+  content: "\f45c"; }
+
+.fa-stack-exchange:before {
+  content: "\f18d"; }
+
+.fa-stack-overflow:before {
+  content: "\f16c"; }
+
+.fa-star:before {
+  content: "\f005"; }
+
+.fa-star-half:before {
+  content: "\f089"; }
+
+.fa-staylinked:before {
+  content: "\f3f5"; }
+
+.fa-steam:before {
+  content: "\f1b6"; }
+
+.fa-steam-square:before {
+  content: "\f1b7"; }
+
+.fa-steam-symbol:before {
+  content: "\f3f6"; }
+
+.fa-step-backward:before {
+  content: "\f048"; }
+
+.fa-step-forward:before {
+  content: "\f051"; }
+
+.fa-stethoscope:before {
+  content: "\f0f1"; }
+
+.fa-sticker-mule:before {
+  content: "\f3f7"; }
+
+.fa-sticky-note:before {
+  content: "\f249"; }
+
+.fa-stop:before {
+  content: "\f04d"; }
+
+.fa-stop-circle:before {
+  content: "\f28d"; }
+
+.fa-stopwatch:before {
+  content: "\f2f2"; }
+
+.fa-strava:before {
+  content: "\f428"; }
+
+.fa-street-view:before {
+  content: "\f21d"; }
+
+.fa-strikethrough:before {
+  content: "\f0cc"; }
+
+.fa-stripe:before {
+  content: "\f429"; }
+
+.fa-stripe-s:before {
+  content: "\f42a"; }
+
+.fa-studiovinari:before {
+  content: "\f3f8"; }
+
+.fa-stumbleupon:before {
+  content: "\f1a4"; }
+
+.fa-stumbleupon-circle:before {
+  content: "\f1a3"; }
+
+.fa-subscript:before {
+  content: "\f12c"; }
+
+.fa-subway:before {
+  content: "\f239"; }
+
+.fa-suitcase:before {
+  content: "\f0f2"; }
+
+.fa-sun:before {
+  content: "\f185"; }
+
+.fa-superpowers:before {
+  content: "\f2dd"; }
+
+.fa-superscript:before {
+  content: "\f12b"; }
+
+.fa-supple:before {
+  content: "\f3f9"; }
+
+.fa-sync:before {
+  content: "\f021"; }
+
+.fa-sync-alt:before {
+  content: "\f2f1"; }
+
+.fa-syringe:before {
+  content: "\f48e"; }
+
+.fa-table:before {
+  content: "\f0ce"; }
+
+.fa-table-tennis:before {
+  content: "\f45d"; }
+
+.fa-tablet:before {
+  content: "\f10a"; }
+
+.fa-tablet-alt:before {
+  content: "\f3fa"; }
+
+.fa-tablets:before {
+  content: "\f490"; }
+
+.fa-tachometer-alt:before {
+  content: "\f3fd"; }
+
+.fa-tag:before {
+  content: "\f02b"; }
+
+.fa-tags:before {
+  content: "\f02c"; }
+
+.fa-tape:before {
+  content: "\f4db"; }
+
+.fa-tasks:before {
+  content: "\f0ae"; }
+
+.fa-taxi:before {
+  content: "\f1ba"; }
+
+.fa-telegram:before {
+  content: "\f2c6"; }
+
+.fa-telegram-plane:before {
+  content: "\f3fe"; }
+
+.fa-tencent-weibo:before {
+  content: "\f1d5"; }
+
+.fa-terminal:before {
+  content: "\f120"; }
+
+.fa-text-height:before {
+  content: "\f034"; }
+
+.fa-text-width:before {
+  content: "\f035"; }
+
+.fa-th:before {
+  content: "\f00a"; }
+
+.fa-th-large:before {
+  content: "\f009"; }
+
+.fa-th-list:before {
+  content: "\f00b"; }
+
+.fa-themeisle:before {
+  content: "\f2b2"; }
+
+.fa-thermometer:before {
+  content: "\f491"; }
+
+.fa-thermometer-empty:before {
+  content: "\f2cb"; }
+
+.fa-thermometer-full:before {
+  content: "\f2c7"; }
+
+.fa-thermometer-half:before {
+  content: "\f2c9"; }
+
+.fa-thermometer-quarter:before {
+  content: "\f2ca"; }
+
+.fa-thermometer-three-quarters:before {
+  content: "\f2c8"; }
+
+.fa-thumbs-down:before {
+  content: "\f165"; }
+
+.fa-thumbs-up:before {
+  content: "\f164"; }
+
+.fa-thumbtack:before {
+  content: "\f08d"; }
+
+.fa-ticket-alt:before {
+  content: "\f3ff"; }
+
+.fa-times:before {
+  content: "\f00d"; }
+
+.fa-times-circle:before {
+  content: "\f057"; }
+
+.fa-tint:before {
+  content: "\f043"; }
+
+.fa-toggle-off:before {
+  content: "\f204"; }
+
+.fa-toggle-on:before {
+  content: "\f205"; }
+
+.fa-trademark:before {
+  content: "\f25c"; }
+
+.fa-train:before {
+  content: "\f238"; }
+
+.fa-transgender:before {
+  content: "\f224"; }
+
+.fa-transgender-alt:before {
+  content: "\f225"; }
+
+.fa-trash:before {
+  content: "\f1f8"; }
+
+.fa-trash-alt:before {
+  content: "\f2ed"; }
+
+.fa-tree:before {
+  content: "\f1bb"; }
+
+.fa-trello:before {
+  content: "\f181"; }
+
+.fa-tripadvisor:before {
+  content: "\f262"; }
+
+.fa-trophy:before {
+  content: "\f091"; }
+
+.fa-truck:before {
+  content: "\f0d1"; }
+
+.fa-truck-loading:before {
+  content: "\f4de"; }
+
+.fa-truck-moving:before {
+  content: "\f4df"; }
+
+.fa-tty:before {
+  content: "\f1e4"; }
+
+.fa-tumblr:before {
+  content: "\f173"; }
+
+.fa-tumblr-square:before {
+  content: "\f174"; }
+
+.fa-tv:before {
+  content: "\f26c"; }
+
+.fa-twitch:before {
+  content: "\f1e8"; }
+
+.fa-twitter:before {
+  content: "\f099"; }
+
+.fa-twitter-square:before {
+  content: "\f081"; }
+
+.fa-typo3:before {
+  content: "\f42b"; }
+
+.fa-uber:before {
+  content: "\f402"; }
+
+.fa-uikit:before {
+  content: "\f403"; }
+
+.fa-umbrella:before {
+  content: "\f0e9"; }
+
+.fa-underline:before {
+  content: "\f0cd"; }
+
+.fa-undo:before {
+  content: "\f0e2"; }
+
+.fa-undo-alt:before {
+  content: "\f2ea"; }
+
+.fa-uniregistry:before {
+  content: "\f404"; }
+
+.fa-universal-access:before {
+  content: "\f29a"; }
+
+.fa-university:before {
+  content: "\f19c"; }
+
+.fa-unlink:before {
+  content: "\f127"; }
+
+.fa-unlock:before {
+  content: "\f09c"; }
+
+.fa-unlock-alt:before {
+  content: "\f13e"; }
+
+.fa-untappd:before {
+  content: "\f405"; }
+
+.fa-upload:before {
+  content: "\f093"; }
+
+.fa-usb:before {
+  content: "\f287"; }
+
+.fa-user:before {
+  content: "\f007"; }
+
+.fa-user-circle:before {
+  content: "\f2bd"; }
+
+.fa-user-md:before {
+  content: "\f0f0"; }
+
+.fa-user-plus:before {
+  content: "\f234"; }
+
+.fa-user-secret:before {
+  content: "\f21b"; }
+
+.fa-user-times:before {
+  content: "\f235"; }
+
+.fa-users:before {
+  content: "\f0c0"; }
+
+.fa-ussunnah:before {
+  content: "\f407"; }
+
+.fa-utensil-spoon:before {
+  content: "\f2e5"; }
+
+.fa-utensils:before {
+  content: "\f2e7"; }
+
+.fa-vaadin:before {
+  content: "\f408"; }
+
+.fa-venus:before {
+  content: "\f221"; }
+
+.fa-venus-double:before {
+  content: "\f226"; }
+
+.fa-venus-mars:before {
+  content: "\f228"; }
+
+.fa-viacoin:before {
+  content: "\f237"; }
+
+.fa-viadeo:before {
+  content: "\f2a9"; }
+
+.fa-viadeo-square:before {
+  content: "\f2aa"; }
+
+.fa-vial:before {
+  content: "\f492"; }
+
+.fa-vials:before {
+  content: "\f493"; }
+
+.fa-viber:before {
+  content: "\f409"; }
+
+.fa-video:before {
+  content: "\f03d"; }
+
+.fa-video-slash:before {
+  content: "\f4e2"; }
+
+.fa-vimeo:before {
+  content: "\f40a"; }
+
+.fa-vimeo-square:before {
+  content: "\f194"; }
+
+.fa-vimeo-v:before {
+  content: "\f27d"; }
+
+.fa-vine:before {
+  content: "\f1ca"; }
+
+.fa-vk:before {
+  content: "\f189"; }
+
+.fa-vnv:before {
+  content: "\f40b"; }
+
+.fa-volleyball-ball:before {
+  content: "\f45f"; }
+
+.fa-volume-down:before {
+  content: "\f027"; }
+
+.fa-volume-off:before {
+  content: "\f026"; }
+
+.fa-volume-up:before {
+  content: "\f028"; }
+
+.fa-vuejs:before {
+  content: "\f41f"; }
+
+.fa-warehouse:before {
+  content: "\f494"; }
+
+.fa-weibo:before {
+  content: "\f18a"; }
+
+.fa-weight:before {
+  content: "\f496"; }
+
+.fa-weixin:before {
+  content: "\f1d7"; }
+
+.fa-whatsapp:before {
+  content: "\f232"; }
+
+.fa-whatsapp-square:before {
+  content: "\f40c"; }
+
+.fa-wheelchair:before {
+  content: "\f193"; }
+
+.fa-whmcs:before {
+  content: "\f40d"; }
+
+.fa-wifi:before {
+  content: "\f1eb"; }
+
+.fa-wikipedia-w:before {
+  content: "\f266"; }
+
+.fa-window-close:before {
+  content: "\f410"; }
+
+.fa-window-maximize:before {
+  content: "\f2d0"; }
+
+.fa-window-minimize:before {
+  content: "\f2d1"; }
+
+.fa-window-restore:before {
+  content: "\f2d2"; }
+
+.fa-windows:before {
+  content: "\f17a"; }
+
+.fa-wine-glass:before {
+  content: "\f4e3"; }
+
+.fa-won-sign:before {
+  content: "\f159"; }
+
+.fa-wordpress:before {
+  content: "\f19a"; }
+
+.fa-wordpress-simple:before {
+  content: "\f411"; }
+
+.fa-wpbeginner:before {
+  content: "\f297"; }
+
+.fa-wpexplorer:before {
+  content: "\f2de"; }
+
+.fa-wpforms:before {
+  content: "\f298"; }
+
+.fa-wrench:before {
+  content: "\f0ad"; }
+
+.fa-x-ray:before {
+  content: "\f497"; }
+
+.fa-xbox:before {
+  content: "\f412"; }
+
+.fa-xing:before {
+  content: "\f168"; }
+
+.fa-xing-square:before {
+  content: "\f169"; }
+
+.fa-y-combinator:before {
+  content: "\f23b"; }
+
+.fa-yahoo:before {
+  content: "\f19e"; }
+
+.fa-yandex:before {
+  content: "\f413"; }
+
+.fa-yandex-international:before {
+  content: "\f414"; }
+
+.fa-yelp:before {
+  content: "\f1e9"; }
+
+.fa-yen-sign:before {
+  content: "\f157"; }
+
+.fa-yoast:before {
+  content: "\f2b1"; }
+
+.fa-youtube:before {
+  content: "\f167"; }
+
+.fa-youtube-square:before {
+  content: "\f431"; }
+
+.sr-only {
+  border: 0;
+  clip: rect(0, 0, 0, 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  clip: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  position: static;
+  width: auto; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.min.css b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..b2932211bf78242b91616098ad4abb0ae06520a5
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/css/fontawesome.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}
\ No newline at end of file
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_animated.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_animated.less
new file mode 100644
index 0000000000000000000000000000000000000000..704ec951037407467699bbdddab9ee901febaae0
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_animated.less
@@ -0,0 +1,19 @@
+// Animated Icons
+// --------------------------
+
+.@{fa-css-prefix}-spin {
+  animation: fa-spin 2s infinite linear;
+}
+
+.@{fa-css-prefix}-pulse {
+  animation: fa-spin 1s infinite steps(8);
+}
+
+@keyframes fa-spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_bordered-pulled.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_bordered-pulled.less
new file mode 100644
index 0000000000000000000000000000000000000000..29a356b423de898b4f226c1ff7a6eebe427fc22d
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_bordered-pulled.less
@@ -0,0 +1,16 @@
+// Bordered & Pulled
+// -------------------------
+
+.@{fa-css-prefix}-border {
+  border-radius: .1em;
+  border: solid .08em @fa-border-color;
+  padding: .2em .25em .15em;
+}
+
+.@{fa-css-prefix}-pull-left { float: left; }
+.@{fa-css-prefix}-pull-right { float: right; }
+
+.@{fa-css-prefix}, .fas, .far, .fal, .fab {
+  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
+  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_core.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_core.less
new file mode 100644
index 0000000000000000000000000000000000000000..82031d65235dee59f968045b501e98c69a7d5008
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_core.less
@@ -0,0 +1,12 @@
+// Base Class Definition
+// -------------------------
+
+.@{fa-css-prefix}, .fas, .far, .fal, .fab {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  text-rendering: auto;
+  line-height: 1;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_fixed-width.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_fixed-width.less
new file mode 100644
index 0000000000000000000000000000000000000000..be817c637538d7a54cf5c328ad9445270bf544ec
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_fixed-width.less
@@ -0,0 +1,6 @@
+// Fixed Width Icons
+// -------------------------
+.@{fa-css-prefix}-fw {
+  text-align: center;
+  width: (20em / 16);
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_icons.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_icons.less
new file mode 100644
index 0000000000000000000000000000000000000000..34ba85472eecbfe47a58b32fc0d7c54b35d6647b
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_icons.less
@@ -0,0 +1,876 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+
+.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
+.@{fa-css-prefix}-accessible-icon:before { content: @fa-var-accessible-icon; }
+.@{fa-css-prefix}-accusoft:before { content: @fa-var-accusoft; }
+.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; }
+.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; }
+.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
+.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
+.@{fa-css-prefix}-adversal:before { content: @fa-var-adversal; }
+.@{fa-css-prefix}-affiliatetheme:before { content: @fa-var-affiliatetheme; }
+.@{fa-css-prefix}-algolia:before { content: @fa-var-algolia; }
+.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
+.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
+.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
+.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
+.@{fa-css-prefix}-allergies:before { content: @fa-var-allergies; }
+.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
+.@{fa-css-prefix}-amazon-pay:before { content: @fa-var-amazon-pay; }
+.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
+.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }
+.@{fa-css-prefix}-amilia:before { content: @fa-var-amilia; }
+.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
+.@{fa-css-prefix}-android:before { content: @fa-var-android; }
+.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
+.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
+.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
+.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
+.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
+.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
+.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
+.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
+.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
+.@{fa-css-prefix}-angrycreative:before { content: @fa-var-angrycreative; }
+.@{fa-css-prefix}-angular:before { content: @fa-var-angular; }
+.@{fa-css-prefix}-app-store:before { content: @fa-var-app-store; }
+.@{fa-css-prefix}-app-store-ios:before { content: @fa-var-app-store-ios; }
+.@{fa-css-prefix}-apper:before { content: @fa-var-apper; }
+.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
+.@{fa-css-prefix}-apple-pay:before { content: @fa-var-apple-pay; }
+.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
+.@{fa-css-prefix}-arrow-alt-circle-down:before { content: @fa-var-arrow-alt-circle-down; }
+.@{fa-css-prefix}-arrow-alt-circle-left:before { content: @fa-var-arrow-alt-circle-left; }
+.@{fa-css-prefix}-arrow-alt-circle-right:before { content: @fa-var-arrow-alt-circle-right; }
+.@{fa-css-prefix}-arrow-alt-circle-up:before { content: @fa-var-arrow-alt-circle-up; }
+.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
+.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
+.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
+.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
+.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
+.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
+.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
+.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
+.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
+.@{fa-css-prefix}-arrows-alt-h:before { content: @fa-var-arrows-alt-h; }
+.@{fa-css-prefix}-arrows-alt-v:before { content: @fa-var-arrows-alt-v; }
+.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }
+.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
+.@{fa-css-prefix}-asymmetrik:before { content: @fa-var-asymmetrik; }
+.@{fa-css-prefix}-at:before { content: @fa-var-at; }
+.@{fa-css-prefix}-audible:before { content: @fa-var-audible; }
+.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }
+.@{fa-css-prefix}-autoprefixer:before { content: @fa-var-autoprefixer; }
+.@{fa-css-prefix}-avianex:before { content: @fa-var-avianex; }
+.@{fa-css-prefix}-aviato:before { content: @fa-var-aviato; }
+.@{fa-css-prefix}-aws:before { content: @fa-var-aws; }
+.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
+.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
+.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
+.@{fa-css-prefix}-band-aid:before { content: @fa-var-band-aid; }
+.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; }
+.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
+.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
+.@{fa-css-prefix}-baseball-ball:before { content: @fa-var-baseball-ball; }
+.@{fa-css-prefix}-basketball-ball:before { content: @fa-var-basketball-ball; }
+.@{fa-css-prefix}-bath:before { content: @fa-var-bath; }
+.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
+.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
+.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
+.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
+.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
+.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
+.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
+.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
+.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
+.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
+.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
+.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
+.@{fa-css-prefix}-bimobject:before { content: @fa-var-bimobject; }
+.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
+.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
+.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
+.@{fa-css-prefix}-bitcoin:before { content: @fa-var-bitcoin; }
+.@{fa-css-prefix}-bity:before { content: @fa-var-bity; }
+.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
+.@{fa-css-prefix}-blackberry:before { content: @fa-var-blackberry; }
+.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }
+.@{fa-css-prefix}-blogger:before { content: @fa-var-blogger; }
+.@{fa-css-prefix}-blogger-b:before { content: @fa-var-blogger-b; }
+.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
+.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
+.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
+.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
+.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
+.@{fa-css-prefix}-book:before { content: @fa-var-book; }
+.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
+.@{fa-css-prefix}-bowling-ball:before { content: @fa-var-bowling-ball; }
+.@{fa-css-prefix}-box:before { content: @fa-var-box; }
+.@{fa-css-prefix}-box-open:before { content: @fa-var-box-open; }
+.@{fa-css-prefix}-boxes:before { content: @fa-var-boxes; }
+.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }
+.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
+.@{fa-css-prefix}-briefcase-medical:before { content: @fa-var-briefcase-medical; }
+.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
+.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
+.@{fa-css-prefix}-building:before { content: @fa-var-building; }
+.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
+.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
+.@{fa-css-prefix}-burn:before { content: @fa-var-burn; }
+.@{fa-css-prefix}-buromobelexperte:before { content: @fa-var-buromobelexperte; }
+.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
+.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
+.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
+.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
+.@{fa-css-prefix}-calendar-alt:before { content: @fa-var-calendar-alt; }
+.@{fa-css-prefix}-calendar-check:before { content: @fa-var-calendar-check; }
+.@{fa-css-prefix}-calendar-minus:before { content: @fa-var-calendar-minus; }
+.@{fa-css-prefix}-calendar-plus:before { content: @fa-var-calendar-plus; }
+.@{fa-css-prefix}-calendar-times:before { content: @fa-var-calendar-times; }
+.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
+.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
+.@{fa-css-prefix}-capsules:before { content: @fa-var-capsules; }
+.@{fa-css-prefix}-car:before { content: @fa-var-car; }
+.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
+.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
+.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
+.@{fa-css-prefix}-caret-square-down:before { content: @fa-var-caret-square-down; }
+.@{fa-css-prefix}-caret-square-left:before { content: @fa-var-caret-square-left; }
+.@{fa-css-prefix}-caret-square-right:before { content: @fa-var-caret-square-right; }
+.@{fa-css-prefix}-caret-square-up:before { content: @fa-var-caret-square-up; }
+.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
+.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
+.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
+.@{fa-css-prefix}-cc-amazon-pay:before { content: @fa-var-cc-amazon-pay; }
+.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
+.@{fa-css-prefix}-cc-apple-pay:before { content: @fa-var-cc-apple-pay; }
+.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
+.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
+.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
+.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
+.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
+.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
+.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
+.@{fa-css-prefix}-centercode:before { content: @fa-var-centercode; }
+.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
+.@{fa-css-prefix}-chart-area:before { content: @fa-var-chart-area; }
+.@{fa-css-prefix}-chart-bar:before { content: @fa-var-chart-bar; }
+.@{fa-css-prefix}-chart-line:before { content: @fa-var-chart-line; }
+.@{fa-css-prefix}-chart-pie:before { content: @fa-var-chart-pie; }
+.@{fa-css-prefix}-check:before { content: @fa-var-check; }
+.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
+.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
+.@{fa-css-prefix}-chess:before { content: @fa-var-chess; }
+.@{fa-css-prefix}-chess-bishop:before { content: @fa-var-chess-bishop; }
+.@{fa-css-prefix}-chess-board:before { content: @fa-var-chess-board; }
+.@{fa-css-prefix}-chess-king:before { content: @fa-var-chess-king; }
+.@{fa-css-prefix}-chess-knight:before { content: @fa-var-chess-knight; }
+.@{fa-css-prefix}-chess-pawn:before { content: @fa-var-chess-pawn; }
+.@{fa-css-prefix}-chess-queen:before { content: @fa-var-chess-queen; }
+.@{fa-css-prefix}-chess-rook:before { content: @fa-var-chess-rook; }
+.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
+.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
+.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
+.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
+.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
+.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
+.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
+.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
+.@{fa-css-prefix}-child:before { content: @fa-var-child; }
+.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
+.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
+.@{fa-css-prefix}-circle-notch:before { content: @fa-var-circle-notch; }
+.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
+.@{fa-css-prefix}-clipboard-check:before { content: @fa-var-clipboard-check; }
+.@{fa-css-prefix}-clipboard-list:before { content: @fa-var-clipboard-list; }
+.@{fa-css-prefix}-clock:before { content: @fa-var-clock; }
+.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
+.@{fa-css-prefix}-closed-captioning:before { content: @fa-var-closed-captioning; }
+.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
+.@{fa-css-prefix}-cloud-download-alt:before { content: @fa-var-cloud-download-alt; }
+.@{fa-css-prefix}-cloud-upload-alt:before { content: @fa-var-cloud-upload-alt; }
+.@{fa-css-prefix}-cloudscale:before { content: @fa-var-cloudscale; }
+.@{fa-css-prefix}-cloudsmith:before { content: @fa-var-cloudsmith; }
+.@{fa-css-prefix}-cloudversify:before { content: @fa-var-cloudversify; }
+.@{fa-css-prefix}-code:before { content: @fa-var-code; }
+.@{fa-css-prefix}-code-branch:before { content: @fa-var-code-branch; }
+.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
+.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
+.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
+.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
+.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
+.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
+.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
+.@{fa-css-prefix}-comment-alt:before { content: @fa-var-comment-alt; }
+.@{fa-css-prefix}-comment-dots:before { content: @fa-var-comment-dots; }
+.@{fa-css-prefix}-comment-slash:before { content: @fa-var-comment-slash; }
+.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
+.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
+.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
+.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
+.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
+.@{fa-css-prefix}-copy:before { content: @fa-var-copy; }
+.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
+.@{fa-css-prefix}-couch:before { content: @fa-var-couch; }
+.@{fa-css-prefix}-cpanel:before { content: @fa-var-cpanel; }
+.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
+.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
+.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
+.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
+.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
+.@{fa-css-prefix}-css3-alt:before { content: @fa-var-css3-alt; }
+.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
+.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
+.@{fa-css-prefix}-cut:before { content: @fa-var-cut; }
+.@{fa-css-prefix}-cuttlefish:before { content: @fa-var-cuttlefish; }
+.@{fa-css-prefix}-d-and-d:before { content: @fa-var-d-and-d; }
+.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
+.@{fa-css-prefix}-database:before { content: @fa-var-database; }
+.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }
+.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
+.@{fa-css-prefix}-deploydog:before { content: @fa-var-deploydog; }
+.@{fa-css-prefix}-deskpro:before { content: @fa-var-deskpro; }
+.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
+.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
+.@{fa-css-prefix}-diagnoses:before { content: @fa-var-diagnoses; }
+.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
+.@{fa-css-prefix}-digital-ocean:before { content: @fa-var-digital-ocean; }
+.@{fa-css-prefix}-discord:before { content: @fa-var-discord; }
+.@{fa-css-prefix}-discourse:before { content: @fa-var-discourse; }
+.@{fa-css-prefix}-dna:before { content: @fa-var-dna; }
+.@{fa-css-prefix}-dochub:before { content: @fa-var-dochub; }
+.@{fa-css-prefix}-docker:before { content: @fa-var-docker; }
+.@{fa-css-prefix}-dollar-sign:before { content: @fa-var-dollar-sign; }
+.@{fa-css-prefix}-dolly:before { content: @fa-var-dolly; }
+.@{fa-css-prefix}-dolly-flatbed:before { content: @fa-var-dolly-flatbed; }
+.@{fa-css-prefix}-donate:before { content: @fa-var-donate; }
+.@{fa-css-prefix}-dot-circle:before { content: @fa-var-dot-circle; }
+.@{fa-css-prefix}-dove:before { content: @fa-var-dove; }
+.@{fa-css-prefix}-download:before { content: @fa-var-download; }
+.@{fa-css-prefix}-draft2digital:before { content: @fa-var-draft2digital; }
+.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
+.@{fa-css-prefix}-dribbble-square:before { content: @fa-var-dribbble-square; }
+.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
+.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
+.@{fa-css-prefix}-dyalog:before { content: @fa-var-dyalog; }
+.@{fa-css-prefix}-earlybirds:before { content: @fa-var-earlybirds; }
+.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
+.@{fa-css-prefix}-edit:before { content: @fa-var-edit; }
+.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
+.@{fa-css-prefix}-elementor:before { content: @fa-var-elementor; }
+.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
+.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
+.@{fa-css-prefix}-ember:before { content: @fa-var-ember; }
+.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
+.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
+.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; }
+.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
+.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }
+.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
+.@{fa-css-prefix}-erlang:before { content: @fa-var-erlang; }
+.@{fa-css-prefix}-ethereum:before { content: @fa-var-ethereum; }
+.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; }
+.@{fa-css-prefix}-euro-sign:before { content: @fa-var-euro-sign; }
+.@{fa-css-prefix}-exchange-alt:before { content: @fa-var-exchange-alt; }
+.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
+.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
+.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
+.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
+.@{fa-css-prefix}-expand-arrows-alt:before { content: @fa-var-expand-arrows-alt; }
+.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
+.@{fa-css-prefix}-external-link-alt:before { content: @fa-var-external-link-alt; }
+.@{fa-css-prefix}-external-link-square-alt:before { content: @fa-var-external-link-square-alt; }
+.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
+.@{fa-css-prefix}-eye-dropper:before { content: @fa-var-eye-dropper; }
+.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
+.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
+.@{fa-css-prefix}-facebook-f:before { content: @fa-var-facebook-f; }
+.@{fa-css-prefix}-facebook-messenger:before { content: @fa-var-facebook-messenger; }
+.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
+.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
+.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
+.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
+.@{fa-css-prefix}-female:before { content: @fa-var-female; }
+.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
+.@{fa-css-prefix}-file:before { content: @fa-var-file; }
+.@{fa-css-prefix}-file-alt:before { content: @fa-var-file-alt; }
+.@{fa-css-prefix}-file-archive:before { content: @fa-var-file-archive; }
+.@{fa-css-prefix}-file-audio:before { content: @fa-var-file-audio; }
+.@{fa-css-prefix}-file-code:before { content: @fa-var-file-code; }
+.@{fa-css-prefix}-file-excel:before { content: @fa-var-file-excel; }
+.@{fa-css-prefix}-file-image:before { content: @fa-var-file-image; }
+.@{fa-css-prefix}-file-medical:before { content: @fa-var-file-medical; }
+.@{fa-css-prefix}-file-medical-alt:before { content: @fa-var-file-medical-alt; }
+.@{fa-css-prefix}-file-pdf:before { content: @fa-var-file-pdf; }
+.@{fa-css-prefix}-file-powerpoint:before { content: @fa-var-file-powerpoint; }
+.@{fa-css-prefix}-file-video:before { content: @fa-var-file-video; }
+.@{fa-css-prefix}-file-word:before { content: @fa-var-file-word; }
+.@{fa-css-prefix}-film:before { content: @fa-var-film; }
+.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
+.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
+.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
+.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
+.@{fa-css-prefix}-first-aid:before { content: @fa-var-first-aid; }
+.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }
+.@{fa-css-prefix}-firstdraft:before { content: @fa-var-firstdraft; }
+.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
+.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
+.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
+.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
+.@{fa-css-prefix}-flipboard:before { content: @fa-var-flipboard; }
+.@{fa-css-prefix}-fly:before { content: @fa-var-fly; }
+.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
+.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
+.@{fa-css-prefix}-font:before { content: @fa-var-font; }
+.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }
+.@{fa-css-prefix}-font-awesome-alt:before { content: @fa-var-font-awesome-alt; }
+.@{fa-css-prefix}-font-awesome-flag:before { content: @fa-var-font-awesome-flag; }
+.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
+.@{fa-css-prefix}-fonticons-fi:before { content: @fa-var-fonticons-fi; }
+.@{fa-css-prefix}-football-ball:before { content: @fa-var-football-ball; }
+.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
+.@{fa-css-prefix}-fort-awesome-alt:before { content: @fa-var-fort-awesome-alt; }
+.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
+.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
+.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
+.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; }
+.@{fa-css-prefix}-freebsd:before { content: @fa-var-freebsd; }
+.@{fa-css-prefix}-frown:before { content: @fa-var-frown; }
+.@{fa-css-prefix}-futbol:before { content: @fa-var-futbol; }
+.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
+.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
+.@{fa-css-prefix}-gem:before { content: @fa-var-gem; }
+.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
+.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
+.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
+.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
+.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
+.@{fa-css-prefix}-git:before { content: @fa-var-git; }
+.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
+.@{fa-css-prefix}-github:before { content: @fa-var-github; }
+.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
+.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
+.@{fa-css-prefix}-gitkraken:before { content: @fa-var-gitkraken; }
+.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }
+.@{fa-css-prefix}-gitter:before { content: @fa-var-gitter; }
+.@{fa-css-prefix}-glass-martini:before { content: @fa-var-glass-martini; }
+.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }
+.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }
+.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
+.@{fa-css-prefix}-gofore:before { content: @fa-var-gofore; }
+.@{fa-css-prefix}-golf-ball:before { content: @fa-var-golf-ball; }
+.@{fa-css-prefix}-goodreads:before { content: @fa-var-goodreads; }
+.@{fa-css-prefix}-goodreads-g:before { content: @fa-var-goodreads-g; }
+.@{fa-css-prefix}-google:before { content: @fa-var-google; }
+.@{fa-css-prefix}-google-drive:before { content: @fa-var-google-drive; }
+.@{fa-css-prefix}-google-play:before { content: @fa-var-google-play; }
+.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
+.@{fa-css-prefix}-google-plus-g:before { content: @fa-var-google-plus-g; }
+.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
+.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
+.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
+.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
+.@{fa-css-prefix}-grav:before { content: @fa-var-grav; }
+.@{fa-css-prefix}-gripfire:before { content: @fa-var-gripfire; }
+.@{fa-css-prefix}-grunt:before { content: @fa-var-grunt; }
+.@{fa-css-prefix}-gulp:before { content: @fa-var-gulp; }
+.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
+.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
+.@{fa-css-prefix}-hacker-news-square:before { content: @fa-var-hacker-news-square; }
+.@{fa-css-prefix}-hand-holding:before { content: @fa-var-hand-holding; }
+.@{fa-css-prefix}-hand-holding-heart:before { content: @fa-var-hand-holding-heart; }
+.@{fa-css-prefix}-hand-holding-usd:before { content: @fa-var-hand-holding-usd; }
+.@{fa-css-prefix}-hand-lizard:before { content: @fa-var-hand-lizard; }
+.@{fa-css-prefix}-hand-paper:before { content: @fa-var-hand-paper; }
+.@{fa-css-prefix}-hand-peace:before { content: @fa-var-hand-peace; }
+.@{fa-css-prefix}-hand-point-down:before { content: @fa-var-hand-point-down; }
+.@{fa-css-prefix}-hand-point-left:before { content: @fa-var-hand-point-left; }
+.@{fa-css-prefix}-hand-point-right:before { content: @fa-var-hand-point-right; }
+.@{fa-css-prefix}-hand-point-up:before { content: @fa-var-hand-point-up; }
+.@{fa-css-prefix}-hand-pointer:before { content: @fa-var-hand-pointer; }
+.@{fa-css-prefix}-hand-rock:before { content: @fa-var-hand-rock; }
+.@{fa-css-prefix}-hand-scissors:before { content: @fa-var-hand-scissors; }
+.@{fa-css-prefix}-hand-spock:before { content: @fa-var-hand-spock; }
+.@{fa-css-prefix}-hands:before { content: @fa-var-hands; }
+.@{fa-css-prefix}-hands-helping:before { content: @fa-var-hands-helping; }
+.@{fa-css-prefix}-handshake:before { content: @fa-var-handshake; }
+.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
+.@{fa-css-prefix}-hdd:before { content: @fa-var-hdd; }
+.@{fa-css-prefix}-heading:before { content: @fa-var-heading; }
+.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
+.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
+.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
+.@{fa-css-prefix}-hips:before { content: @fa-var-hips; }
+.@{fa-css-prefix}-hire-a-helper:before { content: @fa-var-hire-a-helper; }
+.@{fa-css-prefix}-history:before { content: @fa-var-history; }
+.@{fa-css-prefix}-hockey-puck:before { content: @fa-var-hockey-puck; }
+.@{fa-css-prefix}-home:before { content: @fa-var-home; }
+.@{fa-css-prefix}-hooli:before { content: @fa-var-hooli; }
+.@{fa-css-prefix}-hospital:before { content: @fa-var-hospital; }
+.@{fa-css-prefix}-hospital-alt:before { content: @fa-var-hospital-alt; }
+.@{fa-css-prefix}-hospital-symbol:before { content: @fa-var-hospital-symbol; }
+.@{fa-css-prefix}-hotjar:before { content: @fa-var-hotjar; }
+.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
+.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
+.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
+.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
+.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
+.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
+.@{fa-css-prefix}-hubspot:before { content: @fa-var-hubspot; }
+.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
+.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; }
+.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; }
+.@{fa-css-prefix}-id-card-alt:before { content: @fa-var-id-card-alt; }
+.@{fa-css-prefix}-image:before { content: @fa-var-image; }
+.@{fa-css-prefix}-images:before { content: @fa-var-images; }
+.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; }
+.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
+.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
+.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
+.@{fa-css-prefix}-info:before { content: @fa-var-info; }
+.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
+.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
+.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
+.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
+.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
+.@{fa-css-prefix}-itunes:before { content: @fa-var-itunes; }
+.@{fa-css-prefix}-itunes-note:before { content: @fa-var-itunes-note; }
+.@{fa-css-prefix}-jenkins:before { content: @fa-var-jenkins; }
+.@{fa-css-prefix}-joget:before { content: @fa-var-joget; }
+.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
+.@{fa-css-prefix}-js:before { content: @fa-var-js; }
+.@{fa-css-prefix}-js-square:before { content: @fa-var-js-square; }
+.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
+.@{fa-css-prefix}-key:before { content: @fa-var-key; }
+.@{fa-css-prefix}-keyboard:before { content: @fa-var-keyboard; }
+.@{fa-css-prefix}-keycdn:before { content: @fa-var-keycdn; }
+.@{fa-css-prefix}-kickstarter:before { content: @fa-var-kickstarter; }
+.@{fa-css-prefix}-kickstarter-k:before { content: @fa-var-kickstarter-k; }
+.@{fa-css-prefix}-korvue:before { content: @fa-var-korvue; }
+.@{fa-css-prefix}-language:before { content: @fa-var-language; }
+.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
+.@{fa-css-prefix}-laravel:before { content: @fa-var-laravel; }
+.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
+.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
+.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
+.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
+.@{fa-css-prefix}-lemon:before { content: @fa-var-lemon; }
+.@{fa-css-prefix}-less:before { content: @fa-var-less; }
+.@{fa-css-prefix}-level-down-alt:before { content: @fa-var-level-down-alt; }
+.@{fa-css-prefix}-level-up-alt:before { content: @fa-var-level-up-alt; }
+.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
+.@{fa-css-prefix}-lightbulb:before { content: @fa-var-lightbulb; }
+.@{fa-css-prefix}-line:before { content: @fa-var-line; }
+.@{fa-css-prefix}-link:before { content: @fa-var-link; }
+.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
+.@{fa-css-prefix}-linkedin-in:before { content: @fa-var-linkedin-in; }
+.@{fa-css-prefix}-linode:before { content: @fa-var-linode; }
+.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
+.@{fa-css-prefix}-lira-sign:before { content: @fa-var-lira-sign; }
+.@{fa-css-prefix}-list:before { content: @fa-var-list; }
+.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
+.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
+.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
+.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
+.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
+.@{fa-css-prefix}-lock-open:before { content: @fa-var-lock-open; }
+.@{fa-css-prefix}-long-arrow-alt-down:before { content: @fa-var-long-arrow-alt-down; }
+.@{fa-css-prefix}-long-arrow-alt-left:before { content: @fa-var-long-arrow-alt-left; }
+.@{fa-css-prefix}-long-arrow-alt-right:before { content: @fa-var-long-arrow-alt-right; }
+.@{fa-css-prefix}-long-arrow-alt-up:before { content: @fa-var-long-arrow-alt-up; }
+.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }
+.@{fa-css-prefix}-lyft:before { content: @fa-var-lyft; }
+.@{fa-css-prefix}-magento:before { content: @fa-var-magento; }
+.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
+.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
+.@{fa-css-prefix}-male:before { content: @fa-var-male; }
+.@{fa-css-prefix}-map:before { content: @fa-var-map; }
+.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
+.@{fa-css-prefix}-map-marker-alt:before { content: @fa-var-map-marker-alt; }
+.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
+.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
+.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
+.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
+.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
+.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
+.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
+.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
+.@{fa-css-prefix}-medapps:before { content: @fa-var-medapps; }
+.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
+.@{fa-css-prefix}-medium-m:before { content: @fa-var-medium-m; }
+.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
+.@{fa-css-prefix}-medrt:before { content: @fa-var-medrt; }
+.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; }
+.@{fa-css-prefix}-meh:before { content: @fa-var-meh; }
+.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
+.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; }
+.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
+.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
+.@{fa-css-prefix}-microsoft:before { content: @fa-var-microsoft; }
+.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
+.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
+.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
+.@{fa-css-prefix}-mix:before { content: @fa-var-mix; }
+.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
+.@{fa-css-prefix}-mizuni:before { content: @fa-var-mizuni; }
+.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
+.@{fa-css-prefix}-mobile-alt:before { content: @fa-var-mobile-alt; }
+.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
+.@{fa-css-prefix}-monero:before { content: @fa-var-monero; }
+.@{fa-css-prefix}-money-bill-alt:before { content: @fa-var-money-bill-alt; }
+.@{fa-css-prefix}-moon:before { content: @fa-var-moon; }
+.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
+.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
+.@{fa-css-prefix}-music:before { content: @fa-var-music; }
+.@{fa-css-prefix}-napster:before { content: @fa-var-napster; }
+.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
+.@{fa-css-prefix}-newspaper:before { content: @fa-var-newspaper; }
+.@{fa-css-prefix}-nintendo-switch:before { content: @fa-var-nintendo-switch; }
+.@{fa-css-prefix}-node:before { content: @fa-var-node; }
+.@{fa-css-prefix}-node-js:before { content: @fa-var-node-js; }
+.@{fa-css-prefix}-notes-medical:before { content: @fa-var-notes-medical; }
+.@{fa-css-prefix}-npm:before { content: @fa-var-npm; }
+.@{fa-css-prefix}-ns8:before { content: @fa-var-ns8; }
+.@{fa-css-prefix}-nutritionix:before { content: @fa-var-nutritionix; }
+.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
+.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
+.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
+.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
+.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
+.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
+.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
+.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
+.@{fa-css-prefix}-osi:before { content: @fa-var-osi; }
+.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
+.@{fa-css-prefix}-page4:before { content: @fa-var-page4; }
+.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
+.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
+.@{fa-css-prefix}-palfed:before { content: @fa-var-palfed; }
+.@{fa-css-prefix}-pallet:before { content: @fa-var-pallet; }
+.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
+.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
+.@{fa-css-prefix}-parachute-box:before { content: @fa-var-parachute-box; }
+.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
+.@{fa-css-prefix}-paste:before { content: @fa-var-paste; }
+.@{fa-css-prefix}-patreon:before { content: @fa-var-patreon; }
+.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
+.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
+.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
+.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
+.@{fa-css-prefix}-pen-square:before { content: @fa-var-pen-square; }
+.@{fa-css-prefix}-pencil-alt:before { content: @fa-var-pencil-alt; }
+.@{fa-css-prefix}-people-carry:before { content: @fa-var-people-carry; }
+.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
+.@{fa-css-prefix}-periscope:before { content: @fa-var-periscope; }
+.@{fa-css-prefix}-phabricator:before { content: @fa-var-phabricator; }
+.@{fa-css-prefix}-phoenix-framework:before { content: @fa-var-phoenix-framework; }
+.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
+.@{fa-css-prefix}-phone-slash:before { content: @fa-var-phone-slash; }
+.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
+.@{fa-css-prefix}-phone-volume:before { content: @fa-var-phone-volume; }
+.@{fa-css-prefix}-php:before { content: @fa-var-php; }
+.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
+.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
+.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }
+.@{fa-css-prefix}-piggy-bank:before { content: @fa-var-piggy-bank; }
+.@{fa-css-prefix}-pills:before { content: @fa-var-pills; }
+.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
+.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
+.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
+.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
+.@{fa-css-prefix}-play:before { content: @fa-var-play; }
+.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
+.@{fa-css-prefix}-playstation:before { content: @fa-var-playstation; }
+.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
+.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
+.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
+.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
+.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; }
+.@{fa-css-prefix}-poo:before { content: @fa-var-poo; }
+.@{fa-css-prefix}-pound-sign:before { content: @fa-var-pound-sign; }
+.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
+.@{fa-css-prefix}-prescription-bottle:before { content: @fa-var-prescription-bottle; }
+.@{fa-css-prefix}-prescription-bottle-alt:before { content: @fa-var-prescription-bottle-alt; }
+.@{fa-css-prefix}-print:before { content: @fa-var-print; }
+.@{fa-css-prefix}-procedures:before { content: @fa-var-procedures; }
+.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
+.@{fa-css-prefix}-pushed:before { content: @fa-var-pushed; }
+.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
+.@{fa-css-prefix}-python:before { content: @fa-var-python; }
+.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
+.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
+.@{fa-css-prefix}-question:before { content: @fa-var-question; }
+.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
+.@{fa-css-prefix}-quidditch:before { content: @fa-var-quidditch; }
+.@{fa-css-prefix}-quinscape:before { content: @fa-var-quinscape; }
+.@{fa-css-prefix}-quora:before { content: @fa-var-quora; }
+.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
+.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
+.@{fa-css-prefix}-random:before { content: @fa-var-random; }
+.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; }
+.@{fa-css-prefix}-react:before { content: @fa-var-react; }
+.@{fa-css-prefix}-readme:before { content: @fa-var-readme; }
+.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
+.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
+.@{fa-css-prefix}-red-river:before { content: @fa-var-red-river; }
+.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
+.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
+.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
+.@{fa-css-prefix}-redo:before { content: @fa-var-redo; }
+.@{fa-css-prefix}-redo-alt:before { content: @fa-var-redo-alt; }
+.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
+.@{fa-css-prefix}-rendact:before { content: @fa-var-rendact; }
+.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
+.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
+.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
+.@{fa-css-prefix}-replyd:before { content: @fa-var-replyd; }
+.@{fa-css-prefix}-resolving:before { content: @fa-var-resolving; }
+.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
+.@{fa-css-prefix}-ribbon:before { content: @fa-var-ribbon; }
+.@{fa-css-prefix}-road:before { content: @fa-var-road; }
+.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
+.@{fa-css-prefix}-rocketchat:before { content: @fa-var-rocketchat; }
+.@{fa-css-prefix}-rockrms:before { content: @fa-var-rockrms; }
+.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
+.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
+.@{fa-css-prefix}-ruble-sign:before { content: @fa-var-ruble-sign; }
+.@{fa-css-prefix}-rupee-sign:before { content: @fa-var-rupee-sign; }
+.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
+.@{fa-css-prefix}-sass:before { content: @fa-var-sass; }
+.@{fa-css-prefix}-save:before { content: @fa-var-save; }
+.@{fa-css-prefix}-schlix:before { content: @fa-var-schlix; }
+.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
+.@{fa-css-prefix}-search:before { content: @fa-var-search; }
+.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
+.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
+.@{fa-css-prefix}-searchengin:before { content: @fa-var-searchengin; }
+.@{fa-css-prefix}-seedling:before { content: @fa-var-seedling; }
+.@{fa-css-prefix}-sellcast:before { content: @fa-var-sellcast; }
+.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
+.@{fa-css-prefix}-server:before { content: @fa-var-server; }
+.@{fa-css-prefix}-servicestack:before { content: @fa-var-servicestack; }
+.@{fa-css-prefix}-share:before { content: @fa-var-share; }
+.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
+.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
+.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
+.@{fa-css-prefix}-shekel-sign:before { content: @fa-var-shekel-sign; }
+.@{fa-css-prefix}-shield-alt:before { content: @fa-var-shield-alt; }
+.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
+.@{fa-css-prefix}-shipping-fast:before { content: @fa-var-shipping-fast; }
+.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
+.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
+.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
+.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
+.@{fa-css-prefix}-shower:before { content: @fa-var-shower; }
+.@{fa-css-prefix}-sign:before { content: @fa-var-sign; }
+.@{fa-css-prefix}-sign-in-alt:before { content: @fa-var-sign-in-alt; }
+.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }
+.@{fa-css-prefix}-sign-out-alt:before { content: @fa-var-sign-out-alt; }
+.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
+.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
+.@{fa-css-prefix}-sistrix:before { content: @fa-var-sistrix; }
+.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
+.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
+.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
+.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
+.@{fa-css-prefix}-slack-hash:before { content: @fa-var-slack-hash; }
+.@{fa-css-prefix}-sliders-h:before { content: @fa-var-sliders-h; }
+.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
+.@{fa-css-prefix}-smile:before { content: @fa-var-smile; }
+.@{fa-css-prefix}-smoking:before { content: @fa-var-smoking; }
+.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }
+.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }
+.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }
+.@{fa-css-prefix}-snowflake:before { content: @fa-var-snowflake; }
+.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
+.@{fa-css-prefix}-sort-alpha-down:before { content: @fa-var-sort-alpha-down; }
+.@{fa-css-prefix}-sort-alpha-up:before { content: @fa-var-sort-alpha-up; }
+.@{fa-css-prefix}-sort-amount-down:before { content: @fa-var-sort-amount-down; }
+.@{fa-css-prefix}-sort-amount-up:before { content: @fa-var-sort-amount-up; }
+.@{fa-css-prefix}-sort-down:before { content: @fa-var-sort-down; }
+.@{fa-css-prefix}-sort-numeric-down:before { content: @fa-var-sort-numeric-down; }
+.@{fa-css-prefix}-sort-numeric-up:before { content: @fa-var-sort-numeric-up; }
+.@{fa-css-prefix}-sort-up:before { content: @fa-var-sort-up; }
+.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
+.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
+.@{fa-css-prefix}-speakap:before { content: @fa-var-speakap; }
+.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
+.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
+.@{fa-css-prefix}-square:before { content: @fa-var-square; }
+.@{fa-css-prefix}-square-full:before { content: @fa-var-square-full; }
+.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
+.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
+.@{fa-css-prefix}-star:before { content: @fa-var-star; }
+.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
+.@{fa-css-prefix}-staylinked:before { content: @fa-var-staylinked; }
+.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
+.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
+.@{fa-css-prefix}-steam-symbol:before { content: @fa-var-steam-symbol; }
+.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
+.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
+.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
+.@{fa-css-prefix}-sticker-mule:before { content: @fa-var-sticker-mule; }
+.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
+.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
+.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
+.@{fa-css-prefix}-stopwatch:before { content: @fa-var-stopwatch; }
+.@{fa-css-prefix}-strava:before { content: @fa-var-strava; }
+.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
+.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
+.@{fa-css-prefix}-stripe:before { content: @fa-var-stripe; }
+.@{fa-css-prefix}-stripe-s:before { content: @fa-var-stripe-s; }
+.@{fa-css-prefix}-studiovinari:before { content: @fa-var-studiovinari; }
+.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
+.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
+.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
+.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
+.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
+.@{fa-css-prefix}-sun:before { content: @fa-var-sun; }
+.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; }
+.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
+.@{fa-css-prefix}-supple:before { content: @fa-var-supple; }
+.@{fa-css-prefix}-sync:before { content: @fa-var-sync; }
+.@{fa-css-prefix}-sync-alt:before { content: @fa-var-sync-alt; }
+.@{fa-css-prefix}-syringe:before { content: @fa-var-syringe; }
+.@{fa-css-prefix}-table:before { content: @fa-var-table; }
+.@{fa-css-prefix}-table-tennis:before { content: @fa-var-table-tennis; }
+.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
+.@{fa-css-prefix}-tablet-alt:before { content: @fa-var-tablet-alt; }
+.@{fa-css-prefix}-tablets:before { content: @fa-var-tablets; }
+.@{fa-css-prefix}-tachometer-alt:before { content: @fa-var-tachometer-alt; }
+.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
+.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
+.@{fa-css-prefix}-tape:before { content: @fa-var-tape; }
+.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
+.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
+.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; }
+.@{fa-css-prefix}-telegram-plane:before { content: @fa-var-telegram-plane; }
+.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
+.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
+.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
+.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
+.@{fa-css-prefix}-th:before { content: @fa-var-th; }
+.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
+.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
+.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }
+.@{fa-css-prefix}-thermometer:before { content: @fa-var-thermometer; }
+.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; }
+.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; }
+.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; }
+.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; }
+.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; }
+.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
+.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
+.@{fa-css-prefix}-thumbtack:before { content: @fa-var-thumbtack; }
+.@{fa-css-prefix}-ticket-alt:before { content: @fa-var-ticket-alt; }
+.@{fa-css-prefix}-times:before { content: @fa-var-times; }
+.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
+.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
+.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
+.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
+.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
+.@{fa-css-prefix}-train:before { content: @fa-var-train; }
+.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
+.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
+.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
+.@{fa-css-prefix}-trash-alt:before { content: @fa-var-trash-alt; }
+.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
+.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
+.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
+.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
+.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
+.@{fa-css-prefix}-truck-loading:before { content: @fa-var-truck-loading; }
+.@{fa-css-prefix}-truck-moving:before { content: @fa-var-truck-moving; }
+.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
+.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
+.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
+.@{fa-css-prefix}-tv:before { content: @fa-var-tv; }
+.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
+.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
+.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
+.@{fa-css-prefix}-typo3:before { content: @fa-var-typo3; }
+.@{fa-css-prefix}-uber:before { content: @fa-var-uber; }
+.@{fa-css-prefix}-uikit:before { content: @fa-var-uikit; }
+.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
+.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
+.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
+.@{fa-css-prefix}-undo-alt:before { content: @fa-var-undo-alt; }
+.@{fa-css-prefix}-uniregistry:before { content: @fa-var-uniregistry; }
+.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }
+.@{fa-css-prefix}-university:before { content: @fa-var-university; }
+.@{fa-css-prefix}-unlink:before { content: @fa-var-unlink; }
+.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
+.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
+.@{fa-css-prefix}-untappd:before { content: @fa-var-untappd; }
+.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
+.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
+.@{fa-css-prefix}-user:before { content: @fa-var-user; }
+.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; }
+.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
+.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
+.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
+.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
+.@{fa-css-prefix}-users:before { content: @fa-var-users; }
+.@{fa-css-prefix}-ussunnah:before { content: @fa-var-ussunnah; }
+.@{fa-css-prefix}-utensil-spoon:before { content: @fa-var-utensil-spoon; }
+.@{fa-css-prefix}-utensils:before { content: @fa-var-utensils; }
+.@{fa-css-prefix}-vaadin:before { content: @fa-var-vaadin; }
+.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
+.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
+.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
+.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
+.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }
+.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }
+.@{fa-css-prefix}-vial:before { content: @fa-var-vial; }
+.@{fa-css-prefix}-vials:before { content: @fa-var-vials; }
+.@{fa-css-prefix}-viber:before { content: @fa-var-viber; }
+.@{fa-css-prefix}-video:before { content: @fa-var-video; }
+.@{fa-css-prefix}-video-slash:before { content: @fa-var-video-slash; }
+.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
+.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
+.@{fa-css-prefix}-vimeo-v:before { content: @fa-var-vimeo-v; }
+.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
+.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
+.@{fa-css-prefix}-vnv:before { content: @fa-var-vnv; }
+.@{fa-css-prefix}-volleyball-ball:before { content: @fa-var-volleyball-ball; }
+.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
+.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
+.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
+.@{fa-css-prefix}-vuejs:before { content: @fa-var-vuejs; }
+.@{fa-css-prefix}-warehouse:before { content: @fa-var-warehouse; }
+.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
+.@{fa-css-prefix}-weight:before { content: @fa-var-weight; }
+.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
+.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
+.@{fa-css-prefix}-whatsapp-square:before { content: @fa-var-whatsapp-square; }
+.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
+.@{fa-css-prefix}-whmcs:before { content: @fa-var-whmcs; }
+.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
+.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
+.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; }
+.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; }
+.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; }
+.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; }
+.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
+.@{fa-css-prefix}-wine-glass:before { content: @fa-var-wine-glass; }
+.@{fa-css-prefix}-won-sign:before { content: @fa-var-won-sign; }
+.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
+.@{fa-css-prefix}-wordpress-simple:before { content: @fa-var-wordpress-simple; }
+.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }
+.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; }
+.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }
+.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
+.@{fa-css-prefix}-x-ray:before { content: @fa-var-x-ray; }
+.@{fa-css-prefix}-xbox:before { content: @fa-var-xbox; }
+.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
+.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
+.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
+.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
+.@{fa-css-prefix}-yandex:before { content: @fa-var-yandex; }
+.@{fa-css-prefix}-yandex-international:before { content: @fa-var-yandex-international; }
+.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
+.@{fa-css-prefix}-yen-sign:before { content: @fa-var-yen-sign; }
+.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }
+.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
+.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_larger.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_larger.less
new file mode 100644
index 0000000000000000000000000000000000000000..6cbb1ec6ec5bb98d8ace94cb8dec06a73e8ed7e1
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_larger.less
@@ -0,0 +1,27 @@
+// Icon Sizes
+// -------------------------
+
+.larger(@factor) when (@factor > 0) {
+  .larger((@factor - 1));
+
+  .@{fa-css-prefix}-@{factor}x {
+    font-size: (@factor * 1em);
+  }
+}
+
+/* makes the font 33% larger relative to the icon container */
+.@{fa-css-prefix}-lg {
+  font-size: (4em / 3);
+  line-height: (3em / 4);
+  vertical-align: -.0667em;
+}
+
+.@{fa-css-prefix}-xs {
+  font-size: .75em;
+}
+
+.@{fa-css-prefix}-sm {
+  font-size: .875em;
+}
+
+.larger(10);
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_list.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_list.less
new file mode 100644
index 0000000000000000000000000000000000000000..1ff7ca7f59983c00476043dad96db69a21c19f98
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_list.less
@@ -0,0 +1,18 @@
+// List Icons
+// -------------------------
+
+.@{fa-css-prefix}-ul {
+  list-style-type: none;
+  margin-left: @fa-li-width * 5/4;
+  padding-left: 0;
+
+  > li { position: relative; }
+}
+
+.@{fa-css-prefix}-li {
+  left: -@fa-li-width;
+  position: absolute;
+  text-align: center;
+  width: @fa-li-width;
+  line-height: inherit;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_mixins.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_mixins.less
new file mode 100644
index 0000000000000000000000000000000000000000..a4e93f90a39db7e4b8d83bfa149b2005a73d9085
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_mixins.less
@@ -0,0 +1,57 @@
+// Mixins
+// --------------------------
+
+.fa-icon() {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  font-weight: normal;
+  line-height: 1;
+  vertical-align: -.125em;
+}
+
+.fa-icon-rotate(@degrees, @rotation) {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
+  transform: rotate(@degrees);
+}
+
+.fa-icon-flip(@horiz, @vert, @rotation) {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
+  transform: scale(@horiz, @vert);
+}
+
+
+// Only display content to screen readers. A la Bootstrap 4.
+//
+// See: http://a11yproject.com/posts/how-to-hide-content/
+
+.sr-only() {
+  border: 0;
+  clip: rect(0,0,0,0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+//
+// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+//
+// Credit: HTML5 Boilerplate
+
+.sr-only-focusable() {
+  &:active,
+  &:focus {
+    clip: auto;
+    height: auto;
+    margin: 0;
+    overflow: visible;
+    position: static;
+    width: auto;
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_rotated-flipped.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_rotated-flipped.less
new file mode 100644
index 0000000000000000000000000000000000000000..1ee31db19f44db98fe9d1142438e0528abd1288e
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_rotated-flipped.less
@@ -0,0 +1,23 @@
+// Rotated & Flipped Icons
+// -------------------------
+
+.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }
+.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
+.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
+
+.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
+.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }
+.@{fa-css-prefix}-flip-horizontal.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(-1, -1, 2); }
+
+// Hook for IE8-9
+// -------------------------
+
+:root {
+  .@{fa-css-prefix}-rotate-90,
+  .@{fa-css-prefix}-rotate-180,
+  .@{fa-css-prefix}-rotate-270,
+  .@{fa-css-prefix}-flip-horizontal,
+  .@{fa-css-prefix}-flip-vertical {
+    filter: none;
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_screen-reader.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_screen-reader.less
new file mode 100644
index 0000000000000000000000000000000000000000..11c188196d5ade55930b7b94fc5a1dd0f6d1a800
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_screen-reader.less
@@ -0,0 +1,5 @@
+// Screen Readers
+// -------------------------
+
+.sr-only { .sr-only(); }
+.sr-only-focusable { .sr-only-focusable(); }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_stacked.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_stacked.less
new file mode 100644
index 0000000000000000000000000000000000000000..263b5c44fcebea9d09f9e5addb99915e66165986
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_stacked.less
@@ -0,0 +1,22 @@
+// Stacked Icons
+// -------------------------
+
+.@{fa-css-prefix}-stack {
+  display: inline-block;
+  height: 2em;
+  line-height: 2em;
+  position: relative;
+  vertical-align: middle;
+  width: 2em;
+}
+
+.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
+  left: 0;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+
+.@{fa-css-prefix}-stack-1x { line-height: inherit; }
+.@{fa-css-prefix}-stack-2x { font-size: 2em; }
+.@{fa-css-prefix}-inverse { color: @fa-inverse; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_variables.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_variables.less
new file mode 100644
index 0000000000000000000000000000000000000000..491e8463cf493fbea3a01cc16d5104d1a75cc0bc
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/_variables.less
@@ -0,0 +1,885 @@
+// Variables
+// --------------------------
+
+@fa-font-path:        "../webfonts";
+@fa-font-size-base:   16px;
+@fa-line-height-base: 1;
+@fa-css-prefix:       fa;
+@fa-version:          "5.0.9";
+@fa-border-color:     #eee;
+@fa-inverse:          #fff;
+@fa-li-width:         2em;
+
+@fa-var-500px: "\f26e";
+@fa-var-accessible-icon: "\f368";
+@fa-var-accusoft: "\f369";
+@fa-var-address-book: "\f2b9";
+@fa-var-address-card: "\f2bb";
+@fa-var-adjust: "\f042";
+@fa-var-adn: "\f170";
+@fa-var-adversal: "\f36a";
+@fa-var-affiliatetheme: "\f36b";
+@fa-var-algolia: "\f36c";
+@fa-var-align-center: "\f037";
+@fa-var-align-justify: "\f039";
+@fa-var-align-left: "\f036";
+@fa-var-align-right: "\f038";
+@fa-var-allergies: "\f461";
+@fa-var-amazon: "\f270";
+@fa-var-amazon-pay: "\f42c";
+@fa-var-ambulance: "\f0f9";
+@fa-var-american-sign-language-interpreting: "\f2a3";
+@fa-var-amilia: "\f36d";
+@fa-var-anchor: "\f13d";
+@fa-var-android: "\f17b";
+@fa-var-angellist: "\f209";
+@fa-var-angle-double-down: "\f103";
+@fa-var-angle-double-left: "\f100";
+@fa-var-angle-double-right: "\f101";
+@fa-var-angle-double-up: "\f102";
+@fa-var-angle-down: "\f107";
+@fa-var-angle-left: "\f104";
+@fa-var-angle-right: "\f105";
+@fa-var-angle-up: "\f106";
+@fa-var-angrycreative: "\f36e";
+@fa-var-angular: "\f420";
+@fa-var-app-store: "\f36f";
+@fa-var-app-store-ios: "\f370";
+@fa-var-apper: "\f371";
+@fa-var-apple: "\f179";
+@fa-var-apple-pay: "\f415";
+@fa-var-archive: "\f187";
+@fa-var-arrow-alt-circle-down: "\f358";
+@fa-var-arrow-alt-circle-left: "\f359";
+@fa-var-arrow-alt-circle-right: "\f35a";
+@fa-var-arrow-alt-circle-up: "\f35b";
+@fa-var-arrow-circle-down: "\f0ab";
+@fa-var-arrow-circle-left: "\f0a8";
+@fa-var-arrow-circle-right: "\f0a9";
+@fa-var-arrow-circle-up: "\f0aa";
+@fa-var-arrow-down: "\f063";
+@fa-var-arrow-left: "\f060";
+@fa-var-arrow-right: "\f061";
+@fa-var-arrow-up: "\f062";
+@fa-var-arrows-alt: "\f0b2";
+@fa-var-arrows-alt-h: "\f337";
+@fa-var-arrows-alt-v: "\f338";
+@fa-var-assistive-listening-systems: "\f2a2";
+@fa-var-asterisk: "\f069";
+@fa-var-asymmetrik: "\f372";
+@fa-var-at: "\f1fa";
+@fa-var-audible: "\f373";
+@fa-var-audio-description: "\f29e";
+@fa-var-autoprefixer: "\f41c";
+@fa-var-avianex: "\f374";
+@fa-var-aviato: "\f421";
+@fa-var-aws: "\f375";
+@fa-var-backward: "\f04a";
+@fa-var-balance-scale: "\f24e";
+@fa-var-ban: "\f05e";
+@fa-var-band-aid: "\f462";
+@fa-var-bandcamp: "\f2d5";
+@fa-var-barcode: "\f02a";
+@fa-var-bars: "\f0c9";
+@fa-var-baseball-ball: "\f433";
+@fa-var-basketball-ball: "\f434";
+@fa-var-bath: "\f2cd";
+@fa-var-battery-empty: "\f244";
+@fa-var-battery-full: "\f240";
+@fa-var-battery-half: "\f242";
+@fa-var-battery-quarter: "\f243";
+@fa-var-battery-three-quarters: "\f241";
+@fa-var-bed: "\f236";
+@fa-var-beer: "\f0fc";
+@fa-var-behance: "\f1b4";
+@fa-var-behance-square: "\f1b5";
+@fa-var-bell: "\f0f3";
+@fa-var-bell-slash: "\f1f6";
+@fa-var-bicycle: "\f206";
+@fa-var-bimobject: "\f378";
+@fa-var-binoculars: "\f1e5";
+@fa-var-birthday-cake: "\f1fd";
+@fa-var-bitbucket: "\f171";
+@fa-var-bitcoin: "\f379";
+@fa-var-bity: "\f37a";
+@fa-var-black-tie: "\f27e";
+@fa-var-blackberry: "\f37b";
+@fa-var-blind: "\f29d";
+@fa-var-blogger: "\f37c";
+@fa-var-blogger-b: "\f37d";
+@fa-var-bluetooth: "\f293";
+@fa-var-bluetooth-b: "\f294";
+@fa-var-bold: "\f032";
+@fa-var-bolt: "\f0e7";
+@fa-var-bomb: "\f1e2";
+@fa-var-book: "\f02d";
+@fa-var-bookmark: "\f02e";
+@fa-var-bowling-ball: "\f436";
+@fa-var-box: "\f466";
+@fa-var-box-open: "\f49e";
+@fa-var-boxes: "\f468";
+@fa-var-braille: "\f2a1";
+@fa-var-briefcase: "\f0b1";
+@fa-var-briefcase-medical: "\f469";
+@fa-var-btc: "\f15a";
+@fa-var-bug: "\f188";
+@fa-var-building: "\f1ad";
+@fa-var-bullhorn: "\f0a1";
+@fa-var-bullseye: "\f140";
+@fa-var-burn: "\f46a";
+@fa-var-buromobelexperte: "\f37f";
+@fa-var-bus: "\f207";
+@fa-var-buysellads: "\f20d";
+@fa-var-calculator: "\f1ec";
+@fa-var-calendar: "\f133";
+@fa-var-calendar-alt: "\f073";
+@fa-var-calendar-check: "\f274";
+@fa-var-calendar-minus: "\f272";
+@fa-var-calendar-plus: "\f271";
+@fa-var-calendar-times: "\f273";
+@fa-var-camera: "\f030";
+@fa-var-camera-retro: "\f083";
+@fa-var-capsules: "\f46b";
+@fa-var-car: "\f1b9";
+@fa-var-caret-down: "\f0d7";
+@fa-var-caret-left: "\f0d9";
+@fa-var-caret-right: "\f0da";
+@fa-var-caret-square-down: "\f150";
+@fa-var-caret-square-left: "\f191";
+@fa-var-caret-square-right: "\f152";
+@fa-var-caret-square-up: "\f151";
+@fa-var-caret-up: "\f0d8";
+@fa-var-cart-arrow-down: "\f218";
+@fa-var-cart-plus: "\f217";
+@fa-var-cc-amazon-pay: "\f42d";
+@fa-var-cc-amex: "\f1f3";
+@fa-var-cc-apple-pay: "\f416";
+@fa-var-cc-diners-club: "\f24c";
+@fa-var-cc-discover: "\f1f2";
+@fa-var-cc-jcb: "\f24b";
+@fa-var-cc-mastercard: "\f1f1";
+@fa-var-cc-paypal: "\f1f4";
+@fa-var-cc-stripe: "\f1f5";
+@fa-var-cc-visa: "\f1f0";
+@fa-var-centercode: "\f380";
+@fa-var-certificate: "\f0a3";
+@fa-var-chart-area: "\f1fe";
+@fa-var-chart-bar: "\f080";
+@fa-var-chart-line: "\f201";
+@fa-var-chart-pie: "\f200";
+@fa-var-check: "\f00c";
+@fa-var-check-circle: "\f058";
+@fa-var-check-square: "\f14a";
+@fa-var-chess: "\f439";
+@fa-var-chess-bishop: "\f43a";
+@fa-var-chess-board: "\f43c";
+@fa-var-chess-king: "\f43f";
+@fa-var-chess-knight: "\f441";
+@fa-var-chess-pawn: "\f443";
+@fa-var-chess-queen: "\f445";
+@fa-var-chess-rook: "\f447";
+@fa-var-chevron-circle-down: "\f13a";
+@fa-var-chevron-circle-left: "\f137";
+@fa-var-chevron-circle-right: "\f138";
+@fa-var-chevron-circle-up: "\f139";
+@fa-var-chevron-down: "\f078";
+@fa-var-chevron-left: "\f053";
+@fa-var-chevron-right: "\f054";
+@fa-var-chevron-up: "\f077";
+@fa-var-child: "\f1ae";
+@fa-var-chrome: "\f268";
+@fa-var-circle: "\f111";
+@fa-var-circle-notch: "\f1ce";
+@fa-var-clipboard: "\f328";
+@fa-var-clipboard-check: "\f46c";
+@fa-var-clipboard-list: "\f46d";
+@fa-var-clock: "\f017";
+@fa-var-clone: "\f24d";
+@fa-var-closed-captioning: "\f20a";
+@fa-var-cloud: "\f0c2";
+@fa-var-cloud-download-alt: "\f381";
+@fa-var-cloud-upload-alt: "\f382";
+@fa-var-cloudscale: "\f383";
+@fa-var-cloudsmith: "\f384";
+@fa-var-cloudversify: "\f385";
+@fa-var-code: "\f121";
+@fa-var-code-branch: "\f126";
+@fa-var-codepen: "\f1cb";
+@fa-var-codiepie: "\f284";
+@fa-var-coffee: "\f0f4";
+@fa-var-cog: "\f013";
+@fa-var-cogs: "\f085";
+@fa-var-columns: "\f0db";
+@fa-var-comment: "\f075";
+@fa-var-comment-alt: "\f27a";
+@fa-var-comment-dots: "\f4ad";
+@fa-var-comment-slash: "\f4b3";
+@fa-var-comments: "\f086";
+@fa-var-compass: "\f14e";
+@fa-var-compress: "\f066";
+@fa-var-connectdevelop: "\f20e";
+@fa-var-contao: "\f26d";
+@fa-var-copy: "\f0c5";
+@fa-var-copyright: "\f1f9";
+@fa-var-couch: "\f4b8";
+@fa-var-cpanel: "\f388";
+@fa-var-creative-commons: "\f25e";
+@fa-var-credit-card: "\f09d";
+@fa-var-crop: "\f125";
+@fa-var-crosshairs: "\f05b";
+@fa-var-css3: "\f13c";
+@fa-var-css3-alt: "\f38b";
+@fa-var-cube: "\f1b2";
+@fa-var-cubes: "\f1b3";
+@fa-var-cut: "\f0c4";
+@fa-var-cuttlefish: "\f38c";
+@fa-var-d-and-d: "\f38d";
+@fa-var-dashcube: "\f210";
+@fa-var-database: "\f1c0";
+@fa-var-deaf: "\f2a4";
+@fa-var-delicious: "\f1a5";
+@fa-var-deploydog: "\f38e";
+@fa-var-deskpro: "\f38f";
+@fa-var-desktop: "\f108";
+@fa-var-deviantart: "\f1bd";
+@fa-var-diagnoses: "\f470";
+@fa-var-digg: "\f1a6";
+@fa-var-digital-ocean: "\f391";
+@fa-var-discord: "\f392";
+@fa-var-discourse: "\f393";
+@fa-var-dna: "\f471";
+@fa-var-dochub: "\f394";
+@fa-var-docker: "\f395";
+@fa-var-dollar-sign: "\f155";
+@fa-var-dolly: "\f472";
+@fa-var-dolly-flatbed: "\f474";
+@fa-var-donate: "\f4b9";
+@fa-var-dot-circle: "\f192";
+@fa-var-dove: "\f4ba";
+@fa-var-download: "\f019";
+@fa-var-draft2digital: "\f396";
+@fa-var-dribbble: "\f17d";
+@fa-var-dribbble-square: "\f397";
+@fa-var-dropbox: "\f16b";
+@fa-var-drupal: "\f1a9";
+@fa-var-dyalog: "\f399";
+@fa-var-earlybirds: "\f39a";
+@fa-var-edge: "\f282";
+@fa-var-edit: "\f044";
+@fa-var-eject: "\f052";
+@fa-var-elementor: "\f430";
+@fa-var-ellipsis-h: "\f141";
+@fa-var-ellipsis-v: "\f142";
+@fa-var-ember: "\f423";
+@fa-var-empire: "\f1d1";
+@fa-var-envelope: "\f0e0";
+@fa-var-envelope-open: "\f2b6";
+@fa-var-envelope-square: "\f199";
+@fa-var-envira: "\f299";
+@fa-var-eraser: "\f12d";
+@fa-var-erlang: "\f39d";
+@fa-var-ethereum: "\f42e";
+@fa-var-etsy: "\f2d7";
+@fa-var-euro-sign: "\f153";
+@fa-var-exchange-alt: "\f362";
+@fa-var-exclamation: "\f12a";
+@fa-var-exclamation-circle: "\f06a";
+@fa-var-exclamation-triangle: "\f071";
+@fa-var-expand: "\f065";
+@fa-var-expand-arrows-alt: "\f31e";
+@fa-var-expeditedssl: "\f23e";
+@fa-var-external-link-alt: "\f35d";
+@fa-var-external-link-square-alt: "\f360";
+@fa-var-eye: "\f06e";
+@fa-var-eye-dropper: "\f1fb";
+@fa-var-eye-slash: "\f070";
+@fa-var-facebook: "\f09a";
+@fa-var-facebook-f: "\f39e";
+@fa-var-facebook-messenger: "\f39f";
+@fa-var-facebook-square: "\f082";
+@fa-var-fast-backward: "\f049";
+@fa-var-fast-forward: "\f050";
+@fa-var-fax: "\f1ac";
+@fa-var-female: "\f182";
+@fa-var-fighter-jet: "\f0fb";
+@fa-var-file: "\f15b";
+@fa-var-file-alt: "\f15c";
+@fa-var-file-archive: "\f1c6";
+@fa-var-file-audio: "\f1c7";
+@fa-var-file-code: "\f1c9";
+@fa-var-file-excel: "\f1c3";
+@fa-var-file-image: "\f1c5";
+@fa-var-file-medical: "\f477";
+@fa-var-file-medical-alt: "\f478";
+@fa-var-file-pdf: "\f1c1";
+@fa-var-file-powerpoint: "\f1c4";
+@fa-var-file-video: "\f1c8";
+@fa-var-file-word: "\f1c2";
+@fa-var-film: "\f008";
+@fa-var-filter: "\f0b0";
+@fa-var-fire: "\f06d";
+@fa-var-fire-extinguisher: "\f134";
+@fa-var-firefox: "\f269";
+@fa-var-first-aid: "\f479";
+@fa-var-first-order: "\f2b0";
+@fa-var-firstdraft: "\f3a1";
+@fa-var-flag: "\f024";
+@fa-var-flag-checkered: "\f11e";
+@fa-var-flask: "\f0c3";
+@fa-var-flickr: "\f16e";
+@fa-var-flipboard: "\f44d";
+@fa-var-fly: "\f417";
+@fa-var-folder: "\f07b";
+@fa-var-folder-open: "\f07c";
+@fa-var-font: "\f031";
+@fa-var-font-awesome: "\f2b4";
+@fa-var-font-awesome-alt: "\f35c";
+@fa-var-font-awesome-flag: "\f425";
+@fa-var-fonticons: "\f280";
+@fa-var-fonticons-fi: "\f3a2";
+@fa-var-football-ball: "\f44e";
+@fa-var-fort-awesome: "\f286";
+@fa-var-fort-awesome-alt: "\f3a3";
+@fa-var-forumbee: "\f211";
+@fa-var-forward: "\f04e";
+@fa-var-foursquare: "\f180";
+@fa-var-free-code-camp: "\f2c5";
+@fa-var-freebsd: "\f3a4";
+@fa-var-frown: "\f119";
+@fa-var-futbol: "\f1e3";
+@fa-var-gamepad: "\f11b";
+@fa-var-gavel: "\f0e3";
+@fa-var-gem: "\f3a5";
+@fa-var-genderless: "\f22d";
+@fa-var-get-pocket: "\f265";
+@fa-var-gg: "\f260";
+@fa-var-gg-circle: "\f261";
+@fa-var-gift: "\f06b";
+@fa-var-git: "\f1d3";
+@fa-var-git-square: "\f1d2";
+@fa-var-github: "\f09b";
+@fa-var-github-alt: "\f113";
+@fa-var-github-square: "\f092";
+@fa-var-gitkraken: "\f3a6";
+@fa-var-gitlab: "\f296";
+@fa-var-gitter: "\f426";
+@fa-var-glass-martini: "\f000";
+@fa-var-glide: "\f2a5";
+@fa-var-glide-g: "\f2a6";
+@fa-var-globe: "\f0ac";
+@fa-var-gofore: "\f3a7";
+@fa-var-golf-ball: "\f450";
+@fa-var-goodreads: "\f3a8";
+@fa-var-goodreads-g: "\f3a9";
+@fa-var-google: "\f1a0";
+@fa-var-google-drive: "\f3aa";
+@fa-var-google-play: "\f3ab";
+@fa-var-google-plus: "\f2b3";
+@fa-var-google-plus-g: "\f0d5";
+@fa-var-google-plus-square: "\f0d4";
+@fa-var-google-wallet: "\f1ee";
+@fa-var-graduation-cap: "\f19d";
+@fa-var-gratipay: "\f184";
+@fa-var-grav: "\f2d6";
+@fa-var-gripfire: "\f3ac";
+@fa-var-grunt: "\f3ad";
+@fa-var-gulp: "\f3ae";
+@fa-var-h-square: "\f0fd";
+@fa-var-hacker-news: "\f1d4";
+@fa-var-hacker-news-square: "\f3af";
+@fa-var-hand-holding: "\f4bd";
+@fa-var-hand-holding-heart: "\f4be";
+@fa-var-hand-holding-usd: "\f4c0";
+@fa-var-hand-lizard: "\f258";
+@fa-var-hand-paper: "\f256";
+@fa-var-hand-peace: "\f25b";
+@fa-var-hand-point-down: "\f0a7";
+@fa-var-hand-point-left: "\f0a5";
+@fa-var-hand-point-right: "\f0a4";
+@fa-var-hand-point-up: "\f0a6";
+@fa-var-hand-pointer: "\f25a";
+@fa-var-hand-rock: "\f255";
+@fa-var-hand-scissors: "\f257";
+@fa-var-hand-spock: "\f259";
+@fa-var-hands: "\f4c2";
+@fa-var-hands-helping: "\f4c4";
+@fa-var-handshake: "\f2b5";
+@fa-var-hashtag: "\f292";
+@fa-var-hdd: "\f0a0";
+@fa-var-heading: "\f1dc";
+@fa-var-headphones: "\f025";
+@fa-var-heart: "\f004";
+@fa-var-heartbeat: "\f21e";
+@fa-var-hips: "\f452";
+@fa-var-hire-a-helper: "\f3b0";
+@fa-var-history: "\f1da";
+@fa-var-hockey-puck: "\f453";
+@fa-var-home: "\f015";
+@fa-var-hooli: "\f427";
+@fa-var-hospital: "\f0f8";
+@fa-var-hospital-alt: "\f47d";
+@fa-var-hospital-symbol: "\f47e";
+@fa-var-hotjar: "\f3b1";
+@fa-var-hourglass: "\f254";
+@fa-var-hourglass-end: "\f253";
+@fa-var-hourglass-half: "\f252";
+@fa-var-hourglass-start: "\f251";
+@fa-var-houzz: "\f27c";
+@fa-var-html5: "\f13b";
+@fa-var-hubspot: "\f3b2";
+@fa-var-i-cursor: "\f246";
+@fa-var-id-badge: "\f2c1";
+@fa-var-id-card: "\f2c2";
+@fa-var-id-card-alt: "\f47f";
+@fa-var-image: "\f03e";
+@fa-var-images: "\f302";
+@fa-var-imdb: "\f2d8";
+@fa-var-inbox: "\f01c";
+@fa-var-indent: "\f03c";
+@fa-var-industry: "\f275";
+@fa-var-info: "\f129";
+@fa-var-info-circle: "\f05a";
+@fa-var-instagram: "\f16d";
+@fa-var-internet-explorer: "\f26b";
+@fa-var-ioxhost: "\f208";
+@fa-var-italic: "\f033";
+@fa-var-itunes: "\f3b4";
+@fa-var-itunes-note: "\f3b5";
+@fa-var-jenkins: "\f3b6";
+@fa-var-joget: "\f3b7";
+@fa-var-joomla: "\f1aa";
+@fa-var-js: "\f3b8";
+@fa-var-js-square: "\f3b9";
+@fa-var-jsfiddle: "\f1cc";
+@fa-var-key: "\f084";
+@fa-var-keyboard: "\f11c";
+@fa-var-keycdn: "\f3ba";
+@fa-var-kickstarter: "\f3bb";
+@fa-var-kickstarter-k: "\f3bc";
+@fa-var-korvue: "\f42f";
+@fa-var-language: "\f1ab";
+@fa-var-laptop: "\f109";
+@fa-var-laravel: "\f3bd";
+@fa-var-lastfm: "\f202";
+@fa-var-lastfm-square: "\f203";
+@fa-var-leaf: "\f06c";
+@fa-var-leanpub: "\f212";
+@fa-var-lemon: "\f094";
+@fa-var-less: "\f41d";
+@fa-var-level-down-alt: "\f3be";
+@fa-var-level-up-alt: "\f3bf";
+@fa-var-life-ring: "\f1cd";
+@fa-var-lightbulb: "\f0eb";
+@fa-var-line: "\f3c0";
+@fa-var-link: "\f0c1";
+@fa-var-linkedin: "\f08c";
+@fa-var-linkedin-in: "\f0e1";
+@fa-var-linode: "\f2b8";
+@fa-var-linux: "\f17c";
+@fa-var-lira-sign: "\f195";
+@fa-var-list: "\f03a";
+@fa-var-list-alt: "\f022";
+@fa-var-list-ol: "\f0cb";
+@fa-var-list-ul: "\f0ca";
+@fa-var-location-arrow: "\f124";
+@fa-var-lock: "\f023";
+@fa-var-lock-open: "\f3c1";
+@fa-var-long-arrow-alt-down: "\f309";
+@fa-var-long-arrow-alt-left: "\f30a";
+@fa-var-long-arrow-alt-right: "\f30b";
+@fa-var-long-arrow-alt-up: "\f30c";
+@fa-var-low-vision: "\f2a8";
+@fa-var-lyft: "\f3c3";
+@fa-var-magento: "\f3c4";
+@fa-var-magic: "\f0d0";
+@fa-var-magnet: "\f076";
+@fa-var-male: "\f183";
+@fa-var-map: "\f279";
+@fa-var-map-marker: "\f041";
+@fa-var-map-marker-alt: "\f3c5";
+@fa-var-map-pin: "\f276";
+@fa-var-map-signs: "\f277";
+@fa-var-mars: "\f222";
+@fa-var-mars-double: "\f227";
+@fa-var-mars-stroke: "\f229";
+@fa-var-mars-stroke-h: "\f22b";
+@fa-var-mars-stroke-v: "\f22a";
+@fa-var-maxcdn: "\f136";
+@fa-var-medapps: "\f3c6";
+@fa-var-medium: "\f23a";
+@fa-var-medium-m: "\f3c7";
+@fa-var-medkit: "\f0fa";
+@fa-var-medrt: "\f3c8";
+@fa-var-meetup: "\f2e0";
+@fa-var-meh: "\f11a";
+@fa-var-mercury: "\f223";
+@fa-var-microchip: "\f2db";
+@fa-var-microphone: "\f130";
+@fa-var-microphone-slash: "\f131";
+@fa-var-microsoft: "\f3ca";
+@fa-var-minus: "\f068";
+@fa-var-minus-circle: "\f056";
+@fa-var-minus-square: "\f146";
+@fa-var-mix: "\f3cb";
+@fa-var-mixcloud: "\f289";
+@fa-var-mizuni: "\f3cc";
+@fa-var-mobile: "\f10b";
+@fa-var-mobile-alt: "\f3cd";
+@fa-var-modx: "\f285";
+@fa-var-monero: "\f3d0";
+@fa-var-money-bill-alt: "\f3d1";
+@fa-var-moon: "\f186";
+@fa-var-motorcycle: "\f21c";
+@fa-var-mouse-pointer: "\f245";
+@fa-var-music: "\f001";
+@fa-var-napster: "\f3d2";
+@fa-var-neuter: "\f22c";
+@fa-var-newspaper: "\f1ea";
+@fa-var-nintendo-switch: "\f418";
+@fa-var-node: "\f419";
+@fa-var-node-js: "\f3d3";
+@fa-var-notes-medical: "\f481";
+@fa-var-npm: "\f3d4";
+@fa-var-ns8: "\f3d5";
+@fa-var-nutritionix: "\f3d6";
+@fa-var-object-group: "\f247";
+@fa-var-object-ungroup: "\f248";
+@fa-var-odnoklassniki: "\f263";
+@fa-var-odnoklassniki-square: "\f264";
+@fa-var-opencart: "\f23d";
+@fa-var-openid: "\f19b";
+@fa-var-opera: "\f26a";
+@fa-var-optin-monster: "\f23c";
+@fa-var-osi: "\f41a";
+@fa-var-outdent: "\f03b";
+@fa-var-page4: "\f3d7";
+@fa-var-pagelines: "\f18c";
+@fa-var-paint-brush: "\f1fc";
+@fa-var-palfed: "\f3d8";
+@fa-var-pallet: "\f482";
+@fa-var-paper-plane: "\f1d8";
+@fa-var-paperclip: "\f0c6";
+@fa-var-parachute-box: "\f4cd";
+@fa-var-paragraph: "\f1dd";
+@fa-var-paste: "\f0ea";
+@fa-var-patreon: "\f3d9";
+@fa-var-pause: "\f04c";
+@fa-var-pause-circle: "\f28b";
+@fa-var-paw: "\f1b0";
+@fa-var-paypal: "\f1ed";
+@fa-var-pen-square: "\f14b";
+@fa-var-pencil-alt: "\f303";
+@fa-var-people-carry: "\f4ce";
+@fa-var-percent: "\f295";
+@fa-var-periscope: "\f3da";
+@fa-var-phabricator: "\f3db";
+@fa-var-phoenix-framework: "\f3dc";
+@fa-var-phone: "\f095";
+@fa-var-phone-slash: "\f3dd";
+@fa-var-phone-square: "\f098";
+@fa-var-phone-volume: "\f2a0";
+@fa-var-php: "\f457";
+@fa-var-pied-piper: "\f2ae";
+@fa-var-pied-piper-alt: "\f1a8";
+@fa-var-pied-piper-pp: "\f1a7";
+@fa-var-piggy-bank: "\f4d3";
+@fa-var-pills: "\f484";
+@fa-var-pinterest: "\f0d2";
+@fa-var-pinterest-p: "\f231";
+@fa-var-pinterest-square: "\f0d3";
+@fa-var-plane: "\f072";
+@fa-var-play: "\f04b";
+@fa-var-play-circle: "\f144";
+@fa-var-playstation: "\f3df";
+@fa-var-plug: "\f1e6";
+@fa-var-plus: "\f067";
+@fa-var-plus-circle: "\f055";
+@fa-var-plus-square: "\f0fe";
+@fa-var-podcast: "\f2ce";
+@fa-var-poo: "\f2fe";
+@fa-var-pound-sign: "\f154";
+@fa-var-power-off: "\f011";
+@fa-var-prescription-bottle: "\f485";
+@fa-var-prescription-bottle-alt: "\f486";
+@fa-var-print: "\f02f";
+@fa-var-procedures: "\f487";
+@fa-var-product-hunt: "\f288";
+@fa-var-pushed: "\f3e1";
+@fa-var-puzzle-piece: "\f12e";
+@fa-var-python: "\f3e2";
+@fa-var-qq: "\f1d6";
+@fa-var-qrcode: "\f029";
+@fa-var-question: "\f128";
+@fa-var-question-circle: "\f059";
+@fa-var-quidditch: "\f458";
+@fa-var-quinscape: "\f459";
+@fa-var-quora: "\f2c4";
+@fa-var-quote-left: "\f10d";
+@fa-var-quote-right: "\f10e";
+@fa-var-random: "\f074";
+@fa-var-ravelry: "\f2d9";
+@fa-var-react: "\f41b";
+@fa-var-readme: "\f4d5";
+@fa-var-rebel: "\f1d0";
+@fa-var-recycle: "\f1b8";
+@fa-var-red-river: "\f3e3";
+@fa-var-reddit: "\f1a1";
+@fa-var-reddit-alien: "\f281";
+@fa-var-reddit-square: "\f1a2";
+@fa-var-redo: "\f01e";
+@fa-var-redo-alt: "\f2f9";
+@fa-var-registered: "\f25d";
+@fa-var-rendact: "\f3e4";
+@fa-var-renren: "\f18b";
+@fa-var-reply: "\f3e5";
+@fa-var-reply-all: "\f122";
+@fa-var-replyd: "\f3e6";
+@fa-var-resolving: "\f3e7";
+@fa-var-retweet: "\f079";
+@fa-var-ribbon: "\f4d6";
+@fa-var-road: "\f018";
+@fa-var-rocket: "\f135";
+@fa-var-rocketchat: "\f3e8";
+@fa-var-rockrms: "\f3e9";
+@fa-var-rss: "\f09e";
+@fa-var-rss-square: "\f143";
+@fa-var-ruble-sign: "\f158";
+@fa-var-rupee-sign: "\f156";
+@fa-var-safari: "\f267";
+@fa-var-sass: "\f41e";
+@fa-var-save: "\f0c7";
+@fa-var-schlix: "\f3ea";
+@fa-var-scribd: "\f28a";
+@fa-var-search: "\f002";
+@fa-var-search-minus: "\f010";
+@fa-var-search-plus: "\f00e";
+@fa-var-searchengin: "\f3eb";
+@fa-var-seedling: "\f4d8";
+@fa-var-sellcast: "\f2da";
+@fa-var-sellsy: "\f213";
+@fa-var-server: "\f233";
+@fa-var-servicestack: "\f3ec";
+@fa-var-share: "\f064";
+@fa-var-share-alt: "\f1e0";
+@fa-var-share-alt-square: "\f1e1";
+@fa-var-share-square: "\f14d";
+@fa-var-shekel-sign: "\f20b";
+@fa-var-shield-alt: "\f3ed";
+@fa-var-ship: "\f21a";
+@fa-var-shipping-fast: "\f48b";
+@fa-var-shirtsinbulk: "\f214";
+@fa-var-shopping-bag: "\f290";
+@fa-var-shopping-basket: "\f291";
+@fa-var-shopping-cart: "\f07a";
+@fa-var-shower: "\f2cc";
+@fa-var-sign: "\f4d9";
+@fa-var-sign-in-alt: "\f2f6";
+@fa-var-sign-language: "\f2a7";
+@fa-var-sign-out-alt: "\f2f5";
+@fa-var-signal: "\f012";
+@fa-var-simplybuilt: "\f215";
+@fa-var-sistrix: "\f3ee";
+@fa-var-sitemap: "\f0e8";
+@fa-var-skyatlas: "\f216";
+@fa-var-skype: "\f17e";
+@fa-var-slack: "\f198";
+@fa-var-slack-hash: "\f3ef";
+@fa-var-sliders-h: "\f1de";
+@fa-var-slideshare: "\f1e7";
+@fa-var-smile: "\f118";
+@fa-var-smoking: "\f48d";
+@fa-var-snapchat: "\f2ab";
+@fa-var-snapchat-ghost: "\f2ac";
+@fa-var-snapchat-square: "\f2ad";
+@fa-var-snowflake: "\f2dc";
+@fa-var-sort: "\f0dc";
+@fa-var-sort-alpha-down: "\f15d";
+@fa-var-sort-alpha-up: "\f15e";
+@fa-var-sort-amount-down: "\f160";
+@fa-var-sort-amount-up: "\f161";
+@fa-var-sort-down: "\f0dd";
+@fa-var-sort-numeric-down: "\f162";
+@fa-var-sort-numeric-up: "\f163";
+@fa-var-sort-up: "\f0de";
+@fa-var-soundcloud: "\f1be";
+@fa-var-space-shuttle: "\f197";
+@fa-var-speakap: "\f3f3";
+@fa-var-spinner: "\f110";
+@fa-var-spotify: "\f1bc";
+@fa-var-square: "\f0c8";
+@fa-var-square-full: "\f45c";
+@fa-var-stack-exchange: "\f18d";
+@fa-var-stack-overflow: "\f16c";
+@fa-var-star: "\f005";
+@fa-var-star-half: "\f089";
+@fa-var-staylinked: "\f3f5";
+@fa-var-steam: "\f1b6";
+@fa-var-steam-square: "\f1b7";
+@fa-var-steam-symbol: "\f3f6";
+@fa-var-step-backward: "\f048";
+@fa-var-step-forward: "\f051";
+@fa-var-stethoscope: "\f0f1";
+@fa-var-sticker-mule: "\f3f7";
+@fa-var-sticky-note: "\f249";
+@fa-var-stop: "\f04d";
+@fa-var-stop-circle: "\f28d";
+@fa-var-stopwatch: "\f2f2";
+@fa-var-strava: "\f428";
+@fa-var-street-view: "\f21d";
+@fa-var-strikethrough: "\f0cc";
+@fa-var-stripe: "\f429";
+@fa-var-stripe-s: "\f42a";
+@fa-var-studiovinari: "\f3f8";
+@fa-var-stumbleupon: "\f1a4";
+@fa-var-stumbleupon-circle: "\f1a3";
+@fa-var-subscript: "\f12c";
+@fa-var-subway: "\f239";
+@fa-var-suitcase: "\f0f2";
+@fa-var-sun: "\f185";
+@fa-var-superpowers: "\f2dd";
+@fa-var-superscript: "\f12b";
+@fa-var-supple: "\f3f9";
+@fa-var-sync: "\f021";
+@fa-var-sync-alt: "\f2f1";
+@fa-var-syringe: "\f48e";
+@fa-var-table: "\f0ce";
+@fa-var-table-tennis: "\f45d";
+@fa-var-tablet: "\f10a";
+@fa-var-tablet-alt: "\f3fa";
+@fa-var-tablets: "\f490";
+@fa-var-tachometer-alt: "\f3fd";
+@fa-var-tag: "\f02b";
+@fa-var-tags: "\f02c";
+@fa-var-tape: "\f4db";
+@fa-var-tasks: "\f0ae";
+@fa-var-taxi: "\f1ba";
+@fa-var-telegram: "\f2c6";
+@fa-var-telegram-plane: "\f3fe";
+@fa-var-tencent-weibo: "\f1d5";
+@fa-var-terminal: "\f120";
+@fa-var-text-height: "\f034";
+@fa-var-text-width: "\f035";
+@fa-var-th: "\f00a";
+@fa-var-th-large: "\f009";
+@fa-var-th-list: "\f00b";
+@fa-var-themeisle: "\f2b2";
+@fa-var-thermometer: "\f491";
+@fa-var-thermometer-empty: "\f2cb";
+@fa-var-thermometer-full: "\f2c7";
+@fa-var-thermometer-half: "\f2c9";
+@fa-var-thermometer-quarter: "\f2ca";
+@fa-var-thermometer-three-quarters: "\f2c8";
+@fa-var-thumbs-down: "\f165";
+@fa-var-thumbs-up: "\f164";
+@fa-var-thumbtack: "\f08d";
+@fa-var-ticket-alt: "\f3ff";
+@fa-var-times: "\f00d";
+@fa-var-times-circle: "\f057";
+@fa-var-tint: "\f043";
+@fa-var-toggle-off: "\f204";
+@fa-var-toggle-on: "\f205";
+@fa-var-trademark: "\f25c";
+@fa-var-train: "\f238";
+@fa-var-transgender: "\f224";
+@fa-var-transgender-alt: "\f225";
+@fa-var-trash: "\f1f8";
+@fa-var-trash-alt: "\f2ed";
+@fa-var-tree: "\f1bb";
+@fa-var-trello: "\f181";
+@fa-var-tripadvisor: "\f262";
+@fa-var-trophy: "\f091";
+@fa-var-truck: "\f0d1";
+@fa-var-truck-loading: "\f4de";
+@fa-var-truck-moving: "\f4df";
+@fa-var-tty: "\f1e4";
+@fa-var-tumblr: "\f173";
+@fa-var-tumblr-square: "\f174";
+@fa-var-tv: "\f26c";
+@fa-var-twitch: "\f1e8";
+@fa-var-twitter: "\f099";
+@fa-var-twitter-square: "\f081";
+@fa-var-typo3: "\f42b";
+@fa-var-uber: "\f402";
+@fa-var-uikit: "\f403";
+@fa-var-umbrella: "\f0e9";
+@fa-var-underline: "\f0cd";
+@fa-var-undo: "\f0e2";
+@fa-var-undo-alt: "\f2ea";
+@fa-var-uniregistry: "\f404";
+@fa-var-universal-access: "\f29a";
+@fa-var-university: "\f19c";
+@fa-var-unlink: "\f127";
+@fa-var-unlock: "\f09c";
+@fa-var-unlock-alt: "\f13e";
+@fa-var-untappd: "\f405";
+@fa-var-upload: "\f093";
+@fa-var-usb: "\f287";
+@fa-var-user: "\f007";
+@fa-var-user-circle: "\f2bd";
+@fa-var-user-md: "\f0f0";
+@fa-var-user-plus: "\f234";
+@fa-var-user-secret: "\f21b";
+@fa-var-user-times: "\f235";
+@fa-var-users: "\f0c0";
+@fa-var-ussunnah: "\f407";
+@fa-var-utensil-spoon: "\f2e5";
+@fa-var-utensils: "\f2e7";
+@fa-var-vaadin: "\f408";
+@fa-var-venus: "\f221";
+@fa-var-venus-double: "\f226";
+@fa-var-venus-mars: "\f228";
+@fa-var-viacoin: "\f237";
+@fa-var-viadeo: "\f2a9";
+@fa-var-viadeo-square: "\f2aa";
+@fa-var-vial: "\f492";
+@fa-var-vials: "\f493";
+@fa-var-viber: "\f409";
+@fa-var-video: "\f03d";
+@fa-var-video-slash: "\f4e2";
+@fa-var-vimeo: "\f40a";
+@fa-var-vimeo-square: "\f194";
+@fa-var-vimeo-v: "\f27d";
+@fa-var-vine: "\f1ca";
+@fa-var-vk: "\f189";
+@fa-var-vnv: "\f40b";
+@fa-var-volleyball-ball: "\f45f";
+@fa-var-volume-down: "\f027";
+@fa-var-volume-off: "\f026";
+@fa-var-volume-up: "\f028";
+@fa-var-vuejs: "\f41f";
+@fa-var-warehouse: "\f494";
+@fa-var-weibo: "\f18a";
+@fa-var-weight: "\f496";
+@fa-var-weixin: "\f1d7";
+@fa-var-whatsapp: "\f232";
+@fa-var-whatsapp-square: "\f40c";
+@fa-var-wheelchair: "\f193";
+@fa-var-whmcs: "\f40d";
+@fa-var-wifi: "\f1eb";
+@fa-var-wikipedia-w: "\f266";
+@fa-var-window-close: "\f410";
+@fa-var-window-maximize: "\f2d0";
+@fa-var-window-minimize: "\f2d1";
+@fa-var-window-restore: "\f2d2";
+@fa-var-windows: "\f17a";
+@fa-var-wine-glass: "\f4e3";
+@fa-var-won-sign: "\f159";
+@fa-var-wordpress: "\f19a";
+@fa-var-wordpress-simple: "\f411";
+@fa-var-wpbeginner: "\f297";
+@fa-var-wpexplorer: "\f2de";
+@fa-var-wpforms: "\f298";
+@fa-var-wrench: "\f0ad";
+@fa-var-x-ray: "\f497";
+@fa-var-xbox: "\f412";
+@fa-var-xing: "\f168";
+@fa-var-xing-square: "\f169";
+@fa-var-y-combinator: "\f23b";
+@fa-var-yahoo: "\f19e";
+@fa-var-yandex: "\f413";
+@fa-var-yandex-international: "\f414";
+@fa-var-yelp: "\f1e9";
+@fa-var-yen-sign: "\f157";
+@fa-var-yoast: "\f2b1";
+@fa-var-youtube: "\f167";
+@fa-var-youtube-square: "\f431";
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-brands.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-brands.less
new file mode 100644
index 0000000000000000000000000000000000000000..f37a1c79144ed7c486448c854283b87b87e1462e
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-brands.less
@@ -0,0 +1,21 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import "_variables.less";
+
+@font-face {
+  font-family: 'Font Awesome 5 Brands';
+  font-style: normal;
+  font-weight: normal;
+  src: url('@{fa-font-path}/fa-brands-400.eot');
+  src: url('@{fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
+    url('@{fa-font-path}/fa-brands-400.woff2') format('woff2'),
+    url('@{fa-font-path}/fa-brands-400.woff') format('woff'),
+    url('@{fa-font-path}/fa-brands-400.ttf') format('truetype'),
+    url('@{fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
+}
+
+.fab {
+  font-family: 'Font Awesome 5 Brands';
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-regular.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-regular.less
new file mode 100644
index 0000000000000000000000000000000000000000..a9f9308200727111324e24a3a7c2474c4f9bd962
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-regular.less
@@ -0,0 +1,22 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import "_variables.less";
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 400;
+  src: url('@{fa-font-path}/fa-regular-400.eot');
+  src: url('@{fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
+    url('@{fa-font-path}/fa-regular-400.woff2') format('woff2'),
+    url('@{fa-font-path}/fa-regular-400.woff') format('woff'),
+    url('@{fa-font-path}/fa-regular-400.ttf') format('truetype'),
+    url('@{fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
+}
+
+.far {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 400;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-solid.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-solid.less
new file mode 100644
index 0000000000000000000000000000000000000000..09a48fb1d8ec369fcfcc12c0b843b7241c4727a6
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fa-solid.less
@@ -0,0 +1,23 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import "_variables.less";
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 900;
+  src: url('@{fa-font-path}/fa-solid-900.eot');
+  src: url('@{fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
+    url('@{fa-font-path}/fa-solid-900.woff2') format('woff2'),
+    url('@{fa-font-path}/fa-solid-900.woff') format('woff'),
+    url('@{fa-font-path}/fa-solid-900.ttf') format('truetype'),
+    url('@{fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
+}
+
+.fa,
+.fas {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 900;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fontawesome.less b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fontawesome.less
new file mode 100644
index 0000000000000000000000000000000000000000..58671a4bd2750c03b2c0619d620d6db3ba1f121d
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/less/fontawesome.less
@@ -0,0 +1,16 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import "_variables.less";
+@import "_mixins.less";
+@import "_core.less";
+@import "_larger.less";
+@import "_fixed-width.less";
+@import "_list.less";
+@import "_bordered-pulled.less";
+@import "_animated.less";
+@import "_rotated-flipped.less";
+@import "_stacked.less";
+@import "_icons.less";
+@import "_screen-reader.less";
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_animated.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_animated.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7c7c0e173c5be0ae113fb8fbbff994b502f0a475
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_animated.scss
@@ -0,0 +1,20 @@
+// Animated Icons
+// --------------------------
+
+.#{$fa-css-prefix}-spin {
+  animation: fa-spin 2s infinite linear;
+}
+
+.#{$fa-css-prefix}-pulse {
+  animation: fa-spin 1s infinite steps(8);
+}
+
+@keyframes fa-spin {
+  0% {
+    transform: rotate(0deg);
+  }
+
+  100% {
+    transform: rotate(360deg);
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_bordered-pulled.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_bordered-pulled.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c8c4274c40956310d9814993badecac54942b9a5
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_bordered-pulled.scss
@@ -0,0 +1,20 @@
+// Bordered & Pulled
+// -------------------------
+
+.#{$fa-css-prefix}-border {
+  border: solid .08em $fa-border-color;
+  border-radius: .1em;
+  padding: .2em .25em .15em;
+}
+
+.#{$fa-css-prefix}-pull-left { float: left; }
+.#{$fa-css-prefix}-pull-right { float: right; }
+
+.#{$fa-css-prefix},
+.fas,
+.far,
+.fal,
+.fab {
+  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
+  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_core.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_core.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7fd37f855cf5f0f9cc82164ab6493b6d0c93bb14
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_core.scss
@@ -0,0 +1,16 @@
+// Base Class Definition
+// -------------------------
+
+.#{$fa-css-prefix},
+.fas,
+.far,
+.fal,
+.fab {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  text-rendering: auto;
+  line-height: 1;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_fixed-width.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_fixed-width.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5b33eb49aa9b9fe02e902f3d92e003ccc335fb3c
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_fixed-width.scss
@@ -0,0 +1,6 @@
+// Fixed Width Icons
+// -------------------------
+.#{$fa-css-prefix}-fw {
+  text-align: center;
+  width: (20em / 16);
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_icons.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_icons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b082f17e35593354f6fd259e7ded1c63b57486d1
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_icons.scss
@@ -0,0 +1,876 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+
+.#{$fa-css-prefix}-500px:before { content: fa-content($fa-var-500px); }
+.#{$fa-css-prefix}-accessible-icon:before { content: fa-content($fa-var-accessible-icon); }
+.#{$fa-css-prefix}-accusoft:before { content: fa-content($fa-var-accusoft); }
+.#{$fa-css-prefix}-address-book:before { content: fa-content($fa-var-address-book); }
+.#{$fa-css-prefix}-address-card:before { content: fa-content($fa-var-address-card); }
+.#{$fa-css-prefix}-adjust:before { content: fa-content($fa-var-adjust); }
+.#{$fa-css-prefix}-adn:before { content: fa-content($fa-var-adn); }
+.#{$fa-css-prefix}-adversal:before { content: fa-content($fa-var-adversal); }
+.#{$fa-css-prefix}-affiliatetheme:before { content: fa-content($fa-var-affiliatetheme); }
+.#{$fa-css-prefix}-algolia:before { content: fa-content($fa-var-algolia); }
+.#{$fa-css-prefix}-align-center:before { content: fa-content($fa-var-align-center); }
+.#{$fa-css-prefix}-align-justify:before { content: fa-content($fa-var-align-justify); }
+.#{$fa-css-prefix}-align-left:before { content: fa-content($fa-var-align-left); }
+.#{$fa-css-prefix}-align-right:before { content: fa-content($fa-var-align-right); }
+.#{$fa-css-prefix}-allergies:before { content: fa-content($fa-var-allergies); }
+.#{$fa-css-prefix}-amazon:before { content: fa-content($fa-var-amazon); }
+.#{$fa-css-prefix}-amazon-pay:before { content: fa-content($fa-var-amazon-pay); }
+.#{$fa-css-prefix}-ambulance:before { content: fa-content($fa-var-ambulance); }
+.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); }
+.#{$fa-css-prefix}-amilia:before { content: fa-content($fa-var-amilia); }
+.#{$fa-css-prefix}-anchor:before { content: fa-content($fa-var-anchor); }
+.#{$fa-css-prefix}-android:before { content: fa-content($fa-var-android); }
+.#{$fa-css-prefix}-angellist:before { content: fa-content($fa-var-angellist); }
+.#{$fa-css-prefix}-angle-double-down:before { content: fa-content($fa-var-angle-double-down); }
+.#{$fa-css-prefix}-angle-double-left:before { content: fa-content($fa-var-angle-double-left); }
+.#{$fa-css-prefix}-angle-double-right:before { content: fa-content($fa-var-angle-double-right); }
+.#{$fa-css-prefix}-angle-double-up:before { content: fa-content($fa-var-angle-double-up); }
+.#{$fa-css-prefix}-angle-down:before { content: fa-content($fa-var-angle-down); }
+.#{$fa-css-prefix}-angle-left:before { content: fa-content($fa-var-angle-left); }
+.#{$fa-css-prefix}-angle-right:before { content: fa-content($fa-var-angle-right); }
+.#{$fa-css-prefix}-angle-up:before { content: fa-content($fa-var-angle-up); }
+.#{$fa-css-prefix}-angrycreative:before { content: fa-content($fa-var-angrycreative); }
+.#{$fa-css-prefix}-angular:before { content: fa-content($fa-var-angular); }
+.#{$fa-css-prefix}-app-store:before { content: fa-content($fa-var-app-store); }
+.#{$fa-css-prefix}-app-store-ios:before { content: fa-content($fa-var-app-store-ios); }
+.#{$fa-css-prefix}-apper:before { content: fa-content($fa-var-apper); }
+.#{$fa-css-prefix}-apple:before { content: fa-content($fa-var-apple); }
+.#{$fa-css-prefix}-apple-pay:before { content: fa-content($fa-var-apple-pay); }
+.#{$fa-css-prefix}-archive:before { content: fa-content($fa-var-archive); }
+.#{$fa-css-prefix}-arrow-alt-circle-down:before { content: fa-content($fa-var-arrow-alt-circle-down); }
+.#{$fa-css-prefix}-arrow-alt-circle-left:before { content: fa-content($fa-var-arrow-alt-circle-left); }
+.#{$fa-css-prefix}-arrow-alt-circle-right:before { content: fa-content($fa-var-arrow-alt-circle-right); }
+.#{$fa-css-prefix}-arrow-alt-circle-up:before { content: fa-content($fa-var-arrow-alt-circle-up); }
+.#{$fa-css-prefix}-arrow-circle-down:before { content: fa-content($fa-var-arrow-circle-down); }
+.#{$fa-css-prefix}-arrow-circle-left:before { content: fa-content($fa-var-arrow-circle-left); }
+.#{$fa-css-prefix}-arrow-circle-right:before { content: fa-content($fa-var-arrow-circle-right); }
+.#{$fa-css-prefix}-arrow-circle-up:before { content: fa-content($fa-var-arrow-circle-up); }
+.#{$fa-css-prefix}-arrow-down:before { content: fa-content($fa-var-arrow-down); }
+.#{$fa-css-prefix}-arrow-left:before { content: fa-content($fa-var-arrow-left); }
+.#{$fa-css-prefix}-arrow-right:before { content: fa-content($fa-var-arrow-right); }
+.#{$fa-css-prefix}-arrow-up:before { content: fa-content($fa-var-arrow-up); }
+.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-arrows-alt); }
+.#{$fa-css-prefix}-arrows-alt-h:before { content: fa-content($fa-var-arrows-alt-h); }
+.#{$fa-css-prefix}-arrows-alt-v:before { content: fa-content($fa-var-arrows-alt-v); }
+.#{$fa-css-prefix}-assistive-listening-systems:before { content: fa-content($fa-var-assistive-listening-systems); }
+.#{$fa-css-prefix}-asterisk:before { content: fa-content($fa-var-asterisk); }
+.#{$fa-css-prefix}-asymmetrik:before { content: fa-content($fa-var-asymmetrik); }
+.#{$fa-css-prefix}-at:before { content: fa-content($fa-var-at); }
+.#{$fa-css-prefix}-audible:before { content: fa-content($fa-var-audible); }
+.#{$fa-css-prefix}-audio-description:before { content: fa-content($fa-var-audio-description); }
+.#{$fa-css-prefix}-autoprefixer:before { content: fa-content($fa-var-autoprefixer); }
+.#{$fa-css-prefix}-avianex:before { content: fa-content($fa-var-avianex); }
+.#{$fa-css-prefix}-aviato:before { content: fa-content($fa-var-aviato); }
+.#{$fa-css-prefix}-aws:before { content: fa-content($fa-var-aws); }
+.#{$fa-css-prefix}-backward:before { content: fa-content($fa-var-backward); }
+.#{$fa-css-prefix}-balance-scale:before { content: fa-content($fa-var-balance-scale); }
+.#{$fa-css-prefix}-ban:before { content: fa-content($fa-var-ban); }
+.#{$fa-css-prefix}-band-aid:before { content: fa-content($fa-var-band-aid); }
+.#{$fa-css-prefix}-bandcamp:before { content: fa-content($fa-var-bandcamp); }
+.#{$fa-css-prefix}-barcode:before { content: fa-content($fa-var-barcode); }
+.#{$fa-css-prefix}-bars:before { content: fa-content($fa-var-bars); }
+.#{$fa-css-prefix}-baseball-ball:before { content: fa-content($fa-var-baseball-ball); }
+.#{$fa-css-prefix}-basketball-ball:before { content: fa-content($fa-var-basketball-ball); }
+.#{$fa-css-prefix}-bath:before { content: fa-content($fa-var-bath); }
+.#{$fa-css-prefix}-battery-empty:before { content: fa-content($fa-var-battery-empty); }
+.#{$fa-css-prefix}-battery-full:before { content: fa-content($fa-var-battery-full); }
+.#{$fa-css-prefix}-battery-half:before { content: fa-content($fa-var-battery-half); }
+.#{$fa-css-prefix}-battery-quarter:before { content: fa-content($fa-var-battery-quarter); }
+.#{$fa-css-prefix}-battery-three-quarters:before { content: fa-content($fa-var-battery-three-quarters); }
+.#{$fa-css-prefix}-bed:before { content: fa-content($fa-var-bed); }
+.#{$fa-css-prefix}-beer:before { content: fa-content($fa-var-beer); }
+.#{$fa-css-prefix}-behance:before { content: fa-content($fa-var-behance); }
+.#{$fa-css-prefix}-behance-square:before { content: fa-content($fa-var-behance-square); }
+.#{$fa-css-prefix}-bell:before { content: fa-content($fa-var-bell); }
+.#{$fa-css-prefix}-bell-slash:before { content: fa-content($fa-var-bell-slash); }
+.#{$fa-css-prefix}-bicycle:before { content: fa-content($fa-var-bicycle); }
+.#{$fa-css-prefix}-bimobject:before { content: fa-content($fa-var-bimobject); }
+.#{$fa-css-prefix}-binoculars:before { content: fa-content($fa-var-binoculars); }
+.#{$fa-css-prefix}-birthday-cake:before { content: fa-content($fa-var-birthday-cake); }
+.#{$fa-css-prefix}-bitbucket:before { content: fa-content($fa-var-bitbucket); }
+.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-bitcoin); }
+.#{$fa-css-prefix}-bity:before { content: fa-content($fa-var-bity); }
+.#{$fa-css-prefix}-black-tie:before { content: fa-content($fa-var-black-tie); }
+.#{$fa-css-prefix}-blackberry:before { content: fa-content($fa-var-blackberry); }
+.#{$fa-css-prefix}-blind:before { content: fa-content($fa-var-blind); }
+.#{$fa-css-prefix}-blogger:before { content: fa-content($fa-var-blogger); }
+.#{$fa-css-prefix}-blogger-b:before { content: fa-content($fa-var-blogger-b); }
+.#{$fa-css-prefix}-bluetooth:before { content: fa-content($fa-var-bluetooth); }
+.#{$fa-css-prefix}-bluetooth-b:before { content: fa-content($fa-var-bluetooth-b); }
+.#{$fa-css-prefix}-bold:before { content: fa-content($fa-var-bold); }
+.#{$fa-css-prefix}-bolt:before { content: fa-content($fa-var-bolt); }
+.#{$fa-css-prefix}-bomb:before { content: fa-content($fa-var-bomb); }
+.#{$fa-css-prefix}-book:before { content: fa-content($fa-var-book); }
+.#{$fa-css-prefix}-bookmark:before { content: fa-content($fa-var-bookmark); }
+.#{$fa-css-prefix}-bowling-ball:before { content: fa-content($fa-var-bowling-ball); }
+.#{$fa-css-prefix}-box:before { content: fa-content($fa-var-box); }
+.#{$fa-css-prefix}-box-open:before { content: fa-content($fa-var-box-open); }
+.#{$fa-css-prefix}-boxes:before { content: fa-content($fa-var-boxes); }
+.#{$fa-css-prefix}-braille:before { content: fa-content($fa-var-braille); }
+.#{$fa-css-prefix}-briefcase:before { content: fa-content($fa-var-briefcase); }
+.#{$fa-css-prefix}-briefcase-medical:before { content: fa-content($fa-var-briefcase-medical); }
+.#{$fa-css-prefix}-btc:before { content: fa-content($fa-var-btc); }
+.#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); }
+.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); }
+.#{$fa-css-prefix}-bullhorn:before { content: fa-content($fa-var-bullhorn); }
+.#{$fa-css-prefix}-bullseye:before { content: fa-content($fa-var-bullseye); }
+.#{$fa-css-prefix}-burn:before { content: fa-content($fa-var-burn); }
+.#{$fa-css-prefix}-buromobelexperte:before { content: fa-content($fa-var-buromobelexperte); }
+.#{$fa-css-prefix}-bus:before { content: fa-content($fa-var-bus); }
+.#{$fa-css-prefix}-buysellads:before { content: fa-content($fa-var-buysellads); }
+.#{$fa-css-prefix}-calculator:before { content: fa-content($fa-var-calculator); }
+.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar); }
+.#{$fa-css-prefix}-calendar-alt:before { content: fa-content($fa-var-calendar-alt); }
+.#{$fa-css-prefix}-calendar-check:before { content: fa-content($fa-var-calendar-check); }
+.#{$fa-css-prefix}-calendar-minus:before { content: fa-content($fa-var-calendar-minus); }
+.#{$fa-css-prefix}-calendar-plus:before { content: fa-content($fa-var-calendar-plus); }
+.#{$fa-css-prefix}-calendar-times:before { content: fa-content($fa-var-calendar-times); }
+.#{$fa-css-prefix}-camera:before { content: fa-content($fa-var-camera); }
+.#{$fa-css-prefix}-camera-retro:before { content: fa-content($fa-var-camera-retro); }
+.#{$fa-css-prefix}-capsules:before { content: fa-content($fa-var-capsules); }
+.#{$fa-css-prefix}-car:before { content: fa-content($fa-var-car); }
+.#{$fa-css-prefix}-caret-down:before { content: fa-content($fa-var-caret-down); }
+.#{$fa-css-prefix}-caret-left:before { content: fa-content($fa-var-caret-left); }
+.#{$fa-css-prefix}-caret-right:before { content: fa-content($fa-var-caret-right); }
+.#{$fa-css-prefix}-caret-square-down:before { content: fa-content($fa-var-caret-square-down); }
+.#{$fa-css-prefix}-caret-square-left:before { content: fa-content($fa-var-caret-square-left); }
+.#{$fa-css-prefix}-caret-square-right:before { content: fa-content($fa-var-caret-square-right); }
+.#{$fa-css-prefix}-caret-square-up:before { content: fa-content($fa-var-caret-square-up); }
+.#{$fa-css-prefix}-caret-up:before { content: fa-content($fa-var-caret-up); }
+.#{$fa-css-prefix}-cart-arrow-down:before { content: fa-content($fa-var-cart-arrow-down); }
+.#{$fa-css-prefix}-cart-plus:before { content: fa-content($fa-var-cart-plus); }
+.#{$fa-css-prefix}-cc-amazon-pay:before { content: fa-content($fa-var-cc-amazon-pay); }
+.#{$fa-css-prefix}-cc-amex:before { content: fa-content($fa-var-cc-amex); }
+.#{$fa-css-prefix}-cc-apple-pay:before { content: fa-content($fa-var-cc-apple-pay); }
+.#{$fa-css-prefix}-cc-diners-club:before { content: fa-content($fa-var-cc-diners-club); }
+.#{$fa-css-prefix}-cc-discover:before { content: fa-content($fa-var-cc-discover); }
+.#{$fa-css-prefix}-cc-jcb:before { content: fa-content($fa-var-cc-jcb); }
+.#{$fa-css-prefix}-cc-mastercard:before { content: fa-content($fa-var-cc-mastercard); }
+.#{$fa-css-prefix}-cc-paypal:before { content: fa-content($fa-var-cc-paypal); }
+.#{$fa-css-prefix}-cc-stripe:before { content: fa-content($fa-var-cc-stripe); }
+.#{$fa-css-prefix}-cc-visa:before { content: fa-content($fa-var-cc-visa); }
+.#{$fa-css-prefix}-centercode:before { content: fa-content($fa-var-centercode); }
+.#{$fa-css-prefix}-certificate:before { content: fa-content($fa-var-certificate); }
+.#{$fa-css-prefix}-chart-area:before { content: fa-content($fa-var-chart-area); }
+.#{$fa-css-prefix}-chart-bar:before { content: fa-content($fa-var-chart-bar); }
+.#{$fa-css-prefix}-chart-line:before { content: fa-content($fa-var-chart-line); }
+.#{$fa-css-prefix}-chart-pie:before { content: fa-content($fa-var-chart-pie); }
+.#{$fa-css-prefix}-check:before { content: fa-content($fa-var-check); }
+.#{$fa-css-prefix}-check-circle:before { content: fa-content($fa-var-check-circle); }
+.#{$fa-css-prefix}-check-square:before { content: fa-content($fa-var-check-square); }
+.#{$fa-css-prefix}-chess:before { content: fa-content($fa-var-chess); }
+.#{$fa-css-prefix}-chess-bishop:before { content: fa-content($fa-var-chess-bishop); }
+.#{$fa-css-prefix}-chess-board:before { content: fa-content($fa-var-chess-board); }
+.#{$fa-css-prefix}-chess-king:before { content: fa-content($fa-var-chess-king); }
+.#{$fa-css-prefix}-chess-knight:before { content: fa-content($fa-var-chess-knight); }
+.#{$fa-css-prefix}-chess-pawn:before { content: fa-content($fa-var-chess-pawn); }
+.#{$fa-css-prefix}-chess-queen:before { content: fa-content($fa-var-chess-queen); }
+.#{$fa-css-prefix}-chess-rook:before { content: fa-content($fa-var-chess-rook); }
+.#{$fa-css-prefix}-chevron-circle-down:before { content: fa-content($fa-var-chevron-circle-down); }
+.#{$fa-css-prefix}-chevron-circle-left:before { content: fa-content($fa-var-chevron-circle-left); }
+.#{$fa-css-prefix}-chevron-circle-right:before { content: fa-content($fa-var-chevron-circle-right); }
+.#{$fa-css-prefix}-chevron-circle-up:before { content: fa-content($fa-var-chevron-circle-up); }
+.#{$fa-css-prefix}-chevron-down:before { content: fa-content($fa-var-chevron-down); }
+.#{$fa-css-prefix}-chevron-left:before { content: fa-content($fa-var-chevron-left); }
+.#{$fa-css-prefix}-chevron-right:before { content: fa-content($fa-var-chevron-right); }
+.#{$fa-css-prefix}-chevron-up:before { content: fa-content($fa-var-chevron-up); }
+.#{$fa-css-prefix}-child:before { content: fa-content($fa-var-child); }
+.#{$fa-css-prefix}-chrome:before { content: fa-content($fa-var-chrome); }
+.#{$fa-css-prefix}-circle:before { content: fa-content($fa-var-circle); }
+.#{$fa-css-prefix}-circle-notch:before { content: fa-content($fa-var-circle-notch); }
+.#{$fa-css-prefix}-clipboard:before { content: fa-content($fa-var-clipboard); }
+.#{$fa-css-prefix}-clipboard-check:before { content: fa-content($fa-var-clipboard-check); }
+.#{$fa-css-prefix}-clipboard-list:before { content: fa-content($fa-var-clipboard-list); }
+.#{$fa-css-prefix}-clock:before { content: fa-content($fa-var-clock); }
+.#{$fa-css-prefix}-clone:before { content: fa-content($fa-var-clone); }
+.#{$fa-css-prefix}-closed-captioning:before { content: fa-content($fa-var-closed-captioning); }
+.#{$fa-css-prefix}-cloud:before { content: fa-content($fa-var-cloud); }
+.#{$fa-css-prefix}-cloud-download-alt:before { content: fa-content($fa-var-cloud-download-alt); }
+.#{$fa-css-prefix}-cloud-upload-alt:before { content: fa-content($fa-var-cloud-upload-alt); }
+.#{$fa-css-prefix}-cloudscale:before { content: fa-content($fa-var-cloudscale); }
+.#{$fa-css-prefix}-cloudsmith:before { content: fa-content($fa-var-cloudsmith); }
+.#{$fa-css-prefix}-cloudversify:before { content: fa-content($fa-var-cloudversify); }
+.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
+.#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); }
+.#{$fa-css-prefix}-codepen:before { content: fa-content($fa-var-codepen); }
+.#{$fa-css-prefix}-codiepie:before { content: fa-content($fa-var-codiepie); }
+.#{$fa-css-prefix}-coffee:before { content: fa-content($fa-var-coffee); }
+.#{$fa-css-prefix}-cog:before { content: fa-content($fa-var-cog); }
+.#{$fa-css-prefix}-cogs:before { content: fa-content($fa-var-cogs); }
+.#{$fa-css-prefix}-columns:before { content: fa-content($fa-var-columns); }
+.#{$fa-css-prefix}-comment:before { content: fa-content($fa-var-comment); }
+.#{$fa-css-prefix}-comment-alt:before { content: fa-content($fa-var-comment-alt); }
+.#{$fa-css-prefix}-comment-dots:before { content: fa-content($fa-var-comment-dots); }
+.#{$fa-css-prefix}-comment-slash:before { content: fa-content($fa-var-comment-slash); }
+.#{$fa-css-prefix}-comments:before { content: fa-content($fa-var-comments); }
+.#{$fa-css-prefix}-compass:before { content: fa-content($fa-var-compass); }
+.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress); }
+.#{$fa-css-prefix}-connectdevelop:before { content: fa-content($fa-var-connectdevelop); }
+.#{$fa-css-prefix}-contao:before { content: fa-content($fa-var-contao); }
+.#{$fa-css-prefix}-copy:before { content: fa-content($fa-var-copy); }
+.#{$fa-css-prefix}-copyright:before { content: fa-content($fa-var-copyright); }
+.#{$fa-css-prefix}-couch:before { content: fa-content($fa-var-couch); }
+.#{$fa-css-prefix}-cpanel:before { content: fa-content($fa-var-cpanel); }
+.#{$fa-css-prefix}-creative-commons:before { content: fa-content($fa-var-creative-commons); }
+.#{$fa-css-prefix}-credit-card:before { content: fa-content($fa-var-credit-card); }
+.#{$fa-css-prefix}-crop:before { content: fa-content($fa-var-crop); }
+.#{$fa-css-prefix}-crosshairs:before { content: fa-content($fa-var-crosshairs); }
+.#{$fa-css-prefix}-css3:before { content: fa-content($fa-var-css3); }
+.#{$fa-css-prefix}-css3-alt:before { content: fa-content($fa-var-css3-alt); }
+.#{$fa-css-prefix}-cube:before { content: fa-content($fa-var-cube); }
+.#{$fa-css-prefix}-cubes:before { content: fa-content($fa-var-cubes); }
+.#{$fa-css-prefix}-cut:before { content: fa-content($fa-var-cut); }
+.#{$fa-css-prefix}-cuttlefish:before { content: fa-content($fa-var-cuttlefish); }
+.#{$fa-css-prefix}-d-and-d:before { content: fa-content($fa-var-d-and-d); }
+.#{$fa-css-prefix}-dashcube:before { content: fa-content($fa-var-dashcube); }
+.#{$fa-css-prefix}-database:before { content: fa-content($fa-var-database); }
+.#{$fa-css-prefix}-deaf:before { content: fa-content($fa-var-deaf); }
+.#{$fa-css-prefix}-delicious:before { content: fa-content($fa-var-delicious); }
+.#{$fa-css-prefix}-deploydog:before { content: fa-content($fa-var-deploydog); }
+.#{$fa-css-prefix}-deskpro:before { content: fa-content($fa-var-deskpro); }
+.#{$fa-css-prefix}-desktop:before { content: fa-content($fa-var-desktop); }
+.#{$fa-css-prefix}-deviantart:before { content: fa-content($fa-var-deviantart); }
+.#{$fa-css-prefix}-diagnoses:before { content: fa-content($fa-var-diagnoses); }
+.#{$fa-css-prefix}-digg:before { content: fa-content($fa-var-digg); }
+.#{$fa-css-prefix}-digital-ocean:before { content: fa-content($fa-var-digital-ocean); }
+.#{$fa-css-prefix}-discord:before { content: fa-content($fa-var-discord); }
+.#{$fa-css-prefix}-discourse:before { content: fa-content($fa-var-discourse); }
+.#{$fa-css-prefix}-dna:before { content: fa-content($fa-var-dna); }
+.#{$fa-css-prefix}-dochub:before { content: fa-content($fa-var-dochub); }
+.#{$fa-css-prefix}-docker:before { content: fa-content($fa-var-docker); }
+.#{$fa-css-prefix}-dollar-sign:before { content: fa-content($fa-var-dollar-sign); }
+.#{$fa-css-prefix}-dolly:before { content: fa-content($fa-var-dolly); }
+.#{$fa-css-prefix}-dolly-flatbed:before { content: fa-content($fa-var-dolly-flatbed); }
+.#{$fa-css-prefix}-donate:before { content: fa-content($fa-var-donate); }
+.#{$fa-css-prefix}-dot-circle:before { content: fa-content($fa-var-dot-circle); }
+.#{$fa-css-prefix}-dove:before { content: fa-content($fa-var-dove); }
+.#{$fa-css-prefix}-download:before { content: fa-content($fa-var-download); }
+.#{$fa-css-prefix}-draft2digital:before { content: fa-content($fa-var-draft2digital); }
+.#{$fa-css-prefix}-dribbble:before { content: fa-content($fa-var-dribbble); }
+.#{$fa-css-prefix}-dribbble-square:before { content: fa-content($fa-var-dribbble-square); }
+.#{$fa-css-prefix}-dropbox:before { content: fa-content($fa-var-dropbox); }
+.#{$fa-css-prefix}-drupal:before { content: fa-content($fa-var-drupal); }
+.#{$fa-css-prefix}-dyalog:before { content: fa-content($fa-var-dyalog); }
+.#{$fa-css-prefix}-earlybirds:before { content: fa-content($fa-var-earlybirds); }
+.#{$fa-css-prefix}-edge:before { content: fa-content($fa-var-edge); }
+.#{$fa-css-prefix}-edit:before { content: fa-content($fa-var-edit); }
+.#{$fa-css-prefix}-eject:before { content: fa-content($fa-var-eject); }
+.#{$fa-css-prefix}-elementor:before { content: fa-content($fa-var-elementor); }
+.#{$fa-css-prefix}-ellipsis-h:before { content: fa-content($fa-var-ellipsis-h); }
+.#{$fa-css-prefix}-ellipsis-v:before { content: fa-content($fa-var-ellipsis-v); }
+.#{$fa-css-prefix}-ember:before { content: fa-content($fa-var-ember); }
+.#{$fa-css-prefix}-empire:before { content: fa-content($fa-var-empire); }
+.#{$fa-css-prefix}-envelope:before { content: fa-content($fa-var-envelope); }
+.#{$fa-css-prefix}-envelope-open:before { content: fa-content($fa-var-envelope-open); }
+.#{$fa-css-prefix}-envelope-square:before { content: fa-content($fa-var-envelope-square); }
+.#{$fa-css-prefix}-envira:before { content: fa-content($fa-var-envira); }
+.#{$fa-css-prefix}-eraser:before { content: fa-content($fa-var-eraser); }
+.#{$fa-css-prefix}-erlang:before { content: fa-content($fa-var-erlang); }
+.#{$fa-css-prefix}-ethereum:before { content: fa-content($fa-var-ethereum); }
+.#{$fa-css-prefix}-etsy:before { content: fa-content($fa-var-etsy); }
+.#{$fa-css-prefix}-euro-sign:before { content: fa-content($fa-var-euro-sign); }
+.#{$fa-css-prefix}-exchange-alt:before { content: fa-content($fa-var-exchange-alt); }
+.#{$fa-css-prefix}-exclamation:before { content: fa-content($fa-var-exclamation); }
+.#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); }
+.#{$fa-css-prefix}-exclamation-triangle:before { content: fa-content($fa-var-exclamation-triangle); }
+.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand); }
+.#{$fa-css-prefix}-expand-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); }
+.#{$fa-css-prefix}-expeditedssl:before { content: fa-content($fa-var-expeditedssl); }
+.#{$fa-css-prefix}-external-link-alt:before { content: fa-content($fa-var-external-link-alt); }
+.#{$fa-css-prefix}-external-link-square-alt:before { content: fa-content($fa-var-external-link-square-alt); }
+.#{$fa-css-prefix}-eye:before { content: fa-content($fa-var-eye); }
+.#{$fa-css-prefix}-eye-dropper:before { content: fa-content($fa-var-eye-dropper); }
+.#{$fa-css-prefix}-eye-slash:before { content: fa-content($fa-var-eye-slash); }
+.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook); }
+.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); }
+.#{$fa-css-prefix}-facebook-messenger:before { content: fa-content($fa-var-facebook-messenger); }
+.#{$fa-css-prefix}-facebook-square:before { content: fa-content($fa-var-facebook-square); }
+.#{$fa-css-prefix}-fast-backward:before { content: fa-content($fa-var-fast-backward); }
+.#{$fa-css-prefix}-fast-forward:before { content: fa-content($fa-var-fast-forward); }
+.#{$fa-css-prefix}-fax:before { content: fa-content($fa-var-fax); }
+.#{$fa-css-prefix}-female:before { content: fa-content($fa-var-female); }
+.#{$fa-css-prefix}-fighter-jet:before { content: fa-content($fa-var-fighter-jet); }
+.#{$fa-css-prefix}-file:before { content: fa-content($fa-var-file); }
+.#{$fa-css-prefix}-file-alt:before { content: fa-content($fa-var-file-alt); }
+.#{$fa-css-prefix}-file-archive:before { content: fa-content($fa-var-file-archive); }
+.#{$fa-css-prefix}-file-audio:before { content: fa-content($fa-var-file-audio); }
+.#{$fa-css-prefix}-file-code:before { content: fa-content($fa-var-file-code); }
+.#{$fa-css-prefix}-file-excel:before { content: fa-content($fa-var-file-excel); }
+.#{$fa-css-prefix}-file-image:before { content: fa-content($fa-var-file-image); }
+.#{$fa-css-prefix}-file-medical:before { content: fa-content($fa-var-file-medical); }
+.#{$fa-css-prefix}-file-medical-alt:before { content: fa-content($fa-var-file-medical-alt); }
+.#{$fa-css-prefix}-file-pdf:before { content: fa-content($fa-var-file-pdf); }
+.#{$fa-css-prefix}-file-powerpoint:before { content: fa-content($fa-var-file-powerpoint); }
+.#{$fa-css-prefix}-file-video:before { content: fa-content($fa-var-file-video); }
+.#{$fa-css-prefix}-file-word:before { content: fa-content($fa-var-file-word); }
+.#{$fa-css-prefix}-film:before { content: fa-content($fa-var-film); }
+.#{$fa-css-prefix}-filter:before { content: fa-content($fa-var-filter); }
+.#{$fa-css-prefix}-fire:before { content: fa-content($fa-var-fire); }
+.#{$fa-css-prefix}-fire-extinguisher:before { content: fa-content($fa-var-fire-extinguisher); }
+.#{$fa-css-prefix}-firefox:before { content: fa-content($fa-var-firefox); }
+.#{$fa-css-prefix}-first-aid:before { content: fa-content($fa-var-first-aid); }
+.#{$fa-css-prefix}-first-order:before { content: fa-content($fa-var-first-order); }
+.#{$fa-css-prefix}-firstdraft:before { content: fa-content($fa-var-firstdraft); }
+.#{$fa-css-prefix}-flag:before { content: fa-content($fa-var-flag); }
+.#{$fa-css-prefix}-flag-checkered:before { content: fa-content($fa-var-flag-checkered); }
+.#{$fa-css-prefix}-flask:before { content: fa-content($fa-var-flask); }
+.#{$fa-css-prefix}-flickr:before { content: fa-content($fa-var-flickr); }
+.#{$fa-css-prefix}-flipboard:before { content: fa-content($fa-var-flipboard); }
+.#{$fa-css-prefix}-fly:before { content: fa-content($fa-var-fly); }
+.#{$fa-css-prefix}-folder:before { content: fa-content($fa-var-folder); }
+.#{$fa-css-prefix}-folder-open:before { content: fa-content($fa-var-folder-open); }
+.#{$fa-css-prefix}-font:before { content: fa-content($fa-var-font); }
+.#{$fa-css-prefix}-font-awesome:before { content: fa-content($fa-var-font-awesome); }
+.#{$fa-css-prefix}-font-awesome-alt:before { content: fa-content($fa-var-font-awesome-alt); }
+.#{$fa-css-prefix}-font-awesome-flag:before { content: fa-content($fa-var-font-awesome-flag); }
+.#{$fa-css-prefix}-fonticons:before { content: fa-content($fa-var-fonticons); }
+.#{$fa-css-prefix}-fonticons-fi:before { content: fa-content($fa-var-fonticons-fi); }
+.#{$fa-css-prefix}-football-ball:before { content: fa-content($fa-var-football-ball); }
+.#{$fa-css-prefix}-fort-awesome:before { content: fa-content($fa-var-fort-awesome); }
+.#{$fa-css-prefix}-fort-awesome-alt:before { content: fa-content($fa-var-fort-awesome-alt); }
+.#{$fa-css-prefix}-forumbee:before { content: fa-content($fa-var-forumbee); }
+.#{$fa-css-prefix}-forward:before { content: fa-content($fa-var-forward); }
+.#{$fa-css-prefix}-foursquare:before { content: fa-content($fa-var-foursquare); }
+.#{$fa-css-prefix}-free-code-camp:before { content: fa-content($fa-var-free-code-camp); }
+.#{$fa-css-prefix}-freebsd:before { content: fa-content($fa-var-freebsd); }
+.#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); }
+.#{$fa-css-prefix}-futbol:before { content: fa-content($fa-var-futbol); }
+.#{$fa-css-prefix}-gamepad:before { content: fa-content($fa-var-gamepad); }
+.#{$fa-css-prefix}-gavel:before { content: fa-content($fa-var-gavel); }
+.#{$fa-css-prefix}-gem:before { content: fa-content($fa-var-gem); }
+.#{$fa-css-prefix}-genderless:before { content: fa-content($fa-var-genderless); }
+.#{$fa-css-prefix}-get-pocket:before { content: fa-content($fa-var-get-pocket); }
+.#{$fa-css-prefix}-gg:before { content: fa-content($fa-var-gg); }
+.#{$fa-css-prefix}-gg-circle:before { content: fa-content($fa-var-gg-circle); }
+.#{$fa-css-prefix}-gift:before { content: fa-content($fa-var-gift); }
+.#{$fa-css-prefix}-git:before { content: fa-content($fa-var-git); }
+.#{$fa-css-prefix}-git-square:before { content: fa-content($fa-var-git-square); }
+.#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); }
+.#{$fa-css-prefix}-github-alt:before { content: fa-content($fa-var-github-alt); }
+.#{$fa-css-prefix}-github-square:before { content: fa-content($fa-var-github-square); }
+.#{$fa-css-prefix}-gitkraken:before { content: fa-content($fa-var-gitkraken); }
+.#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); }
+.#{$fa-css-prefix}-gitter:before { content: fa-content($fa-var-gitter); }
+.#{$fa-css-prefix}-glass-martini:before { content: fa-content($fa-var-glass-martini); }
+.#{$fa-css-prefix}-glide:before { content: fa-content($fa-var-glide); }
+.#{$fa-css-prefix}-glide-g:before { content: fa-content($fa-var-glide-g); }
+.#{$fa-css-prefix}-globe:before { content: fa-content($fa-var-globe); }
+.#{$fa-css-prefix}-gofore:before { content: fa-content($fa-var-gofore); }
+.#{$fa-css-prefix}-golf-ball:before { content: fa-content($fa-var-golf-ball); }
+.#{$fa-css-prefix}-goodreads:before { content: fa-content($fa-var-goodreads); }
+.#{$fa-css-prefix}-goodreads-g:before { content: fa-content($fa-var-goodreads-g); }
+.#{$fa-css-prefix}-google:before { content: fa-content($fa-var-google); }
+.#{$fa-css-prefix}-google-drive:before { content: fa-content($fa-var-google-drive); }
+.#{$fa-css-prefix}-google-play:before { content: fa-content($fa-var-google-play); }
+.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus); }
+.#{$fa-css-prefix}-google-plus-g:before { content: fa-content($fa-var-google-plus-g); }
+.#{$fa-css-prefix}-google-plus-square:before { content: fa-content($fa-var-google-plus-square); }
+.#{$fa-css-prefix}-google-wallet:before { content: fa-content($fa-var-google-wallet); }
+.#{$fa-css-prefix}-graduation-cap:before { content: fa-content($fa-var-graduation-cap); }
+.#{$fa-css-prefix}-gratipay:before { content: fa-content($fa-var-gratipay); }
+.#{$fa-css-prefix}-grav:before { content: fa-content($fa-var-grav); }
+.#{$fa-css-prefix}-gripfire:before { content: fa-content($fa-var-gripfire); }
+.#{$fa-css-prefix}-grunt:before { content: fa-content($fa-var-grunt); }
+.#{$fa-css-prefix}-gulp:before { content: fa-content($fa-var-gulp); }
+.#{$fa-css-prefix}-h-square:before { content: fa-content($fa-var-h-square); }
+.#{$fa-css-prefix}-hacker-news:before { content: fa-content($fa-var-hacker-news); }
+.#{$fa-css-prefix}-hacker-news-square:before { content: fa-content($fa-var-hacker-news-square); }
+.#{$fa-css-prefix}-hand-holding:before { content: fa-content($fa-var-hand-holding); }
+.#{$fa-css-prefix}-hand-holding-heart:before { content: fa-content($fa-var-hand-holding-heart); }
+.#{$fa-css-prefix}-hand-holding-usd:before { content: fa-content($fa-var-hand-holding-usd); }
+.#{$fa-css-prefix}-hand-lizard:before { content: fa-content($fa-var-hand-lizard); }
+.#{$fa-css-prefix}-hand-paper:before { content: fa-content($fa-var-hand-paper); }
+.#{$fa-css-prefix}-hand-peace:before { content: fa-content($fa-var-hand-peace); }
+.#{$fa-css-prefix}-hand-point-down:before { content: fa-content($fa-var-hand-point-down); }
+.#{$fa-css-prefix}-hand-point-left:before { content: fa-content($fa-var-hand-point-left); }
+.#{$fa-css-prefix}-hand-point-right:before { content: fa-content($fa-var-hand-point-right); }
+.#{$fa-css-prefix}-hand-point-up:before { content: fa-content($fa-var-hand-point-up); }
+.#{$fa-css-prefix}-hand-pointer:before { content: fa-content($fa-var-hand-pointer); }
+.#{$fa-css-prefix}-hand-rock:before { content: fa-content($fa-var-hand-rock); }
+.#{$fa-css-prefix}-hand-scissors:before { content: fa-content($fa-var-hand-scissors); }
+.#{$fa-css-prefix}-hand-spock:before { content: fa-content($fa-var-hand-spock); }
+.#{$fa-css-prefix}-hands:before { content: fa-content($fa-var-hands); }
+.#{$fa-css-prefix}-hands-helping:before { content: fa-content($fa-var-hands-helping); }
+.#{$fa-css-prefix}-handshake:before { content: fa-content($fa-var-handshake); }
+.#{$fa-css-prefix}-hashtag:before { content: fa-content($fa-var-hashtag); }
+.#{$fa-css-prefix}-hdd:before { content: fa-content($fa-var-hdd); }
+.#{$fa-css-prefix}-heading:before { content: fa-content($fa-var-heading); }
+.#{$fa-css-prefix}-headphones:before { content: fa-content($fa-var-headphones); }
+.#{$fa-css-prefix}-heart:before { content: fa-content($fa-var-heart); }
+.#{$fa-css-prefix}-heartbeat:before { content: fa-content($fa-var-heartbeat); }
+.#{$fa-css-prefix}-hips:before { content: fa-content($fa-var-hips); }
+.#{$fa-css-prefix}-hire-a-helper:before { content: fa-content($fa-var-hire-a-helper); }
+.#{$fa-css-prefix}-history:before { content: fa-content($fa-var-history); }
+.#{$fa-css-prefix}-hockey-puck:before { content: fa-content($fa-var-hockey-puck); }
+.#{$fa-css-prefix}-home:before { content: fa-content($fa-var-home); }
+.#{$fa-css-prefix}-hooli:before { content: fa-content($fa-var-hooli); }
+.#{$fa-css-prefix}-hospital:before { content: fa-content($fa-var-hospital); }
+.#{$fa-css-prefix}-hospital-alt:before { content: fa-content($fa-var-hospital-alt); }
+.#{$fa-css-prefix}-hospital-symbol:before { content: fa-content($fa-var-hospital-symbol); }
+.#{$fa-css-prefix}-hotjar:before { content: fa-content($fa-var-hotjar); }
+.#{$fa-css-prefix}-hourglass:before { content: fa-content($fa-var-hourglass); }
+.#{$fa-css-prefix}-hourglass-end:before { content: fa-content($fa-var-hourglass-end); }
+.#{$fa-css-prefix}-hourglass-half:before { content: fa-content($fa-var-hourglass-half); }
+.#{$fa-css-prefix}-hourglass-start:before { content: fa-content($fa-var-hourglass-start); }
+.#{$fa-css-prefix}-houzz:before { content: fa-content($fa-var-houzz); }
+.#{$fa-css-prefix}-html5:before { content: fa-content($fa-var-html5); }
+.#{$fa-css-prefix}-hubspot:before { content: fa-content($fa-var-hubspot); }
+.#{$fa-css-prefix}-i-cursor:before { content: fa-content($fa-var-i-cursor); }
+.#{$fa-css-prefix}-id-badge:before { content: fa-content($fa-var-id-badge); }
+.#{$fa-css-prefix}-id-card:before { content: fa-content($fa-var-id-card); }
+.#{$fa-css-prefix}-id-card-alt:before { content: fa-content($fa-var-id-card-alt); }
+.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); }
+.#{$fa-css-prefix}-images:before { content: fa-content($fa-var-images); }
+.#{$fa-css-prefix}-imdb:before { content: fa-content($fa-var-imdb); }
+.#{$fa-css-prefix}-inbox:before { content: fa-content($fa-var-inbox); }
+.#{$fa-css-prefix}-indent:before { content: fa-content($fa-var-indent); }
+.#{$fa-css-prefix}-industry:before { content: fa-content($fa-var-industry); }
+.#{$fa-css-prefix}-info:before { content: fa-content($fa-var-info); }
+.#{$fa-css-prefix}-info-circle:before { content: fa-content($fa-var-info-circle); }
+.#{$fa-css-prefix}-instagram:before { content: fa-content($fa-var-instagram); }
+.#{$fa-css-prefix}-internet-explorer:before { content: fa-content($fa-var-internet-explorer); }
+.#{$fa-css-prefix}-ioxhost:before { content: fa-content($fa-var-ioxhost); }
+.#{$fa-css-prefix}-italic:before { content: fa-content($fa-var-italic); }
+.#{$fa-css-prefix}-itunes:before { content: fa-content($fa-var-itunes); }
+.#{$fa-css-prefix}-itunes-note:before { content: fa-content($fa-var-itunes-note); }
+.#{$fa-css-prefix}-jenkins:before { content: fa-content($fa-var-jenkins); }
+.#{$fa-css-prefix}-joget:before { content: fa-content($fa-var-joget); }
+.#{$fa-css-prefix}-joomla:before { content: fa-content($fa-var-joomla); }
+.#{$fa-css-prefix}-js:before { content: fa-content($fa-var-js); }
+.#{$fa-css-prefix}-js-square:before { content: fa-content($fa-var-js-square); }
+.#{$fa-css-prefix}-jsfiddle:before { content: fa-content($fa-var-jsfiddle); }
+.#{$fa-css-prefix}-key:before { content: fa-content($fa-var-key); }
+.#{$fa-css-prefix}-keyboard:before { content: fa-content($fa-var-keyboard); }
+.#{$fa-css-prefix}-keycdn:before { content: fa-content($fa-var-keycdn); }
+.#{$fa-css-prefix}-kickstarter:before { content: fa-content($fa-var-kickstarter); }
+.#{$fa-css-prefix}-kickstarter-k:before { content: fa-content($fa-var-kickstarter-k); }
+.#{$fa-css-prefix}-korvue:before { content: fa-content($fa-var-korvue); }
+.#{$fa-css-prefix}-language:before { content: fa-content($fa-var-language); }
+.#{$fa-css-prefix}-laptop:before { content: fa-content($fa-var-laptop); }
+.#{$fa-css-prefix}-laravel:before { content: fa-content($fa-var-laravel); }
+.#{$fa-css-prefix}-lastfm:before { content: fa-content($fa-var-lastfm); }
+.#{$fa-css-prefix}-lastfm-square:before { content: fa-content($fa-var-lastfm-square); }
+.#{$fa-css-prefix}-leaf:before { content: fa-content($fa-var-leaf); }
+.#{$fa-css-prefix}-leanpub:before { content: fa-content($fa-var-leanpub); }
+.#{$fa-css-prefix}-lemon:before { content: fa-content($fa-var-lemon); }
+.#{$fa-css-prefix}-less:before { content: fa-content($fa-var-less); }
+.#{$fa-css-prefix}-level-down-alt:before { content: fa-content($fa-var-level-down-alt); }
+.#{$fa-css-prefix}-level-up-alt:before { content: fa-content($fa-var-level-up-alt); }
+.#{$fa-css-prefix}-life-ring:before { content: fa-content($fa-var-life-ring); }
+.#{$fa-css-prefix}-lightbulb:before { content: fa-content($fa-var-lightbulb); }
+.#{$fa-css-prefix}-line:before { content: fa-content($fa-var-line); }
+.#{$fa-css-prefix}-link:before { content: fa-content($fa-var-link); }
+.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin); }
+.#{$fa-css-prefix}-linkedin-in:before { content: fa-content($fa-var-linkedin-in); }
+.#{$fa-css-prefix}-linode:before { content: fa-content($fa-var-linode); }
+.#{$fa-css-prefix}-linux:before { content: fa-content($fa-var-linux); }
+.#{$fa-css-prefix}-lira-sign:before { content: fa-content($fa-var-lira-sign); }
+.#{$fa-css-prefix}-list:before { content: fa-content($fa-var-list); }
+.#{$fa-css-prefix}-list-alt:before { content: fa-content($fa-var-list-alt); }
+.#{$fa-css-prefix}-list-ol:before { content: fa-content($fa-var-list-ol); }
+.#{$fa-css-prefix}-list-ul:before { content: fa-content($fa-var-list-ul); }
+.#{$fa-css-prefix}-location-arrow:before { content: fa-content($fa-var-location-arrow); }
+.#{$fa-css-prefix}-lock:before { content: fa-content($fa-var-lock); }
+.#{$fa-css-prefix}-lock-open:before { content: fa-content($fa-var-lock-open); }
+.#{$fa-css-prefix}-long-arrow-alt-down:before { content: fa-content($fa-var-long-arrow-alt-down); }
+.#{$fa-css-prefix}-long-arrow-alt-left:before { content: fa-content($fa-var-long-arrow-alt-left); }
+.#{$fa-css-prefix}-long-arrow-alt-right:before { content: fa-content($fa-var-long-arrow-alt-right); }
+.#{$fa-css-prefix}-long-arrow-alt-up:before { content: fa-content($fa-var-long-arrow-alt-up); }
+.#{$fa-css-prefix}-low-vision:before { content: fa-content($fa-var-low-vision); }
+.#{$fa-css-prefix}-lyft:before { content: fa-content($fa-var-lyft); }
+.#{$fa-css-prefix}-magento:before { content: fa-content($fa-var-magento); }
+.#{$fa-css-prefix}-magic:before { content: fa-content($fa-var-magic); }
+.#{$fa-css-prefix}-magnet:before { content: fa-content($fa-var-magnet); }
+.#{$fa-css-prefix}-male:before { content: fa-content($fa-var-male); }
+.#{$fa-css-prefix}-map:before { content: fa-content($fa-var-map); }
+.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker); }
+.#{$fa-css-prefix}-map-marker-alt:before { content: fa-content($fa-var-map-marker-alt); }
+.#{$fa-css-prefix}-map-pin:before { content: fa-content($fa-var-map-pin); }
+.#{$fa-css-prefix}-map-signs:before { content: fa-content($fa-var-map-signs); }
+.#{$fa-css-prefix}-mars:before { content: fa-content($fa-var-mars); }
+.#{$fa-css-prefix}-mars-double:before { content: fa-content($fa-var-mars-double); }
+.#{$fa-css-prefix}-mars-stroke:before { content: fa-content($fa-var-mars-stroke); }
+.#{$fa-css-prefix}-mars-stroke-h:before { content: fa-content($fa-var-mars-stroke-h); }
+.#{$fa-css-prefix}-mars-stroke-v:before { content: fa-content($fa-var-mars-stroke-v); }
+.#{$fa-css-prefix}-maxcdn:before { content: fa-content($fa-var-maxcdn); }
+.#{$fa-css-prefix}-medapps:before { content: fa-content($fa-var-medapps); }
+.#{$fa-css-prefix}-medium:before { content: fa-content($fa-var-medium); }
+.#{$fa-css-prefix}-medium-m:before { content: fa-content($fa-var-medium-m); }
+.#{$fa-css-prefix}-medkit:before { content: fa-content($fa-var-medkit); }
+.#{$fa-css-prefix}-medrt:before { content: fa-content($fa-var-medrt); }
+.#{$fa-css-prefix}-meetup:before { content: fa-content($fa-var-meetup); }
+.#{$fa-css-prefix}-meh:before { content: fa-content($fa-var-meh); }
+.#{$fa-css-prefix}-mercury:before { content: fa-content($fa-var-mercury); }
+.#{$fa-css-prefix}-microchip:before { content: fa-content($fa-var-microchip); }
+.#{$fa-css-prefix}-microphone:before { content: fa-content($fa-var-microphone); }
+.#{$fa-css-prefix}-microphone-slash:before { content: fa-content($fa-var-microphone-slash); }
+.#{$fa-css-prefix}-microsoft:before { content: fa-content($fa-var-microsoft); }
+.#{$fa-css-prefix}-minus:before { content: fa-content($fa-var-minus); }
+.#{$fa-css-prefix}-minus-circle:before { content: fa-content($fa-var-minus-circle); }
+.#{$fa-css-prefix}-minus-square:before { content: fa-content($fa-var-minus-square); }
+.#{$fa-css-prefix}-mix:before { content: fa-content($fa-var-mix); }
+.#{$fa-css-prefix}-mixcloud:before { content: fa-content($fa-var-mixcloud); }
+.#{$fa-css-prefix}-mizuni:before { content: fa-content($fa-var-mizuni); }
+.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile); }
+.#{$fa-css-prefix}-mobile-alt:before { content: fa-content($fa-var-mobile-alt); }
+.#{$fa-css-prefix}-modx:before { content: fa-content($fa-var-modx); }
+.#{$fa-css-prefix}-monero:before { content: fa-content($fa-var-monero); }
+.#{$fa-css-prefix}-money-bill-alt:before { content: fa-content($fa-var-money-bill-alt); }
+.#{$fa-css-prefix}-moon:before { content: fa-content($fa-var-moon); }
+.#{$fa-css-prefix}-motorcycle:before { content: fa-content($fa-var-motorcycle); }
+.#{$fa-css-prefix}-mouse-pointer:before { content: fa-content($fa-var-mouse-pointer); }
+.#{$fa-css-prefix}-music:before { content: fa-content($fa-var-music); }
+.#{$fa-css-prefix}-napster:before { content: fa-content($fa-var-napster); }
+.#{$fa-css-prefix}-neuter:before { content: fa-content($fa-var-neuter); }
+.#{$fa-css-prefix}-newspaper:before { content: fa-content($fa-var-newspaper); }
+.#{$fa-css-prefix}-nintendo-switch:before { content: fa-content($fa-var-nintendo-switch); }
+.#{$fa-css-prefix}-node:before { content: fa-content($fa-var-node); }
+.#{$fa-css-prefix}-node-js:before { content: fa-content($fa-var-node-js); }
+.#{$fa-css-prefix}-notes-medical:before { content: fa-content($fa-var-notes-medical); }
+.#{$fa-css-prefix}-npm:before { content: fa-content($fa-var-npm); }
+.#{$fa-css-prefix}-ns8:before { content: fa-content($fa-var-ns8); }
+.#{$fa-css-prefix}-nutritionix:before { content: fa-content($fa-var-nutritionix); }
+.#{$fa-css-prefix}-object-group:before { content: fa-content($fa-var-object-group); }
+.#{$fa-css-prefix}-object-ungroup:before { content: fa-content($fa-var-object-ungroup); }
+.#{$fa-css-prefix}-odnoklassniki:before { content: fa-content($fa-var-odnoklassniki); }
+.#{$fa-css-prefix}-odnoklassniki-square:before { content: fa-content($fa-var-odnoklassniki-square); }
+.#{$fa-css-prefix}-opencart:before { content: fa-content($fa-var-opencart); }
+.#{$fa-css-prefix}-openid:before { content: fa-content($fa-var-openid); }
+.#{$fa-css-prefix}-opera:before { content: fa-content($fa-var-opera); }
+.#{$fa-css-prefix}-optin-monster:before { content: fa-content($fa-var-optin-monster); }
+.#{$fa-css-prefix}-osi:before { content: fa-content($fa-var-osi); }
+.#{$fa-css-prefix}-outdent:before { content: fa-content($fa-var-outdent); }
+.#{$fa-css-prefix}-page4:before { content: fa-content($fa-var-page4); }
+.#{$fa-css-prefix}-pagelines:before { content: fa-content($fa-var-pagelines); }
+.#{$fa-css-prefix}-paint-brush:before { content: fa-content($fa-var-paint-brush); }
+.#{$fa-css-prefix}-palfed:before { content: fa-content($fa-var-palfed); }
+.#{$fa-css-prefix}-pallet:before { content: fa-content($fa-var-pallet); }
+.#{$fa-css-prefix}-paper-plane:before { content: fa-content($fa-var-paper-plane); }
+.#{$fa-css-prefix}-paperclip:before { content: fa-content($fa-var-paperclip); }
+.#{$fa-css-prefix}-parachute-box:before { content: fa-content($fa-var-parachute-box); }
+.#{$fa-css-prefix}-paragraph:before { content: fa-content($fa-var-paragraph); }
+.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-paste); }
+.#{$fa-css-prefix}-patreon:before { content: fa-content($fa-var-patreon); }
+.#{$fa-css-prefix}-pause:before { content: fa-content($fa-var-pause); }
+.#{$fa-css-prefix}-pause-circle:before { content: fa-content($fa-var-pause-circle); }
+.#{$fa-css-prefix}-paw:before { content: fa-content($fa-var-paw); }
+.#{$fa-css-prefix}-paypal:before { content: fa-content($fa-var-paypal); }
+.#{$fa-css-prefix}-pen-square:before { content: fa-content($fa-var-pen-square); }
+.#{$fa-css-prefix}-pencil-alt:before { content: fa-content($fa-var-pencil-alt); }
+.#{$fa-css-prefix}-people-carry:before { content: fa-content($fa-var-people-carry); }
+.#{$fa-css-prefix}-percent:before { content: fa-content($fa-var-percent); }
+.#{$fa-css-prefix}-periscope:before { content: fa-content($fa-var-periscope); }
+.#{$fa-css-prefix}-phabricator:before { content: fa-content($fa-var-phabricator); }
+.#{$fa-css-prefix}-phoenix-framework:before { content: fa-content($fa-var-phoenix-framework); }
+.#{$fa-css-prefix}-phone:before { content: fa-content($fa-var-phone); }
+.#{$fa-css-prefix}-phone-slash:before { content: fa-content($fa-var-phone-slash); }
+.#{$fa-css-prefix}-phone-square:before { content: fa-content($fa-var-phone-square); }
+.#{$fa-css-prefix}-phone-volume:before { content: fa-content($fa-var-phone-volume); }
+.#{$fa-css-prefix}-php:before { content: fa-content($fa-var-php); }
+.#{$fa-css-prefix}-pied-piper:before { content: fa-content($fa-var-pied-piper); }
+.#{$fa-css-prefix}-pied-piper-alt:before { content: fa-content($fa-var-pied-piper-alt); }
+.#{$fa-css-prefix}-pied-piper-pp:before { content: fa-content($fa-var-pied-piper-pp); }
+.#{$fa-css-prefix}-piggy-bank:before { content: fa-content($fa-var-piggy-bank); }
+.#{$fa-css-prefix}-pills:before { content: fa-content($fa-var-pills); }
+.#{$fa-css-prefix}-pinterest:before { content: fa-content($fa-var-pinterest); }
+.#{$fa-css-prefix}-pinterest-p:before { content: fa-content($fa-var-pinterest-p); }
+.#{$fa-css-prefix}-pinterest-square:before { content: fa-content($fa-var-pinterest-square); }
+.#{$fa-css-prefix}-plane:before { content: fa-content($fa-var-plane); }
+.#{$fa-css-prefix}-play:before { content: fa-content($fa-var-play); }
+.#{$fa-css-prefix}-play-circle:before { content: fa-content($fa-var-play-circle); }
+.#{$fa-css-prefix}-playstation:before { content: fa-content($fa-var-playstation); }
+.#{$fa-css-prefix}-plug:before { content: fa-content($fa-var-plug); }
+.#{$fa-css-prefix}-plus:before { content: fa-content($fa-var-plus); }
+.#{$fa-css-prefix}-plus-circle:before { content: fa-content($fa-var-plus-circle); }
+.#{$fa-css-prefix}-plus-square:before { content: fa-content($fa-var-plus-square); }
+.#{$fa-css-prefix}-podcast:before { content: fa-content($fa-var-podcast); }
+.#{$fa-css-prefix}-poo:before { content: fa-content($fa-var-poo); }
+.#{$fa-css-prefix}-pound-sign:before { content: fa-content($fa-var-pound-sign); }
+.#{$fa-css-prefix}-power-off:before { content: fa-content($fa-var-power-off); }
+.#{$fa-css-prefix}-prescription-bottle:before { content: fa-content($fa-var-prescription-bottle); }
+.#{$fa-css-prefix}-prescription-bottle-alt:before { content: fa-content($fa-var-prescription-bottle-alt); }
+.#{$fa-css-prefix}-print:before { content: fa-content($fa-var-print); }
+.#{$fa-css-prefix}-procedures:before { content: fa-content($fa-var-procedures); }
+.#{$fa-css-prefix}-product-hunt:before { content: fa-content($fa-var-product-hunt); }
+.#{$fa-css-prefix}-pushed:before { content: fa-content($fa-var-pushed); }
+.#{$fa-css-prefix}-puzzle-piece:before { content: fa-content($fa-var-puzzle-piece); }
+.#{$fa-css-prefix}-python:before { content: fa-content($fa-var-python); }
+.#{$fa-css-prefix}-qq:before { content: fa-content($fa-var-qq); }
+.#{$fa-css-prefix}-qrcode:before { content: fa-content($fa-var-qrcode); }
+.#{$fa-css-prefix}-question:before { content: fa-content($fa-var-question); }
+.#{$fa-css-prefix}-question-circle:before { content: fa-content($fa-var-question-circle); }
+.#{$fa-css-prefix}-quidditch:before { content: fa-content($fa-var-quidditch); }
+.#{$fa-css-prefix}-quinscape:before { content: fa-content($fa-var-quinscape); }
+.#{$fa-css-prefix}-quora:before { content: fa-content($fa-var-quora); }
+.#{$fa-css-prefix}-quote-left:before { content: fa-content($fa-var-quote-left); }
+.#{$fa-css-prefix}-quote-right:before { content: fa-content($fa-var-quote-right); }
+.#{$fa-css-prefix}-random:before { content: fa-content($fa-var-random); }
+.#{$fa-css-prefix}-ravelry:before { content: fa-content($fa-var-ravelry); }
+.#{$fa-css-prefix}-react:before { content: fa-content($fa-var-react); }
+.#{$fa-css-prefix}-readme:before { content: fa-content($fa-var-readme); }
+.#{$fa-css-prefix}-rebel:before { content: fa-content($fa-var-rebel); }
+.#{$fa-css-prefix}-recycle:before { content: fa-content($fa-var-recycle); }
+.#{$fa-css-prefix}-red-river:before { content: fa-content($fa-var-red-river); }
+.#{$fa-css-prefix}-reddit:before { content: fa-content($fa-var-reddit); }
+.#{$fa-css-prefix}-reddit-alien:before { content: fa-content($fa-var-reddit-alien); }
+.#{$fa-css-prefix}-reddit-square:before { content: fa-content($fa-var-reddit-square); }
+.#{$fa-css-prefix}-redo:before { content: fa-content($fa-var-redo); }
+.#{$fa-css-prefix}-redo-alt:before { content: fa-content($fa-var-redo-alt); }
+.#{$fa-css-prefix}-registered:before { content: fa-content($fa-var-registered); }
+.#{$fa-css-prefix}-rendact:before { content: fa-content($fa-var-rendact); }
+.#{$fa-css-prefix}-renren:before { content: fa-content($fa-var-renren); }
+.#{$fa-css-prefix}-reply:before { content: fa-content($fa-var-reply); }
+.#{$fa-css-prefix}-reply-all:before { content: fa-content($fa-var-reply-all); }
+.#{$fa-css-prefix}-replyd:before { content: fa-content($fa-var-replyd); }
+.#{$fa-css-prefix}-resolving:before { content: fa-content($fa-var-resolving); }
+.#{$fa-css-prefix}-retweet:before { content: fa-content($fa-var-retweet); }
+.#{$fa-css-prefix}-ribbon:before { content: fa-content($fa-var-ribbon); }
+.#{$fa-css-prefix}-road:before { content: fa-content($fa-var-road); }
+.#{$fa-css-prefix}-rocket:before { content: fa-content($fa-var-rocket); }
+.#{$fa-css-prefix}-rocketchat:before { content: fa-content($fa-var-rocketchat); }
+.#{$fa-css-prefix}-rockrms:before { content: fa-content($fa-var-rockrms); }
+.#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); }
+.#{$fa-css-prefix}-rss-square:before { content: fa-content($fa-var-rss-square); }
+.#{$fa-css-prefix}-ruble-sign:before { content: fa-content($fa-var-ruble-sign); }
+.#{$fa-css-prefix}-rupee-sign:before { content: fa-content($fa-var-rupee-sign); }
+.#{$fa-css-prefix}-safari:before { content: fa-content($fa-var-safari); }
+.#{$fa-css-prefix}-sass:before { content: fa-content($fa-var-sass); }
+.#{$fa-css-prefix}-save:before { content: fa-content($fa-var-save); }
+.#{$fa-css-prefix}-schlix:before { content: fa-content($fa-var-schlix); }
+.#{$fa-css-prefix}-scribd:before { content: fa-content($fa-var-scribd); }
+.#{$fa-css-prefix}-search:before { content: fa-content($fa-var-search); }
+.#{$fa-css-prefix}-search-minus:before { content: fa-content($fa-var-search-minus); }
+.#{$fa-css-prefix}-search-plus:before { content: fa-content($fa-var-search-plus); }
+.#{$fa-css-prefix}-searchengin:before { content: fa-content($fa-var-searchengin); }
+.#{$fa-css-prefix}-seedling:before { content: fa-content($fa-var-seedling); }
+.#{$fa-css-prefix}-sellcast:before { content: fa-content($fa-var-sellcast); }
+.#{$fa-css-prefix}-sellsy:before { content: fa-content($fa-var-sellsy); }
+.#{$fa-css-prefix}-server:before { content: fa-content($fa-var-server); }
+.#{$fa-css-prefix}-servicestack:before { content: fa-content($fa-var-servicestack); }
+.#{$fa-css-prefix}-share:before { content: fa-content($fa-var-share); }
+.#{$fa-css-prefix}-share-alt:before { content: fa-content($fa-var-share-alt); }
+.#{$fa-css-prefix}-share-alt-square:before { content: fa-content($fa-var-share-alt-square); }
+.#{$fa-css-prefix}-share-square:before { content: fa-content($fa-var-share-square); }
+.#{$fa-css-prefix}-shekel-sign:before { content: fa-content($fa-var-shekel-sign); }
+.#{$fa-css-prefix}-shield-alt:before { content: fa-content($fa-var-shield-alt); }
+.#{$fa-css-prefix}-ship:before { content: fa-content($fa-var-ship); }
+.#{$fa-css-prefix}-shipping-fast:before { content: fa-content($fa-var-shipping-fast); }
+.#{$fa-css-prefix}-shirtsinbulk:before { content: fa-content($fa-var-shirtsinbulk); }
+.#{$fa-css-prefix}-shopping-bag:before { content: fa-content($fa-var-shopping-bag); }
+.#{$fa-css-prefix}-shopping-basket:before { content: fa-content($fa-var-shopping-basket); }
+.#{$fa-css-prefix}-shopping-cart:before { content: fa-content($fa-var-shopping-cart); }
+.#{$fa-css-prefix}-shower:before { content: fa-content($fa-var-shower); }
+.#{$fa-css-prefix}-sign:before { content: fa-content($fa-var-sign); }
+.#{$fa-css-prefix}-sign-in-alt:before { content: fa-content($fa-var-sign-in-alt); }
+.#{$fa-css-prefix}-sign-language:before { content: fa-content($fa-var-sign-language); }
+.#{$fa-css-prefix}-sign-out-alt:before { content: fa-content($fa-var-sign-out-alt); }
+.#{$fa-css-prefix}-signal:before { content: fa-content($fa-var-signal); }
+.#{$fa-css-prefix}-simplybuilt:before { content: fa-content($fa-var-simplybuilt); }
+.#{$fa-css-prefix}-sistrix:before { content: fa-content($fa-var-sistrix); }
+.#{$fa-css-prefix}-sitemap:before { content: fa-content($fa-var-sitemap); }
+.#{$fa-css-prefix}-skyatlas:before { content: fa-content($fa-var-skyatlas); }
+.#{$fa-css-prefix}-skype:before { content: fa-content($fa-var-skype); }
+.#{$fa-css-prefix}-slack:before { content: fa-content($fa-var-slack); }
+.#{$fa-css-prefix}-slack-hash:before { content: fa-content($fa-var-slack-hash); }
+.#{$fa-css-prefix}-sliders-h:before { content: fa-content($fa-var-sliders-h); }
+.#{$fa-css-prefix}-slideshare:before { content: fa-content($fa-var-slideshare); }
+.#{$fa-css-prefix}-smile:before { content: fa-content($fa-var-smile); }
+.#{$fa-css-prefix}-smoking:before { content: fa-content($fa-var-smoking); }
+.#{$fa-css-prefix}-snapchat:before { content: fa-content($fa-var-snapchat); }
+.#{$fa-css-prefix}-snapchat-ghost:before { content: fa-content($fa-var-snapchat-ghost); }
+.#{$fa-css-prefix}-snapchat-square:before { content: fa-content($fa-var-snapchat-square); }
+.#{$fa-css-prefix}-snowflake:before { content: fa-content($fa-var-snowflake); }
+.#{$fa-css-prefix}-sort:before { content: fa-content($fa-var-sort); }
+.#{$fa-css-prefix}-sort-alpha-down:before { content: fa-content($fa-var-sort-alpha-down); }
+.#{$fa-css-prefix}-sort-alpha-up:before { content: fa-content($fa-var-sort-alpha-up); }
+.#{$fa-css-prefix}-sort-amount-down:before { content: fa-content($fa-var-sort-amount-down); }
+.#{$fa-css-prefix}-sort-amount-up:before { content: fa-content($fa-var-sort-amount-up); }
+.#{$fa-css-prefix}-sort-down:before { content: fa-content($fa-var-sort-down); }
+.#{$fa-css-prefix}-sort-numeric-down:before { content: fa-content($fa-var-sort-numeric-down); }
+.#{$fa-css-prefix}-sort-numeric-up:before { content: fa-content($fa-var-sort-numeric-up); }
+.#{$fa-css-prefix}-sort-up:before { content: fa-content($fa-var-sort-up); }
+.#{$fa-css-prefix}-soundcloud:before { content: fa-content($fa-var-soundcloud); }
+.#{$fa-css-prefix}-space-shuttle:before { content: fa-content($fa-var-space-shuttle); }
+.#{$fa-css-prefix}-speakap:before { content: fa-content($fa-var-speakap); }
+.#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); }
+.#{$fa-css-prefix}-spotify:before { content: fa-content($fa-var-spotify); }
+.#{$fa-css-prefix}-square:before { content: fa-content($fa-var-square); }
+.#{$fa-css-prefix}-square-full:before { content: fa-content($fa-var-square-full); }
+.#{$fa-css-prefix}-stack-exchange:before { content: fa-content($fa-var-stack-exchange); }
+.#{$fa-css-prefix}-stack-overflow:before { content: fa-content($fa-var-stack-overflow); }
+.#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); }
+.#{$fa-css-prefix}-star-half:before { content: fa-content($fa-var-star-half); }
+.#{$fa-css-prefix}-staylinked:before { content: fa-content($fa-var-staylinked); }
+.#{$fa-css-prefix}-steam:before { content: fa-content($fa-var-steam); }
+.#{$fa-css-prefix}-steam-square:before { content: fa-content($fa-var-steam-square); }
+.#{$fa-css-prefix}-steam-symbol:before { content: fa-content($fa-var-steam-symbol); }
+.#{$fa-css-prefix}-step-backward:before { content: fa-content($fa-var-step-backward); }
+.#{$fa-css-prefix}-step-forward:before { content: fa-content($fa-var-step-forward); }
+.#{$fa-css-prefix}-stethoscope:before { content: fa-content($fa-var-stethoscope); }
+.#{$fa-css-prefix}-sticker-mule:before { content: fa-content($fa-var-sticker-mule); }
+.#{$fa-css-prefix}-sticky-note:before { content: fa-content($fa-var-sticky-note); }
+.#{$fa-css-prefix}-stop:before { content: fa-content($fa-var-stop); }
+.#{$fa-css-prefix}-stop-circle:before { content: fa-content($fa-var-stop-circle); }
+.#{$fa-css-prefix}-stopwatch:before { content: fa-content($fa-var-stopwatch); }
+.#{$fa-css-prefix}-strava:before { content: fa-content($fa-var-strava); }
+.#{$fa-css-prefix}-street-view:before { content: fa-content($fa-var-street-view); }
+.#{$fa-css-prefix}-strikethrough:before { content: fa-content($fa-var-strikethrough); }
+.#{$fa-css-prefix}-stripe:before { content: fa-content($fa-var-stripe); }
+.#{$fa-css-prefix}-stripe-s:before { content: fa-content($fa-var-stripe-s); }
+.#{$fa-css-prefix}-studiovinari:before { content: fa-content($fa-var-studiovinari); }
+.#{$fa-css-prefix}-stumbleupon:before { content: fa-content($fa-var-stumbleupon); }
+.#{$fa-css-prefix}-stumbleupon-circle:before { content: fa-content($fa-var-stumbleupon-circle); }
+.#{$fa-css-prefix}-subscript:before { content: fa-content($fa-var-subscript); }
+.#{$fa-css-prefix}-subway:before { content: fa-content($fa-var-subway); }
+.#{$fa-css-prefix}-suitcase:before { content: fa-content($fa-var-suitcase); }
+.#{$fa-css-prefix}-sun:before { content: fa-content($fa-var-sun); }
+.#{$fa-css-prefix}-superpowers:before { content: fa-content($fa-var-superpowers); }
+.#{$fa-css-prefix}-superscript:before { content: fa-content($fa-var-superscript); }
+.#{$fa-css-prefix}-supple:before { content: fa-content($fa-var-supple); }
+.#{$fa-css-prefix}-sync:before { content: fa-content($fa-var-sync); }
+.#{$fa-css-prefix}-sync-alt:before { content: fa-content($fa-var-sync-alt); }
+.#{$fa-css-prefix}-syringe:before { content: fa-content($fa-var-syringe); }
+.#{$fa-css-prefix}-table:before { content: fa-content($fa-var-table); }
+.#{$fa-css-prefix}-table-tennis:before { content: fa-content($fa-var-table-tennis); }
+.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet); }
+.#{$fa-css-prefix}-tablet-alt:before { content: fa-content($fa-var-tablet-alt); }
+.#{$fa-css-prefix}-tablets:before { content: fa-content($fa-var-tablets); }
+.#{$fa-css-prefix}-tachometer-alt:before { content: fa-content($fa-var-tachometer-alt); }
+.#{$fa-css-prefix}-tag:before { content: fa-content($fa-var-tag); }
+.#{$fa-css-prefix}-tags:before { content: fa-content($fa-var-tags); }
+.#{$fa-css-prefix}-tape:before { content: fa-content($fa-var-tape); }
+.#{$fa-css-prefix}-tasks:before { content: fa-content($fa-var-tasks); }
+.#{$fa-css-prefix}-taxi:before { content: fa-content($fa-var-taxi); }
+.#{$fa-css-prefix}-telegram:before { content: fa-content($fa-var-telegram); }
+.#{$fa-css-prefix}-telegram-plane:before { content: fa-content($fa-var-telegram-plane); }
+.#{$fa-css-prefix}-tencent-weibo:before { content: fa-content($fa-var-tencent-weibo); }
+.#{$fa-css-prefix}-terminal:before { content: fa-content($fa-var-terminal); }
+.#{$fa-css-prefix}-text-height:before { content: fa-content($fa-var-text-height); }
+.#{$fa-css-prefix}-text-width:before { content: fa-content($fa-var-text-width); }
+.#{$fa-css-prefix}-th:before { content: fa-content($fa-var-th); }
+.#{$fa-css-prefix}-th-large:before { content: fa-content($fa-var-th-large); }
+.#{$fa-css-prefix}-th-list:before { content: fa-content($fa-var-th-list); }
+.#{$fa-css-prefix}-themeisle:before { content: fa-content($fa-var-themeisle); }
+.#{$fa-css-prefix}-thermometer:before { content: fa-content($fa-var-thermometer); }
+.#{$fa-css-prefix}-thermometer-empty:before { content: fa-content($fa-var-thermometer-empty); }
+.#{$fa-css-prefix}-thermometer-full:before { content: fa-content($fa-var-thermometer-full); }
+.#{$fa-css-prefix}-thermometer-half:before { content: fa-content($fa-var-thermometer-half); }
+.#{$fa-css-prefix}-thermometer-quarter:before { content: fa-content($fa-var-thermometer-quarter); }
+.#{$fa-css-prefix}-thermometer-three-quarters:before { content: fa-content($fa-var-thermometer-three-quarters); }
+.#{$fa-css-prefix}-thumbs-down:before { content: fa-content($fa-var-thumbs-down); }
+.#{$fa-css-prefix}-thumbs-up:before { content: fa-content($fa-var-thumbs-up); }
+.#{$fa-css-prefix}-thumbtack:before { content: fa-content($fa-var-thumbtack); }
+.#{$fa-css-prefix}-ticket-alt:before { content: fa-content($fa-var-ticket-alt); }
+.#{$fa-css-prefix}-times:before { content: fa-content($fa-var-times); }
+.#{$fa-css-prefix}-times-circle:before { content: fa-content($fa-var-times-circle); }
+.#{$fa-css-prefix}-tint:before { content: fa-content($fa-var-tint); }
+.#{$fa-css-prefix}-toggle-off:before { content: fa-content($fa-var-toggle-off); }
+.#{$fa-css-prefix}-toggle-on:before { content: fa-content($fa-var-toggle-on); }
+.#{$fa-css-prefix}-trademark:before { content: fa-content($fa-var-trademark); }
+.#{$fa-css-prefix}-train:before { content: fa-content($fa-var-train); }
+.#{$fa-css-prefix}-transgender:before { content: fa-content($fa-var-transgender); }
+.#{$fa-css-prefix}-transgender-alt:before { content: fa-content($fa-var-transgender-alt); }
+.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash); }
+.#{$fa-css-prefix}-trash-alt:before { content: fa-content($fa-var-trash-alt); }
+.#{$fa-css-prefix}-tree:before { content: fa-content($fa-var-tree); }
+.#{$fa-css-prefix}-trello:before { content: fa-content($fa-var-trello); }
+.#{$fa-css-prefix}-tripadvisor:before { content: fa-content($fa-var-tripadvisor); }
+.#{$fa-css-prefix}-trophy:before { content: fa-content($fa-var-trophy); }
+.#{$fa-css-prefix}-truck:before { content: fa-content($fa-var-truck); }
+.#{$fa-css-prefix}-truck-loading:before { content: fa-content($fa-var-truck-loading); }
+.#{$fa-css-prefix}-truck-moving:before { content: fa-content($fa-var-truck-moving); }
+.#{$fa-css-prefix}-tty:before { content: fa-content($fa-var-tty); }
+.#{$fa-css-prefix}-tumblr:before { content: fa-content($fa-var-tumblr); }
+.#{$fa-css-prefix}-tumblr-square:before { content: fa-content($fa-var-tumblr-square); }
+.#{$fa-css-prefix}-tv:before { content: fa-content($fa-var-tv); }
+.#{$fa-css-prefix}-twitch:before { content: fa-content($fa-var-twitch); }
+.#{$fa-css-prefix}-twitter:before { content: fa-content($fa-var-twitter); }
+.#{$fa-css-prefix}-twitter-square:before { content: fa-content($fa-var-twitter-square); }
+.#{$fa-css-prefix}-typo3:before { content: fa-content($fa-var-typo3); }
+.#{$fa-css-prefix}-uber:before { content: fa-content($fa-var-uber); }
+.#{$fa-css-prefix}-uikit:before { content: fa-content($fa-var-uikit); }
+.#{$fa-css-prefix}-umbrella:before { content: fa-content($fa-var-umbrella); }
+.#{$fa-css-prefix}-underline:before { content: fa-content($fa-var-underline); }
+.#{$fa-css-prefix}-undo:before { content: fa-content($fa-var-undo); }
+.#{$fa-css-prefix}-undo-alt:before { content: fa-content($fa-var-undo-alt); }
+.#{$fa-css-prefix}-uniregistry:before { content: fa-content($fa-var-uniregistry); }
+.#{$fa-css-prefix}-universal-access:before { content: fa-content($fa-var-universal-access); }
+.#{$fa-css-prefix}-university:before { content: fa-content($fa-var-university); }
+.#{$fa-css-prefix}-unlink:before { content: fa-content($fa-var-unlink); }
+.#{$fa-css-prefix}-unlock:before { content: fa-content($fa-var-unlock); }
+.#{$fa-css-prefix}-unlock-alt:before { content: fa-content($fa-var-unlock-alt); }
+.#{$fa-css-prefix}-untappd:before { content: fa-content($fa-var-untappd); }
+.#{$fa-css-prefix}-upload:before { content: fa-content($fa-var-upload); }
+.#{$fa-css-prefix}-usb:before { content: fa-content($fa-var-usb); }
+.#{$fa-css-prefix}-user:before { content: fa-content($fa-var-user); }
+.#{$fa-css-prefix}-user-circle:before { content: fa-content($fa-var-user-circle); }
+.#{$fa-css-prefix}-user-md:before { content: fa-content($fa-var-user-md); }
+.#{$fa-css-prefix}-user-plus:before { content: fa-content($fa-var-user-plus); }
+.#{$fa-css-prefix}-user-secret:before { content: fa-content($fa-var-user-secret); }
+.#{$fa-css-prefix}-user-times:before { content: fa-content($fa-var-user-times); }
+.#{$fa-css-prefix}-users:before { content: fa-content($fa-var-users); }
+.#{$fa-css-prefix}-ussunnah:before { content: fa-content($fa-var-ussunnah); }
+.#{$fa-css-prefix}-utensil-spoon:before { content: fa-content($fa-var-utensil-spoon); }
+.#{$fa-css-prefix}-utensils:before { content: fa-content($fa-var-utensils); }
+.#{$fa-css-prefix}-vaadin:before { content: fa-content($fa-var-vaadin); }
+.#{$fa-css-prefix}-venus:before { content: fa-content($fa-var-venus); }
+.#{$fa-css-prefix}-venus-double:before { content: fa-content($fa-var-venus-double); }
+.#{$fa-css-prefix}-venus-mars:before { content: fa-content($fa-var-venus-mars); }
+.#{$fa-css-prefix}-viacoin:before { content: fa-content($fa-var-viacoin); }
+.#{$fa-css-prefix}-viadeo:before { content: fa-content($fa-var-viadeo); }
+.#{$fa-css-prefix}-viadeo-square:before { content: fa-content($fa-var-viadeo-square); }
+.#{$fa-css-prefix}-vial:before { content: fa-content($fa-var-vial); }
+.#{$fa-css-prefix}-vials:before { content: fa-content($fa-var-vials); }
+.#{$fa-css-prefix}-viber:before { content: fa-content($fa-var-viber); }
+.#{$fa-css-prefix}-video:before { content: fa-content($fa-var-video); }
+.#{$fa-css-prefix}-video-slash:before { content: fa-content($fa-var-video-slash); }
+.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo); }
+.#{$fa-css-prefix}-vimeo-square:before { content: fa-content($fa-var-vimeo-square); }
+.#{$fa-css-prefix}-vimeo-v:before { content: fa-content($fa-var-vimeo-v); }
+.#{$fa-css-prefix}-vine:before { content: fa-content($fa-var-vine); }
+.#{$fa-css-prefix}-vk:before { content: fa-content($fa-var-vk); }
+.#{$fa-css-prefix}-vnv:before { content: fa-content($fa-var-vnv); }
+.#{$fa-css-prefix}-volleyball-ball:before { content: fa-content($fa-var-volleyball-ball); }
+.#{$fa-css-prefix}-volume-down:before { content: fa-content($fa-var-volume-down); }
+.#{$fa-css-prefix}-volume-off:before { content: fa-content($fa-var-volume-off); }
+.#{$fa-css-prefix}-volume-up:before { content: fa-content($fa-var-volume-up); }
+.#{$fa-css-prefix}-vuejs:before { content: fa-content($fa-var-vuejs); }
+.#{$fa-css-prefix}-warehouse:before { content: fa-content($fa-var-warehouse); }
+.#{$fa-css-prefix}-weibo:before { content: fa-content($fa-var-weibo); }
+.#{$fa-css-prefix}-weight:before { content: fa-content($fa-var-weight); }
+.#{$fa-css-prefix}-weixin:before { content: fa-content($fa-var-weixin); }
+.#{$fa-css-prefix}-whatsapp:before { content: fa-content($fa-var-whatsapp); }
+.#{$fa-css-prefix}-whatsapp-square:before { content: fa-content($fa-var-whatsapp-square); }
+.#{$fa-css-prefix}-wheelchair:before { content: fa-content($fa-var-wheelchair); }
+.#{$fa-css-prefix}-whmcs:before { content: fa-content($fa-var-whmcs); }
+.#{$fa-css-prefix}-wifi:before { content: fa-content($fa-var-wifi); }
+.#{$fa-css-prefix}-wikipedia-w:before { content: fa-content($fa-var-wikipedia-w); }
+.#{$fa-css-prefix}-window-close:before { content: fa-content($fa-var-window-close); }
+.#{$fa-css-prefix}-window-maximize:before { content: fa-content($fa-var-window-maximize); }
+.#{$fa-css-prefix}-window-minimize:before { content: fa-content($fa-var-window-minimize); }
+.#{$fa-css-prefix}-window-restore:before { content: fa-content($fa-var-window-restore); }
+.#{$fa-css-prefix}-windows:before { content: fa-content($fa-var-windows); }
+.#{$fa-css-prefix}-wine-glass:before { content: fa-content($fa-var-wine-glass); }
+.#{$fa-css-prefix}-won-sign:before { content: fa-content($fa-var-won-sign); }
+.#{$fa-css-prefix}-wordpress:before { content: fa-content($fa-var-wordpress); }
+.#{$fa-css-prefix}-wordpress-simple:before { content: fa-content($fa-var-wordpress-simple); }
+.#{$fa-css-prefix}-wpbeginner:before { content: fa-content($fa-var-wpbeginner); }
+.#{$fa-css-prefix}-wpexplorer:before { content: fa-content($fa-var-wpexplorer); }
+.#{$fa-css-prefix}-wpforms:before { content: fa-content($fa-var-wpforms); }
+.#{$fa-css-prefix}-wrench:before { content: fa-content($fa-var-wrench); }
+.#{$fa-css-prefix}-x-ray:before { content: fa-content($fa-var-x-ray); }
+.#{$fa-css-prefix}-xbox:before { content: fa-content($fa-var-xbox); }
+.#{$fa-css-prefix}-xing:before { content: fa-content($fa-var-xing); }
+.#{$fa-css-prefix}-xing-square:before { content: fa-content($fa-var-xing-square); }
+.#{$fa-css-prefix}-y-combinator:before { content: fa-content($fa-var-y-combinator); }
+.#{$fa-css-prefix}-yahoo:before { content: fa-content($fa-var-yahoo); }
+.#{$fa-css-prefix}-yandex:before { content: fa-content($fa-var-yandex); }
+.#{$fa-css-prefix}-yandex-international:before { content: fa-content($fa-var-yandex-international); }
+.#{$fa-css-prefix}-yelp:before { content: fa-content($fa-var-yelp); }
+.#{$fa-css-prefix}-yen-sign:before { content: fa-content($fa-var-yen-sign); }
+.#{$fa-css-prefix}-yoast:before { content: fa-content($fa-var-yoast); }
+.#{$fa-css-prefix}-youtube:before { content: fa-content($fa-var-youtube); }
+.#{$fa-css-prefix}-youtube-square:before { content: fa-content($fa-var-youtube-square); }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_larger.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_larger.scss
new file mode 100644
index 0000000000000000000000000000000000000000..27c2ad5fc45272972e7e894e2b1dc4ae7e10367b
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_larger.scss
@@ -0,0 +1,23 @@
+// Icon Sizes
+// -------------------------
+
+// makes the font 33% larger relative to the icon container
+.#{$fa-css-prefix}-lg {
+  font-size: (4em / 3);
+  line-height: (3em / 4);
+  vertical-align: -.0667em;
+}
+
+.#{$fa-css-prefix}-xs {
+  font-size: .75em;
+}
+
+.#{$fa-css-prefix}-sm {
+  font-size: .875em;
+}
+
+@for $i from 1 through 10 {
+  .#{$fa-css-prefix}-#{$i}x {
+    font-size: $i * 1em;
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_list.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_list.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8ebf33333cfd9cc589c44b39e9881d781986fccb
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_list.scss
@@ -0,0 +1,18 @@
+// List Icons
+// -------------------------
+
+.#{$fa-css-prefix}-ul {
+  list-style-type: none;
+  margin-left: $fa-li-width * 5/4;
+  padding-left: 0;
+
+  > li { position: relative; }
+}
+
+.#{$fa-css-prefix}-li {
+  left: -$fa-li-width;
+  position: absolute;
+  text-align: center;
+  width: $fa-li-width;
+  line-height: inherit;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_mixins.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_mixins.scss
new file mode 100644
index 0000000000000000000000000000000000000000..50a2e9f18c97c8a7e814d848a28598c32e53834e
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_mixins.scss
@@ -0,0 +1,57 @@
+// Mixins
+// --------------------------
+
+@mixin fa-icon {
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  display: inline-block;
+  font-style: normal;
+  font-variant: normal;
+  font-weight: normal;
+  line-height: 1;
+  vertical-align: -.125em;
+}
+
+@mixin fa-icon-rotate($degrees, $rotation) {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
+  transform: rotate($degrees);
+}
+
+@mixin fa-icon-flip($horiz, $vert, $rotation) {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
+  transform: scale($horiz, $vert);
+}
+
+
+// Only display content to screen readers. A la Bootstrap 4.
+//
+// See: http://a11yproject.com/posts/how-to-hide-content/
+
+@mixin sr-only {
+  border: 0;
+  clip: rect(0, 0, 0, 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+//
+// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+//
+// Credit: HTML5 Boilerplate
+
+@mixin sr-only-focusable {
+  &:active,
+  &:focus {
+    clip: auto;
+    height: auto;
+    margin: 0;
+    overflow: visible;
+    position: static;
+    width: auto;
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_rotated-flipped.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_rotated-flipped.scss
new file mode 100644
index 0000000000000000000000000000000000000000..995bc4cc70dacb1d6a8b9c925ea6faf0947d79a0
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_rotated-flipped.scss
@@ -0,0 +1,23 @@
+// Rotated & Flipped Icons
+// -------------------------
+
+.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }
+.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
+.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
+
+.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
+.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }
+.#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
+
+// Hook for IE8-9
+// -------------------------
+
+:root {
+  .#{$fa-css-prefix}-rotate-90,
+  .#{$fa-css-prefix}-rotate-180,
+  .#{$fa-css-prefix}-rotate-270,
+  .#{$fa-css-prefix}-flip-horizontal,
+  .#{$fa-css-prefix}-flip-vertical {
+    filter: none;
+  }
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_screen-reader.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_screen-reader.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5d0ab262f15f96241db42e70fcace6fa6914a720
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_screen-reader.scss
@@ -0,0 +1,5 @@
+// Screen Readers
+// -------------------------
+
+.sr-only { @include sr-only; }
+.sr-only-focusable { @include sr-only-focusable; }
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_stacked.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_stacked.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6c09d84cd11febf6d52a337198f1f468f5f9a1b9
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_stacked.scss
@@ -0,0 +1,31 @@
+// Stacked Icons
+// -------------------------
+
+.#{$fa-css-prefix}-stack {
+  display: inline-block;
+  height: 2em;
+  line-height: 2em;
+  position: relative;
+  vertical-align: middle;
+  width: 2em;
+}
+
+.#{$fa-css-prefix}-stack-1x,
+.#{$fa-css-prefix}-stack-2x {
+  left: 0;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+
+.#{$fa-css-prefix}-stack-1x {
+  line-height: inherit;
+}
+
+.#{$fa-css-prefix}-stack-2x {
+  font-size: 2em;
+}
+
+.#{$fa-css-prefix}-inverse {
+  color: $fa-inverse;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_variables.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f98353e33cda818ce94eda08b7c26f569af58155
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/_variables.scss
@@ -0,0 +1,889 @@
+// Variables
+// --------------------------
+
+$fa-font-path:                "../webfonts" !default;
+$fa-font-size-base:           16px !default;
+$fa-css-prefix:               fa !default;
+$fa-version:                  "5.0.9" !default;
+$fa-border-color:             #eee !default;
+$fa-inverse:                  #fff !default;
+$fa-li-width:                 2em !default;
+
+// Convenience function used to set content property
+@function fa-content($fa-var) {
+  @return unquote("\"#{ $fa-var }\"");
+}
+
+$fa-var-500px: \f26e;
+$fa-var-accessible-icon: \f368;
+$fa-var-accusoft: \f369;
+$fa-var-address-book: \f2b9;
+$fa-var-address-card: \f2bb;
+$fa-var-adjust: \f042;
+$fa-var-adn: \f170;
+$fa-var-adversal: \f36a;
+$fa-var-affiliatetheme: \f36b;
+$fa-var-algolia: \f36c;
+$fa-var-align-center: \f037;
+$fa-var-align-justify: \f039;
+$fa-var-align-left: \f036;
+$fa-var-align-right: \f038;
+$fa-var-allergies: \f461;
+$fa-var-amazon: \f270;
+$fa-var-amazon-pay: \f42c;
+$fa-var-ambulance: \f0f9;
+$fa-var-american-sign-language-interpreting: \f2a3;
+$fa-var-amilia: \f36d;
+$fa-var-anchor: \f13d;
+$fa-var-android: \f17b;
+$fa-var-angellist: \f209;
+$fa-var-angle-double-down: \f103;
+$fa-var-angle-double-left: \f100;
+$fa-var-angle-double-right: \f101;
+$fa-var-angle-double-up: \f102;
+$fa-var-angle-down: \f107;
+$fa-var-angle-left: \f104;
+$fa-var-angle-right: \f105;
+$fa-var-angle-up: \f106;
+$fa-var-angrycreative: \f36e;
+$fa-var-angular: \f420;
+$fa-var-app-store: \f36f;
+$fa-var-app-store-ios: \f370;
+$fa-var-apper: \f371;
+$fa-var-apple: \f179;
+$fa-var-apple-pay: \f415;
+$fa-var-archive: \f187;
+$fa-var-arrow-alt-circle-down: \f358;
+$fa-var-arrow-alt-circle-left: \f359;
+$fa-var-arrow-alt-circle-right: \f35a;
+$fa-var-arrow-alt-circle-up: \f35b;
+$fa-var-arrow-circle-down: \f0ab;
+$fa-var-arrow-circle-left: \f0a8;
+$fa-var-arrow-circle-right: \f0a9;
+$fa-var-arrow-circle-up: \f0aa;
+$fa-var-arrow-down: \f063;
+$fa-var-arrow-left: \f060;
+$fa-var-arrow-right: \f061;
+$fa-var-arrow-up: \f062;
+$fa-var-arrows-alt: \f0b2;
+$fa-var-arrows-alt-h: \f337;
+$fa-var-arrows-alt-v: \f338;
+$fa-var-assistive-listening-systems: \f2a2;
+$fa-var-asterisk: \f069;
+$fa-var-asymmetrik: \f372;
+$fa-var-at: \f1fa;
+$fa-var-audible: \f373;
+$fa-var-audio-description: \f29e;
+$fa-var-autoprefixer: \f41c;
+$fa-var-avianex: \f374;
+$fa-var-aviato: \f421;
+$fa-var-aws: \f375;
+$fa-var-backward: \f04a;
+$fa-var-balance-scale: \f24e;
+$fa-var-ban: \f05e;
+$fa-var-band-aid: \f462;
+$fa-var-bandcamp: \f2d5;
+$fa-var-barcode: \f02a;
+$fa-var-bars: \f0c9;
+$fa-var-baseball-ball: \f433;
+$fa-var-basketball-ball: \f434;
+$fa-var-bath: \f2cd;
+$fa-var-battery-empty: \f244;
+$fa-var-battery-full: \f240;
+$fa-var-battery-half: \f242;
+$fa-var-battery-quarter: \f243;
+$fa-var-battery-three-quarters: \f241;
+$fa-var-bed: \f236;
+$fa-var-beer: \f0fc;
+$fa-var-behance: \f1b4;
+$fa-var-behance-square: \f1b5;
+$fa-var-bell: \f0f3;
+$fa-var-bell-slash: \f1f6;
+$fa-var-bicycle: \f206;
+$fa-var-bimobject: \f378;
+$fa-var-binoculars: \f1e5;
+$fa-var-birthday-cake: \f1fd;
+$fa-var-bitbucket: \f171;
+$fa-var-bitcoin: \f379;
+$fa-var-bity: \f37a;
+$fa-var-black-tie: \f27e;
+$fa-var-blackberry: \f37b;
+$fa-var-blind: \f29d;
+$fa-var-blogger: \f37c;
+$fa-var-blogger-b: \f37d;
+$fa-var-bluetooth: \f293;
+$fa-var-bluetooth-b: \f294;
+$fa-var-bold: \f032;
+$fa-var-bolt: \f0e7;
+$fa-var-bomb: \f1e2;
+$fa-var-book: \f02d;
+$fa-var-bookmark: \f02e;
+$fa-var-bowling-ball: \f436;
+$fa-var-box: \f466;
+$fa-var-box-open: \f49e;
+$fa-var-boxes: \f468;
+$fa-var-braille: \f2a1;
+$fa-var-briefcase: \f0b1;
+$fa-var-briefcase-medical: \f469;
+$fa-var-btc: \f15a;
+$fa-var-bug: \f188;
+$fa-var-building: \f1ad;
+$fa-var-bullhorn: \f0a1;
+$fa-var-bullseye: \f140;
+$fa-var-burn: \f46a;
+$fa-var-buromobelexperte: \f37f;
+$fa-var-bus: \f207;
+$fa-var-buysellads: \f20d;
+$fa-var-calculator: \f1ec;
+$fa-var-calendar: \f133;
+$fa-var-calendar-alt: \f073;
+$fa-var-calendar-check: \f274;
+$fa-var-calendar-minus: \f272;
+$fa-var-calendar-plus: \f271;
+$fa-var-calendar-times: \f273;
+$fa-var-camera: \f030;
+$fa-var-camera-retro: \f083;
+$fa-var-capsules: \f46b;
+$fa-var-car: \f1b9;
+$fa-var-caret-down: \f0d7;
+$fa-var-caret-left: \f0d9;
+$fa-var-caret-right: \f0da;
+$fa-var-caret-square-down: \f150;
+$fa-var-caret-square-left: \f191;
+$fa-var-caret-square-right: \f152;
+$fa-var-caret-square-up: \f151;
+$fa-var-caret-up: \f0d8;
+$fa-var-cart-arrow-down: \f218;
+$fa-var-cart-plus: \f217;
+$fa-var-cc-amazon-pay: \f42d;
+$fa-var-cc-amex: \f1f3;
+$fa-var-cc-apple-pay: \f416;
+$fa-var-cc-diners-club: \f24c;
+$fa-var-cc-discover: \f1f2;
+$fa-var-cc-jcb: \f24b;
+$fa-var-cc-mastercard: \f1f1;
+$fa-var-cc-paypal: \f1f4;
+$fa-var-cc-stripe: \f1f5;
+$fa-var-cc-visa: \f1f0;
+$fa-var-centercode: \f380;
+$fa-var-certificate: \f0a3;
+$fa-var-chart-area: \f1fe;
+$fa-var-chart-bar: \f080;
+$fa-var-chart-line: \f201;
+$fa-var-chart-pie: \f200;
+$fa-var-check: \f00c;
+$fa-var-check-circle: \f058;
+$fa-var-check-square: \f14a;
+$fa-var-chess: \f439;
+$fa-var-chess-bishop: \f43a;
+$fa-var-chess-board: \f43c;
+$fa-var-chess-king: \f43f;
+$fa-var-chess-knight: \f441;
+$fa-var-chess-pawn: \f443;
+$fa-var-chess-queen: \f445;
+$fa-var-chess-rook: \f447;
+$fa-var-chevron-circle-down: \f13a;
+$fa-var-chevron-circle-left: \f137;
+$fa-var-chevron-circle-right: \f138;
+$fa-var-chevron-circle-up: \f139;
+$fa-var-chevron-down: \f078;
+$fa-var-chevron-left: \f053;
+$fa-var-chevron-right: \f054;
+$fa-var-chevron-up: \f077;
+$fa-var-child: \f1ae;
+$fa-var-chrome: \f268;
+$fa-var-circle: \f111;
+$fa-var-circle-notch: \f1ce;
+$fa-var-clipboard: \f328;
+$fa-var-clipboard-check: \f46c;
+$fa-var-clipboard-list: \f46d;
+$fa-var-clock: \f017;
+$fa-var-clone: \f24d;
+$fa-var-closed-captioning: \f20a;
+$fa-var-cloud: \f0c2;
+$fa-var-cloud-download-alt: \f381;
+$fa-var-cloud-upload-alt: \f382;
+$fa-var-cloudscale: \f383;
+$fa-var-cloudsmith: \f384;
+$fa-var-cloudversify: \f385;
+$fa-var-code: \f121;
+$fa-var-code-branch: \f126;
+$fa-var-codepen: \f1cb;
+$fa-var-codiepie: \f284;
+$fa-var-coffee: \f0f4;
+$fa-var-cog: \f013;
+$fa-var-cogs: \f085;
+$fa-var-columns: \f0db;
+$fa-var-comment: \f075;
+$fa-var-comment-alt: \f27a;
+$fa-var-comment-dots: \f4ad;
+$fa-var-comment-slash: \f4b3;
+$fa-var-comments: \f086;
+$fa-var-compass: \f14e;
+$fa-var-compress: \f066;
+$fa-var-connectdevelop: \f20e;
+$fa-var-contao: \f26d;
+$fa-var-copy: \f0c5;
+$fa-var-copyright: \f1f9;
+$fa-var-couch: \f4b8;
+$fa-var-cpanel: \f388;
+$fa-var-creative-commons: \f25e;
+$fa-var-credit-card: \f09d;
+$fa-var-crop: \f125;
+$fa-var-crosshairs: \f05b;
+$fa-var-css3: \f13c;
+$fa-var-css3-alt: \f38b;
+$fa-var-cube: \f1b2;
+$fa-var-cubes: \f1b3;
+$fa-var-cut: \f0c4;
+$fa-var-cuttlefish: \f38c;
+$fa-var-d-and-d: \f38d;
+$fa-var-dashcube: \f210;
+$fa-var-database: \f1c0;
+$fa-var-deaf: \f2a4;
+$fa-var-delicious: \f1a5;
+$fa-var-deploydog: \f38e;
+$fa-var-deskpro: \f38f;
+$fa-var-desktop: \f108;
+$fa-var-deviantart: \f1bd;
+$fa-var-diagnoses: \f470;
+$fa-var-digg: \f1a6;
+$fa-var-digital-ocean: \f391;
+$fa-var-discord: \f392;
+$fa-var-discourse: \f393;
+$fa-var-dna: \f471;
+$fa-var-dochub: \f394;
+$fa-var-docker: \f395;
+$fa-var-dollar-sign: \f155;
+$fa-var-dolly: \f472;
+$fa-var-dolly-flatbed: \f474;
+$fa-var-donate: \f4b9;
+$fa-var-dot-circle: \f192;
+$fa-var-dove: \f4ba;
+$fa-var-download: \f019;
+$fa-var-draft2digital: \f396;
+$fa-var-dribbble: \f17d;
+$fa-var-dribbble-square: \f397;
+$fa-var-dropbox: \f16b;
+$fa-var-drupal: \f1a9;
+$fa-var-dyalog: \f399;
+$fa-var-earlybirds: \f39a;
+$fa-var-edge: \f282;
+$fa-var-edit: \f044;
+$fa-var-eject: \f052;
+$fa-var-elementor: \f430;
+$fa-var-ellipsis-h: \f141;
+$fa-var-ellipsis-v: \f142;
+$fa-var-ember: \f423;
+$fa-var-empire: \f1d1;
+$fa-var-envelope: \f0e0;
+$fa-var-envelope-open: \f2b6;
+$fa-var-envelope-square: \f199;
+$fa-var-envira: \f299;
+$fa-var-eraser: \f12d;
+$fa-var-erlang: \f39d;
+$fa-var-ethereum: \f42e;
+$fa-var-etsy: \f2d7;
+$fa-var-euro-sign: \f153;
+$fa-var-exchange-alt: \f362;
+$fa-var-exclamation: \f12a;
+$fa-var-exclamation-circle: \f06a;
+$fa-var-exclamation-triangle: \f071;
+$fa-var-expand: \f065;
+$fa-var-expand-arrows-alt: \f31e;
+$fa-var-expeditedssl: \f23e;
+$fa-var-external-link-alt: \f35d;
+$fa-var-external-link-square-alt: \f360;
+$fa-var-eye: \f06e;
+$fa-var-eye-dropper: \f1fb;
+$fa-var-eye-slash: \f070;
+$fa-var-facebook: \f09a;
+$fa-var-facebook-f: \f39e;
+$fa-var-facebook-messenger: \f39f;
+$fa-var-facebook-square: \f082;
+$fa-var-fast-backward: \f049;
+$fa-var-fast-forward: \f050;
+$fa-var-fax: \f1ac;
+$fa-var-female: \f182;
+$fa-var-fighter-jet: \f0fb;
+$fa-var-file: \f15b;
+$fa-var-file-alt: \f15c;
+$fa-var-file-archive: \f1c6;
+$fa-var-file-audio: \f1c7;
+$fa-var-file-code: \f1c9;
+$fa-var-file-excel: \f1c3;
+$fa-var-file-image: \f1c5;
+$fa-var-file-medical: \f477;
+$fa-var-file-medical-alt: \f478;
+$fa-var-file-pdf: \f1c1;
+$fa-var-file-powerpoint: \f1c4;
+$fa-var-file-video: \f1c8;
+$fa-var-file-word: \f1c2;
+$fa-var-film: \f008;
+$fa-var-filter: \f0b0;
+$fa-var-fire: \f06d;
+$fa-var-fire-extinguisher: \f134;
+$fa-var-firefox: \f269;
+$fa-var-first-aid: \f479;
+$fa-var-first-order: \f2b0;
+$fa-var-firstdraft: \f3a1;
+$fa-var-flag: \f024;
+$fa-var-flag-checkered: \f11e;
+$fa-var-flask: \f0c3;
+$fa-var-flickr: \f16e;
+$fa-var-flipboard: \f44d;
+$fa-var-fly: \f417;
+$fa-var-folder: \f07b;
+$fa-var-folder-open: \f07c;
+$fa-var-font: \f031;
+$fa-var-font-awesome: \f2b4;
+$fa-var-font-awesome-alt: \f35c;
+$fa-var-font-awesome-flag: \f425;
+$fa-var-fonticons: \f280;
+$fa-var-fonticons-fi: \f3a2;
+$fa-var-football-ball: \f44e;
+$fa-var-fort-awesome: \f286;
+$fa-var-fort-awesome-alt: \f3a3;
+$fa-var-forumbee: \f211;
+$fa-var-forward: \f04e;
+$fa-var-foursquare: \f180;
+$fa-var-free-code-camp: \f2c5;
+$fa-var-freebsd: \f3a4;
+$fa-var-frown: \f119;
+$fa-var-futbol: \f1e3;
+$fa-var-gamepad: \f11b;
+$fa-var-gavel: \f0e3;
+$fa-var-gem: \f3a5;
+$fa-var-genderless: \f22d;
+$fa-var-get-pocket: \f265;
+$fa-var-gg: \f260;
+$fa-var-gg-circle: \f261;
+$fa-var-gift: \f06b;
+$fa-var-git: \f1d3;
+$fa-var-git-square: \f1d2;
+$fa-var-github: \f09b;
+$fa-var-github-alt: \f113;
+$fa-var-github-square: \f092;
+$fa-var-gitkraken: \f3a6;
+$fa-var-gitlab: \f296;
+$fa-var-gitter: \f426;
+$fa-var-glass-martini: \f000;
+$fa-var-glide: \f2a5;
+$fa-var-glide-g: \f2a6;
+$fa-var-globe: \f0ac;
+$fa-var-gofore: \f3a7;
+$fa-var-golf-ball: \f450;
+$fa-var-goodreads: \f3a8;
+$fa-var-goodreads-g: \f3a9;
+$fa-var-google: \f1a0;
+$fa-var-google-drive: \f3aa;
+$fa-var-google-play: \f3ab;
+$fa-var-google-plus: \f2b3;
+$fa-var-google-plus-g: \f0d5;
+$fa-var-google-plus-square: \f0d4;
+$fa-var-google-wallet: \f1ee;
+$fa-var-graduation-cap: \f19d;
+$fa-var-gratipay: \f184;
+$fa-var-grav: \f2d6;
+$fa-var-gripfire: \f3ac;
+$fa-var-grunt: \f3ad;
+$fa-var-gulp: \f3ae;
+$fa-var-h-square: \f0fd;
+$fa-var-hacker-news: \f1d4;
+$fa-var-hacker-news-square: \f3af;
+$fa-var-hand-holding: \f4bd;
+$fa-var-hand-holding-heart: \f4be;
+$fa-var-hand-holding-usd: \f4c0;
+$fa-var-hand-lizard: \f258;
+$fa-var-hand-paper: \f256;
+$fa-var-hand-peace: \f25b;
+$fa-var-hand-point-down: \f0a7;
+$fa-var-hand-point-left: \f0a5;
+$fa-var-hand-point-right: \f0a4;
+$fa-var-hand-point-up: \f0a6;
+$fa-var-hand-pointer: \f25a;
+$fa-var-hand-rock: \f255;
+$fa-var-hand-scissors: \f257;
+$fa-var-hand-spock: \f259;
+$fa-var-hands: \f4c2;
+$fa-var-hands-helping: \f4c4;
+$fa-var-handshake: \f2b5;
+$fa-var-hashtag: \f292;
+$fa-var-hdd: \f0a0;
+$fa-var-heading: \f1dc;
+$fa-var-headphones: \f025;
+$fa-var-heart: \f004;
+$fa-var-heartbeat: \f21e;
+$fa-var-hips: \f452;
+$fa-var-hire-a-helper: \f3b0;
+$fa-var-history: \f1da;
+$fa-var-hockey-puck: \f453;
+$fa-var-home: \f015;
+$fa-var-hooli: \f427;
+$fa-var-hospital: \f0f8;
+$fa-var-hospital-alt: \f47d;
+$fa-var-hospital-symbol: \f47e;
+$fa-var-hotjar: \f3b1;
+$fa-var-hourglass: \f254;
+$fa-var-hourglass-end: \f253;
+$fa-var-hourglass-half: \f252;
+$fa-var-hourglass-start: \f251;
+$fa-var-houzz: \f27c;
+$fa-var-html5: \f13b;
+$fa-var-hubspot: \f3b2;
+$fa-var-i-cursor: \f246;
+$fa-var-id-badge: \f2c1;
+$fa-var-id-card: \f2c2;
+$fa-var-id-card-alt: \f47f;
+$fa-var-image: \f03e;
+$fa-var-images: \f302;
+$fa-var-imdb: \f2d8;
+$fa-var-inbox: \f01c;
+$fa-var-indent: \f03c;
+$fa-var-industry: \f275;
+$fa-var-info: \f129;
+$fa-var-info-circle: \f05a;
+$fa-var-instagram: \f16d;
+$fa-var-internet-explorer: \f26b;
+$fa-var-ioxhost: \f208;
+$fa-var-italic: \f033;
+$fa-var-itunes: \f3b4;
+$fa-var-itunes-note: \f3b5;
+$fa-var-jenkins: \f3b6;
+$fa-var-joget: \f3b7;
+$fa-var-joomla: \f1aa;
+$fa-var-js: \f3b8;
+$fa-var-js-square: \f3b9;
+$fa-var-jsfiddle: \f1cc;
+$fa-var-key: \f084;
+$fa-var-keyboard: \f11c;
+$fa-var-keycdn: \f3ba;
+$fa-var-kickstarter: \f3bb;
+$fa-var-kickstarter-k: \f3bc;
+$fa-var-korvue: \f42f;
+$fa-var-language: \f1ab;
+$fa-var-laptop: \f109;
+$fa-var-laravel: \f3bd;
+$fa-var-lastfm: \f202;
+$fa-var-lastfm-square: \f203;
+$fa-var-leaf: \f06c;
+$fa-var-leanpub: \f212;
+$fa-var-lemon: \f094;
+$fa-var-less: \f41d;
+$fa-var-level-down-alt: \f3be;
+$fa-var-level-up-alt: \f3bf;
+$fa-var-life-ring: \f1cd;
+$fa-var-lightbulb: \f0eb;
+$fa-var-line: \f3c0;
+$fa-var-link: \f0c1;
+$fa-var-linkedin: \f08c;
+$fa-var-linkedin-in: \f0e1;
+$fa-var-linode: \f2b8;
+$fa-var-linux: \f17c;
+$fa-var-lira-sign: \f195;
+$fa-var-list: \f03a;
+$fa-var-list-alt: \f022;
+$fa-var-list-ol: \f0cb;
+$fa-var-list-ul: \f0ca;
+$fa-var-location-arrow: \f124;
+$fa-var-lock: \f023;
+$fa-var-lock-open: \f3c1;
+$fa-var-long-arrow-alt-down: \f309;
+$fa-var-long-arrow-alt-left: \f30a;
+$fa-var-long-arrow-alt-right: \f30b;
+$fa-var-long-arrow-alt-up: \f30c;
+$fa-var-low-vision: \f2a8;
+$fa-var-lyft: \f3c3;
+$fa-var-magento: \f3c4;
+$fa-var-magic: \f0d0;
+$fa-var-magnet: \f076;
+$fa-var-male: \f183;
+$fa-var-map: \f279;
+$fa-var-map-marker: \f041;
+$fa-var-map-marker-alt: \f3c5;
+$fa-var-map-pin: \f276;
+$fa-var-map-signs: \f277;
+$fa-var-mars: \f222;
+$fa-var-mars-double: \f227;
+$fa-var-mars-stroke: \f229;
+$fa-var-mars-stroke-h: \f22b;
+$fa-var-mars-stroke-v: \f22a;
+$fa-var-maxcdn: \f136;
+$fa-var-medapps: \f3c6;
+$fa-var-medium: \f23a;
+$fa-var-medium-m: \f3c7;
+$fa-var-medkit: \f0fa;
+$fa-var-medrt: \f3c8;
+$fa-var-meetup: \f2e0;
+$fa-var-meh: \f11a;
+$fa-var-mercury: \f223;
+$fa-var-microchip: \f2db;
+$fa-var-microphone: \f130;
+$fa-var-microphone-slash: \f131;
+$fa-var-microsoft: \f3ca;
+$fa-var-minus: \f068;
+$fa-var-minus-circle: \f056;
+$fa-var-minus-square: \f146;
+$fa-var-mix: \f3cb;
+$fa-var-mixcloud: \f289;
+$fa-var-mizuni: \f3cc;
+$fa-var-mobile: \f10b;
+$fa-var-mobile-alt: \f3cd;
+$fa-var-modx: \f285;
+$fa-var-monero: \f3d0;
+$fa-var-money-bill-alt: \f3d1;
+$fa-var-moon: \f186;
+$fa-var-motorcycle: \f21c;
+$fa-var-mouse-pointer: \f245;
+$fa-var-music: \f001;
+$fa-var-napster: \f3d2;
+$fa-var-neuter: \f22c;
+$fa-var-newspaper: \f1ea;
+$fa-var-nintendo-switch: \f418;
+$fa-var-node: \f419;
+$fa-var-node-js: \f3d3;
+$fa-var-notes-medical: \f481;
+$fa-var-npm: \f3d4;
+$fa-var-ns8: \f3d5;
+$fa-var-nutritionix: \f3d6;
+$fa-var-object-group: \f247;
+$fa-var-object-ungroup: \f248;
+$fa-var-odnoklassniki: \f263;
+$fa-var-odnoklassniki-square: \f264;
+$fa-var-opencart: \f23d;
+$fa-var-openid: \f19b;
+$fa-var-opera: \f26a;
+$fa-var-optin-monster: \f23c;
+$fa-var-osi: \f41a;
+$fa-var-outdent: \f03b;
+$fa-var-page4: \f3d7;
+$fa-var-pagelines: \f18c;
+$fa-var-paint-brush: \f1fc;
+$fa-var-palfed: \f3d8;
+$fa-var-pallet: \f482;
+$fa-var-paper-plane: \f1d8;
+$fa-var-paperclip: \f0c6;
+$fa-var-parachute-box: \f4cd;
+$fa-var-paragraph: \f1dd;
+$fa-var-paste: \f0ea;
+$fa-var-patreon: \f3d9;
+$fa-var-pause: \f04c;
+$fa-var-pause-circle: \f28b;
+$fa-var-paw: \f1b0;
+$fa-var-paypal: \f1ed;
+$fa-var-pen-square: \f14b;
+$fa-var-pencil-alt: \f303;
+$fa-var-people-carry: \f4ce;
+$fa-var-percent: \f295;
+$fa-var-periscope: \f3da;
+$fa-var-phabricator: \f3db;
+$fa-var-phoenix-framework: \f3dc;
+$fa-var-phone: \f095;
+$fa-var-phone-slash: \f3dd;
+$fa-var-phone-square: \f098;
+$fa-var-phone-volume: \f2a0;
+$fa-var-php: \f457;
+$fa-var-pied-piper: \f2ae;
+$fa-var-pied-piper-alt: \f1a8;
+$fa-var-pied-piper-pp: \f1a7;
+$fa-var-piggy-bank: \f4d3;
+$fa-var-pills: \f484;
+$fa-var-pinterest: \f0d2;
+$fa-var-pinterest-p: \f231;
+$fa-var-pinterest-square: \f0d3;
+$fa-var-plane: \f072;
+$fa-var-play: \f04b;
+$fa-var-play-circle: \f144;
+$fa-var-playstation: \f3df;
+$fa-var-plug: \f1e6;
+$fa-var-plus: \f067;
+$fa-var-plus-circle: \f055;
+$fa-var-plus-square: \f0fe;
+$fa-var-podcast: \f2ce;
+$fa-var-poo: \f2fe;
+$fa-var-pound-sign: \f154;
+$fa-var-power-off: \f011;
+$fa-var-prescription-bottle: \f485;
+$fa-var-prescription-bottle-alt: \f486;
+$fa-var-print: \f02f;
+$fa-var-procedures: \f487;
+$fa-var-product-hunt: \f288;
+$fa-var-pushed: \f3e1;
+$fa-var-puzzle-piece: \f12e;
+$fa-var-python: \f3e2;
+$fa-var-qq: \f1d6;
+$fa-var-qrcode: \f029;
+$fa-var-question: \f128;
+$fa-var-question-circle: \f059;
+$fa-var-quidditch: \f458;
+$fa-var-quinscape: \f459;
+$fa-var-quora: \f2c4;
+$fa-var-quote-left: \f10d;
+$fa-var-quote-right: \f10e;
+$fa-var-random: \f074;
+$fa-var-ravelry: \f2d9;
+$fa-var-react: \f41b;
+$fa-var-readme: \f4d5;
+$fa-var-rebel: \f1d0;
+$fa-var-recycle: \f1b8;
+$fa-var-red-river: \f3e3;
+$fa-var-reddit: \f1a1;
+$fa-var-reddit-alien: \f281;
+$fa-var-reddit-square: \f1a2;
+$fa-var-redo: \f01e;
+$fa-var-redo-alt: \f2f9;
+$fa-var-registered: \f25d;
+$fa-var-rendact: \f3e4;
+$fa-var-renren: \f18b;
+$fa-var-reply: \f3e5;
+$fa-var-reply-all: \f122;
+$fa-var-replyd: \f3e6;
+$fa-var-resolving: \f3e7;
+$fa-var-retweet: \f079;
+$fa-var-ribbon: \f4d6;
+$fa-var-road: \f018;
+$fa-var-rocket: \f135;
+$fa-var-rocketchat: \f3e8;
+$fa-var-rockrms: \f3e9;
+$fa-var-rss: \f09e;
+$fa-var-rss-square: \f143;
+$fa-var-ruble-sign: \f158;
+$fa-var-rupee-sign: \f156;
+$fa-var-safari: \f267;
+$fa-var-sass: \f41e;
+$fa-var-save: \f0c7;
+$fa-var-schlix: \f3ea;
+$fa-var-scribd: \f28a;
+$fa-var-search: \f002;
+$fa-var-search-minus: \f010;
+$fa-var-search-plus: \f00e;
+$fa-var-searchengin: \f3eb;
+$fa-var-seedling: \f4d8;
+$fa-var-sellcast: \f2da;
+$fa-var-sellsy: \f213;
+$fa-var-server: \f233;
+$fa-var-servicestack: \f3ec;
+$fa-var-share: \f064;
+$fa-var-share-alt: \f1e0;
+$fa-var-share-alt-square: \f1e1;
+$fa-var-share-square: \f14d;
+$fa-var-shekel-sign: \f20b;
+$fa-var-shield-alt: \f3ed;
+$fa-var-ship: \f21a;
+$fa-var-shipping-fast: \f48b;
+$fa-var-shirtsinbulk: \f214;
+$fa-var-shopping-bag: \f290;
+$fa-var-shopping-basket: \f291;
+$fa-var-shopping-cart: \f07a;
+$fa-var-shower: \f2cc;
+$fa-var-sign: \f4d9;
+$fa-var-sign-in-alt: \f2f6;
+$fa-var-sign-language: \f2a7;
+$fa-var-sign-out-alt: \f2f5;
+$fa-var-signal: \f012;
+$fa-var-simplybuilt: \f215;
+$fa-var-sistrix: \f3ee;
+$fa-var-sitemap: \f0e8;
+$fa-var-skyatlas: \f216;
+$fa-var-skype: \f17e;
+$fa-var-slack: \f198;
+$fa-var-slack-hash: \f3ef;
+$fa-var-sliders-h: \f1de;
+$fa-var-slideshare: \f1e7;
+$fa-var-smile: \f118;
+$fa-var-smoking: \f48d;
+$fa-var-snapchat: \f2ab;
+$fa-var-snapchat-ghost: \f2ac;
+$fa-var-snapchat-square: \f2ad;
+$fa-var-snowflake: \f2dc;
+$fa-var-sort: \f0dc;
+$fa-var-sort-alpha-down: \f15d;
+$fa-var-sort-alpha-up: \f15e;
+$fa-var-sort-amount-down: \f160;
+$fa-var-sort-amount-up: \f161;
+$fa-var-sort-down: \f0dd;
+$fa-var-sort-numeric-down: \f162;
+$fa-var-sort-numeric-up: \f163;
+$fa-var-sort-up: \f0de;
+$fa-var-soundcloud: \f1be;
+$fa-var-space-shuttle: \f197;
+$fa-var-speakap: \f3f3;
+$fa-var-spinner: \f110;
+$fa-var-spotify: \f1bc;
+$fa-var-square: \f0c8;
+$fa-var-square-full: \f45c;
+$fa-var-stack-exchange: \f18d;
+$fa-var-stack-overflow: \f16c;
+$fa-var-star: \f005;
+$fa-var-star-half: \f089;
+$fa-var-staylinked: \f3f5;
+$fa-var-steam: \f1b6;
+$fa-var-steam-square: \f1b7;
+$fa-var-steam-symbol: \f3f6;
+$fa-var-step-backward: \f048;
+$fa-var-step-forward: \f051;
+$fa-var-stethoscope: \f0f1;
+$fa-var-sticker-mule: \f3f7;
+$fa-var-sticky-note: \f249;
+$fa-var-stop: \f04d;
+$fa-var-stop-circle: \f28d;
+$fa-var-stopwatch: \f2f2;
+$fa-var-strava: \f428;
+$fa-var-street-view: \f21d;
+$fa-var-strikethrough: \f0cc;
+$fa-var-stripe: \f429;
+$fa-var-stripe-s: \f42a;
+$fa-var-studiovinari: \f3f8;
+$fa-var-stumbleupon: \f1a4;
+$fa-var-stumbleupon-circle: \f1a3;
+$fa-var-subscript: \f12c;
+$fa-var-subway: \f239;
+$fa-var-suitcase: \f0f2;
+$fa-var-sun: \f185;
+$fa-var-superpowers: \f2dd;
+$fa-var-superscript: \f12b;
+$fa-var-supple: \f3f9;
+$fa-var-sync: \f021;
+$fa-var-sync-alt: \f2f1;
+$fa-var-syringe: \f48e;
+$fa-var-table: \f0ce;
+$fa-var-table-tennis: \f45d;
+$fa-var-tablet: \f10a;
+$fa-var-tablet-alt: \f3fa;
+$fa-var-tablets: \f490;
+$fa-var-tachometer-alt: \f3fd;
+$fa-var-tag: \f02b;
+$fa-var-tags: \f02c;
+$fa-var-tape: \f4db;
+$fa-var-tasks: \f0ae;
+$fa-var-taxi: \f1ba;
+$fa-var-telegram: \f2c6;
+$fa-var-telegram-plane: \f3fe;
+$fa-var-tencent-weibo: \f1d5;
+$fa-var-terminal: \f120;
+$fa-var-text-height: \f034;
+$fa-var-text-width: \f035;
+$fa-var-th: \f00a;
+$fa-var-th-large: \f009;
+$fa-var-th-list: \f00b;
+$fa-var-themeisle: \f2b2;
+$fa-var-thermometer: \f491;
+$fa-var-thermometer-empty: \f2cb;
+$fa-var-thermometer-full: \f2c7;
+$fa-var-thermometer-half: \f2c9;
+$fa-var-thermometer-quarter: \f2ca;
+$fa-var-thermometer-three-quarters: \f2c8;
+$fa-var-thumbs-down: \f165;
+$fa-var-thumbs-up: \f164;
+$fa-var-thumbtack: \f08d;
+$fa-var-ticket-alt: \f3ff;
+$fa-var-times: \f00d;
+$fa-var-times-circle: \f057;
+$fa-var-tint: \f043;
+$fa-var-toggle-off: \f204;
+$fa-var-toggle-on: \f205;
+$fa-var-trademark: \f25c;
+$fa-var-train: \f238;
+$fa-var-transgender: \f224;
+$fa-var-transgender-alt: \f225;
+$fa-var-trash: \f1f8;
+$fa-var-trash-alt: \f2ed;
+$fa-var-tree: \f1bb;
+$fa-var-trello: \f181;
+$fa-var-tripadvisor: \f262;
+$fa-var-trophy: \f091;
+$fa-var-truck: \f0d1;
+$fa-var-truck-loading: \f4de;
+$fa-var-truck-moving: \f4df;
+$fa-var-tty: \f1e4;
+$fa-var-tumblr: \f173;
+$fa-var-tumblr-square: \f174;
+$fa-var-tv: \f26c;
+$fa-var-twitch: \f1e8;
+$fa-var-twitter: \f099;
+$fa-var-twitter-square: \f081;
+$fa-var-typo3: \f42b;
+$fa-var-uber: \f402;
+$fa-var-uikit: \f403;
+$fa-var-umbrella: \f0e9;
+$fa-var-underline: \f0cd;
+$fa-var-undo: \f0e2;
+$fa-var-undo-alt: \f2ea;
+$fa-var-uniregistry: \f404;
+$fa-var-universal-access: \f29a;
+$fa-var-university: \f19c;
+$fa-var-unlink: \f127;
+$fa-var-unlock: \f09c;
+$fa-var-unlock-alt: \f13e;
+$fa-var-untappd: \f405;
+$fa-var-upload: \f093;
+$fa-var-usb: \f287;
+$fa-var-user: \f007;
+$fa-var-user-circle: \f2bd;
+$fa-var-user-md: \f0f0;
+$fa-var-user-plus: \f234;
+$fa-var-user-secret: \f21b;
+$fa-var-user-times: \f235;
+$fa-var-users: \f0c0;
+$fa-var-ussunnah: \f407;
+$fa-var-utensil-spoon: \f2e5;
+$fa-var-utensils: \f2e7;
+$fa-var-vaadin: \f408;
+$fa-var-venus: \f221;
+$fa-var-venus-double: \f226;
+$fa-var-venus-mars: \f228;
+$fa-var-viacoin: \f237;
+$fa-var-viadeo: \f2a9;
+$fa-var-viadeo-square: \f2aa;
+$fa-var-vial: \f492;
+$fa-var-vials: \f493;
+$fa-var-viber: \f409;
+$fa-var-video: \f03d;
+$fa-var-video-slash: \f4e2;
+$fa-var-vimeo: \f40a;
+$fa-var-vimeo-square: \f194;
+$fa-var-vimeo-v: \f27d;
+$fa-var-vine: \f1ca;
+$fa-var-vk: \f189;
+$fa-var-vnv: \f40b;
+$fa-var-volleyball-ball: \f45f;
+$fa-var-volume-down: \f027;
+$fa-var-volume-off: \f026;
+$fa-var-volume-up: \f028;
+$fa-var-vuejs: \f41f;
+$fa-var-warehouse: \f494;
+$fa-var-weibo: \f18a;
+$fa-var-weight: \f496;
+$fa-var-weixin: \f1d7;
+$fa-var-whatsapp: \f232;
+$fa-var-whatsapp-square: \f40c;
+$fa-var-wheelchair: \f193;
+$fa-var-whmcs: \f40d;
+$fa-var-wifi: \f1eb;
+$fa-var-wikipedia-w: \f266;
+$fa-var-window-close: \f410;
+$fa-var-window-maximize: \f2d0;
+$fa-var-window-minimize: \f2d1;
+$fa-var-window-restore: \f2d2;
+$fa-var-windows: \f17a;
+$fa-var-wine-glass: \f4e3;
+$fa-var-won-sign: \f159;
+$fa-var-wordpress: \f19a;
+$fa-var-wordpress-simple: \f411;
+$fa-var-wpbeginner: \f297;
+$fa-var-wpexplorer: \f2de;
+$fa-var-wpforms: \f298;
+$fa-var-wrench: \f0ad;
+$fa-var-x-ray: \f497;
+$fa-var-xbox: \f412;
+$fa-var-xing: \f168;
+$fa-var-xing-square: \f169;
+$fa-var-y-combinator: \f23b;
+$fa-var-yahoo: \f19e;
+$fa-var-yandex: \f413;
+$fa-var-yandex-international: \f414;
+$fa-var-yelp: \f1e9;
+$fa-var-yen-sign: \f157;
+$fa-var-yoast: \f2b1;
+$fa-var-youtube: \f167;
+$fa-var-youtube-square: \f431;
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-brands.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-brands.scss
new file mode 100644
index 0000000000000000000000000000000000000000..64a99b64bd75c1d9d26f762c9494f3bbbfd4910f
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-brands.scss
@@ -0,0 +1,21 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import 'variables';
+
+@font-face {
+  font-family: 'Font Awesome 5 Brands';
+  font-style: normal;
+  font-weight: normal;
+  src: url('#{$fa-font-path}/fa-brands-400.eot');
+  src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
+  url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
+  url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
+  url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
+  url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
+}
+
+.fab {
+  font-family: 'Font Awesome 5 Brands';
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-regular.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-regular.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8d797bcf03a1d3a5daeda9f070607216ceb05c95
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-regular.scss
@@ -0,0 +1,22 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import 'variables';
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 400;
+  src: url('#{$fa-font-path}/fa-regular-400.eot');
+  src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
+  url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
+  url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
+  url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
+  url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
+}
+
+.far {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 400;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-solid.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-solid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8ff2bd3505d3a5ff68f686425ad6f8b38da0dcf1
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fa-solid.scss
@@ -0,0 +1,23 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import 'variables';
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-style: normal;
+  font-weight: 900;
+  src: url('#{$fa-font-path}/fa-solid-900.eot');
+  src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
+  url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
+  url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
+  url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
+  url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
+}
+
+.fa,
+.fas {
+  font-family: 'Font Awesome 5 Free';
+  font-weight: 900;
+}
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fontawesome.scss b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fontawesome.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b149a36c3c8baf37af979a9bb6a3df748249ef30
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/scss/fontawesome.scss
@@ -0,0 +1,16 @@
+/*!
+ * Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@import 'variables';
+@import 'mixins';
+@import 'core';
+@import 'larger';
+@import 'fixed-width';
+@import 'list';
+@import 'bordered-pulled';
+@import 'animated';
+@import 'rotated-flipped';
+@import 'stacked';
+@import 'icons';
+@import 'screen-reader';
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.eot b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.eot
new file mode 100644
index 0000000000000000000000000000000000000000..33e6a990e040ccf058c0569db5a8b722a5118bfa
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.eot differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.svg b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9bda0a04a73964f4ab4d1357a95fe2a7ad49bc5d
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.svg
@@ -0,0 +1,1011 @@
+<?xml version="1.0" standalone="no"?> 
+<!--
+Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs>
+  <font id="fontawesome-free" horiz-adv-x="640.4">
+    <font-face font-family="Font Awesome 5 Brands"
+      units-per-em="512" ascent="448"
+      descent="64"
+      font-weight="400"
+      font-style="Regular" />
+    <missing-glyph horiz-adv-x="0" />
+    <glyph glyph-name="500px"
+      unicode="&#xF26E;"
+      horiz-adv-x="448" d=" M103.3 103.7C96.8 117.9 96.4 122 110.7 126.8C136.3 134.8 118.7 117.6 153.9 77.6H154.2V171.5C155.4 221.7 198.2 263.7 251.9000000000001 263.7C305.8 263.7 349.6 220.2 349.6 166.9C349.6 103.5 288.8 53.7 221.1 73.6C210.6 77.8 219 105.3 229.6 102.2C282.6 102.2 319 112.3 319 166.6C319 227.6 241.9 256.2000000000001 202.1 211.2C178.6 184.8 184.5 169.1 184.5 53.6C235.2 22.6 302.8 31.6 344.9 73.7000000000001C369.7 98.5000000000001 383.4 131.7000000000001 383.4 166.7000000000001C383.4 201.9 369.6 234.9000000000001 344.6 260.0000000000001C319.8 284.8000000000001 286.8 298.5000000000001 251.3 298.5000000000001S182.5 284.7000000000001 157.8 260.0000000000001C157.5 259.7000000000001 141.8 243.5000000000001 136.6 236.1000000000001L136.1 235.5000000000001C132.8 230.8000000000001 129.8 226.4000000000001 116 229.4000000000001C109.1 231.1000000000001 101.7 235.2000000000001 101.7 241.2000000000001V428C101.7 433 105.6 438.5 112.2 438.5H353.5C361.8 438.5 361.8 426.9 361.8 423.4C361.8 419.5 361.8 408.3 353.5 408.3H130.3V275.4H130.6C234.8 385.2 413.4000000000001 311.4 413.4000000000001 166.5C413.4000000000001 -11.6 168.6 -53.8 103.3 103.7zM166.6 364.5C166.1 360.3 171.2 340 181.2 343.9C306 391.4 384 303.5 390.6 303.5C395.4000000000001 303.5 413.4000000000001 318.8 404.9000000000001 326.3C311.7000000000001 415.3 170.4 383.3 166.6 364.5zM393 33.3C283 -76.6 94 -27.5 61 137.5C61 149.7 30.6 144.9 32.1 134.2C56.1 -39.2 278.1 -122.7 413.7000000000001 12.9C420.6 20.7 401.1 41.3 393.0000000000001 33.3zM213.6 141.4C213.6 137.4 217.9 134.1 219.1 132.9C222.1 129.9 225.2 128.5 227.6 128.5C231.4 128.5 230.2 128.3 249.9 148C269.5 128.7 269 128.5 272.2 128.5C277.6 128.5 290.7 138.9 282.9 146.7L265.6 164L283.8 182.2C290.1 189 273.7 204 267.6 197.9L249.7 180C231.1 198.8 231.3 199.5 228.2 199.5C223.2 199.5 210.2 187.8 215.8 182.2L234 164C215.9 146.1 213.6 144.8 213.6 141.4z" />
+    <glyph glyph-name="accessible-icon"
+      unicode="&#xF368;"
+      horiz-adv-x="448" d=" M423.9 192.2L411 34.9C407.7 -5.8 347.1 -0.2 350.4 39.8L360.4 162.3L319.3 160C329.4 139.3 335.1 116.1 335.1 91.4999999999999C335.1 50.3 319 12.8 292.8 -15.0000000000001L253.5 24.3C311.3999999999999 87.9999999999999 266.6 191.5 179.5 191.5C153.5999999999999 191.5 130 181.6 112.2999999999999 165.5L73 204.8C95 225.5 123.1 239.9 154.4 245L229.7 330.7L187.1 355.5L135.5 309.5C105.5 282.7 64.9 328 95 354.9L163 415.6C172.8 424.4000000000001 187.1 425.8 198.5 419.2C198.5 419.2 337.8 338.3 338 338.1C354.2 328 358.7 302.1 344.1 285.5L285.7 219L391.8 224.9C410.3 226 425.4 210.5 423.9 192.2zM359 346.2C387.1 346.2 409.9 369 409.9 397.1C409.9 425.2 387.1 448 359 448C330.9 448 308.1 425.2 308.1 397.1C308.1 369 330.9000000000001 346.2 359 346.2zM179.6 -8.5C99 -8.5 52.2 82.1 96.9 147.6L57.2 187.3C36.4 161 24 127.7 24 91.6C24 -39.1 174.7 -109.7999999999999 275.4 -30.9L235.7 8.8C219.7 -2.1 200.4 -8.5 179.6 -8.5z" />
+    <glyph glyph-name="accusoft"
+      unicode="&#xF369;"
+      horiz-adv-x="640" d=" M482.2 75.9C476.5 82.8 250 373 242.3 382.5C228.6 399.7 242.3 399.3 261.5 399.4C271.2 399.5 367.8 400 378 400C402.1 400.1 406.7 399.4 416.4 387.2C418.5 384.5 621.5 141.4 623.5999999999999 138.9C629.0999999999999 132.2 638.8 119.8 630.8 115.5C628.4 114.2 516.1999999999999 67.8 513 66.6C502.9 62.6 495.5 59.8 482.2 75.9M596.9 81.5000000000001S481.9 31.1000000000001 479.4 29.9C463.4 22.6 452.5 33.1 442.7 44.5000000000001L385.6 118.5000000000001C380.2 119.4 325.2 128.1000000000001 320.3 127.8000000000001C317.2 127.6000000000001 310.7 127.0000000000001 305.9 124.9000000000001C301 122.8000000000001 160.7 72.1000000000001 155.7 70.2000000000001C150.6 68.2000000000001 144.3 66.6000000000001 144.6 62.6000000000001C144.8 60.1000000000001 146.6 60.0000000000001 149.2 59.1000000000001C151.9 58.3000000000001 450.1 -8.4999999999999 457.2 -9.9999999999999C472.8 -13.2999999999999 495.7 -20.4999999999999 510.8 -11.6999999999999C512.9 -10.4999999999999 634.6 64.7000000000002 636.6 66.1000000000001C642 70.1000000000001 640.9 72.9000000000002 634.9 74.3000000000001C632.6 74.6000000000001 610.3 79.0000000000001 596.9 81.5000000000001M270.9 262.8000000000002S258.9 261.2000000000002 245.9 247.7000000000002C236.9 238.4000000000001 3.8 8.6000000000001 2.5 6.8000000000001C-4.5 -3.1999999999999 4.1 1e-13 18.2 5.1000000000001C19 5.1000000000001 132.7 41.7000000000002 132.7 41.7000000000002C133.2 42.3000000000002 132.6 41.8000000000002 133.3 42.3000000000002C132.9 47.4000000000002 132.5 68.5000000000002 132.3 70.0000000000002C131.7 75.2000000000002 134.5 76.9000000000002 139.3 78.9000000000002L231.9 112.7000000000002C232.5 113.5000000000002 320.4 194.4000000000002 322.1 196.0000000000002V197.0000000000002L270.9 262.8000000000002" />
+    <glyph glyph-name="adn"
+      unicode="&#xF170;"
+      horiz-adv-x="496" d=" M248 280.5L312.9 181.7H183.1L248 280.5zM496 192C496 55.1 384.9 -56 248 -56S0 55.1 0 192S111.1 440 248 440S496 328.9 496 192zM396.2 109.3L248 332.5L99.8 109.3H130.2L163.8 161H332.4L366 109.3H396.2z" />
+    <glyph glyph-name="adversal"
+      unicode="&#xF36A;"
+      horiz-adv-x="512" d=" M482.1 416H28.7C5.8 416 0 410.1 0 387.1V-3.1C0 -26.4 5.8 -32 28.7 -32H482.1C506.4999999999999 -32 511.9999999999999 -26.8 511.9999999999999 -2.3V385.8C511.9999999999999 410.4 506.6 416 482.1 416zM178.4 227.7C150.9 247.9 106.3 236.4 94.2 204.3C89.9 193.2 84.9 194.8 76.7 196C67 197.5 59.5 199.2 54.2 201.5C25.4 212.9 62.8 256.8 79.1 265.8C120.2 287.2 162.5 288 204.4 270.6C245.3 253.8 238.9 211.4 238.9 142.1C241.6 116.3 234.6 83.8 248.2 53.3C250.1 48.9 248.6 45.4 245.5 42.6C237.1 35.9 206.2 40.4 198.9 49.9999999999999C197 52.1999999999999 197.1 53.6 195 56.1999999999999C191.4 60.0999999999999 187.7 58.3999999999999 183.1 55.1999999999999C125.7 18.8 42.8 33.8 36.1 98.4999999999999C33 127.8 48.5 155.6 75.7 169.5C113.9 189 187.9 181.3 189.7 200.4C190.8 210.5999999999999 187.8 220.5 178.4 227.7zM465.1 5.7C465.1 -9.4 454 -4.2 447.3 -4.2H52.4C45 -4.2 34.2 -9 34.6 6.5C35 20.4 45.1 15.6 51.7 15.6C184 16 316.2 16 448.5 15.6C455.3 15.6 465.1 20 465.1 5.7zM468.9 346.2V55.2C468.9 49.5 468.2 41.3 460.8 41.3C448.4000000000001 41.7 433.3 34.2 424.7 46.9C418.9 55.6 416.9 50.9 412.3 48.1C358.9000000000001 18.4 284.2000000000001 41 267.9 133.3C261.8 166.7 267.2 200.4 283.6 233.3C295.4 257.2000000000001 340.5 309.4 419.7 263.8V334.8C419.7 361 419.5999999999999 361 445.7 361C448.8 361 452.3 360.6 455.3999999999999 361C465.4999999999999 361.8 468.9999999999999 356.6 468.9999999999999 346.7000000000001C468.8999999999999 346.5 468.8999999999999 346.4000000000001 468.8999999999999 346.2000000000001zM417.4000000000001 113.9C397.9000000000001 66.3 344.5 70.6 327.4000000000001 108.7C312.3 142 311.9000000000001 176.9 327.8 210.2C344.1 244.3 387.5 245.9 409.3 215C429.9000000000001 186.2 424.2 130.4 417.4000000000001 113.9zM122.6 78.6C115.1 79.9 89.6 81.9 88.9 106.4C88.5 120.3 96.7 129.4 108.7 132.2C133.1 138.1 158 142.1 182.4 146.9C191.3000000000001 148.9 189.8000000000001 142.5 190.2000000000001 137.4C191.6000000000001 104.4 164.1000000000001 78.2 122.6000000000001 78.6z" />
+    <glyph glyph-name="affiliatetheme"
+      unicode="&#xF36B;"
+      horiz-adv-x="512" d=" M159.7 210.6C108.4 139.7 43.1 99.8 14 121.4C-15.2 143.1 2.8 218 54.2 288.9C105.5 359.8 170.8 399.7 199.9 378.1C229 356.5 211 281.5 159.7 210.6zM510.9 267.9C437.1 144.5 319 80.2 246.4 124.3C221.4 139.5 205.1 165.5 197.4 198.1C163.8 133.3 104.6 84.3 33.3 64.9C83.1 5.6 157.4 -32 240.3 -32C390.3 -32 511.9 91.1 511.9 242.9C512 251.4 511.6 259.7 510.9 267.9z" />
+    <glyph glyph-name="algolia"
+      unicode="&#xF36C;"
+      horiz-adv-x="448" d=" M229.3 265.4C180 265.4 140.1 225.5 140.1 176.2C140.1 126.9 180 87 229.3 87S318.5 126.9 318.5 176.2C318.5 225.5 278.5 265.4 229.3 265.4zM292 208.8L233.1 178.2C231.3 177.3 229.3 178.6 229.3 180.5V247C229.3 248.5 230.6 249.7 232 249.6C258.2 248.6 280.9 233.9 293.1 212.5C293.8 211.2 293.3 209.5 292 208.8zM389.1 416H58.9C26.4 416 0 389.6 0 357.1V27C0 -5.6 26.4 -32 58.9 -32H389C421.6 -32 447.9 -5.6 447.9 26.9V357.1C448 389.6 421.6 416 389.1 416zM186.5 331.3C186.5 342.1 195.2 350.8 206 350.8H251.3C262.1 350.8 270.8 342.1 270.8 331.3V315.9C270.8 314.1 269.1 312.9 267.5 313.4C255.2 316.8 242.4 318.5 229.4 318.5C215.9 318.5 202.7 316.7 190 313C188.3 312.5 186.6 313.8 186.6 315.5V331.3zM102.1 294.3L111.3 303.5C118.9 311.1 131.2 311.1 138.8 303.5L146.5 295.8C147.6 294.7000000000001 147.5 292.8 146.2 291.8C140 287.3 134.1 282.4 128.6 276.9C123.2 271.5 118.2 265.6 113.8 259.5C112.8 258.2 110.9 258 109.8 259.2L102.1 266.9C94.5 274.4 94.5 286.7 102.1 294.3zM229.3 49.5C159.3 49.5 102.7 106.2 102.7 176.1S159.4 302.7000000000001 229.3 302.7000000000001C299.3 302.7000000000001 355.9 246.1 355.9 176.1C355.9 106.3 299.2 49.5 229.3 49.5z" />
+    <glyph glyph-name="amazon-pay"
+      unicode="&#xF42C;"
+      horiz-adv-x="611.2" d=" M0 122.8C2.3 127 5.2 127.7 9.7 125.3C20.1 119.7 30.3 113.9 40.9 108.6C81.6 88.2000000000001 124.1 73 168.3 62.3C189.2 57.3 210.2 53.3 231.5 50.5C263 46.3 294.7 44.5 326.5 45.3C343.9 45.7 361.3 47.1 378.6 49.1C435 55.8 489.5 69.9 541.9000000000001 91.9C544.8000000000001 93.1 547.8000000000001 93.9 551.0000000000001 93.1C557.7000000000002 91.3 560.0000000000001 84.1 555.1000000000001 79.2000000000001C552.3000000000002 76.4 548.8000000000002 74.1 545.5000000000001 71.8000000000001C514.8000000000001 50.7 481.3000000000001 35.4000000000001 445.9000000000001 23.9000000000001C421.3000000000001 16.0000000000001 396.3000000000001 10.1000000000001 370.8000000000001 6.3000000000001C353.2000000000001 3.7 335.4000000000001 1.9000000000001 317.6000000000001 1.5000000000001C316.8000000000001 1.5000000000001 315.9000000000001 1.3000000000001 315.1000000000001 1.2H294C293.2 1.3000000000001 292.3 1.5000000000001 291.5 1.5000000000001C287.9 1.7 284.3 1.8000000000001 280.8 1.9C263.9000000000001 2.6 247.1 4.5000000000001 230.4 7.2C203 11.7 176.2 18.6 150 28.1C95.9 47.7 47.4 76.7000000000001 4.4 115.1C2.6 116.7000000000001 1.4 118.9 0 120.8V122.8zM158 383C156.6 382.8 155.1 382.6 153.7 382.4C139.7 380.7 127.1 375.5 115.7 367.3C113.3 365.6 111.1 363.8 108.6 361.9C108.4 362.4 108.2 362.9 108.2 363.3C107.8 366 107.4 368.8 106.9 371.5C106.2 376.1 103.9 378.1 99.3 378.1H87.8C80.9 378.1 79.6 376.8 79.6 369.9V160.6C79.6 159.6 79.6 158.6 79.7 157.6C79.9 154.6 81.7 152.7000000000001 84.6 152.6C91.6 152.5 98.7 152.5 105.7 152.6C108.6 152.6 110.4 154.6 110.7 157.6C110.8 158.6 110.8 159.6 110.8 160.6V233C111.9 232.1 112.5 231.6 113 231.1C130.9 216.2 151.5 211.3 174 215.7C194.4 219.7 208.6 232.2 217.8 250.6C224.8 264.5 227.7 279.3 228.1 294.7C228.6 311.8 226.9000000000001 328.6 220 344.5C211.5 364.1 197.4 377 176.1 381.4C172.9 382.1 169.6 382.4 166.3 382.9C163.5 383 160.8 383 158 383zM110.6 341.1C110.6 342.6 111 343.5 112.3 344.4C126 353.9 141.1 358.9 157.9 357.6C172.8 356.5 185 349.2 191.4 331.7C195.3 321 196.3 309.9 196.3 298.7C196.3 288.3 195.5 278.1 192.3 268.1C185.5 246.8 169.9 238.7 149.7 239.6C135.7 240.2 123.5 245.6 112.3 253.5C111.1 254.4 110.6 255.2 110.6 256.8C110.7 270.9 110.6 284.9 110.6 299C110.6 313 110.7 327 110.6 341.1zM316.3 383C315.3 382.9 314.3 382.7 313.4000000000001 382.6C303.6 382.1 294.0000000000001 380.9 284.5000000000001 378.5C278.4000000000001 376.9 272.5000000000001 374.7 266.6000000000001 372.7C263.0000000000001 371.5 261.2000000000001 368.9 261.3000000000001 365C261.4000000000001 361.7 261.2000000000001 358.4 261.3000000000001 355.1C261.4000000000001 350.3 263.4000000000001 349 268.1000000000001 350.2C275.9000000000001 352.2 283.7000000000001 354.4 291.6000000000001 355.9C303.9000000000001 358.2 316.3000000000001 359.2 328.8000000000001 357.3C335.3000000000001 356.3 341.4000000000001 354.4 345.6000000000001 348.9C349.3000000000001 344.1 350.7000000000001 338.4 350.9000000000001 332.5C351.2000000000001 324.2 351.1000000000001 315.9 351.2000000000001 307.6C351.2000000000001 307.2 351.1000000000001 306.7 351.0000000000001 306.2C350.5000000000001 306.3 350.1000000000002 306.2 349.7000000000001 306.3C339.2000000000001 308.8 328.6000000000001 310.6 317.7000000000001 311.2C306.4000000000001 311.8 295.2000000000001 311.1 284.4000000000001 307.3C271.5000000000001 302.8 261.1000000000001 295 255.0000000000001 282.4C250.3000000000001 272.6 249.6000000000001 262.2 251.1000000000001 251.7C253.1000000000001 237.7 260.1000000000001 226.9 272.5000000000001 220C284.4000000000001 213.4 297.3000000000001 212.6 310.4000000000001 214.6C325.5000000000001 216.9 338.9000000000001 223.3 350.7000000000001 233C351.1 233.4 351.6 233.7 352.3000000000001 234.1C352.9000000000001 230.3 353.4000000000001 226.7 354.1000000000001 223.1C354.7000000000001 220 356.6000000000001 218 359.5000000000001 217.9C364.9000000000001 217.8 370.4000000000001 217.8 375.8000000000001 217.9C378.5000000000001 218 380.3000000000001 219.8 380.6000000000001 222.6C380.7000000000001 223.5 380.7000000000001 224.5 380.7000000000001 225.4V331.4C380.7000000000001 335.7 380.5000000000001 340 379.8000000000002 344.3C377.9000000000002 357.2000000000001 372.4000000000002 367.8 360.8000000000002 374.7000000000001C354.1000000000002 378.7000000000001 346.7000000000001 380.7000000000001 339.0000000000001 381.8C335.4000000000001 382.3 331.8000000000002 382.6 328.2000000000001 383.1C324.3000000000002 383 320.3000000000002 383 316.3000000000002 383zM351.3 255.3C351.3 254 350.9000000000001 253.1 349.8 252.3C338.6 244.2 326.3 238.8 312.4000000000001 237.4C306.7000000000001 236.8 301.0000000000001 237 295.6 239.2C289.3 241.7 285.2000000000001 246.1 283.2000000000001 252.5000000000001S281.2000000000001 265.5 283.1 271.9000000000001C285.6 280.2000000000001 291.5 284.9000000000001 299.5 287.5C307.6 290.1 316 290.5 324.3 289.7000000000001C332.7 289 340.9000000000001 287.4 349.3 286.3C350.9000000000001 286.1 351.4000000000001 285.3 351.4000000000001 283.7000000000001C351.3 278.9 351.4000000000001 274.2000000000001 351.4000000000001 269.4C351.3 264.7000000000001 351.2000000000001 260 351.3 255.3zM611.2 125.9C610.2 130.9 606.4000000000001 132.8 602.1 134.2C595.3000000000001 136.5 588.2 137.5 581.1 138.1C568 139.2 554.9 138.6 541.9 136.2C527.6 133.5 514 128.9 501.9 120.6C500.5 119.6 499.1 118.5 498.2 117.1C497.5 116 497.3 114.3 497.7 113.1C498.1 111.6 499.8 111.2 501.3 111.3C502 111.3 502.8 111.3 503.5 111.4C511.3 112.2 519 113.1 526.8 113.9C538.1999999999999 115 549.6999999999999 115.7 561.0999999999999 114.8C565.8999999999999 114.5 570.8 113.4 575.4999999999999 112.1C580.5999999999999 110.7 582.8999999999999 106.9 583.0999999999999 101.7C583.4999999999999 93.7 581.6999999999999 86 579.5999999999999 78.4C575.4999999999999 63 569.5999999999999 48.1 563.8 33.3C563.4 32.3 563 31.3 562.8 30.3C562.3 27.4 564 25.4999999999999 566.9 26.1999999999999C568.6 26.5999999999999 570.5 27.4999999999999 571.6999999999999 28.6999999999999C576.0999999999999 32.9999999999999 580.5999999999999 37.3 584.4 42.0999999999999C597.1999999999999 58.4999999999999 604.6999999999999 77.3999999999999 609.1 97.6999999999999C609.9 101.3 610.5 104.9999999999999 611.2 108.5999999999999V125.8999999999999zM479.1 249.1C466.2 284.8 453.3 320.6 440.4000000000001 356.3C438.4000000000001 362 436.2000000000001 367.6 434.1 373.2C433 376.1 430.9000000000001 378 427.7000000000001 378C420.1 378.1 412.5000000000001 378.2 404.8000000000001 378.1C402.3000000000001 378.1 401.1000000000001 376.1 401.6000000000001 373.6C402.1000000000001 371.5 402.7000000000001 369.5 403.5000000000001 367.5C423.1000000000001 319 442.8000000000001 270.4 462.6000000000001 222C464.3000000000001 217.9 464.7000000000001 214.4 462.8000000000001 210.2C459.5000000000001 202.9 456.9000000000001 195.2 453.5000000000001 187.9C450.5000000000001 181.4 445.5000000000001 176.5 438.3000000000001 174.6C433.2000000000001 173.2 428.1000000000001 173 422.9000000000001 173.5C420.4000000000001 173.6999999999999 417.9000000000001 174.3 415.4000000000001 174.5C412.0000000000001 174.6999999999999 410.3000000000001 173.1999999999999 410.2000000000001 169.6999999999999C410.1000000000001 166.3999999999999 410.1000000000001 163.0999999999999 410.2000000000001 159.8C410.3000000000002 154.3 412.2000000000001 151.8 417.6000000000001 150.9C423.2000000000001 149.9 428.9000000000001 149 434.5000000000001 148.9C451.6000000000001 148.5 465.2 155.4 474.0000000000001 170.3C477.5000000000001 176.1999999999999 480.7 182.4 483.2 188.6999999999999C506.9 248.5 530.3000000000001 308.3999999999999 553.8000000000001 368.3C554.5000000000001 370.0999999999999 555.1 371.8999999999999 555.4000000000001 373.8C555.8000000000001 376.5999999999999 554.5000000000001 378.2 551.7 378.2C545.1 378.3 538.4000000000001 378.2 531.8000000000001 378.2C528.1 378.2 525.5000000000001 376.5999999999999 524.1 373C523.6 371.5999999999999 523 370.3 522.5 368.8999999999999C510.9 335.5999999999999 499.3 302.3 487.7 268.8999999999999C485.2 261.7 482.6 254.3999999999999 480 246.7C479.6 247.8 479.4 248.3999999999999 479.1 249.1z" />
+    <glyph glyph-name="amazon"
+      unicode="&#xF270;"
+      horiz-adv-x="448" d=" M257.2 285.3C208.5 283.5 87.7 269.8 87.7 167.8C87.7 58.3 226 53.8 271.2 124.6C277.7 114.4 306.6 87.1 316.5 77.8L373.3 133.8S341 159.1 341 186.6V333.7C341 359 316.5 416 228.7 416C140.7 416 94 361 94 311.7L167.5 304.9C183.8 354.4 221.7 354.4 221.7 354.4C262.4 354.5 257.2 324.6 257.2 285.3zM257.2 198.5C257.2 118.5 173 130.5 173 181.3C173 228.5 223.5 238 257.2 239.1V198.5zM393.2 35C385.5 25 323.2 -32 218.7 -32S34.2 39.5 9.7 69C2.9 76.7 10.7 80.3 15.2 77.3C88.5 32.8 203 -40.5 387.7 47C395.2 50.7 401 45 393.2 35zM433 32.8C426.5 17 417 6 411.8 1.8C406.3 -2.7 402.3 -0.9 405.3 5.6S424.6 52.1 418 60.6C411.5 68.9 381 64.9 370 63.8C359.2 62.8 357 61.8 356 64.1C353.7 69.8 377.7 79.6 393.5 81.6C409.2 83.4 434.5 82.4 439.5 75.9C443.2 70.8 439.5 48.8 433 32.8z" />
+    <glyph glyph-name="amilia"
+      unicode="&#xF36D;"
+      horiz-adv-x="448" d=" M240.1 416C178.2 416 108.6 399.1 55.9 360.6C50.8 357.5 46.8 351.4 48.7 341.2C49.8 336.1 53.8 313.8 58.9 301.6C63 291.4 73.1 291.4 79.2 295.5C111.7 317.8 175.7 343.2 231.5 343.2C289.4 343.2 290.4 314.8 290.4 270.1V231.6C203 220.3 78.2 197 46.7 183.8C11.2 167.5 16.3 90.3 16.3 72S31.5 -32 141.2 -32C189 -32 254.9000000000001 -11.3 294.5 10.1V-15.3C294.5 -18.3 296.6 -23.4999999999999 300.6 -24.4C303.7000000000001 -25.4 351.3 -26.4 360.5 -26.4S423 -26.7 427 -25.7C431.1 -24.7 432.1 -19.6 432.1 -16.6V280C432 360.3 374.2000000000001 416 240.1 416zM152.2 88.3C152.2 100.5 149.2 131 170.5 141.2C194.8 154.4 245.6 170.6 290.3 174.7V68C268.9000000000001 54.8 241.6 43.6 211.2 43.6C158.4 43.6 152.3 77.1 152.2 88.3" />
+    <glyph glyph-name="android"
+      unicode="&#xF17B;"
+      horiz-adv-x="448" d=" M89.6 243.5V127.7C89.6 112.3 77.5 100 62.1 100C46.8 100 32 112.4 32 127.7V243.5C32 258.6 46.8 271 62.1 271C77.2 271 89.6 258.6 89.6 243.5zM100.4 86.5C100.4 70.1 113.6 56.9 130 56.9H149.9L150.2 -4.2C150.2 -41.1 205.4 -40.8000000000001 205.4 -4.2V56.9H242.6V-4.2C242.6 -40.9 298.1 -41.0000000000001 298.1 -4.2V56.9H318.3C334.5 56.9 347.7 70.1 347.7 86.5V265.9H100.4V86.5zM348.4 275.6H99.3C99.3 318.4 124.9 355.6 162.9 375L143.8 410.3C141 415.2 148.1 418.3 150.5 414.1L169.9 378.5C204.8 394 244.9 393.2 278.2 378.5L297.5 414C300 418.3 307 415.1 304.2 410.2L285.1 375C322.8 355.6 348.4000000000001 318.4 348.4000000000001 275.6zM177.7 331.1C177.7 336.8 173.1 341.6 167.2 341.6C161.5 341.6 157 336.8 157 331.1S161.6 320.6 167.2 320.6C173.1 320.6 177.7 325.4 177.7 331.1zM291.1 331.1C291.1 336.8 286.5 341.6 280.9000000000001 341.6C275.0000000000001 341.6 270.4000000000001 336.8 270.4000000000001 331.1S275.0000000000001 320.6 280.9000000000001 320.6C286.5000000000001 320.6 291.1 325.4 291.1 331.1zM385.9000000000001 271C370.8 271 358.4000000000001 258.9 358.4000000000001 243.5V127.7C358.4000000000001 112.3 370.8 100 385.9000000000001 100C401.3 100 416.0000000000001 112.4 416.0000000000001 127.7V243.5C416.0000000000001 258.9 401.2000000000001 271 385.9000000000001 271z" />
+    <glyph glyph-name="angellist"
+      unicode="&#xF209;"
+      horiz-adv-x="448" d=" M347.1 232.6C358.8 265.2 392.5 359.5 392.5 389.7C392.5 416.3 376.8 438.6 348.8 438.6C304.2 438.6 264.2000000000001 306.9 251.7 275.5C242 304 196.6 448 156.6 448C125.5 448 110.9 425.1 110.9 396.3C110.9 361 145.1 269.5 157.5 234.3C151.2 236.6 144.4 238.6 137.5 238.6C114.1 238.6 89.2 209.5 89.2 186C89.2 177.1 94.1 164.6 97.2 156.3C60.3 146.3 46.1 121.7 46.1 84.6C46 12.4 114.4 -64 210.6 -64C328.6 -64 402 24.6 402 138.9C402 182 395.1 220.9 347.1 232.6zM311.7 340C315.7 352.3 332.8 404.3 348.8 404.3C357.4000000000001 404.3 359.7 395.4 359.7 388.3C359.7 369.2 321.1 263.7 312.6 240.3L278.6 246.3L311.7 340zM142.3 399.7C142.3 411.6 156.8 445.4 188.6 352.6L223.2 252.3C207.6 253.6 195.5 255.3 187.8 250.9C176.9 279.7000000000001 142.3 370.6 142.3 399.7000000000001zM140 204C169.3 204 207.1 109.4 207.1 96.6C207.1 91.5 202.2 85.2000000000001 196.5 85.2000000000001C175.6 85.2000000000001 119.6 162.1 119.6 182.9C119.7 190.6 132.3 204 140 204zM324.3 17.7C295.2 -14.3 258 -30.9 214.6 -30.9C155.2 -30.9 108.3 1.7 85.7 57.4C68.6 100.8 89.5 125.7 106.3 125.7C117.7 125.7 160.6 65.4 160.6 52.6C160.6 47.7 152.9 44.3 148.9 44.3C132.8000000000001 44.3 126.5 59.8 97.8 95.7C68.1 66 118.3000000000001 8.8 156.1 8.8C182.2 8.8 199.2 32.9999999999999 194.1 50.8C197.8 50.8 202.4 50.4999999999999 205.8 51.4C206.9 24.3 214.9 -8 247.5 -10.3C247.5 -9.4 249.5 -3.2 249.5 -2.9C249.5 14.4999999999999 238.9 29.7 238.9 47.4C238.9 75.7 260.6 103.1 282.6 119.1C290.6 125.1 300.3 128.8 309.7000000000001 132.2C319.4000000000001 135.9 329.7000000000001 140.2 337.1 147.6C336 158.8 331.4000000000001 168.7 320.2000000000001 168.7C292.5000000000001 168.7 199.6000000000001 164.7 199.6000000000001 208.4C199.6000000000001 215.1 199.7000000000001 221.5 217.0000000000001 221.5C249.3000000000001 221.5 331.3000000000001 213.5 355.3000000000001 192.4C373.4000000000001 176.3 379.6000000000001 79.2 324.3000000000001 17.7zM225.7 143.7C235.4 140.6 245.4 139.7 255.4 137.7C248 132.3 241.4 125.7 235.1 118.6C232.3 127.1 228.9 135.4 225.7 143.7z" />
+    <glyph glyph-name="angrycreative"
+      unicode="&#xF36E;"
+      horiz-adv-x="640" d=" M640 209.8L636.8 181.6L602.3 179.3L600.3 161.2L634.8 163.5L631.5999999999999 135.3L597.1999999999999 133.1L594.9 113L629.3 115.2L626.3 89.1L561.5999999999999 84.9999999999999L574.3 198.1999999999999L527 82.8L495.1 80.8L471.3 198.6L501.6 200.6L515.2 121.2000000000001L546.9000000000001 203.6000000000001L640.0000000000001 209.8000000000001zM426.8 76.5L455.1 78.3L468 198.4L439.6 196.5L426.8 76.5zM162 59.9L142.6 95.9L139.1 58.5L110.9 56.8L113.6 85.9C102.6 67.9 81.6 51.6 56.7 50.1C23.9 48.1 -3 71 0.3 108.3C2.9 137.6 27 171.1 67.8 173.7000000000001C105.5 176.1 115.4 150.5000000000001 119.1 144.9L121.9 175.7000000000001L160.8 178.2000000000001C180.9 179.5000000000001 199.5 174.5000000000001 203.3 154.5000000000001L205.9 181.1000000000001L270.7 185.3000000000001L268 157.4000000000001L231.6 155.0000000000001L229.9 137.1000000000001L266.3 139.4000000000002L263.6 111.5000000000002L227.2 109.2000000000002L225.3 89.3000000000002L261.6 91.6000000000002L259.5 70.8000000000002L314.5 188.0000000000002L338.3 189.6000000000002L370.4 79L379.3 164.6L357 163.2000000000001L359.8999999999999 191.1L434.8999999999999 196L431.8999999999999 168L407.5999999999999 166.4L397.8999999999999 74.5L339.8999999999999 70.8L335.5999999999999 86.4L296.2 83.9L288.2 67.6L162 59.9zM117.7 130.1L91.3 128.4C84.6 140.8 76.9 145 65 144.2C46 143 31.7 126.7 30.4 110.9C29 94.9 37.7 78.4 59.1 79.7C71.9 80.5 80.4 88.3 88 98.6L115 100.3L117.7 130.1zM173.8 137.8C175 150.6999999999999 166.2 151.4 147.7 150.1999999999999L145 121.6999999999999C159.2 122.5999999999999 172.5 123.8 173.8000000000001 137.8zM194.9 66.9999999999999L200.7 127C195.7 113.5 186 105.8999999999999 172.8 100.3999999999999L194.9 66.9999999999999zM330.3 111.9999999999999L322.4000000000001 149.8L306.6 110.4999999999999L330.3 111.9999999999999zM160.2 186.5999999999999L155.9 204.0999999999999L116.3 201.4999999999999L108.2 183.2999999999999L76.3 181.1999999999999L133.3 303.0999999999999L157.2 304.6999999999999L187.9 202.6999999999999L197.8 307.3999999999999L224.8 309.1999999999999L262.6 245.5999999999999L269.1 312.1999999999999L297.6 314.0999999999999L293.6 272.8999999999999C301 286.3999999999999 316.5 317.5999999999999 357.2000000000001 320.3999999999999C397.7000000000001 323.1999999999999 409.6 291.0999999999999 410.6 290.0999999999999L413.9000000000001 322.0999999999999L453.2 324.7999999999999C465.9 325.6999999999999 481.0000000000001 324.4999999999999 489.5000000000001 315.0999999999999L485.1000000000001 326.9999999999999L517.3000000000001 329.1999999999999L530.2 285.9999999999999L553.2 331.6999999999999L584.2 333.8999999999999L540.6 255.4999999999999L535.8000000000001 211.1999999999999L507.4000000000001 209.2999999999999L512.2 253.5999999999999L496.4 296.5999999999999C497.4 274.2999999999999 487.2 256.4999999999999 464.4 246.9999999999999L489.6 208.1999999999999L453.2 205.7999999999999L434.0000000000001 242.5999999999999L430.0000000000001 204.2999999999999L401.6000000000001 202.3999999999998L404.9000000000001 233.8999999999999C398.2000000000001 224.5999999999998 385.2000000000001 198.4999999999998 345.3000000000001 195.8999999999998C319.1000000000001 194.1999999999999 299.7000000000001 206.1999999999999 289.9000000000001 235.0999999999999L285.9000000000001 194.7999999999999L260.9000000000001 193.1999999999999L223.3000000000001 256.4999999999999L217.0000000000001 190.2999999999999L160.2000000000001 186.5999999999999zM436.8000000000001 268.7C447.0000000000001 269.3999999999999 454.3000000000001 270.7999999999999 458.4000000000001 272.9999999999999C462.9000000000001 275.3999999999999 465.4000000000001 279.3999999999999 466.0000000000001 285.0999999999999C466.6000000000001 290.3999999999999 465.4000000000001 293.8999999999999 462.6000000000001 295.4999999999999C459.0000000000001 297.5999999999999 452.0000000000001 298.3 439.7000000000002 297.4999999999999L436.8000000000002 268.7zM327.7 234C333.3 228.1 340.4 225.5 349 226.1C353.7 226.4 358.1 227.9 362.3 230.2C367.8 233.2 372.9000000000001 238.2 377.4000000000001 244.5L343.2000000000001 242.2L345.6 266.1L408.7000000000001 270.4L409.9000000000001 282.4L378.7000000000001 280.3C374.6 284 370.9000000000001 286.9 367.6 288.4C363.6 290.1 359.5 291.2000000000001 355.4000000000001 290.9C347.4000000000001 290.4 340.1 287.3 333.4000000000001 281.7000000000001C325.7000000000001 275.3 321.4000000000001 267.2000000000001 320.5000000000001 257.3C319.4000000000001 247.7 321.9000000000001 240 327.7000000000001 234zM126.4 225.8L150.2 227.4L141.9 265L126.4 225.8z" />
+    <glyph glyph-name="angular"
+      unicode="&#xF420;"
+      horiz-adv-x="415.6" d=" M169.7 179.9H245.9L207.8 271.5L169.7 179.9zM207.8 416L0 341.6L31.8 65.9L207.8 -32L383.8 65.9L415.6 341.6L207.8 416zM338 74.2H289.4L263.2 139.6H152.6L126.4 74.2000000000001H77.7L207.8 366.5L338 74.2z" />
+    <glyph glyph-name="app-store-ios"
+      unicode="&#xF370;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM127 63.5C121.5 53.9 109.2 50.7 99.7 56.2C90.1 61.7 86.9 74 92.4 83.5L106.7 108.2C122.8 113.1 136 109.3 146.3 96.8L127 63.5zM265.9 117.4H84C73 117.4 64 126.4 64 137.4S73 157.4 84 157.4H135L200.4 270.6L179.9 306C174.4 315.6 177.7 327.8 187.2 333.3C196.8 338.8 209 335.5 214.5 326L223.4 310.6L232.3000000000001 326C237.8000000000001 335.6 250.1000000000001 338.8 259.6 333.3C269.2000000000001 327.8 272.4000000000001 315.5 266.9000000000001 306L181.1 157.4H243.2C263.4000000000001 157.4 274.7000000000001 133.7 265.9000000000001 117.4zM364 117.4H335L354.6 83.5C360.1 73.9 356.8 61.7 347.3 56.2C337.7 50.7 325.5 54 320 63.5C287.1 120.4 262.5 163.2 246 191.6C229.3 220.6 241.2 249.6 253.1 259.4000000000001C266.2 236.7000000000001 285.8 202.7000000000001 312 157.4H364C375 157.4 384 148.4 384 137.4C384 126.3 375 117.4 364 117.4z" />
+    <glyph glyph-name="app-store"
+      unicode="&#xF36F;"
+      horiz-adv-x="512" d=" M255.9 327.1L265 342.8C270.6 352.6 283.1 355.9 292.9 350.3C302.7 344.7 306 332.2 300.4 322.4L212.9 170.9H276.2C296.7 170.9 308.2 146.8 299.3 130.1H113.8C102.5 130.1 93.4 139.2 93.4 150.5C93.4 161.8 102.5 170.8999999999999 113.8 170.8999999999999H165.8L232.4 286.3L211.6 322.3999999999999C206 332.2 209.3 344.5999999999999 219.1 350.3C228.9 355.8999999999999 241.3 352.5999999999999 247 342.8L255.9 327.0999999999999zM177.2 109.1L157.6 75.1C152 65.3 139.5 62 129.7 67.6C119.9 73.2000000000001 116.6 85.7000000000001 122.2 95.5L136.8 120.7C153.2 125.8 166.6 121.9 177.2 109.1zM346.1 170.8H399.2000000000001C410.5000000000001 170.8 419.6 161.7 419.6 150.4C419.6 139.1 410.5 130.0000000000001 399.2000000000001 130.0000000000001H369.7000000000001L389.6 95.5000000000001C395.2000000000001 85.7000000000001 391.9000000000001 73.3000000000001 382.1 67.6000000000001C372.3 62.0000000000001 359.9000000000001 65.3000000000001 354.2000000000001 75.1000000000001C320.7000000000001 133.2000000000001 295.5000000000001 176.7000000000001 278.8000000000001 205.7000000000001C261.7000000000001 235.2000000000001 273.9000000000001 264.8000000000001 286.0000000000001 274.8000000000001C299.4000000000001 251.8000000000001 319.4000000000001 217.1000000000001 346.1000000000001 170.8000000000001zM256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM472 192C472 73.3 375.9 -24 256 -24C137.3 -24 40 72.1 40 192C40 310.7 136.1 408 256 408C374.7 408 472 311.9 472 192z" />
+    <glyph glyph-name="apper"
+      unicode="&#xF371;"
+      horiz-adv-x="640" d=" M42.1 208.9C64.3 208.9 71.1 206.1 75.6 194.3H76.4V217.2C76.4 228.5000000000001 71.6 232.6 58.5 232.6C47.2 232.6 44.1 230.1 43.4 219.8H4.8C5.1 233.7 6.3 238.9 10.6 244.2C17.9 253 29.5 256 56.7 256C89.7 256 103.8 251 110.6 237.1C112.6 232.8 114.6 221.5 114.6 213.4V137.1H76.3L77.6 156.2000000000001H76.6C71.3 140.6 63 135.8000000000001 41.1 135.8000000000001C10.8 135.8000000000001 0 145.9000000000001 0 173.1000000000001C0 198.3000000000001 12.3 208.9000000000001 42.1 208.9000000000001zM59.2 160.8C72.3 160.8 76.1 163.8 76.1 174.2C76.1 183.3 71.8 185.8 56.5 185.8C43.4 185.8 38.6 182.8 38.6 173.7C38.5 163.3 42.3 160.8 59.2 160.8zM137 255.7H175.3L173.8 235.1H174.6C183.7 252.2 190.5 256 212.1 256C226.5000000000001 256 236.8 253.0000000000001 243.6 246.9000000000001C253.4000000000001 238.3000000000001 256.4000000000001 226.5000000000001 256.4000000000001 198.8000000000001C256.4000000000001 168.8000000000001 253.4000000000001 155.7000000000001 244.3000000000001 145.9C237.5000000000001 138.6 227.9000000000001 135.8 211.1 135.8C190.7 135.8 181.9 141.3 177.3 157H176.5V86.7H137V255.7zM217.9 195C217.9 222.5 214.6 227.5 197.2 227.5C180.3 227.5 176.5 222.5 176.5 198.8C176.5 170.8 180 165.3 197.7 165.3C214.1 165.3 217.9 170.9 217.9 195zM275.8 255.7H314.1L312.6 235.1H313.4000000000001C322.5000000000001 252.2 329.3 256 350.9000000000001 256C365.3 256 375.6 253 382.4000000000001 246.9C392.2000000000001 238.3 395.2000000000001 226.5 395.2000000000001 198.8C395.2000000000001 168.8 392.2000000000001 155.7 383.1 145.9C376.3 138.6 366.7000000000001 135.8 349.8 135.8C329.4000000000001 135.8 320.6 141.3 316 157H315.2V86.7H275.7V255.7zM356.7000000000001 195C356.7000000000001 222.5 353.4000000000001 227.5 336.0000000000001 227.5C319.1000000000001 227.5 315.3000000000001 222.5 315.3000000000001 198.8C315.3000000000001 170.8 318.8000000000001 165.3 336.5000000000001 165.3C352.9000000000001 165.3 356.7000000000001 170.9 356.7000000000001 195zM410.5000000000001 198.8C410.5000000000001 224.2 413.8000000000001 236.6 422.8000000000001 244.6C431.6000000000001 252.7 445.0000000000001 255.9000000000001 467.9000000000001 255.9000000000001C510.7000000000001 255.9000000000001 523.6000000000001 243.1 523.6000000000001 200.2000000000001V189.1H448.3000000000002C448.0000000000001 187.1 448.0000000000001 185.1 448.0000000000001 184.3C448.0000000000001 167.4 452.5000000000001 162.4 468.1000000000001 162.4C482.0000000000001 162.4 486.0000000000001 165.4 486.0000000000001 176.3H523.5000000000001V174C523.5000000000001 164.2 521.0000000000001 155.1 516.7000000000002 149.3C509.4000000000001 139.5 497.1000000000001 135.7 472.4000000000001 135.7C444.9000000000002 135.7 430.8000000000002 139 421.8000000000002 148C413.3000000000002 156.5 410.5000000000001 169.3 410.5000000000001 198.8zM486.9000000000001 210.4C486.6000000000001 212.2 486.6000000000001 213.7 486.6000000000001 214.2C486.6000000000001 226.5000000000001 483.3000000000001 228.8 467.0000000000001 228.8C452.6000000000001 228.8 449.9000000000001 225.8 448.9000000000001 213.7L448.6 210.4H486.9zM542.5000000000001 255.7H580.8000000000001L579.0000000000001 235.8H579.7000000000002C586.5000000000001 250.7 594.1000000000001 256 609.4000000000002 256C620.2000000000002 256 628.5000000000002 252.7 632.8000000000002 246.7C638.1000000000001 239.4 639.6000000000001 232.3 639.6000000000001 212.7C639.6000000000001 211.2 639.6000000000001 207.7 639.8000000000002 203.4H604.8000000000002C605.1000000000001 205.2 605.1000000000001 206.7 605.1000000000001 207.4C605.1000000000001 222.8 603.1000000000001 226.8 594.8000000000002 226.8C588.5000000000002 226.8 584.0000000000002 223.5 581.7000000000002 217.5C580.7000000000002 214.5 580.7000000000002 213.1999999999999 580.7000000000002 205.1999999999999V137.1999999999999H542.4000000000002V255.7z" />
+    <glyph glyph-name="apple-pay"
+      unicode="&#xF415;"
+      horiz-adv-x="640" d=" M116.9 289.5C109.4 280.6 97.4 273.6 85.4 274.6C83.9 286.6 89.8 299.4 96.7 307.2C104.2 316.3 117.3 322.8 128 323.3C129.2 310.9 124.3 298.6 116.9 289.5M127.8 272.3C110.4 273.3 95.5 262.4 87.3 262.4C78.9 262.4 66.3 271.8 52.5 271.5C34.6 271.2 18 261.1 8.9 245C-9.9 212.7 4 165 22.2 138.7C31.1 125.7 41.7 111.4 55.7 111.9C69 112.4 74.2 120.5 90.2 120.5C106.3 120.5 111 111.9 125 112.1C139.5 112.4 148.6 125.1 157.5 138.1C167.6 152.9 171.8 167.2000000000001 172 168C171.7 168.3 144 178.9 143.7 210.9C143.4 237.7 165.6 250.4 166.6 251.2C154.1 269.8 134.6 271.8 127.8 272.3M228.2 308.5V113.6H258.5V180.2000000000001H300.4C338.7 180.2000000000001 365.5 206.5000000000001 365.5 244.5000000000001S339.1 308.5000000000001 301.4 308.5000000000001H228.2zM258.5 283H293.4C319.7 283 334.7 269 334.7 244.4S319.7 205.6 293.3 205.6H258.5V283zM420.7 112.1C439.7 112.1 457.3 121.7000000000001 465.3 137H465.9V113.6H493.9V210.6C493.9 238.7 471.4 256.9000000000001 436.8 256.9000000000001C404.7 256.9000000000001 380.9000000000001 238.5000000000001 380 213.3000000000001H407.3C409.6 225.3000000000001 420.7 233.2000000000001 435.9000000000001 233.2000000000001C454.4 233.2000000000001 464.8 224.6000000000001 464.8 208.7000000000001V197.9L427 195.6C391.9 193.5 372.9 179.1 372.9 154.1C373 128.9 392.6 112.1 420.7 112.1zM428.9 135.2000000000001C412.8 135.2000000000001 402.5 143.0000000000001 402.5 154.8000000000001C402.5 167.1000000000001 412.4 174.2000000000001 431.3 175.3000000000001L464.9 177.4000000000001V166.4000000000001C464.9 148.2000000000001 449.4000000000001 135.2000000000001 428.9000000000001 135.2000000000001zM531.4 60.6C560.9 60.6 574.8 71.9 586.9 106L640 255H609.2L573.6 139.9H573L537.4 255H505.8L557 113.1L554.2 104.5C549.6 89.9 542.1 84.2 528.7 84.2C526.3000000000001 84.2 521.7 84.5 519.8000000000001 84.7V61.3C521.6 60.9 529.1 60.6 531.4000000000001 60.6z" />
+    <glyph glyph-name="apple"
+      unicode="&#xF179;"
+      horiz-adv-x="376.5" d=" M314.7 179.3C314.5 216 331.1 243.7 364.7 264.1C345.9 291 317.5 305.8 280 308.7000000000001C244.5 311.5 205.7 288 191.5 288C176.5 288 142.1 307.7000000000001 115.1 307.7000000000001C59.3 306.8 0 263.2 0 174.5C0 148.3 4.8 121.2 14.4 93.3C27.2 56.6 73.4 -33.4 121.6 -31.9C146.8 -31.3 164.6 -14 197.4 -14C229.2 -14 245.7 -31.9 273.8 -31.9C322.4000000000001 -31.2 364.2000000000001 50.6 376.4 87.4C311.2 118.1 314.7 177.4 314.7 179.3000000000001zM258.1 343.5C285.4 375.9 282.9 405.4 282.1 416C258 414.6 230.1 399.6 214.2 381.1C196.7 361.3 186.4 336.8 188.6 309.2C214.7 307.2 238.5 320.6 258.1 343.5z" />
+    <glyph glyph-name="asymmetrik"
+      unicode="&#xF372;"
+      horiz-adv-x="576" d=" M517.5 138.8C556.3 178.8 575.6 218.8 576 254.9C576.8 320.4 516.6 373.1 406.6 389.9C277.9 409.6 118.1 374.4 0 307.5C52 334 110.6 355.7 170.7 365.7C245.2 386.2 323.7 391.1 392 380.5C544.5 356.7 588.8 253 490.8 148.8C480.6 138 468.8 127.7 455.8 118.2L304.9 344.6L114.7 59.1C49.1 88.5 38.2 149.3 95.6 210.3C116.4 232.5 143.9 252.2 175.1 268.4C195.1 280.6 214.8 291 237.1 299.1C172 278.8 114.4 246.2 75.5 206.2C47.8 177.6 34.1 149.1 33.8 123.3C33.3 88.1999999999999 57.2 58.1999999999999 102.2 40.3L67.7 -11.4H169.3L191.3 22.9999999999999C213.5 21.9999999999999 236.6 22.9999999999999 259.9 25.6999999999999L237.1 -11.4000000000001H372.6L340 41.7C358.6 47 376.9 53.2 394.5 60.4L440.4 -11.4H542L468.6 99C487.1 111.1 503.6 124.5 517.5 138.8zM329.9 58.3L304.9 98.9L272.2 45.6C248.8 42.1 225.5 40.5 203 41.2L304.9 200.5000000000001L383.6 77.5000000000001C366.4 70.1000000000001 348.3 63.6000000000001 329.9 58.3000000000001z" />
+    <glyph glyph-name="audible"
+      unicode="&#xF373;"
+      horiz-adv-x="640" d=" M640 248.1V194.1L320 -5.9L0 194V248L320 48L640 248.1zM445.5 176.1L492.6 205.5C455.4 261.3 391.9000000000001 298.1 319.9000000000001 298.1C247.9000000000001 298.1 184.4 261.4000000000001 147.3000000000001 205.7H147.6000000000001C150.1000000000001 208 152.7000000000001 210.2 155.3000000000001 212.4C245.0000000000001 286.8 374.7000000000001 270.5 445.5 176.1zM225.4 157.3C242.3 169.2 261.9 176 282.8 176C317.2 176 348 157.6 369.2000000000001 128.4L414.6 156.8C393.7000000000001 186.6999999999999 359 206.3 319.8 206.3C280.9000000000001 206.3 246.4 186.9 225.4 157.3zM103.6 286.9C235.4 391.2 421.8 363.3 521.1 224.8L521.8000000000001 223.8L570.6 254.2C517.1 335.9 424.8 389.9 319.9 389.9C216.4 389.9 123.3 336.4 69.4 254.3C79.3 264.8 92.1 277.8 103.6 286.9zM570.6 254.2z" />
+    <glyph glyph-name="autoprefixer"
+      unicode="&#xF41C;"
+      horiz-adv-x="640" d=" M318.4 432L157.4 -48H234.9L260.3 33.4H379.8L405 -48H482.5L318.4 432zM278.1 90.1L319.3 220.5H320.8L361.7 90.1H278.0999999999999zM640 43L630 74.4L462.1 90L481.5 33.5L640 43zM177.9 90L10 74.3L0 43L158.5 33.6L177.9 90z" />
+    <glyph glyph-name="avianex"
+      unicode="&#xF374;"
+      horiz-adv-x="512" d=" M453.1 416H141.1C102.2 416 64.9 384.8 57.8 346.3L1.2 37.7C-5.9 -0.8 19.9 -32 58.9 -32H370.9C409.8 -32 447.1 -0.8 454.2 37.7L510.9 346.2C517.9 384.8 492.1 416 453.1 416zM394.9000000000001 68.7L362.9000000000001 55.2L247.5000000000001 165.2C232.8000000000001 155.2 218.3000000000001 145.7 205.8 138.1L227.9 73.9L210 61.2L169.4 122.2L117 170.3L132.7 185.7L190.7 154.6C200 165.1 211.5 177.2 223.5 189.5L203 219.1L134.2 318.9L153 347.8L161.9 352.6L265 240.2L269.9 235.7C289.3 254.5 303.7 268.1 303.7 268.1C311.4 274.6 325.2 271 334.4 260.2C343.4 249.7 345 235.5 337.1 228.9C335.3 227.6 321.6 217.5 301.8 203.3L306.3 196L401.2 76.6L394.8999999999999 68.7z" />
+    <glyph glyph-name="aviato"
+      unicode="&#xF421;"
+      horiz-adv-x="640" d=" M107.2 164.5L88.2 206.3H36.1L17.1 164.5H0L62.2 295.9L124.4 164.5H107.2zM62.2 262.6L42.6 220.1H81.8L62.2 262.6zM174.9 160.2L112.7 291.6H129.8L174.9 195.6L220 291.6H237L174.9 160.2zM255.5 164.5V291.6H271V164.5H255.5zM464.6 280.1V164.5H447.3V280.1H406.1V291.6H505.7V280.1H464.6zM640 229.2C640 220 638.3 211.4 634.9 203.4C631.5 195.4 626.6999999999999 188.3 620.6999999999999 182.3C614.6999999999999 176.3 607.5999999999999 171.5 599.5999999999999 168.1C591.5999999999999 164.7 582.9999999999999 163 573.8 163S556 164.6999999999999 548 168.1C540 171.5 532.9 176.3 526.9 182.3C520.9 188.3 516.1 195.3 512.6999999999999 203.4C509.3 211.4 507.5999999999999 220 507.5999999999999 229.2S509.2999999999999 247 512.6999999999999 255C516.0999999999999 263 520.9 270.1 526.9 276.1C532.9 282.1 539.9 284.5 548 288C556 291.4 564.6 293.1 573.8 293.1S591.5999999999999 291.4 599.5999999999999 288C607.5999999999999 284.6 614.6999999999999 282.2 620.6999999999999 276.1C626.6999999999999 270.1 631.4 263 634.9 255C638.3 247 640 238.4 640 229.2zM624.5 229.2C624.5 236.5 623.2 243.2 620.6 249.5C618 255.8 614.4 261.2 609.8000000000001 265.8C605.2 270.4 599.8000000000001 274 593.6 276.7000000000001C587.4 279.4 580.8000000000001 280.7000000000001 573.8000000000001 280.7000000000001S560.2 279.4 554.0000000000001 276.7000000000001C547.8000000000001 274 542.4000000000001 270.4 537.8000000000001 265.8C533.2 261.2000000000001 529.6 255.8 527.0000000000001 249.5C524.4000000000001 243.2 523.1000000000001 236.4 523.1000000000001 229.2C523.1000000000001 221.9 524.4000000000001 215.2 527.0000000000001 208.9C529.6000000000001 202.6 533.2000000000002 197.2 537.8000000000001 192.6C542.4000000000001 188 547.8000000000001 184.4 554.0000000000001 181.7C560.2000000000002 179 566.8000000000001 177.7 573.8000000000001 177.7S587.4000000000001 179 593.6 181.7C599.8000000000001 184.4 605.2 188 609.8000000000001 192.6C614.4000000000001 197.2 618.0000000000001 202.6 620.6 208.9C623.2 215.2 624.5 222 624.5 229.2zM529.7 132.5V138.8L618.6 148.8L375.7000000000001 135.4C376.3000000000001 137.6 376.8000000000001 140.0000000000001 377.1 142.6C377.4000000000001 144.6 377.6 146.8 377.7000000000001 149.1L442.5000000000001 157.2000000000001L377.6 155.3000000000001C377.6 155.7000000000001 377.5 156.0000000000001 377.5 156.4000000000001C374.7 173.6000000000001 352 180.1000000000001 352 180.1000000000001L350.9 206.4000000000001H374.7L393.7 164.6000000000001H410.8L348.6 296L286.4000000000001 164.6H303.5000000000001L322.5000000000001 206.4H346.1000000000001L345 180S322.3 173.5 319.5 156.3C319.4 156 319.4 155.6 319.4 155.2L254.5 157.1L319.3 149C319.4 146.6999999999999 319.6 144.6 319.9 142.5C320.2 139.8999999999999 320.7 137.5 321.3 135.3L78.4 148.8L167.3 138.8V132.5C161.4 131.6 156.8 126.5 156.8 120.3C156.8 113.5 162.4 107.9 169.2 107.9C176 107.9 181.6 113.5000000000001 181.6 120.3C181.6 126.5 177 131.6 171.1 132.5V138.3L251.4000000000001 129.3V123.9C245.7000000000001 122.8 241.5000000000001 117.7000000000001 241.5000000000001 111.8C241.5000000000001 105 247.1 101.6 253.9000000000001 101.6C260.7000000000001 101.6 266.3 105 266.3 111.8C266.3 117.8 262 122.8 256.4000000000001 123.9V128.8L284.8 125.6V101.9H278.9000000000001V88H284.8V94.6H289.8V88H295.7V101.8H289.8V125L328.1 120.7C336.2000000000001 109.3 347.1 107.1 347.1 107.1L347 100.4L341.9 100.2L341.8 88.1H345.9L346 93.1H351.2L351.3 88.1H355.4000000000001L355.3 100.2L350.2 100.4L350.1 107.1S361 109.2 369.1 120.7L407.4 125V101.8H401.5V88H407.4V94.6H412.4V88H418.3V101.8H412.4V125.5L440.8 128.7V123.8C435.1 122.7 430.9 117.6 430.9 111.7C430.9 104.9 436.5 101.5 443.3 101.5C450.1 101.5 455.6999999999999 104.9 455.6999999999999 111.7C455.6999999999999 117.7 451.3999999999999 122.7 445.8 123.8V129.2L526.0999999999999 138.2V132.4C520.1999999999999 131.5 515.5999999999999 126.4 515.5999999999999 120.2C515.5999999999999 113.4 521.1999999999999 107.8 527.9999999999999 107.8C534.7999999999998 107.8 540.3999999999999 113.4 540.3999999999999 120.2C540.1999999999998 126.5 535.6999999999998 131.6 529.6999999999998 132.5zM328.9000000000001 220.1L348.5000000000001 262.6L368.1000000000001 220.1H350.2000000000001L348.5000000000001 260.4L346.8000000000002 220.1H328.9000000000002z" />
+    <glyph glyph-name="aws"
+      unicode="&#xF375;"
+      horiz-adv-x="512" d=" M261.2 311.9C247.2 254.4 248.1 257.5 235.4 204.9C233.8 198.4 231.3 196.5 224.7 196.4H210.3C204.5 196.5 202.1 198 200.4 203.7C188.1 243.1 171.6 297.8 160.5 334.4C156.4 347.9 159.1 347.6 169.8 347.3C173.5 347.2000000000001 177.1 347.3 180.8 347.3C185.9 347.2000000000001 188.5 345.3 189.9 340.2000000000001C193.5 327.3 195.9 317.4 216.5 236.1C216.9 234.5000000000001 217.4 233.0000000000001 217.9 231.5000000000001H219C219.5 233.5000000000001 220.1 235.4000000000001 220.6 237.4000000000001C228.4 270.3000000000001 236.1 303.3000000000001 243.9 336.2000000000001C246.3 346.4000000000001 250.6 347.4000000000001 260.9 347.4000000000001H268.5C275.4 347.3000000000001 277.5 345.9000000000001 279.2 339.1C285.2 315.7000000000001 302.7 237.3000000000001 305.9 228.7000000000001C311 247.0000000000001 304.1 220.8000000000001 334.4 337.7000000000001C336.5 345.8000000000001 338.5 347.4000000000001 346.7 347.4000000000001H359.4C364.8 347.3000000000001 366.4 345.6 365.1 340.3000000000001C362.7 330.8000000000001 362.2 330.4000000000001 323.8 207.4C320.7 197.5 319.6 196.6 309.2 196.6H298.5999999999999C291.2999999999999 196.6 289.3999999999999 197.9 287.5999999999999 205C283.2999999999999 221.2 264.2999999999999 300.7000000000001 261.2 311.9000000000001zM125.4 200.7C129.6 194.9 133.5 194.4 139.5 198.3L145.8 202.5C152.6 207 153.1 208.8 149.4 216C145.1 224.4 143 233.3 143.1 242.9C143.1 246 143.7 298.6 142.2 309.7C139.5 329 129.7 342.5 110.5 348.4C99.8 351.8 88.8 351.7 77.8 351.4C62.7 351 48.4 346.8 35 340C33.2 339.1 31.3 336.9 30.9 335.1C30.1 331.2 29.8 327 30.2 323C30.8 317.1 32.8 316 38.4 317.9C43.5 319.6 48.4 321.8 53.5 323.3C68 327.7 82.7 329.7 97.6 325C104.7 322.8 109.3 318.1 111.9 311.2C114.9 303.3 114.3 295.1 114.3 287C114.3 281.5 114.2 281.5 108.8 282.5C94.9 285.1 81.1 287.5 66.9 285.6C51.7 283.5 38.3 278.3 28.7 265.6C19.6 253.6 18.7 240 21.3 226.1C24.1 211.1 33.1 200.4 47.7 195.7C68.3 189 87.8 192.4 105.4 205.2C109.2 208 112.6 211.4 116.5 214.7C119.6 209.7 122.3 205 125.4 200.7zM110.1 262.3C113.1 261.9 114.6 260.4 114.4 257.2C114.2 253.4 114.5 249.6 114.1 245.8C112.9 234.1 106.4 226.1 96.2 220.9C88 216.7 79.3 215.1 70.1 215.9C54.9 217.2 49.1 229 50.5 242.2C51.8 254.8 59 261.8 72 264C85.8 266.4 88 265.1 110.1 262.3zM458.9 197.2C480.2 205.8 491.8 223.4 488.1 247.2C485.9 261.8 476.3 271.4 462.9 276.7C448.2000000000001 282.6 429.1 287 414.8 294.9C410.4000000000001 297.3 407.4000000000001 301.2 407.2 306.8C406.8 317.9 411.4 324 422.6 326.6C431.9 328.7 441.4 328.8 450.7 327C458 325.6 465 322.8 472.1 320.7C474.9 319.8 477.9999999999999 318.6 479.9 322.3C483.7 329.6 480.3 341 472.6 344.1C450.1 353.1 427.1 355.7 404.4 345.7C389.8 339.3 379.8 328.3 378.4 311.5C376.8 292.2 385.3 278.1 402.5 269.8C410.2 266.1 418.6 263.9 426.7 260.9C434.8 257.9 442.9 255.1 450.8 251.8C463.1 246.5 462.4 227.6 452 221.8C424.3 206.5 387.1 224.2 382.8 225.6C379.5 226.7 377.5 225.4 376.5 221.9C373.5 210.6 377.2 203.1 388.1 199.2C409.8 191.3 437.7000000000001 188.7 458.9 197.2zM296 34.5C346.8 40.3 394.7 55.3 438.7 81.5C446.7 86.2 454.2 91.8 461.8 97.2C469.1 102.4 465 115.6 450.5 109.4C396.1 86.2 339.3 73.3 280.3 70.5C249.8 69 219.5 70.8 189.2 75.2C126.1 84.4 66.8 104.4 11.6 136.4C9.5 137.6 7.4 138.9 5.1 139.4C0.2 140.5 -2.6 134.7 2.7 129.7C26.7 107.6 53 88.9 81.8 74C135.5 46.3 192.3 31.3 253 32C267.4 32.8 281.8 32.9 296 34.5zM470.7 126.7C485.5 125.9 490.1 120.8 486.4 106.5C482.6 91.7 477.1 77.3 472.5 62.7C471.6 59.8 468.3 56.4 471.7 53.9C475.4 51.3 478.2 54.9 480.7 57.2C490.9 66.7 498.1 78.2 503.2 91C508.6 104.4 512.5 118.2 511.9 132.9C511.7 139.1 510.1 141.7 504.1 143.4C498.7 144.9 493.1 146.2 487.6 146.6C465.9999999999999 148.4 445.1 146.1 425.6 136C422.5 134.3999999999999 419.6 132.3 416.9 130.1C415.8 129.2 413.7 124.8 419.3 124C421.2 123.6999999999999 423.2 124.1 425.2 124.3C442.0999999999999 125.9 453.8 127.6 470.6999999999999 126.6999999999999z" />
+    <glyph glyph-name="bandcamp"
+      unicode="&#xF2D5;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM296.2 113.9H115.2L199.9 270H380.9L296.2 113.9z" />
+    <glyph glyph-name="behance-square"
+      unicode="&#xF1B5;"
+      horiz-adv-x="448" d=" M186.5 155C186.5 135.7 172.5 129.6 155.3 129.6H110.2V182.5H156.2C174.8 182.4 186.5 174.7 186.5 155zM178.8 237.3C178.8 255 165.1 259.2000000000001 149.9 259.2000000000001H110.3V214.4H153C168.1 214.4 178.8 221 178.8 237.3000000000001zM311.1 214.1C292.8 214.1 280.6 202.7 279.4000000000001 184.4H341.6C339.9000000000001 202.9 330.3 214.1 311.1 214.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM271.7 263H349.5V281.9H271.7V263zM228.7 152.7C228.7 176.8 217.3 197.6 193.7 204.3C210.9 212.5 219.9 222 219.9 241.3C219.9 279.5 191.4 288.8 158.5 288.8H68V96.8H161.1C196 96.9999999999999 228.7 113.6999999999999 228.7 152.6999999999999zM380 167.5C380 208.6 355.9 242.9 312.4 242.9C270 242.9 241.3 211.1 241.3 169.3C241.3 126 268.6 96.3 312.4 96.3C345.6 96.3 367.1 111.2 377.5 143.1H343.8C340.1 131.2000000000001 325.2 125 313.6 125C291.2000000000001 125 279.5 138.1 279.5 160.3H379.7C379.8 162.6 380 165.1 380 167.5z" />
+    <glyph glyph-name="behance"
+      unicode="&#xF1B4;"
+      horiz-adv-x="576" d=" M232 210.8C263.8 226 280.4 249 280.4 284.8C280.4 355.4 227.8 372.6 167.1 372.6H0V18.2H171.8C236.2 18.2 296.7000000000001 49.1 296.7000000000001 121.1C296.7000000000001 165.6 275.6 198.5 232.0000000000001 210.8zM77.9 312.1H151C179.1 312.1 204.4 304.2 204.4 271.6C204.4 241.5 184.7 229.4 156.9 229.4H77.9V312.1zM161.2 78.4H77.9V176H162.8C197.1 176 218.8 161.7 218.8 125.4C218.8 89.6 192.9 78.4 161.2 78.4zM519.7 319.1H376V354H519.7V319.1zM576 142.8C576 218.7 531.6 282 451.1 282C372.9000000000001 282 319.8 223.2 319.8 146.2C319.8 66.3 370.1 11.5 451.1 11.5C512.4 11.5 552.1 39.1 571.2 97.8H509C502.3 75.9 474.7 64.3 453.3 64.3C412 64.3 390.3 88.5 390.3 129.6H575.4C575.6999999999999 133.8 576 138.3 576 142.8zM390.4 174C392.7 207.7 415.1 228.8 448.9 228.8C484.3 228.8 502.1 208 505.1 174H390.4z" />
+    <glyph glyph-name="bimobject"
+      unicode="&#xF378;"
+      horiz-adv-x="448" d=" M416 416H32C14.4 416 0 401.6 0 384V0C0 -17.6 14.4 -32 32 -32H416C433.6 -32 448 -17.6 448 0V384C448 401.6 433.6 416 416 416zM352 158.6C352 109.2000000000001 340.6 76 248.2 76H231.3C187.2 76 168.9 90.9 160.9 114.8H160V80H96V312H160V237.3H161.1C165.7 267.8 200.8 276.1 230.8 276.1H248.1C340.5 276.1 351.9000000000001 243.0000000000001 351.9000000000001 193.6V158.6zM288 187.5V164.6C288 142.9 284.6 130.8 249.6 130.8H204.3C175.4 130.8 160.2 137.3 160.2 166.5V185.5C160.2 214.8 175.4 221.2 204.3 221.2H249.6C284.6 221.4 288 209.2 288 187.5z" />
+    <glyph glyph-name="bitbucket"
+      unicode="&#xF171;"
+      horiz-adv-x="512" d=" M23.1 416C14.2 416.1 7 409.1 6.9 400.2C6.9 399.3 7 398.4 7.1 397.4L74.9 -14C76.6 -24.4 85.6 -32 96.1 -32.1H421.2000000000001C429.1 -32.2 435.9000000000001 -26.5 437.2000000000001 -18.7L505.0000000000001 397.3C506.4 406 500.5000000000001 414.2 491.8000000000001 415.6C490.9000000000001 415.7 490.0000000000001 415.8 489.0000000000001 415.8L23.1 416zM308.4000000000001 118.7H204.6L176.5 265.5H333.5L308.4 118.7z" />
+    <glyph glyph-name="bitcoin"
+      unicode="&#xF379;"
+      horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM362.349 227.33C367.286 260.329 342.158 278.069 307.799 289.903L318.945 334.605L291.732 341.386L280.881 297.862C273.727 299.645 266.379 301.326 259.078 302.992L270.007 346.802L242.809 353.583L231.656 308.897C225.734 310.246 219.9209999999999 311.579 214.279 312.981L214.31 313.121L176.78 322.491L169.541 293.429S189.732 288.802 189.3059999999999 288.516C200.3279999999999 285.765 202.3199999999999 278.472 201.9859999999999 272.691L189.2899999999999 221.766C190.0499999999999 221.572 191.0339999999999 221.293 192.119 220.859C191.2119999999999 221.084 190.243 221.332 189.243 221.572L171.447 150.2339999999999C170.098 146.8859999999999 166.68 141.8639999999999 158.976 143.7699999999999C159.2469999999999 143.375 139.196 148.7069999999999 139.196 148.7069999999999L125.6859999999999 117.56L161.0999999999999 108.733C167.6879999999999 107.0819999999999 174.1449999999999 105.3539999999999 180.5 103.727L169.238 58.514L196.4199999999999 51.733L207.5729999999999 96.466A1038.209 1038.209 0 0 1 229.26 90.8389999999999L218.1449999999999 46.3159999999999L245.3579999999999 39.5349999999999L256.6199999999999 84.6629999999999C303.0239999999999 75.8819999999999 337.9189999999999 79.4239999999999 352.6059999999999 121.3899999999999C364.4419999999999 155.1799999999999 352.0169999999999 174.6709999999999 327.6019999999999 187.3809999999999C345.3819999999999 191.4789999999999 358.7759999999999 203.1729999999999 362.3489999999999 227.3299999999999zM300.172 140.151C291.762 106.3609999999999 234.864 124.6279999999999 216.417 129.208L231.361 189.107C249.807 184.504 308.961 175.39 300.172 140.151zM308.589 227.818C300.916 197.082 253.558 212.698 238.196 216.526L251.744 270.853C267.107 267.025 316.58 259.88 308.589 227.818z" />
+    <glyph glyph-name="bity"
+      unicode="&#xF37A;"
+      horiz-adv-x="496" d=" M78.4 380.8C173.8 470 324.5 472 421.5 377C435.8 362.9 415.1 339.9 399.1 355.5C314.3 437.9 183.3 435.8 100.2000000000001 358.7C83.9000000000001 343.6 63.7000000000001 367 78.4000000000001 380.8zM177.3 -37.8C196.6 -43.5 206.6 -14.2 185.2 -7.8C73 26.1 9.4 141.9 37.7 253.2C42.7 272.8 12.8 281.3 7.5 260.3C-24.6 132.9 48.6 0.5 177.3 -37.8000000000001zM325.4 -35.8C447.3 4.4 518.3 131.1 489.8 255.2C485.3 274.9 454.9 269 459.8 247.3C483.9999999999999 139.6 422.7 29.4 316.6 -6.1C295.4 -13.1 306.2 -42.1 325.4 -35.8zM262.5 43.2L262.7 115C262.7 123.2 256.1 129.8 247.9 129.8C239.7 129.8 233.1 123.1 233.1 115L232.9 43.2C232.9 35 239.5 28.4 247.7 28.4S262.5 35 262.5 43.2zM333.5 312.2C335.6 221.3 338.2 180.3 248 179.7C155.5 180.4 161.1 224 162.5 312.2C162.5 334 130 331.8 130 312.2V240.6C130 171.3 190.7 149.7 248 150.5C305.3 149.7 366 171.3 366 240.6V312.2C366 331.8 333.5 334 333.5 312.2z" />
+    <glyph glyph-name="black-tie"
+      unicode="&#xF27E;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM316.5 90.8L224 2.1L131.5 90.8L196 274.8L131.5 361.4H316.4L252 274.8L316.5 90.8z" />
+    <glyph glyph-name="blackberry"
+      unicode="&#xF37B;"
+      horiz-adv-x="512" d=" M166 331.1C166 307.7 149.6 282 93.5 282H23.4L44.4 370.8H112.2C154.3 370.8 166 347.5 166 331.1zM292.2 370.8H224.4L205.7 282H275.8C329.6 282 345.9 307.7 345.9 331.1C346 347.5 334.3 370.8 292.2 370.8zM88.8 239.9H21L0 151.1H70.1C126.2 151.1 142.6 174.5 142.6 200.2C142.6 216.5 130.9 239.9000000000001 88.8 239.9000000000001zM268.9 239.9H201.1L182.4 151.1H252.5C306.3 151.1 322.6 174.5 322.6 200.2C322.6 216.5 310.9 239.9000000000001 268.9 239.9000000000001zM458.2 293.7H390.4L371.7 204.9H441.8C495.6 204.9 511.9 228.3 511.9 254C512 270.3 500.3 293.7 458.2 293.7zM430.2 155.8H362.4L343.7 67H413.8C469.9 67 483.9 90.4 483.9 116.1C483.9 132.4 472.3 155.8 430.2 155.8zM240.8 102H173L154.3 13.2H224.4C280.5 13.2 294.5 38.9 294.5 62.3C294.6 78.6 282.9 102 240.8 102z" />
+    <glyph glyph-name="blogger-b"
+      unicode="&#xF37D;"
+      horiz-adv-x="448" d=" M446.6 225.3C444.8 233.3 439.8 240.7 434.1 243.8C432.3 244.8 421.1 246 409.1 246.5C389 247.4 386.8 247.8 380.4000000000001 251.5C370.3 257.4 367.6 263.8 367.5000000000001 281C367.4000000000001 314 353.7000000000001 344.7 326.6000000000001 372.3C307.3000000000001 392 285.7000000000001 405.3 261.1000000000001 412.8C255.2000000000001 414.6 242.0000000000001 415.2 197.8000000000001 415.7C128.4000000000001 416.5 113.0000000000001 415.1 89.4000000000001 405.7C45.9 388.5 14.7 351.9 3.3 305.1C1.2 296.3 0.7 282.2 0.2 201.2C-0.4 99.7 0.3 84.8 6.6 64.7C22.2 15.1 66.5 -21.6 111 -29.6C125.8 -32.3 308.3 -32.9 327 -30.4C359.5 -26.0000000000001 385 -12.9 408.9 11.4999999999999C426.2 29.1999999999999 437 48.3 444.1 73.6C449 91.2 448.6 216.4 446.6 225.3zM124.5 288.9C132.3 296.8 134.5 297.1 183.3 297.1C227.2 297.1 228.7 297 235.1 293.7C244.4000000000001 289 248.5000000000001 282.4 248.5000000000001 271.8C248.5000000000001 262.3 244.7 255.6 236.2 250.2C231.6 247.3 228.9 247.1 185.9 246.9C159.4 246.7 138.2000000000001 247.3 135.1 248.1C118.5 252.8 112.3 276.6 124.5 288.9zM316.3 89.1L301.4000000000001 86.7000000000001L223.9 85.8000000000001C155.8000000000001 85.0000000000001 136.6 86.2000000000001 133 87.8000000000001C125.9 90.9000000000001 119.2 99.5000000000001 118.1 107.2000000000001C117 114.5000000000001 120.7 124.5000000000001 126.3 129.6C133.4 136 136.5 136.2000000000001 223.6 136.3C313.2000000000001 136.4 312.7000000000001 136.4 321.2000000000001 128.5C333.3000000000001 117.2 330.7000000000001 97.3 316.3000000000001 89.1z" />
+    <glyph glyph-name="blogger"
+      unicode="&#xF37C;"
+      horiz-adv-x="448" d=" M162.4 252C167.2 256.9 168.6 257.1 198.8 257.1C226 257.1 226.9 257 230.9 255C236.7 252.1 239.2 248 239.2 241.4C239.2 235.5 236.8 231.4 231.6 228C228.8 226.2 227.1 226.1 200.5 225.9C184.1 225.8 171 226.1 169 226.7C158.7 229.6 154.9 244.4 162.4 252.0000000000001zM223.8 157.5C169.9 157.5 168 157.3 163.6 153.4C160.1 150.3 157.9 144 158.5 139.5C159.2 134.8 163.3000000000001 129.4 167.7 127.5C169.9 126.5 181.8 125.8 224 126.3L271.9 126.9L281.1 128.4C290.1 133.5000000000001 291.6 145.8 284.2 152.8C278.9 157.5 279.2 157.5 223.8 157.5zM447.2000000000001 27.4C443.7000000000001 -1 424.2000000000001 -23 396.1 -30.1C388.9000000000001 -31.9 386.4000000000001 -32 223.2 -31.9C65.4 -31.9 57.3 -31.8 51.2 -30.1C42.8 -27.9 35.6 -24.6 28.9 -20.1C23.3 -16.3 15 -8.3 11.9 -3.7C8.1 1.9 3.7 11.6 1.9 18.3C0.1 25 0 27.7 0 191.7C0 354.8 0 358.3 1.8 365.4C8.1 390.1 27.7 409 53 414.6C60.3 416.2 385.1 416.5 393 414.9C414.2 410.6 430.9 397.8 440.6 378.5C448.3 363.2 447.6 380 447.9000000000001 197.9C448.1 82.1 447.9000000000001 33.4 447.2000000000001 27.4zM361.8000000000001 212.6C360.7000000000001 217.6 357.6000000000001 222.2 354.1000000000001 224.1C353.0000000000001 224.7 346.1000000000001 225.4 338.6000000000001 225.8C326.2000000000001 226.4 324.8000000000001 226.6 320.8000000000001 228.9C314.6000000000001 232.5 312.9000000000001 236.5 312.8000000000001 247.2C312.8000000000001 267.6 304.3000000000001 286.6 287.5000000000001 303.7C275.5000000000001 315.9 262.2000000000001 324.2 246.9000000000001 328.8C243.3000000000001 329.9 235.1000000000001 330.3 207.7000000000001 330.6C164.8000000000001 331.1 155.2000000000001 330.2 140.6000000000001 324.4C113.6000000000001 313.7 94.3000000000001 291 87.2000000000001 262C85.9000000000001 256.5999999999999 85.6000000000001 247.8 85.3 197.6999999999999C84.9 134.8999999999999 85.3 125.5999999999999 89.3 113.1999999999999C99 82.4999999999999 126.4 59.8 153.9 54.8C163.1 53.1 276.1 52.6999999999999 287.6 54.3C307.7000000000001 56.9999999999999 323.5 65.1 338.3 80.1999999999999C349 91.0999999999999 355.7 102.9999999999999 360.1 118.6999999999999C363.3 129.5999999999999 363 207.0999999999999 361.8 212.5999999999999z" />
+    <glyph glyph-name="bluetooth-b"
+      unicode="&#xF294;"
+      horiz-adv-x="320" d=" M196.48 187.977L289.106 291.31L143.125 448V241.67L57.014 327.781L25.608 296.376L133.669 187.977L25.608 79.578L57.014 48.173L143.125 134.284L145.84 -64L294.392 84.644L196.48 187.977zM237.34 290.973L187.363 240.995L187.025 341.29L237.34 290.973zM187.363 134.96L237.34 84.982L187.025 34.6659999999999L187.363 134.9599999999999z" />
+    <glyph glyph-name="bluetooth"
+      unicode="&#xF293;"
+      horiz-adv-x="448" d=" M292.6 276.9L249.7 234L249.4 320L292.6 276.9M249.4 57.1L292.5 100.2000000000001L249.6 143.1L249.4 57.1zM416 188.6C416 -17 344.1 -64 230.9 -64S32 -17 32 188.6S115.4 448 228.6 448S416 394.1 416 188.6zM257.5 188.6L336.9 277.2000000000001L211.8 411.5V234.6L138 308.4L111 281.5L203.7 188.5L111 95.5L137.9 68.6L211.7 142.4L214 -27.6L341.4 99.9L257.5 188.6z" />
+    <glyph glyph-name="btc"
+      unicode="&#xF15A;"
+      horiz-adv-x="384" d=" M310.204 205.362C337.9340000000001 219.542 355.581 244.752 351.4840000000001 286.662C346.1260000000001 344.013 299.0260000000001 363.235 236.6340000000001 368.591V448H188.1060000000001V370.7970000000001C175.5010000000001 370.7970000000001 162.5810000000001 370.482 149.662 370.1670000000001V448H101.134V368.591C83.2920000000001 368.052 62.512 368.315 3.764 368.591V316.913C42.078 317.591 62.181 320.053 66.787 295.486V78.057C63.862 58.565 48.263 61.372 13.532 61.986L3.765 4.32C92.246 4.32 101.135 4.005 101.135 4.005V-64H149.663V3.06C162.897 2.745 175.817 2.745 188.107 2.745V-64H236.635V4.005C317.9340000000001 8.417 372.2820000000001 28.899 379.5300000000001 105.472C385.201 166.918 356.2100000000001 194.334 310.2040000000001 205.362zM150.608 313.447C178.023 313.447 263.7340000000001 321.954 263.7340000000001 264.919C263.7340000000001 210.404 178.0240000000001 216.707 150.608 216.707V313.447zM150.608 61.671V168.179C183.38 168.179 283.735 177.317 283.735 114.924C283.7340000000001 54.738 183.38 61.671 150.608 61.671z" />
+    <glyph glyph-name="buromobelexperte"
+      unicode="&#xF37F;"
+      horiz-adv-x="448" d=" M0 416V288H128V416H0zM120 296H8V408H120V296zM160 416V288H288V416H160zM280 296H168V408H280V296zM320 416V288H448V416H320zM440 296H328V408H440V296zM0 256V128H128V256H0zM120 136H8V248H120V136zM160 256V128H288V256H160zM280 136H168V248H280V136zM320 256V128H448V256H320zM440 136H328V248H440V136zM0 96V-32H128V96H0zM120 -24H8V88H120V-24zM160 96V-32H288V96H160zM280 -24H168V88H280V-24zM320 96V-32H448V96H320z" />
+    <glyph glyph-name="buysellads"
+      unicode="&#xF20D;"
+      horiz-adv-x="448" d=" M224 297.3L266.9 136.6H181.1L224 297.3zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM382.7 42.7L288.2 341.4H159.8L65.3 42.7H156L267.7 134.3L291.9 42.6999999999999H382.7z" />
+    <glyph glyph-name="cc-amazon-pay"
+      unicode="&#xF42D;"
+      horiz-adv-x="576" d=" M124.7 246.2C124.8 258 124.7 269.7 124.7 281.5V316.8C124.7 318.1 125.1 318.8 126.1 319.5C137.6 327.5 150.2 331.6 164.3 330.6C176.8 329.7 187 323.6 192.4 308.9C195.7 300 196.5 290.7000000000001 196.5 281.2000000000001C196.5 272.5 195.8 263.9 193.1 255.6C187.4 237.8 174.4 230.9000000000001 157.4 231.7C145.7 232.2 135.5 236.7 126 243.4C125.1 244.2 124.6 245 124.7 246.2zM279.6 231.6C284.2000000000001 229.8 288.9000000000001 229.6 293.7000000000001 230.1C305.3000000000001 231.3 315.6 235.8 325.0000000000001 242.6C325.9000000000001 243.2 326.3000000000001 243.9 326.3000000000001 245.1C326.2000000000001 249 326.3000000000001 253 326.3000000000001 256.9C326.3000000000001 260.9 326.2000000000001 264.9 326.3000000000001 268.9C326.3000000000001 270.3 325.9000000000001 270.9 324.5000000000001 271.1C317.5000000000001 272 310.6000000000001 273.3 303.6000000000001 274C296.6000000000001 274.6 289.6000000000001 274.3 282.8000000000001 272.1C276.1000000000001 269.9 271.1000000000001 265.9 269.1000000000001 259C267.5000000000001 253.6 267.5000000000001 248.2 269.2000000000001 242.8C270.8000000000002 237.3 274.4000000000001 233.6 279.6000000000001 231.6zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM368.5 344.1C368.9 342.4 369.4 340.7 370.1 339C386.6 298.4 403 257.7 419.6 217.1C421 213.6 421.3 210.7 419.8 207.2C417 201 414.9000000000001 194.6 412 188.5C409.4 183 405.3 179 399.3 177.3C395.1 176.2 390.8 176 386.4000000000001 176.4C384.3 176.6 382.2000000000001 177.1 380.1 177.2000000000001C377.3 177.4 375.9000000000001 176.1 375.8 173.2000000000001C375.7 170.4 375.7 167.6 375.8 164.9C375.9000000000001 160.3 377.4000000000001 158.2000000000001 382 157.4C386.7 156.6 391.4 155.8 396.2 155.7000000000001C410.5 155.4 421.9 161.1 429.3 173.6C432.2 178.5 434.9000000000001 183.7000000000001 437 189C456.8 239.1 476.5 289.3 496.2 339.5C496.8 341 497.3 342.5 497.5 344.1C497.9 346.5 496.8 347.7 494.4 347.8C488.8 347.9 483.3 347.8 477.7 347.8C474.6 347.8 472.4 346.4 471.3 343.5C470.9 342.4 470.4 341.2 470 340.1L440.9 256.4C438.8 250.3 436.7 244.3 434.4 237.8C434 238.7 433.8 239.2 433.6 239.7C422.8 269.6 412 299.6 401.2 329.5C399.5 334.2 397.7 339 395.9 343.7C395 346.2 393.2 347.7 390.5 347.7C384.1 347.8 377.7 347.9 371.3 347.8C369.1 347.8 368 346.2 368.5 344.1zM242.4 242C244.1 230.3 250 221.2 260.4 215.4C270.3 209.9 281.1 209.2 292.1 210.8C304.8 212.7 316 218.1 325.9 226.3C326.3 226.6 326.7 226.9 327.3 227.3C327.8 224.1 328.2 221.1 328.8 218.1C329.3 215.5 330.9 213.8 333.3 213.7C337.9 213.6 342.4 213.6 347 213.7C349.3 213.8 350.8 215.3 351 217.6C351.1 218.4 351.1 219.2 351.1 219.9V308.7000000000001C351.1 312.3000000000001 350.9 315.9000000000001 350.4 319.5000000000001C348.8 330.3000000000001 344.2 339.2000000000001 334.5 344.9000000000001C328.9 348.2000000000001 322.7 349.9000000000001 316.3 350.8000000000001C313.3 351.2000000000001 310.3 351.5000000000001 307.2 351.9000000000001H297.2C296.4 351.8000000000001 295.6 351.6000000000001 294.7 351.6000000000001C286.5 351.2000000000001 278.4 350.2000000000001 270.5 348.1000000000001C265.4 346.8000000000001 260.5 344.9000000000001 255.5 343.2000000000001C252.5 342.2000000000001 251 340.0000000000001 251.1 336.7000000000001C251.2 333.9000000000001 251 331.1000000000001 251.1 328.4000000000001C251.2 324.3000000000001 252.9 323.2000000000001 256.8 324.3000000000001C263.3 326.0000000000001 269.9000000000001 327.8000000000001 276.5 329.1000000000001C286.8 331.0000000000001 297.2 331.8000000000001 307.6 330.3000000000001C313 329.5000000000001 318.1 327.9000000000001 321.7000000000001 323.3000000000001C324.8000000000001 319.3000000000001 325.9000000000001 314.5000000000001 326.1 309.6000000000001C326.4000000000001 302.7000000000001 326.3 295.7000000000001 326.4000000000001 288.8000000000001C326.4000000000001 288.4000000000001 326.3 288.1000000000001 326.2000000000001 287.6000000000001C325.8000000000001 287.6000000000001 325.4000000000001 287.6000000000001 325.1 287.7000000000001C316.3 289.8000000000001 307.4000000000001 291.3000000000001 298.3 291.8000000000001C288.8 292.3000000000001 279.4000000000001 291.7000000000001 270.4000000000001 288.6000000000001C259.6 284.8000000000001 250.9000000000001 278.3000000000001 245.8000000000001 267.8000000000001C241.7000000000001 259.5000000000001 241.2000000000001 250.8000000000001 242.4000000000001 242.0000000000001zM98.7 341.1V165.8C98.7 165 98.7 164.1 98.8 163.3C99 160.8 100.5 159.1999999999999 102.9 159.1C108.8 159 114.7 159 120.6 159.1C123.1 159.1 124.6 160.8 124.7 163.2C124.8 164 124.8 164.9 124.8 165.7V226.4C125.7 225.7 126.2 225.2 126.7 224.8C141.7 212.3 158.9 208.2 177.8 211.9C194.9 215.3 206.7 225.8 214.5 241.1C220.3 252.7 222.8 265.2 223.2 278.1C223.7 292.4 222.2 306.5 216.4 319.8C209.3 336.2 197.5 347.1 179.7 350.7C177 351.3 174.2 351.5 171.5 351.9H164.5C163.3 351.7 162.1 351.6 160.9 351.4C149.2 350 138.6 345.6 129.1 338.7C127.1 337.3 125.2 335.7 123.2 334.2C123.1 334.7 122.9 335 122.8 335.4C122.4 337.7 122.1 340 121.7 342.3C121.1 346.2 119.2 347.8 115.3 347.9H105.6C99.7 348 98.7 346.9 98.7 341.1zM493.6 109C490.9 109.7 488.5 109 486 108C442.1 89.6 396.5 77.8 349.2 72.2C334.7 70.5 320.1 69.4 305.5 69C278.9 68.3 252.3 69.8 225.9 73.3C208.1 75.7 190.4 79 172.9 83.2C135.9 92.1 100.2 104.9 66.2 122C57.4 126.4 48.8 131.3 40.1 136C36.3 138.1 33.9 137.5 31.9 133.9V132.2C33.1 130.6 34.1 128.8 35.6 127.4C71.6 95.2 112.2 70.9 157.6 54.5C179.5 46.6 202 40.8 224.9 37C238.9 34.7 252.9 33.2 267.1 32.5C270.1 32.4 273.1 32.3 276.1 32.1C276.8 32.1 277.5 31.9 278.2 31.8H295.9C296.6 31.9 297.3 32.1 298 32.1C312.9 32.5 327.8 33.9 342.6 36.1C364 39.3 385 44.2 405.5 50.8C435.1 60.4 463.2 73.2 488.9 90.9C491.7 92.8 494.6 94.7000000000001 496.9 97.1C501.2 101.5 499.2 107.5 493.6 109zM544 136.7C543.2 140.9 540 142.5 536.4 143.7C530.6999999999999 145.6 524.8 146.5 518.8 147C507.8 147.9 496.8 147.4 485.9999999999999 145.4C473.9999999999999 143.2 462.6 139.3 452.4999999999999 132.3C451.3 131.5 450.1 130.5 449.3999999999999 129.3C448.7999999999999 128.4 448.7 127 448.8999999999999 125.9C449.2 124.6 450.5999999999999 124.3 451.8999999999999 124.4C452.4999999999999 124.4 453.0999999999999 124.4 453.6999999999999 124.5L473.1999999999999 126.6C482.8 127.5 492.3999999999999 128.1 501.9999999999999 127.4C506.1 127.1 510.1 126.2000000000001 514 125.2000000000001C518.3 124.1 520.2 120.8000000000001 520.4 116.5000000000001C520.6999999999999 109.8000000000001 519.1999999999999 103.4 517.5 97.0000000000001C514 84.1000000000001 509.2 71.6000000000001 504.2 59.2000000000001C503.9 58.4 503.5 57.5000000000001 503.4 56.7000000000001C503 54.2 504.4 52.7 506.8 53.2C508.1999999999999 53.5000000000001 509.8 54.3000000000001 510.8 55.3000000000001C514.5 58.9000000000001 518.3 62.5000000000001 521.4 66.5000000000001C532.1 80.3000000000001 538.4 96.1000000000001 542.1 113.1000000000001C542.8000000000001 116.1000000000001 543.3000000000001 119.2000000000001 543.8000000000001 122.2000000000001C544.0000000000001 126.9000000000001 544.0000000000001 131.8000000000001 544.0000000000001 136.7000000000001z" />
+    <glyph glyph-name="cc-amex"
+      unicode="&#xF1F3;"
+      horiz-adv-x="576" d=" M576 192.6C538.1 192.8 531.8 193.5 521.5 187.6V192.6C476.2 192.6 468 194.3 456.6 187.4V192.6H378.4000000000001V187.5C367.0000000000001 194 357.0000000000001 192.6 302.7000000000001 192.6V187C296.4000000000001 190.7 288.2000000000001 192.6 278.4000000000001 192.6H220.4C216.9 188.8 207.9 178.9 204.7000000000001 175.4C192.0000000000001 189.5 194.2000000000001 187 189.2000000000001 192.6H106.1000000000001V100.3H188.1000000000001C191.4000000000001 103.8 201.0000000000001 114.1999999999999 204.2000000000001 117.6999999999999C216.9 103.3999999999999 214.5000000000001 105.9999999999999 219.6000000000001 100.3H268.5000000000001C268.5000000000001 115 268.6000000000001 108.6 268.6000000000001 123.3C280.1000000000001 123.1 292.9000000000001 123.5 302.9000000000001 129.5C302.9000000000001 115.6 302.8000000000001 112.3999999999999 302.8000000000001 100.3H342.4000000000001C342.4000000000001 118.8 342.5000000000001 107.6999999999999 342.5000000000001 125.6C348.7000000000001 125.6 350.2000000000001 125.6 351.9000000000001 125.5C352.0000000000001 124.1999999999999 351.9000000000001 125.5 351.9000000000001 100.3C504.7000000000001 100.3 497.8000000000001 99.1999999999999 508.6000000000001 104.8V100.3C543.4000000000001 100.3 563.4000000000001 98.1 576.1000000000001 106.4V16C576.1000000000001 -10.5 554.6000000000001 -32 528.1000000000001 -32H48C21.5 -32 0 -10.5 0 16V219.7H26.6C30.8 229.8 28.8 225 33 235H52.2C56.4 225 54.4 229.8 58.6 219.7H111.5V231.1C113.7 226.1 112.6 228.6 116.6 219.7H146.1C148.5 225.2 148.7 225.5 151.2 231.1V219.7H286.7V244.8C293.1 244.8 294.7 244.9 296.5 244.6C296.5 244.6 296.3 233.7 296.6 219.8H363.1V228.7C370.5 222.8 380.5 219.8 392.8 219.8H419.6C423.8 229.9 421.8 225.1 426 235.1H445C451.5 220.1 445.2 234.6 451.6 219.8H504.4V241.7C516.2 222 512.2 228.8 517.6 219.8H559.2V311.8H519.3000000000001V293.4C507.1000000000001 313.6 513.0000000000001 303.8 508.1000000000001 311.8H464.8000000000001V291.2C458.6000000000001 305.8 460.2 302 456.0000000000001 311.8H423.6000000000001C423.2000000000001 311.8 421.3000000000001 311.6 421.3000000000001 312.1H393.7000000000001C380.9000000000001 312.1 370.6 308.9 363.0000000000001 302.8V312.1H323.1000000000001V306.8C312.3000000000001 312.9 302.4000000000001 311.9 258.7000000000001 312.1C258.6 312.1 247.1000000000001 312.2 247.1000000000001 312.1H144.1000000000001C141.6000000000001 306 137.3000000000001 295.7 131.5000000000001 282.1C128.7000000000001 288.1 120.5000000000001 305.9 117.6000000000001 312.1H71.6000000000001V291C64.2000000000001 308.4 66.9000000000001 302 62.6000000000001 312.1H22.9C19.5 304.2 9.2 280.1 -0.2 258.2V368C-0.2 394.5 21.3 416 47.8 416H527.8C554.3 416 575.8 394.5 575.8 368V192.6zM389.4 273.2C389.1 273 388 271 388 265.6C388 259.6 388.9 257.9 389.1 257.7C389.3 257.6 390.2000000000001 257.2 392.5 257.2L399.8 274.1C398.7 274.1 397.7 274.2 396.7 274.2C391.1 274.2 389.7 273.5 389.4 273.2zM369.5 142.3C378.7 139 380.5 132.8 380.5 123.9L380.4 110.1H363.8L363.9 121.6C363.9 133.4 360.1 135.4 349.1 135.4H331.5L331.3999999999999 110.1H314.7999999999999L314.8999999999999 179.4H354.2999999999999C367.2999999999999 179.4 381.3999999999999 177.1 381.3999999999999 160.7C381.2999999999999 153.1 377.2 145.4 369.5 142.3zM363.2 157.6999999999999C363.2 164.0999999999999 357.6 165.0999999999999 352.5 165.0999999999999H331.5V149.4999999999999H352.2C357.8 149.4999999999999 363.2 150.7999999999999 363.2 157.6999999999999zM544.9 164.8H575V179.4H542.1C529.3000000000001 179.4 518.3000000000001 172.8 518.3000000000001 158.7C518.3000000000001 125.7 561.0000000000001 145.9 561.0000000000001 131.3C561.0000000000001 126.2 556.7000000000002 124.9 552.6000000000001 124.9H520.6000000000001L520.5000000000001 110.1H552.5000000000001C560.9000000000001 110.1 570.1000000000001 111.9 575.0000000000001 119V144.8C564.5000000000001 158.6 535.7000000000002 146.1 535.7000000000002 158.3C535.7000000000002 164.1 540.3000000000002 164.8 544.9000000000002 164.8zM445.7 165.1V179.4H390.5L390.4 110.1H445.6L445.7 124.4L407.1 124.7V138.5H445V152.6H407.2V165.1H445.7zM487.9 125H455.7L455.6 110.1999999999999H487.8C502.6 110.1999999999999 514 115.8 514 132.1999999999999C514 165.3999999999999 471.1 143.3999999999999 471.1 158.5C471.1 164.1 476 164.8999999999999 480.3 164.8999999999999H510.7V179.5H477.5C464.7 179.5 454 172.8999999999999 454 158.8C454 125.8 496.7 146.3 496.7 131.4C496.6 126 492 125 487.9 125zM409.8 283.7C392.4 284 376.6 287.8 376.6 264C376.6 252.2 379.4 244.1 392.7 244.1H400.1L423.6 298.5999999999999H448.4L476.3 233.2V298.5999999999999H501.6L530.6999999999999 250.5V298.5999999999999H547.5999999999999V229.6H524L492.8 281.5V229.6H459.1L452.5 244.9H418.2L411.8 229.6H392.6C369.8 229.6 359.6 241.4 359.6 263.5999999999999C359.6 286.9 370.1 298.8999999999999 393.6 298.8999999999999H409.7000000000001V283.7zM424.1 259.2H446.9L435.7 286.8L424.1 259.2zM351.5 298.8H334.6V229.5H351.5V298.8zM313.4 261.5C322.9 258.2 324.4 252.3 324.4 243.1V229.6H307.8C307.5 244.4 311.4 254.7 293 254.7H275V229.6H258.6V298.8999999999999L297.7 298.5999999999999C311 298.5999999999999 325.1 296.5999999999999 325.1 280.2C325.2 272.2 320.8 264.4999999999999 313.4 261.4999999999999zM306.7 276.8C306.7 283.2 301.1 284.2 296 284.2H275V268.9H295.7C301.4 268.9 306.7 270.2 306.7 276.8zM247.2 284.2V298.8H191.7V229.5H247.2V243.8H208.3V257.6H246.1V271.7H208.3V284.2H247.2zM162.6 229.5V283.7L138.6 229.5H124L100 283.7V229.5H66.2L59.8 244.8H25.3L18.9 229.5H1L30.7 298.8H55.2L83.3 233.1V298.8H110.4L132.1 251.8L151.8 298.8H179.4V229.5H162.6zM53.9 259.2L42.4 286.8L31.2 259.2H53.9zM306.9 156.7C306.9 128.8 276.5 133.4 257.6 133.4L257.5 110.1H225.3L204.9 133.1L183.5999999999999 110.1H118.1999999999999L118.2999999999999 179.4H184.7999999999999L205.2999999999999 156.6L226.3 179.4H279C294.6 179.4 306.9 174 306.9 156.7zM194.2 144.9L176.3 165.1H134.6V152.6H170.9V138.5H134.6V124.6999999999999H175.2L194.2 144.8999999999999zM241 172L215.7 144.6L241 116.5V172zM289.3 156.7C289.3 162.8 284.7 165.1 279.1 165.1H257.6V147.5H278.8C284.7 147.5 289.3 150.3 289.3 156.6999999999999z" />
+    <glyph glyph-name="cc-apple-pay"
+      unicode="&#xF416;"
+      horiz-adv-x="576" d=" M302.2 229.6C302.2 212.4 291.7 202.5 273.2 202.5H248.9V256.7H273.3C291.7 256.7 302.2 246.9 302.2 229.6zM349.7 167C349.7 158.7 356.9 153.3 368.2 153.3C382.6 153.3 393.4 162.4 393.4 175.2V182.9L369.9 181.4C356.6 180.5 349.7 175.6 349.7 167zM576 369V17C576 -9.5 554.5 -31 528 -31H48C21.5 -31 0 -9.5 0 17V369C0 395.5 21.5 417 48 417H528C554.5 417 576 395.5 576 369zM127.8 250.8C136.2 250.1 144.6 255 149.9 261.2000000000001C155.1 267.6 158.5 276.2000000000001 157.6 284.9C150.2 284.6 141 280 135.7 273.6C130.9 268.1 126.8 259.2 127.8 250.8zM188.4 176.3C188.2 176.5 168.8 183.9 168.6 206.3C168.4 225 183.9 234 184.6 234.5C175.8 247.5 162.2 248.9 157.5 249.2C145.3 249.9 134.9 242.3 129.1 242.3C123.2 242.3 114.4 248.9 104.8 248.7C92.3 248.5 80.6 241.4 74.3 230.1C61.2 207.5 70.9 174.1 83.6 155.7C89.8 146.6 97.3 136.6 107.1 137C116.4 137.4 120.1 143 131.3 143C142.6 143 145.8 137 155.6 137.1C165.8 137.3 172.1 146.2000000000001 178.4 155.3C185.3 165.7 188.2 175.7 188.4 176.3zM323.8 229.7C323.8 256.3 305.3 274.5 278.9000000000001 274.5H227.7000000000001V138.1H248.9000000000001V184.7000000000001H278.2000000000001C305.0000000000001 184.7000000000001 323.8000000000001 203.1000000000001 323.8000000000001 229.7000000000001zM413.8 206C413.8 225.7 398 238.4000000000001 373.8 238.4000000000001C351.3 238.4000000000001 334.7 225.5000000000001 334.1 207.9H353.2000000000001C354.8000000000001 216.3000000000001 362.6 221.8000000000001 373.2000000000001 221.8000000000001C386.2000000000001 221.8000000000001 393.4000000000001 215.8000000000001 393.4000000000001 204.6000000000001V197.1000000000001L367.0000000000001 195.5000000000001C342.4000000000001 194.0000000000001 329.1000000000001 183.9 329.1000000000001 166.4C329.1000000000001 148.7000000000001 342.8000000000001 137.0000000000001 362.5000000000001 137.0000000000001C375.8000000000001 137.0000000000001 388.1000000000001 143.7000000000001 393.7000000000001 154.4H394.1V138H413.7000000000001V206zM516 237.1H494.5L469.6 156.5H469.2L444.3000000000001 237.1H422L457.9 137.8L456 131.8C452.8 121.6 447.5 117.6 438.1 117.6C436.4000000000001 117.6 433.2000000000001 117.8 431.9000000000001 117.9V101.5000000000001C433.1 101.1000000000001 438.4000000000001 101.0000000000001 440.0000000000001 101.0000000000001C460.7 101.0000000000001 470.4 108.9 478.9 132.8000000000001L516 237.1z" />
+    <glyph glyph-name="cc-diners-club"
+      unicode="&#xF24C;"
+      horiz-adv-x="576" d=" M239.7 368.1C142.8 368.1 63.9 289.5 63.9 192.3C63.9 95.4 142.8 16.5 239.7 16.5C336.9 16.5 415.5 95.4 415.5 192.3C415.5 289.5 336.9 368.1 239.7 368.1zM199.8 88.5C158.1 104.4 128.4 144.9 128.4 192.3S158.1 280.2000000000001 199.8 296.4V88.5zM279.6 88.2V296.4C321.3 280.2000000000001 351 239.7 351 192.3S321.3 104.4 279.6 88.2000000000001zM528 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H528C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 528 416zM329.7 0H239.4C133.2 0 45.6 85.5 45.6 190.2C45.6 304.8 133.2 384 239.4 384H329.7C434.7 384 530.4 304.8 530.4 190.2C530.4 85.5 434.7 0 329.7 0z" />
+    <glyph glyph-name="cc-discover"
+      unicode="&#xF1F2;"
+      horiz-adv-x="576" d=" M83 235.9C83 228 79.8 220.4 74.1 215.2C69.2 210.8 62.5 208.8 52.2 208.8H48V263H52.2C62.5 263 68.9 261.3 74.1 256.4C79.8 251.4 83 243.8 83 235.9zM504.8 264H499.9V239.1H504.6C514.9 239.1 520.4 243.5 520.4 251.9C520.4 259.8 514.9 264 504.8 264zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM428 195H473.3V208.8H444V231H472.3V244.8H444V263H473.3V277H428V195zM341.8 277L376.8 192.8H385.4000000000001L420.9000000000001 277H403.4000000000001L381.2000000000001 221.8L359.3000000000001 277H341.8000000000001zM258.8 235.4C258.8 210.8 278.7 190.8 303.4000000000001 190.8C328.0000000000001 190.8 348.0000000000001 210.7 348.0000000000001 235.4C348.0000000000001 260 328.1000000000001 280 303.4000000000001 280C278.8 280 258.8 260.1 258.8 235.4zM190.8 235.9C190.8 203.4 224.4 183.4 254.1 197.7V216.7C234.8 197.4 207.3 210.9 207.3 235.9C207.3 259.6 234 275 254.1 254.9V273.9C223.9 288.9 190.8 267.1 190.8 235.9zM156.9 207.6C149.3 207.6 143.1 211.3 139.4 218.4L129.1 208.5C146.9 182.4 185.7 190.3 185.7 219.8C185.7 232.9 180.3 238.8 162.1 245.4C152.5 248.8 149.8 251.3 149.8 255.7C149.8 264.4 164.3 269.8 174.7 258.2000000000001L183.1 269C164 286.1 133.4 277.9000000000001 133.4 254.7C133.4 243.4 138.6 237.5000000000001 153.6 232.0000000000001C179.3 222.9 168.3 207.6 156.9 207.6zM99.5 235.9C99.5 260 81.5 277 55.4 277H32V195H55.4C86.3 195 99.5 217.4 99.5 235.9zM122.9 277H106.9V195H122.9V277zM544 160C510.7 139.2 317.6 35.6 128 0H529C537.2 0 544 6.8 544 15V160zM544 195L518.1 229.5C530.2 232 536.8000000000001 240.1 536.8000000000001 252.7C536.8000000000001 281.2 506.5000000000001 277.1 483.9000000000001 277.1V195.1H499.9000000000001V227.9H502.1000000000001L524.3000000000001 195.1H544z" />
+    <glyph glyph-name="cc-jcb"
+      unicode="&#xF24B;"
+      horiz-adv-x="576" d=" M431.5 203.7V236C472.7 236 470 235.8 470 235.8C477.3 234.5 483.3 228.5 483.3 219.8C483.3 211 477.3 205.3 470 204C468.8 203.6 466.7 203.7 431.5 203.7zM474.3 183.5C471.5 184.2 471 184 431.5 184V149C471.1 149 471.5 148.8 474.3 149.5C481.8 151 487.8 157.5 487.8 166.5C487.8 175.2 481.8 182 474.3 183.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM182 255.7H125C125 188.6 135.7 146 89.2 146C69.7 146 50.4 151.7 32 160.8V132.8C62 124.5 100 124.5 100 124.5C197.9 124.5 182 172.2 182 255.7zM360.5 251.2C297.1 267.2 195.5 266.1 195.5 191.9C195.5 114.8 303.7 118.3 360.5 132.7V161C312.9 136.3 253 139 253 192S312.8 247.6 360.5 223.2V251.2zM544 161.5C544 180 527.5 192 506 193.5V194.3C525.5 197 536.3 209.8 536.3 224.5C536.3 243.5 520.5999999999999 254.5 499.3 255.5C499.3 255.5 505.6 255.8 379 255.8V128.3H501.6999999999999C525.9999999999999 128.2 543.9999999999999 141.2 543.9999999999999 161.5z" />
+    <glyph glyph-name="cc-mastercard"
+      unicode="&#xF1F1;"
+      horiz-adv-x="576" d=" M482.9 37.7C482.9 30.9 478.3 26 471.7 26C464.9 26 460.5 31.2 460.5 37.7C460.5 44.2 464.9 49.4 471.7 49.4C478.3 49.4 482.9 44.2 482.9 37.7zM172.1 49.4C165 49.4 160.9 44.2 160.9 37.7C160.9 31.2 165 26 172.1 26C178.6 26 183 30.9 183 37.7C182.9 44.2 178.6 49.4 172.1 49.4zM289.6 49.7C284.2 49.7 280.9 46.2 280.1 41H299.2C298.3 46.7 294.8 49.7 289.6 49.7zM397.4 49.4C390.6 49.4 386.5 44.2 386.5 37.7C386.5 31.2 390.6 26 397.4 26C404.2 26 408.6 30.9 408.6 37.7C408.6 44.2 404.2 49.4 397.4 49.4zM503.3 23.3C503.3 22.9999999999999 503.6 22.8 503.6 22.1999999999999C503.6 21.8999999999999 503.3 21.6999999999999 503.3 21.0999999999999C502.9999999999999 20.7999999999999 502.9999999999999 20.5999999999999 502.8 20.2999999999999C502.4999999999999 19.9999999999999 502.3 19.7999999999999 501.6999999999999 19.7999999999999C501.3999999999999 19.4999999999999 501.1999999999999 19.4999999999999 500.5999999999999 19.4999999999999C500.2999999999999 19.4999999999999 500.0999999999999 19.4999999999999 499.4999999999999 19.7999999999999C499.1999999999999 19.7999999999999 498.9999999999999 20.0999999999999 498.6999999999999 20.2999999999999C498.3999999999999 20.5999999999999 498.1999999999999 20.7999999999999 498.1999999999999 21.0999999999999C497.8999999999999 21.5999999999999 497.8999999999999 21.8999999999999 497.8999999999999 22.1999999999999C497.8999999999999 22.6999999999999 497.8999999999999 22.9999999999999 498.1999999999999 23.3C498.1999999999999 23.8 498.4999999999999 24.1 498.6999999999999 24.4C498.9999999999999 24.7 499.1999999999999 24.7 499.4999999999999 24.9C499.9999999999999 25.2 500.2999999999999 25.2 500.5999999999999 25.2C501.0999999999999 25.2 501.3999999999999 25.2 501.6999999999999 24.9C502.1999999999999 24.6 502.4999999999999 24.6 502.8 24.4S502.9999999999999 23.8 503.3 23.3zM501.1 21.9C501.6 21.9 501.6 22.2 501.9 22.2C502.2 22.5 502.2 22.7 502.2 23C502.2 23.3 502.2 23.5 501.9 23.8C501.6 23.8 501.4 24.1 500.8 24.1H499.1999999999999V20.6H499.9999999999999V22H500.3L501.4 20.6H502.2L501.1 21.9zM576 367V15C576 -11.5 554.5 -33 528 -33H48C21.5 -33 0 -11.5 0 15V367C0 393.5 21.5 415 48 415H528C554.5 415 576 393.5 576 367zM64 227.4C64 150.9 126.1 88.9 202.5 88.9C229.7 88.9 256.4 97.1 279 112C206.1 171.3 206.6 283.2 279 342.5C256.4 357.5 229.7 365.6 202.5 365.6C126.1 365.7 64 303.6 64 227.4zM288 118.6C358.5 173.6 358.2 280.8 288 336.1C217.8 280.8 217.5 173.5 288 118.6zM145.7 42.3C145.7 51 140 56.7 131 57C126.4 57 121.5 55.6 118.2 50.5C115.8 54.6 111.7 57 106 57C102.2 57 98.4 55.6 95.4 51.6V56H87.2V19.3H95.4C95.4 38.2 92.9 49.5 104.4 49.5C114.6 49.5 112.6 39.3 112.6 19.3H120.5C120.5 37.6 118 49.5 129.5 49.5C139.7 49.5 137.7 39.5 137.7 19.3H145.9V42.3zM190.6 56H182.7V51.6C180 54.9 176.2 57 171 57C160.7 57 152.8 48.8 152.8 37.7C152.8 26.5 160.7 18.4 171 18.4C176.2 18.4 180 20.3 182.7 23.8V19.1999999999999H190.6V56zM231.1 30.4C231.1 45.4 208.2 38.6 208.2 45.6C208.2 51.3 220.1 50.4 226.7 46.7L230 53.2C220.6 59.3 199.8 59.2 199.8 45C199.8 30.7 222.7 36.7 222.7 30C222.7 23.7 209.2 24.2 202 29.2L198.5 22.9C209.7 15.3 231.1 16.9 231.1 30.4zM266.5 21.1L264.3 27.9C260.5 25.8 252.1 23.5 252.1 32V48.6H265.2000000000001V56H252.1000000000001V67.2H243.9000000000001V56H236.3000000000001V48.7H243.9000000000001V32C243.9000000000001 14.4 261.2000000000001 17.6 266.5000000000001 21.1zM279.8 34.4999999999999H307.3C307.3 50.6999999999999 299.9000000000001 57.1 289.9000000000001 57.1C279.3 57.1 271.7000000000001 49.2 271.7000000000001 37.8C271.7000000000001 17.3 294.3000000000001 13.9 305.5000000000001 23.6L301.7000000000001 29.6C293.9000000000001 23.2 282.1 23.8 279.8000000000001 34.4999999999999zM338.9000000000001 55.9999999999999C334.3 57.9999999999999 327.3 57.8 323.7000000000001 51.6V56H315.5000000000001V19.3H323.7000000000001V40C323.7000000000001 51.6 333.2000000000001 50.1 336.5000000000001 48.4L338.9000000000001 56zM349.5000000000001 37.6999999999999C349.5000000000001 49.0999999999999 361.1000000000001 52.8 370.2000000000001 46.0999999999999L374.0000000000001 52.5999999999999C362.4000000000001 61.6999999999999 341.3000000000001 56.6999999999999 341.3000000000001 37.5999999999999C341.3000000000001 17.7999999999999 363.7000000000001 13.7999999999999 374.0000000000001 22.5999999999999L370.2000000000001 29.0999999999999C361.0000000000001 22.5999999999999 349.5000000000001 26.4999999999999 349.5000000000001 37.6999999999999zM416.2000000000001 55.9999999999999H408V51.6C399.7 62.6 378.1 56.4 378.1 37.7C378.1 18.5 400.5 13 408 23.8V19.2H416.2V56zM449.9000000000001 55.9999999999999C447.5000000000001 57.1999999999999 438.9000000000001 58.8999999999999 434.7000000000001 51.6V56H426.8000000000001V19.3H434.7000000000001V40C434.7000000000001 51 443.7000000000001 50.3 447.5000000000001 48.4L449.9000000000001 56zM490.2 70.8999999999999H482.3000000000001V51.5999999999999C474.1000000000001 62.4999999999999 452.4000000000001 56.6999999999999 452.4000000000001 37.6999999999999C452.4000000000001 18.3 474.9000000000001 13.0999999999999 482.3000000000001 23.8V19.1999999999999H490.2V70.8999999999999zM497.8000000000001 145.9999999999999V141.3999999999999H498.6000000000001V146H500.5000000000001V146.8H495.9V146H497.8zM504.4000000000001 22.1999999999999C504.4000000000001 22.6999999999999 504.4000000000001 23.2999999999999 504.1000000000001 23.7999999999999C503.8000000000001 24.0999999999999 503.6000000000001 24.5999999999999 503.3000000000001 24.8999999999999C503.0000000000001 25.1999999999999 502.5000000000001 25.3999999999999 502.2 25.6999999999999C501.7 25.6999999999999 501.1 25.9999999999999 500.6 25.9999999999999C500.3 25.9999999999999 499.8 25.6999999999999 499.2 25.6999999999999C498.7 25.3999999999999 498.4 25.1999999999999 498.1 24.8999999999999C497.6 24.5999999999999 497.3 24.0999999999999 497.3 23.7999999999999C497 23.2999999999999 497 22.6999999999999 497 22.1999999999999C497 21.8999999999999 497 21.3999999999999 497.3 20.7999999999999C497.3 20.4999999999999 497.6 19.9999999999999 498.1 19.6999999999999C498.4 19.3999999999999 498.6 19.1999999999999 499.2 18.8999999999999C499.7 18.5999999999999 500.3000000000001 18.5999999999999 500.6 18.5999999999999C501.1 18.5999999999999 501.7 18.5999999999999 502.2 18.8999999999999C502.5000000000001 19.1999999999999 503.0000000000001 19.3999999999999 503.3000000000001 19.6999999999999C503.6000000000001 19.9999999999999 503.8000000000001 20.4999999999999 504.1000000000001 20.7999999999999C504.4000000000001 21.3999999999999 504.4000000000001 21.8999999999999 504.4000000000001 22.1999999999999zM507.6000000000001 146.8999999999999H506.2000000000001L504.6000000000001 143.3999999999999L503.0000000000001 146.8999999999999H501.6000000000001V141.4999999999999H502.4000000000001V145.5999999999999L504.0000000000001 142.0999999999999H505.1000000000001L506.5000000000001 145.5999999999999V141.4999999999999H507.6000000000001V146.8999999999999zM512.0000000000001 227.3999999999999C512.0000000000001 303.5999999999999 449.9000000000001 365.6999999999999 373.5000000000001 365.6999999999999C346.3000000000002 365.6999999999999 319.6000000000002 357.4999999999999 297.0000000000001 342.5999999999999C369.1000000000002 283.2999999999999 370.2000000000001 171.0999999999999 297.0000000000001 112.0999999999999C319.6000000000002 97.0999999999999 346.5000000000001 88.9999999999999 373.5000000000001 88.9999999999999C449.9000000000001 88.8999999999999 512.0000000000001 150.8999999999999 512.0000000000001 227.3999999999999z" />
+    <glyph glyph-name="cc-paypal"
+      unicode="&#xF1F4;"
+      horiz-adv-x="576" d=" M186.3 189.8C186.3 177.6 176.6 168.3 164.3 168.3C155.1 168.3 148.3 173.5 148.3 183.3C148.3 195.5 157.8 205.3 170 205.3C179.3 205.3 186.3 199.6 186.3 189.8zM80.5 238.3H75.8C74.3 238.3 72.8 237.3 72.6 235.6L68.3 208.9L76.5 209.2000000000001C87.5 209.2000000000001 96 210.7000000000001 98 223.4C100.3 236.8000000000001 91.8 238.3000000000001 80.5 238.3000000000001zM364.5 238.3H360C358.2 238.3 357 237.3 356.8 235.6L352.6 208.9L360.6 209.2000000000001C373.6 209.2000000000001 382.6 212.2000000000001 382.6 227.2000000000001C382.5 237.8000000000001 373 238.3000000000001 364.5 238.3000000000001zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM128.3 232.6C128.3 253.6 112.1 260.6 93.6 260.6H53.6C51.1 260.6 48.6 258.6 48.4 255.9L32 153.8C31.7 151.8 33.2 149.8 35.2 149.8H54.2C56.9 149.8 59.4 152.7 59.7 155.5L64.2 182.1C65.2 189.3 77.4 186.8 82.2 186.8C110.8 186.8 128.3 203.8 128.3 232.6zM212.5 223.8H193.5C189.7 223.8 189.5 218.3 189.3 215.6C183.5 224.1 175.1 225.6 165.6 225.6C141.1 225.6 122.4 204.1 122.4 180.4C122.4 160.9 134.6 148.2 154.1 148.2C163.1 148.2 174.3 153.1 180.6 160.1C180.1 158.6 179.6 155.4 179.6 153.9C179.6 151.6 180.6 149.9 182.8 149.9H200C202.7 149.9 205 152.8 205.5 155.6L215.7 219.9C216 221.8 214.5 223.8 212.5 223.8zM253 125.9L316.7 218.5C317.2 219 317.2 219.5 317.2 220.2C317.2 221.9 315.7 223.7 314 223.7H294.8C293.1 223.7 291.3 222.7 290.3 221.2L263.8 182.1999999999999L252.8 219.6999999999999C252 221.8999999999999 249.8 223.6999999999999 247.3 223.6999999999999H228.6C226.9000000000001 223.6999999999999 225.4000000000001 221.8999999999999 225.4000000000001 220.1999999999999C225.4000000000001 219 244.9000000000001 163.3999999999999 246.6 158.0999999999999C243.9000000000001 154.2999999999999 226.1 129.4999999999999 226.1 126.4999999999999C226.1 124.6999999999999 227.6 123.2999999999999 229.3 123.2999999999999H248.5C250.3 123.3999999999999 252 124.3999999999999 253 125.8999999999999zM412.3 232.6C412.3 253.6 396.1 260.6 377.6 260.6H337.9000000000001C335.2000000000001 260.6 332.7000000000001 258.6 332.4000000000001 255.9L316.2000000000001 153.9C316.0000000000001 151.9 317.5000000000001 149.9 319.4000000000001 149.9H339.9000000000001C341.9000000000001 149.9 343.4000000000001 151.4 343.9000000000001 153.1L348.4000000000001 182.1C349.4000000000001 189.3 361.6 186.8 366.4000000000001 186.8C394.8 186.8 412.3 203.8 412.3 232.6zM496.5 223.8H477.5C473.7 223.8 473.5 218.3 473.2 215.6C467.7 224.1 459.2 225.6 449.5 225.6C425 225.6 406.3 204.1 406.3 180.4C406.3 160.9 418.5 148.2 438 148.2C447.3 148.2 458.5 153.1 464.5 160.1C464.2 158.6 463.5 155.4 463.5 153.9C463.5 151.6 464.5 149.9 466.7 149.9H484C486.7 149.9 489 152.8 489.5 155.6L499.7 219.9C500 221.8 498.5 223.8 496.5 223.8zM544 257.1C544 259.1 542.5 260.6 540.8 260.6H522.3C520.8 260.6 519.3 259.4 519.0999999999999 257.9L502.8999999999999 153.9L502.5999999999999 153.4C502.5999999999999 151.6 504.0999999999999 149.9 506.0999999999999 149.9H522.5999999999999C525.0999999999999 149.9 527.5999999999999 152.8 527.8 155.6L544 256.8V257.1zM454 205.3C441.8 205.3 432.3 195.6 432.3 183.3C432.3 173.6 439.3 168.3 448.5 168.3C460.5 168.3 470.2 177.5 470.2 189.8C470.3 199.6 463.3 205.3 454 205.3z" />
+    <glyph glyph-name="cc-stripe"
+      unicode="&#xF1F5;"
+      horiz-adv-x="576" d=" M396.9 191.5C396.9 172.4 388.1 158.1 375 158.1C366.7 158.1 361.7 161.1 358.2 164.8L358 217.6C361.7 221.7 366.8 224.6 375 224.6C387.9 224.7 396.9 210.1 396.9 191.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM122.2 166.9C122.2 209.2 67.9 201.6 67.9 217.6C67.9 223.1 72.5 225.3 80 225.3C90.8 225.3 104.5 222 115.3 216.2V249.6C103.5 254.3 91.8 256.1 80 256.1C51.2 256.1 32 241.1 32 215.9C32 176.6 86 183 86 166C86 159.4 80.3 157.3 72.4 157.3C60.6 157.3 45.5 162.2 33.5 168.6V134.7000000000001C46.7 129.0000000000001 60.1 126.6 72.3 126.6C101.9 126.8 122.2 141.3 122.2 166.9zM191.1 253.8H164.1V284.6L129.4 277.2L129.2000000000001 163.3C129.2000000000001 142.3 145.0000000000001 126.8 166.1000000000001 126.8C177.7000000000001 126.8 186.3000000000001 128.9 191.0000000000001 131.5V160.3999999999999C186.5000000000001 158.5999999999999 164.0000000000001 152.0999999999999 164.0000000000001 173V223.5H191.0000000000001V253.8zM264.9000000000001 253.8C260.2000000000001 255.5 243.6 258.6 235.3000000000001 243.3L233.1000000000001 253.8H202.4000000000001V129.3H237.9000000000001V213.7C246.3000000000001 224.7 260.5000000000001 222.6 265.0000000000001 221.1V253.8zM309.1 253.8H273.4000000000001V129.3H309.1V253.8zM309.1 301.1L273.4000000000001 293.5V264.6L309.1 272.2V301.1zM431.8 192.3C431.8 233.6 408.3 256.1 383.4000000000001 256.1C369.5000000000001 256.1 360.5000000000001 249.5 355.6 245L353.8 253.8H322.5V88L358 95.5L358.1 135.7C363.2000000000001 132 370.8 126.7 383.2000000000001 126.7C408.6 126.8 431.8000000000001 147.2 431.8000000000001 192.3zM544 191.1C544 227.5 526.4 256.2 492.7 256.2C458.9 256.2 438.4 227.5 438.4 191.3C438.4 148.5 462.6 126.8 497.2 126.8C514.2 126.8 526.9 130.6999999999999 536.6 136V164.6C526.9 159.7 515.8000000000001 156.7 501.7 156.7C487.9 156.7 475.7 161.6 474.1 178.2H543.6C543.7 180.2 544 187.6 544 191.1zM492.4 227.2C483.5 227.2 473.7 220.5 473.7 204.5H510.4C510.4 220.5 501.1 227.2 492.4 227.2z" />
+    <glyph glyph-name="cc-visa"
+      unicode="&#xF1F0;"
+      horiz-adv-x="576" d=" M470.1 216.7S477.7 179.5 479.4 171.7H446C449.3 180.6 462 215.2 462 215.2C461.8 214.9 465.3 224.3 467.3 230.1L470.1 216.7zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM152.5 116.8L215.7 272H173.2L133.9 166L129.6 187.5L115.6 258.9C113.3 268.8 106.2 271.6 97.4 272H32.7L32 268.9C47.8 264.9 61.9 259.1 74.2 251.8L110 116.8H152.5zM246.9 116.6L272.1 272H231.9000000000001L206.8000000000001 116.6H246.9000000000001zM386.8 167.4C387 185.1 376.2 198.6 353.1 209.7000000000001C339 216.8000000000001 330.4000000000001 221.6000000000001 330.4000000000001 228.9000000000001C330.6 235.5000000000001 337.7000000000001 242.3000000000001 353.5000000000001 242.3000000000001C366.6000000000001 242.6000000000001 376.2000000000001 239.5000000000001 383.4000000000001 236.4000000000001L387.0000000000001 234.7000000000001L392.5000000000001 268.3000000000001C384.6000000000001 271.4000000000001 372.0000000000001 274.9000000000001 356.5000000000001 274.9000000000001C316.8000000000001 274.9000000000001 288.9000000000001 253.7000000000001 288.7000000000001 223.5C288.4000000000001 201.2 308.7000000000001 188.8 323.9000000000001 181.3C339.4000000000001 173.7 344.7000000000001 168.7 344.7000000000001 162C344.5000000000001 151.6 332.1 146.8 320.6 146.8C304.6 146.8 296 149.3 282.9000000000001 155.1L277.6 157.6L272 122.7000000000001C281.4 118.4 298.8 114.6 316.8 114.4C359 114.3 386.5 135.2000000000001 386.8 167.4zM528 116.6L495.6 272H464.5C454.9 272 447.6 269.2 443.5 259.1L383.8 116.6H426S432.9 135.8 434.4 139.9H486C487.2 134.4 490.8 116.6 490.8 116.6H528z" />
+    <glyph glyph-name="centercode"
+      unicode="&#xF380;"
+      horiz-adv-x="512" d=" M329.2 179.4C325.4 144.2 293.8 118.8 258.6 122.6C223.4 126.4 198 158 201.8 193.2C205.6 228.4 237.2 253.8 272.4 250C307.5 246.2 333 214.5999999999999 329.2 179.4zM243.4 -55.7C96.7 -48 -8.2 82.5 10.1 223.7C21.3 310.3 75.9 380.6 149.2 415.7C310.2 492.8 498.9 378.3 503.9 199.1C508 52.1 385.5 -63.1 243.4 -55.7zM423.3 124.3C451.1999999999999 242.3 262.8 330.2 186.1 358.5C128.6 302.2 117 169.9 152.3 14.1C221.1 -1.7 321.4 40.4999999999999 423.3 124.3z" />
+    <glyph glyph-name="chrome"
+      unicode="&#xF268;"
+      horiz-adv-x="496" d=" M131.5 230.5L55.1 347.9C102.7 407.1 174.1 439.7 247.1 440C289.4 440.3 332.6 429.5 371.9 406.8C415.3 381.6 448.3 345.4 469.3 303.8L264 314.6C205.9 318 150.6 285.3 131.5 230.5zM164.4 192C164.4 145.8 201.8 108.4 248 108.4S331.6 145.8 331.6 192S294.2000000000001 275.6 248.0000000000001 275.6S164.4 238.3 164.4 192zM479.3 281.2L339.6 274C377.5 229.7 378.1 165.8 346.2000000000001 116.8L234.1 -55.6C280.6 -58.1 328.5 -47.9 371.9 -22.7C479.3 39.3 522.8 169.3 479.3 281.2zM133.7 144.4L40.4 327.9C14.9 288.9 0 242.1 0 192C0 68 90.8 -34.7 209.5 -52.9L273.2 71.9C215.6 61.1 160 92.7000000000001 133.7 144.4z" />
+    <glyph glyph-name="cloudscale"
+      unicode="&#xF383;"
+      horiz-adv-x="448" d=" M318.1 294L308.7000000000001 286.4C286.2000000000001 305.7000000000001 257.2000000000001 320 225.4000000000001 320C153.8 320 96 259.2 96 187.7C96 181.1 96.4 174.6 97.4 168.3C95.4 224.3 139.2 265.7000000000001 190 265.7000000000001C214.2 265.7000000000001 236.2 256.3 252.6 241.0000000000001L227.4 220.6C219.1 221.5 210.6 218.8 204.3 212.5C193.2 201.5 193.2 183.6 204.3 172.5C215.4 161.5 233.2 161.5 244.3 172.5C250.6 178.8 253.3 187.4 252.4 195.6L327.6 284.4C333.9000000000001 290.9 324.3 300.3 318.1 294zM234.3 182.5C228.7 177 219.7 177 214.1 182.5C208.5 188.1 208.5 197.1 214.1 202.7S228.7 208.3 234.3 202.7S239.9 188 234.3 182.5zM224 416C100.5 416 0 315.5 0 192S100.5 -32 224 -32S448 68.5 448 192S347.5 416 224 416zM224 32C135.8 32 64 103.8 64 192S135.8 352 224 352S384 280.2 384 192S312.2 32 224 32z" />
+    <glyph glyph-name="cloudsmith"
+      unicode="&#xF384;"
+      horiz-adv-x="332" d=" M332.5 28.1C332.5 -18.3 294.9 -56 248.5 -56S164.5 -18.3 164.5 28.1S202.1 112.1 248.5 112.1S332.5 74.5 332.5 28.1zM248.5 272C294.9 272 328.5 309.6 328.5 356S294.9 440 248.5 440S160.5 402.4000000000001 160.5 356S130.9 280 84.5 280S0.5 238.4000000000001 0.5 192S38.1 112 84.5 112S168.5 145.6 168.5 192S202.1 272 248.5 272z" />
+    <glyph glyph-name="cloudversify"
+      unicode="&#xF385;"
+      horiz-adv-x="616" d=" M148.6 144C156.8 75.5 216 28.5 294.6 32.7C345.8 -10.6 431.4000000000001 -13.1 481 38.3C550.2 37.2 599.5 82.9 612.5 137.8C627.3 200.3 594.3 270.3 520.4 292.9C487.4 381 389 394.4 333.9 377.9C276.6 360.6 249.6 324.7 234.6 268.2C226.8 265.5 208.1 259.3 189.6 244.1C201.3 244.1 204.8 235.2 204.8 224.6V204.2C204.8 193.5 196.1 184.7 185.3 184.7H165.1C154.4 184.7 145.6 190.7 145.6 201.4V208H98.8C95 208 88 203.7 88 196.1V155.7C88 149.3 93.3 143.9 99.7 143.9H148.6zM376 136C365.3 89.7 397.7 63.6 431.3 49.2C324.1 15.4 259.7 100 296 160C262.8 138.4 262.3 88.8 266.8 67.1C248.9 79.5 213 99.5 209.4 146.9C206.4 186.8 230.9 222.6 266.4 240.8000000000001C297 256.6 369.9 249.3 400 200C385.9 248 346.2 270.1 298.2 274.8C329.1 305.5 362.6 325.1 412.4 318.5C482.2 309.2 545.5999999999999 235.7 480.1 168C515.0999999999999 184.3 528.8 222.4 527.5999999999999 244.9L538.0999999999999 225.3C549.8999999999999 203.3 553.3 177.7 547.4999999999999 153.3C538.2999999999998 114.3 506.8999999999999 84.5 467.7999999999999 76.8C435.6999999999999 70.5 384.7 81.9 375.9999999999999 136zM128 240H88.2C79.3 240 72 247.3 72 256.2V295.8C72 304.7 79.3 312 88.2 312H128C136.9 312 144.2 304.7 144.2 295.8V256.2C144.2 247.3 136.9 240 128 240zM10.1 280C4.5 280 0 284.5 0 290.1V317.9C0 323.5 4.5 328 10.1 328H37.8C43.3 328 47.9 323.5 47.9 317.9V290.1C47.9 284.5 43.4 280 37.8 280H10.1zM168 305.3V326.7000000000001C168 331.8 172.2 336 177.3 336H198.7C203.8 336 208 331.8 208 326.7000000000001V305.3C208 300.2000000000001 203.8000000000001 296 198.7 296H177.3C172.2 296 168 300.2 168 305.3zM56 212.5V187.5C56 181.2 50.9 176 44.6 176H19.4C13.1 176 8 181.2 8 187.5V212.5C8 218.8 13.1 224 19.4 224H44.5C50.9 224 56 218.8 56 212.5z" />
+    <glyph glyph-name="codepen"
+      unicode="&#xF1CB;"
+      horiz-adv-x="512" d=" M502.285 288.296L268.2850000000001 444.296C260.298 449.211 251.7740000000001 449.256 243.7140000000001 444.296L9.714 288.296C3.714 284.2970000000001 0 277.153 0 270.011V114.012C0 106.869 3.714 99.726 9.715 95.726L243.715 -60.296C251.702 -65.211 260.226 -65.256 268.286 -60.296L502.286 95.726C508.286 99.725 512.001 106.869 512.001 114.012V270.011C512 277.153 508.286 284.2970000000001 502.285 288.296zM278 384.8690000000001L450.286 270.011L373.429 218.582L278 282.2970000000001V384.8690000000001zM234 384.8690000000001V282.2970000000001L138.571 218.582L61.714 270.011L234 384.8690000000001zM44 228.868L99.143 192.011L44 155.154V228.868zM234 -0.847L61.714 114.011L138.571 165.4400000000001L234 101.725V-0.847zM256 140.011L178.285 192.011L256 244.011L333.7150000000001 192.011L256 140.011zM278 -0.847V101.725L373.429 165.4400000000001L450.286 114.0110000000001L278 -0.847zM468 155.154L412.857 192.011L468 228.868V155.154z" />
+    <glyph glyph-name="codiepie"
+      unicode="&#xF284;"
+      horiz-adv-x="472" d=" M422.5 245.1C453.2 245.1 456 192 422.2 192H411.4V147.7H384.8V245.1H422.5zM472 95.4C429.9 3.5 350.4 -56 248 -56C111 -56 0 55 0 192S111 440 248 440C345.4 440 420.8 386.3 466.2 301.6L280.2 192.8L472 95.4zM433.5 82.9L373.2 113.6C346.1 69.3 302.8 42.1999999999999 250.8 42.1999999999999C168.3 42.1999999999999 101.6 108.8999999999999 101.6 191.0999999999999C101.6 273.5999999999999 168.3 340.2999999999999 250.8 340.2999999999999C299.2 340.2999999999999 339.7 316.7999999999999 367.7 276.8999999999999L427.2 311.4999999999999C386.5 374.0999999999999 322.5 411.4999999999999 248 411.4999999999999C126.8 411.4999999999999 28.5 313.1999999999999 28.5 191.9999999999999S126.8 -27.5 248 -27.5C326.6 -27.5 394.5 14.6 433.5 82.9z" />
+    <glyph glyph-name="connectdevelop"
+      unicode="&#xF20E;"
+      horiz-adv-x="576" d=" M550.5 207L500.411 293.786C501.482 295.928 502.286 298.339 502.286 301.0180000000001C502.286 309.054 495.59 315.751 487.554 316.019L432.107 411.9120000000001C432.643 413.519 433.178 415.126 433.178 416.733C433.178 425.304 426.214 432.001 417.91 432.001C413.089 432.001 409.071 429.858 406.124 426.376H299.518C296.839 429.857 292.8210000000001 432 288 432S279.161 429.857 276.482 426.375H170.411C167.464 429.857 163.447 432 158.625 432C150.322 432 143.357 425.304 143.357 416.732C143.357 415.125 143.893 413.25 144.429 411.911L88.446 314.678C83.09 312.2680000000001 79.339 307.178 79.339 301.017C79.339 300.482 79.607 299.9460000000001 79.607 299.41L26.303 207.267C19.071 205.928 13.713 199.767 13.713 192.267C13.713 185.035 18.802 178.874 25.767 177.267L80.946 81.909C80.41 80.302 80.142 78.963 80.142 77.088C80.142 69.8559999999999 85.231 63.6949999999999 92.196 62.356L143.893 -27.376C143.357 -28.983 142.822 -30.858 142.822 -32.733C142.822 -41.304 149.786 -48.001 158.09 -48.001C162.911 -48.001 166.929 -45.858 169.608 -42.6439999999999H276.483C279.161 -45.857 283.447 -48 288 -48S296.839 -45.857 299.5180000000001 -42.643H406.6610000000001C409.3390000000001 -45.589 413.3570000000001 -47.464 417.6430000000001 -47.464C426.2140000000001 -47.464 432.9110000000001 -40.5 432.9110000000001 -32.196C432.9110000000001 -30.589 432.6440000000001 -29.25 432.1080000000001 -27.911L483.8050000000001 62.357C490.7690000000001 63.696 495.859 69.857 495.859 77.0889999999999C495.859 78.696 495.5910000000001 80.3029999999999 495.0550000000001 81.91L549.9660000000001 177.268C556.9300000000002 178.607 562.2880000000001 184.768 562.2880000000001 192.268C562.2860000000002 199.5 557.1960000000001 205.661 550.5000000000001 207zM153.535 -2.732L109.875 73.071H153.535V-2.732zM153.535 81.107H109.875C109.607 82.178 109.071 83.249 108.536 84.321L153.535 131.731V81.107zM153.535 143.518L103.178 90.2139999999999C101.839 90.7499999999999 100.499 91.5539999999999 99.16 91.821L43.447 188.25C43.982 189.589 43.982 190.929 43.982 192.268S43.982 194.678 43.714 195.75L95.679 285.75C98.358 286.0180000000001 101.036 286.822 103.447 288.429L153.536 236.464V143.518zM153.535 245.84L107.732 293.25C109.071 295.393 109.875 298.071 109.875 301.017C109.875 301.285 109.607 301.821 109.607 302.089L153.535 317.893V245.84zM153.535 326.465L109.875 310.661L153.535 386.197V326.465zM480.054 287.357L480.8579999999999 286.018L445.5 118.875L381.75 186.107L479.786 287.625L480.054 287.357zM291.75 92.893L303.2680000000001 81.107H280.5L291.75 92.893zM291.4820000000001 104.143L208.179 189.589L287.7320000000001 273.964L370.7680000000001 186.375L291.4820000000001 104.1429999999999zM296.8390000000001 98.25L376.1250000000001 180.482L443.6250000000001 109.232L437.7330000000001 81.107H313.714L296.839 98.25zM410.411 403.607C411.4820000000001 403.0710000000001 412.553 402.535 413.8930000000001 402.267L471.75 301.553V301.017C471.75 298.0710000000001 472.553 295.3930000000001 473.893 293.25L376.393 192L293.358 279.589L410.411 403.607zM401.304 405.75L287.7320000000001 285.482L230.6780000000001 345.75L397.0170000000001 405.75H401.3040000000001zM277.821 405.75C280.499 403.072 283.981 401.4650000000001 288 401.4650000000001S295.5 403.072 298.1789999999999 405.75H373.1789999999999L224.786 352.179L173.893 405.75H277.8210000000001zM161.572 400.125L162.643 402.267A33.834 33.834 0 0 1 165.322 403.0710000000001L216.483 349.231L161.572 329.41V400.125zM161.572 320.839L222.375 342.803L282.107 279.589L202.554 195.482L161.572 237.535V320.839zM161.572 228.161L198 190.393L161.572 152.089V228.161zM161.572 140.303L203.625 184.767L286.393 98.785L269.25 81.107H161.572V140.303zM168.536 -21.75C166.929 -20.143 165.054 -19.072 162.643 -18.268L161.572 -16.6609999999999V73.071H261.482L169.875 -21.75H168.536zM298.447 -21.75C295.7680000000001 -19.34 292.019 -17.465 288 -17.465S280.233 -19.34 277.553 -21.75H181.124L272.731 73.071H311.035L402.642 -21.75H298.447zM418.447 -9.964L414.161 -17.464C412.822 -17.732 411.751 -18.267 410.679 -18.803L321.483 73.072H435.8589999999999L418.447 -9.964zM431.303 12.268L444.161 73.071H466.125L431.303 12.268zM466.125 81.107H445.7680000000001L450.3210000000001 102.2670000000001L467.4640000000001 84.0530000000001C466.929 83.2500000000001 466.393 82.179 466.1250000000001 81.107zM532.2860000000001 188.518L476.8390000000001 91.821C475.5000000000001 91.286 474.1600000000001 90.75 472.8210000000001 89.947L452.1960000000001 111.911L486.7500000000001 275.839L532.5530000000001 196.553C532.2860000000001 195.214 531.7500000000001 193.875 531.7500000000001 192.268C531.7500000000001 190.929 532.0180000000001 189.857 532.2860000000001 188.518z" />
+    <glyph glyph-name="contao"
+      unicode="&#xF26D;"
+      horiz-adv-x="512" d=" M45.4 143C59.8 75.9 71.8 14 113.6 -32H34C15.3 -32 0 -16.8 0 2V382C0 400.7 15.2 416 34 416H91.7C77.9 403.4 65.6 388.8 54.8 372.4C9.4 302.4 27.8 225.6 45.4 143zM478 416H387.8C409.2 394.6 427 366.5 440.5 331.9L303.4 302.6C288.5 331.6 265.6 355.9 220.8 346.5C196.2 341.2 179.8 327.2 172.5 311.9C163.7 293.2000000000001 159.3 272.1 180.7 171.6C201.8 71.4 214.4 53.9 230.2 40.4C243.1 29.3 263.6 23.4 288.5 28.7C333 38.1 344.2 69.4 345.9 101.9L483.3 131.5000000000001C486.4999999999999 60.0000000000001 464.6 6.3000000000001 425.9 -32.0999999999999H478C496.7 -32.0999999999999 512 -16.8999999999999 512 1.9000000000001V382C512 400.8 496.8 416 478 416z" />
+    <glyph glyph-name="cpanel"
+      unicode="&#xF388;"
+      horiz-adv-x="640" d=" M52.9 234.3H92.9L86.7 210.7C84.8 204.2 79.3 199.8 72.4 199.8H53.8C28.9 199.8 29.1 162.4 53.8 162.4H65.1C69.3 162.4 72.7 158.5000000000001 71.5 154.1L64.4 128H52C18.5 128 -7 159.4 1.7 193.2C9 220.2 30 234.3 52.9 234.3M73.1 128L108 258.1C109.8 264.5 115.2 269 122.3 269H159.3C183.4 269 204.7 252.6 210.3 227.8C216.9 198.7 195.8 162.5 158.6 162.5H126.6L133 186.3C134.8000000000001 192.5 140.3000000000001 197.1 147.3000000000001 197.1H157.6000000000001C170.0000000000001 197.1 178.4000000000001 208.8 175.9000000000001 219.7C173.8000000000001 228.9 166.0000000000001 234.5000000000001 157.6000000000001 234.5000000000001H137.8000000000001L112 138.8C110.1 132.6 104.6 128.1 97.8 128.1L73.1 128M293.7 197.4C294 198.4 295.6 202.7 291.6 202.7H234.1C224.4 202.7 217.5 211.6 219.9 221.2L223.4 234.6H301.3C320.1 234.6 334.6 217 329.8 197.8L315.8 146C313 135.4 303.6 128.2 292.4 128.2L234.9 128.4C192 128.4 196.4 192.2 235.6 192.2H284L280.5 179C278.6 172.8 273.1 168.2 266.3 168.2H244.7C239.4 168.2 239.4 160.3 244.7 160.3H279.6C284.2000000000001 160.3 284.7000000000001 164.2 285.1 165.6L293.7000000000001 197.4M396.8000000000001 234.3000000000001C431.2000000000001 234.3000000000001 456.1000000000001 202.0000000000001 447.1000000000001 168.9L438.3000000000001 135.8C437.1000000000001 130.9 432.6000000000001 128 428.0000000000001 128H408.9000000000001C404.4000000000001 128 401.3 132 402.5000000000001 136.3L413.1000000000001 176.3C416.4000000000001 187.9 407.5000000000001 199.7 395.0000000000001 199.7H375.2000000000001L358.0000000000001 135.7000000000001C356.8000000000001 130.9 352.4000000000001 127.9 347.6000000000001 127.9H328.7000000000001C324.5000000000001 127.9 321.1000000000001 131.8 322.3000000000002 136.2000000000001L348.5000000000001 234.2000000000001H396.8000000000002M498 196.4L490 166.4C489.1 163.1 491.5 159.7 495.1 159.7H568.4L562.6999999999999 138.7C560.8 132.5 555.3 128 548.4999999999999 128H481.7999999999999C461.7999999999999 128 448.4999999999999 147 453.4999999999999 164.7L464.2999999999999 204.7C469.0999999999999 222.3 484.9999999999999 234.3 502.8999999999999 234.3H550.1999999999999C569.1999999999999 234.3 583.4 216.6 578.4999999999999 197.5L575.2999999999998 185.5C572.3999999999999 174.5 562.5999999999998 167.9 552.0999999999998 167.9H498.6999999999998L502.1999999999998 180.9C503.7999999999998 187.1 509.3999999999998 191.7 516.3999999999999 191.7H538C540 191.7 541.3 192.7 541.9 194.7L542.6 197.3C543.3000000000001 200 541.3000000000001 202.4 538.7 202.4H505.8000000000001C501.7 202.4 498.9000000000001 200.3 498.0000000000001 196.4zM568.2 128L603.8000000000001 261.1C605.0000000000001 265.8 609.3000000000001 269 614.2 269H633.1C637.6 269 640.8000000000001 265 639.6 260.7L613.1 162.5C608 141.8 588.9 128 568.2 128" />
+    <glyph glyph-name="creative-commons"
+      unicode="&#xF25E;"
+      horiz-adv-x="512" d=" M255.547 440C392.884 440 504 333.5610000000001 504 191.996C504 42.021 381.106 -56 255.562 -56C122.319 -56 8 53.443 8 191.996C8 323.175 113.486 440 255.547 440zM256.446 395.266C136.105 395.266 52.719 294.698 52.719 191.988C52.719 85.473 141.703 -10.406 256.446 -10.406C357.974 -10.406 459.2669999999999 69.036 459.2669999999999 191.981C459.266 306.754 367.4939999999999 395.266 256.4459999999999 395.266zM253.338 233.173L220.113 215.898C214.718 227.101 204.863 235.824 192.654 235.824C170.52 235.824 159.437 221.215 159.437 191.982C159.437 168.14 168.883 148.14 192.654 148.14C207.1229999999999 148.14 217.3069999999999 155.231 223.22 169.399L253.771 153.899C240.958 130 216.8839999999999 114.924 188.6699999999999 114.924C145.5079999999999 114.924 114.7109999999999 142.196 114.7109999999999 191.976C114.7109999999999 241.517 147.4169999999999 269.035 187.3449999999999 269.035C218.0589999999999 269.048 240.0459999999999 257.089 253.3379999999999 233.173zM396.382 233.173L363.607 215.898C358.09 227.38 348.283 235.824 335.707 235.824C313.565 235.824 302.482 221.215 302.482 191.982C302.482 168.076 311.984 148.14 335.707 148.14C350.161 148.14 360.352 155.231 366.25 169.399L397.25 153.899C383.887 130.03 359.799 114.924 332.164 114.924C288.725 114.924 258.205 141.912 258.205 191.976C258.205 241.499 290.903 269.035 330.831 269.035C361.5370000000001 269.048 383.4000000000001 257.089 396.382 233.173z" />
+    <glyph glyph-name="css3-alt"
+      unicode="&#xF38B;"
+      horiz-adv-x="384" d=" M0 416L34.9 20.2L192 -32L349.1 20.2L384 416H0zM313.1 336L308.3 288.7L193 239.4L192.7 239.3H304.2L291.4 92.7000000000001L193.2 64.0000000000001L94.4 93.2000000000001L88 167.1H136.9L140.1 128.8L192.7 115.5L247.4 130.9L251.1 192.5L84.8 193V193.1L84.6 193L81 239.3L193.1 286L199.6 288.7H76.7L70.9 336H313.1z" />
+    <glyph glyph-name="css3"
+      unicode="&#xF13C;"
+      horiz-adv-x="512" d=" M480 416L416 48L192.7 -32L0 48L19.6 142.8H101.6L93.6 102.2L210 57.8L344.1 102.2L362.9000000000001 199.3H29.5L45.5 281.3H379.2L389.7 334H56.3L72.6 416H480z" />
+    <glyph glyph-name="cuttlefish"
+      unicode="&#xF38C;"
+      horiz-adv-x="440" d=" M344 142.5C326.5 110.9 286.6 88 248 88C191.4 88 144 135.4 144 192S191.4 296 248 296C286.6 296 326.5 273.1 344 241.5C357.7 292.4 385.7 334.8 431 359.3C385.7 408.9 320.5 440 248 440C111 440 0 329 0 192S111 -56 248 -56C320.5 -56 385.7 -24.9 431 24.7C385.7 49.2 357.7 91.6 344 142.5z" />
+    <glyph glyph-name="d-and-d"
+      unicode="&#xF38D;"
+      horiz-adv-x="576" d=" M82.5 349.1C81.9 366.3 84.5 382.9 95.2 397.3C95.5 389.9 96.4 382.8 99.4 375.7C105.3 403.2 119.1 425 141.7 441.2C139.8 435.3 138.2 429.4 138.7 423.5C147.4 430.9 157.5 441.3 183.1 446.2C197.8 449 212.8 448.2 225.2 445.2C263.7 435.9 286.2 410.9 294.9 372.9C300.2 349.8 295.6 327.9 286.6 306.5C281.4 294.1 274.6 282.1 265.9 271.4C263.9 273.3 262 275.2000000000001 260.1 277C217.3 317.8 233.3 302.2 222.7 314.4C221.6 315.6 221.7 316.6 222.6 318C230.9 331.5 234.4 346.2 232.6 362C231.5 371.8 228.3 380.9 221.3 388.2C206.8 403.5 182.1 403.2 167.8 387.6C156.4 375.1 153.7 360.2 156.9 344C157.0999999999999 342.7 157.3 341.3 156.9 340.1C153.5 326.4 152.3 312.5 154.4 298.5C154.5 298 154.5 297.4 154.5 296.9C154.5 296.6 154.4 296.4 154.3 295.8C132.5 306.8 118.3 324.1 111.1 348C102.8 330.2000000000001 100 312.5 104.5 293.9C88.9 309.1 83.2 328.2 82.5 349.1zM552.1 225.9C540.5 237.5 527.1 246.3 512 252.5C499.2 257.7 486 260.4 472.1 259.6C462.1 259 452.5 256.5 443.1 253.2C440.6 252.3 438 251.6 435.4000000000001 251C430.5000000000001 249.8 428.1 254.1 430.7000000000001 257.8C433.9000000000001 262.4 434.1 262 445.7000000000001 269.8C446.3000000000001 270.2 446.9000000000001 270.6 447.9000000000001 271.3H445.4000000000001C444.8 271.3 444.2000000000001 271.1 443.5000000000001 271C424.2000000000001 267.7 412.8000000000001 255.5 394.6000000000001 241.4C384.2000000000001 233.3 380.8000000000001 237.6 382.6000000000001 241.9C384.0000000000001 245.4 385.9000000000001 248.6 387.7000000000001 251.9C388.7000000000001 253.7 390.0000000000001 255.3 391.2000000000001 257C391.0000000000001 257.2 390.7000000000001 257.3 390.5000000000001 257.5C363.5000000000001 239.2 343.8000000000002 215.1 332.8000000000002 184.2C333.1000000000002 183.9 333.5000000000001 183.6 333.8000000000002 183.3C334.1000000000002 183.9 334.3000000000002 184.5 334.7000000000001 185C345.1000000000001 197.1 357.5000000000001 206.8 371.3000000000002 214.8C389.5000000000001 225.4 408.8000000000002 233.1 430.0000000000001 235C434.3000000000002 235.4 438.7000000000001 235.1 443.1000000000002 235.1C441.3000000000002 234.4 439.6000000000002 234.2 437.8000000000002 234C419.3000000000002 231.6 402.3000000000002 225 386.3000000000002 215.5C356.1000000000002 197.6 331.8000000000002 173.3 311.2000000000002 145.1C310.9000000000002 144.7000000000001 310.8000000000002 144.2000000000001 310.5000000000002 143.8C325.0000000000002 138.5 334.5000000000002 126.5 346.6000000000002 118.2C346.8000000000002 118.3 346.9000000000002 118.4 347.0000000000002 118.6L348.2000000000002 121.3C360.4000000000002 148.1999999999999 375.2000000000002 173.6 394.9000000000002 195.8C411.6000000000002 214.6 432.9000000000002 221.1 457.4000000000001 215.8C463.3000000000001 214.5 468.8000000000001 211.4 474.6000000000001 209C476.9000000000001 210.4 479.7000000000002 212.1999999999999 482.6000000000001 213.6999999999999C491.0000000000001 218 500.0000000000001 220.6999999999999 509.3000000000001 222.6999999999999C524.0000000000001 225.8 538.8000000000002 227.6 553.8000000000002 224V224.5C553.3000000000002 224.9 552.6000000000001 225.3 552.1000000000001 225.9zM316.7 50.4C277.3 83.4 293.9 69.9 274 86C273.2 85.1 274 86.2 272.1 83C260.9000000000001 63.9 246.6 47.7 228.1 35.4C217.8 28.6 206.6 23.6 194 23.6C172.4 23.6 155.8 33.1 144.6 51.4C132.6 70.9 131.3 92.1 136.4 114C144.2000000000001 147.8 166.5 169.2 175 178.3C156.3000000000001 184.5 142 176.6 128.6 164.4C129.4 178.3 132.9 190.6 140.4 201.7000000000001C116.1 191.1 94.5 176.7000000000001 75.6 157.8000000000001C75.3 163.6000000000001 81 201.5000000000001 81.2 202.5000000000001C81.5 205.2000000000001 80.6 207.8000000000001 78.2 209.9000000000001C54 185.2000000000001 33.7 158.1000000000001 22.1 125.3000000000001C29.5 131.2000000000001 37 136.7000000000001 45.7 141.5000000000001C37.4 119.2000000000001 26.1 88.7000000000001 37.9 40.4000000000001C42.5 21.4000000000001 49.8 3.6000000000001 62 -11.8999999999999C64.9 -15.5999999999999 68.3 -18.7999999999999 71.5 -22.1999999999999C71.7 -21.9999999999999 71.9 -21.8999999999999 72.1 -21.6999999999999C70.7 -14.6999999999999 69.9 -7.5999999999999 70.6 0.2C72.8 -2.9999999999999 74.5 -5.8 76.5 -8.4C89.1 -24.4 105.2 -35.8 123.7 -44C148.7000000000001 -55.3 174.8000000000001 -57.3 201.6 -52.6C256.5 -42.9 292.3 -4 317.6 46.2C318.6 48 318.2000000000001 49.1 316.7000000000001 50.4zM488.7 96.8C479.2 99.9 466.5 100.9999999999999 460 99.6999999999999C469.9 95.6999999999999 474.1 93.0999999999999 478.8 87.6999999999999C491.4 73.3 489.2 52.9999999999999 473.4 42.0999999999999C461.7 33.9999999999999 448.5000000000001 31.5999999999999 434.5000000000001 32.9999999999999C433.3000000000001 33.0999999999999 432.2000000000001 33.3999999999999 431.5000000000001 33.5999999999999C434.3000000000001 37.2999999999999 437.5000000000001 40.5999999999999 439.6000000000001 44.3999999999999C449.0000000000001 61.1999999999999 445.0000000000001 86.4999999999999 430.9000000000001 100.4999999999999C428.8000000000001 102.6 426.3000000000001 104.3999999999999 423.9000000000001 106.3999999999999C423.6000000000001 105.0999999999999 423.8000000000001 104.2999999999999 424.0000000000001 103.5999999999999C428.2000000000001 86.9999999999999 415.9000000000001 71.1999999999999 399.2000000000001 71.7999999999999C391.6000000000001 72.0999999999999 385.3000000000002 75.5999999999999 379.6000000000001 80.2999999999999C360.1000000000001 96.3999999999999 340.5000000000001 112.3999999999999 321.1000000000001 128.5999999999999C315.2000000000001 133.4999999999999 308.6000000000001 136.6999999999999 301.0000000000001 137.2999999999999C296.4000000000001 137.6999999999999 291.7000000000001 137.8999999999999 287.1000000000001 138.1999999999999C281.2000000000001 138.5999999999999 278.3000000000001 140.9999999999999 276.7000000000001 146.5999999999999C275.8000000000002 149.9999999999998 275.2000000000001 153.3999999999999 274.5000000000001 156.7999999999999C273.0000000000001 164.8999999999999 268.3000000000002 169.7999999999999 260.2000000000001 170.9999999999998C255.8000000000001 171.6999999999998 251.3000000000001 171.9999999999998 246.9000000000001 172.4999999999998C233.9000000000001 173.8999999999998 227.1000000000001 179.8999999999998 224.3000000000001 192.7999999999999C219.3000000000001 181.7999999999999 222.7000000000001 170.3999999999999 231.6000000000001 162.8999999999999C236.1000000000001 159.0999999999999 240.9000000000001 155.5999999999999 245.4000000000001 151.6999999999999C250.0000000000001 147.8999999999999 252.8000000000002 142.9999999999999 253.3000000000002 136.8999999999999C253.7000000000002 132.1999999999999 254.1000000000002 127.3999999999999 255.1000000000002 122.7999999999999C257.3000000000002 112.1999999999998 264.0000000000001 104.3999999999999 272.1000000000002 97.6999999999998C288.6000000000002 83.9999999999998 305.1000000000002 70.3999999999998 321.6000000000002 56.5999999999998C339.5000000000001 41.5999999999998 335.5000000000001 23.7999999999998 334.6000000000002 0.5999999999998C333.7000000000002 -22.3000000000002 346.8000000000002 -42.3000000000002 368.1000000000002 -50.6000000000002C369.1000000000002 -51.0000000000002 370.1000000000002 -51.2000000000002 371.7000000000002 -51.7000000000002C356.0000000000002 -33.5000000000002 361.6000000000002 -7.6000000000002 372.4000000000002 0.5999999999998C372.7000000000002 -1.6000000000002 372.8000000000002 -3.7000000000002 373.3000000000002 -5.8000000000002C382.7000000000001 -49.9000000000002 418.7000000000001 -70.0000000000002 458.3000000000001 -62.7000000000002C474.3000000000001 -59.8000000000002 488.9000000000001 -53.8000000000002 501.2000000000001 -42.9000000000001C503.2000000000001 -41.1000000000001 504.9000000000001 -38.8000000000001 507.1000000000001 -36.4000000000001C487.8000000000001 -41.0000000000002 471.3000000000001 -36.5000000000002 456.2000000000001 -25.8000000000001C456.9000000000001 -25.5000000000001 457.5000000000001 -25.5000000000001 458.1000000000001 -25.5000000000001C479.4000000000001 -27.3000000000001 498.7000000000001 -22.1000000000001 515.1000000000001 -8.1000000000001C534.6000000000001 8.4999999999999 541.7000000000002 34.7999999999998 532.5000000000001 57.8999999999999C524.2000000000002 77.9999999999999 508.9000000000001 90.1999999999999 488.7000000000001 96.7999999999998zM99.4 268.7C94.1 277.9 86.2 284.3 77.3 290C91 290.5 103.9 289.8 116.9 286.3C109.9 298.5 108.4 311 111.9 325C117.2 313.1 125.6 304.9 135.5 298.2000000000001C155.2 285 171.2 278.6 182.2 268C185.6 264.7000000000001 188.5 260.9000000000001 191.8 257.1C191 259.2000000000001 190.4 261.2000000000001 189.6 263.1C184.6 273.7000000000001 176.6 281.7000000000001 167 288.1C165.2 289.3 164.2 290.6 163.6 292.6C160.3 305.1 160.6 317.7000000000001 162.9 330.2000000000001C163.9 335.7000000000001 165.7 341.1 167.4 346.5C168.2 348.9000000000001 169.7 351.1 171.4 353.1C172 346.2 171.4 327.6 191 307.1C201.8 295.8 213.4 285.2000000000001 224.9 274.4000000000001C233.9 265.9000000000001 243.2 257.7000000000001 250.4 247.6C251.5 246.0000000000001 252.6 244.3 254.2 242.9000000000001C249.2 255.9000000000001 240.0000000000001 267 230.0000000000001 276.7000000000001C220.4 286.0000000000001 210.6 295.1 200.8000000000001 304.1C197.5 307.1 196.2000000000001 310.8000000000001 195.7000000000001 315.0000000000001C194.5000000000001 325.4000000000001 195.7000000000001 335.6 200.0000000000001 345.2000000000001C200.5000000000001 346.2000000000001 201.1000000000001 347.2000000000001 201.9000000000001 348.5000000000001C202.4000000000001 344.3000000000001 202.5000000000001 340.6 203.3000000000001 336.9000000000001C208.1000000000001 313.8000000000001 223.7000000000001 300.6000000000001 252.6000000000001 273.4000000000001C262.6000000000001 264.0000000000001 271.9000000000001 254.2000000000001 278.2000000000001 241.8000000000001C283.0000000000001 232.5000000000001 285.5000000000001 222.8000000000001 283.9000000000001 212.2000000000001C283.8000000000001 211.6000000000001 284.4000000000001 210.5000000000001 285.0000000000001 210.2000000000001C291.2000000000001 207.6000000000001 295.0000000000001 203.3000000000001 294.7000000000001 195.9000000000001C302.4000000000001 198.5000000000001 307.2000000000001 203.9000000000001 311.1000000000001 210.4000000000001C315.3000000000001 190.2000000000001 302.0000000000001 160.1000000000001 283.9000000000001 151.7000000000001C284.3000000000001 156.2000000000001 288.9000000000001 175.1 267.4000000000001 179.4C260.6000000000001 180.7000000000001 254.6000000000001 180.7000000000001 244.5000000000001 181.5000000000001C249.2000000000001 190.5000000000001 254.9000000000001 202.1000000000001 245.0000000000001 203.9000000000001C220.1000000000001 208.5000000000001 192.2000000000001 202.0000000000001 187.2000000000001 199.3000000000001C195.4000000000001 198.9000000000001 203.5000000000001 198.3000000000001 210.7000000000001 196.0000000000001C208.7000000000001 189.5000000000001 206.7000000000001 183.3000000000001 204.9000000000001 177.1000000000001C203.0000000000001 170.6000000000001 207.0000000000001 162.5000000000001 214.2000000000001 167.5000000000001C215.4000000000001 168.4 216.5000000000001 169.4 217.5000000000001 170.2000000000001C214.4000000000001 152.3000000000001 214.6000000000001 154.3000000000001 214.7000000000001 151.9C215.0000000000001 141.7000000000001 224.2000000000001 144.1 230.4000000000001 144.6C227.9000000000001 132.8 200.9000000000001 117.3 185.0000000000001 118.8C192.0000000000001 123.5 197.7000000000001 129.1 200.9000000000001 136.7C194.4000000000001 135.9 188.0000000000001 135.1 181.7000000000001 134.3L181.4000000000001 135.2C186.1000000000001 138.6 189.4000000000001 143 191.6000000000001 148.3C200.3000000000001 169.4 188.0000000000001 186.3 166.6000000000001 188.2C157.5000000000001 189 148.8000000000001 187.4 140.7000000000001 182.7C146.9000000000001 198.3 157.9000000000001 209.3 173.3000000000001 217.2C158.1000000000001 221.5 164.4000000000001 219.9 148.7000000000001 223.5C163.3000000000001 232.8 178.9000000000001 236.7 195.2000000000001 238.1C190.0000000000001 241.3 147.1000000000001 241.7 125.0000000000001 217.2C132.9000000000001 215.8 140.5000000000001 214.4 148.2000000000001 213C124.4000000000001 206 104.2000000000001 193.3 85.8000000000001 177.4C86.9000000000001 182.2 88.5000000000001 186.9 89.1000000000001 191.7C89.7000000000001 196.2 89.9000000000001 200.9 89.2000000000001 205.3C87.7000000000001 214.7 80.3000000000001 220.4 69.5000000000001 221.6C61.6000000000001 222.5 53.9000000000001 221.5 46.2000000000001 220.3C45.3000000000001 220.2 44.5000000000001 220 43.3000000000001 220.3C59.1000000000001 235.1 79.3000000000001 242 96.4000000000001 253.8C102.4000000000001 258.3 103.2000000000001 262 99.4000000000001 268.7zM227.8 241.9C231.1 225.9 240.4 216.4 251.6 217.6C247.0000000000001 228.9 239.5000000000001 237.1 227.8 241.9z" />
+    <glyph glyph-name="dashcube"
+      unicode="&#xF210;"
+      horiz-adv-x="448" d=" M326.6 344H110.4C59.3 344 19.2 300.7 19.2 250.5V21C19.2 -29.5 59.3 -64 110.4 -64H337.6C388.7000000000001 -64 428.8 -29.5 428.8 21V448L326.6 344zM153.9 31.5C136.2 31.5 121.5 46.6 121.5 64.3V207.2C121.5 224.9 136.2 239.7 153.9 239.7H294.6C312.3 239.7 326.6 224.9 326.6 207.2V83.7L377.7000000000001 31.4H153.9z" />
+    <glyph glyph-name="delicious"
+      unicode="&#xF1A5;"
+      horiz-adv-x="448" d=" M446.5 380C446.1 381.5 445.6 383 445.1 384.5C444.2000000000001 387 443.1 389.3 441.8 391.6C440.4000000000001 394 438.8 396.4 437.1 398.5C435 401 432.7000000000001 403.3 430.2000000000001 405.3C429.1 406.2 428.0000000000001 407 426.9000000000001 407.8C425.6 408.7 424.3 409.5 422.9000000000001 410.2C421.1 411.2 419.3 412 417.4000000000001 412.7C415.7000000000001 413.4 413.9000000000001 414 412.0000000000001 414.4C408.2000000000001 415.4 404.1000000000001 415.9 400.0000000000001 415.9H48C21.5 416 0 394.5 0 368V16C0 11.9 0.5 7.8 1.5 4C3.5 -3.7 7.3 -10.6 12.5 -16.3C13.5 -17.4 14.6 -18.5 15.8 -19.6C21.5 -24.8 28.4 -28.6 36.1 -30.6C39.9 -31.6 44 -32.1 48.1 -32.1H400.1C426.6 -32.1 448.1 -10.6 448.1 15.9V368C448 372.1 447.5 376.2 446.5 380zM416 16C416 7.2 408.8 0 400 0H224V192H32V368C32 376.8 39.2 384 48 384H224V192H416V16z" />
+    <glyph glyph-name="deploydog"
+      unicode="&#xF38E;"
+      horiz-adv-x="512" d=" M382.2 312H433.9V72.4H382.2V93.1C362.4 68.3 329.4 68.9999999999999 308.4 78.4C282.2 90.1 264.1 116.5 264.1 150.2C264.1 180 278.9 208.1 307.4 221C327.6 230.1 360.1 231.6 382.2 208.1V312zM317.5 150.2C317.5 132 331.1 116.7 350.7 116.7C370.5 116.7 383.9 133.1 383.9 149.6C383.9 166.7 370.2 182.8 350.7 182.8C331.1 182.8 317.5 166.4 317.5 150.1999999999999zM188.5 312H240.2V72.4H188.5V93.1C168.7 68.3 135.7 68.9999999999999 114.7 78.4C88.5 90.1 70.4 116.5 70.4 150.2C70.4 180 85.2 208.1 113.7 221C133.9 230.1 166.4 231.6 188.5 208.1V312zM123.8 150.2C123.8 132 137.4 116.7 157 116.7C176.8 116.7 190.2 133.1 190.2 149.6C190.2 166.7 176.5 182.8 157 182.8C137.3 182.8 123.8 166.4 123.8 150.1999999999999zM448 352C465.5 352 480 337.6 480 320V64C480 46.5 465.6 32 448 32H64C46.5 32 32 46.4 32 64V320C32 337.5 46.4 352 64 352H448M448 384H64C28.8 384 0 355.2 0 320V64C0 28.8 28.8 0 64 0H448C483.2 0 512 28.8 512 64V320C512 355.2 483.2 384 448 384z" />
+    <glyph glyph-name="deskpro"
+      unicode="&#xF38F;"
+      horiz-adv-x="480" d=" M205.9 -64L237 -25.6C249.3 -25.4 262.6 -24.2 273.5 -19C312.4 -0.4 311.9 42.9 311.8 44.8C311.7 49.8 311 49.2 282.9000000000001 82.2H362C361.8 32.1 354.7 13.7 351.8 6.5C342.4000000000001 -17.2 307.9000000000001 -56.3 256.6 -62.9C247.9000000000001 -64 223.8 -64.1 205.9 -64zM406.3 103.7C444.9000000000001 103.7 464.8 117.3 480 134.6L304.5 134.9L287.1 103.6L406.3 103.7zM362.7 327.6V159.3H289.2L256.5 103.8H250C197.7 103.8 191.9 160.3 191.7 162.6999999999999C190.5 175.8999999999999 170.4 174.3 171.6 160.8999999999999C173 145.0999999999999 180.4 120.8999999999999 198 103.7999999999999H107C81.5 103.7999999999999 -3.8 130.5999999999999 0 217.7999999999999V431.1C0 447.1 9.7 447.7 15 447.9H97C97.2 447.9 97.3 447.8 97.5 447.8C101.8 448.2 147.6 449.9 147.6 404.1C147.6 390.8 167.8 390.7 167.8 404.1C167.8 422.3 162.3 436.9 152 447.8H236.2C344.9 448.2 362.7 368.4 362.7 327.6zM230.2 271.6L294.2 242.3C307.5 287.8 252 314 230.2 271.6z" />
+    <glyph glyph-name="deviantart"
+      unicode="&#xF1BD;"
+      horiz-adv-x="320" d=" M320 354.8L221.8 175.7L229.2 166.2H320V38.5H159.1L145.6 29.3L101.9 -54.7C101.6 -54.7 93.3 -63.3 92.7 -63.9H0V29.3L93.2 208.7L85.8 217.9H0V345.5H156L169.5 354.7L213.2 438.7C213.5 438.7 221.8 447.3 222.4 447.9H320V354.8z" />
+    <glyph glyph-name="digg"
+      unicode="&#xF1A6;"
+      horiz-adv-x="512" d=" M81.7 275.7H0V101.3H132.7V352H81.7V275.7zM81.7 142.3H50.9V234.6H81.7V142.3zM378.9 275.7V101.3H460.7V72.8H378.9V32H512V275.7H378.9zM460.7 142.3H429.9V234.6H460.7V142.3zM225.1 101.3H307.2V72.8H225.1V32H358.4V275.7H225.1V101.3zM276.3 234.6H307.1V142.3H276.3V234.6zM153.3 352H204.6V301H153.3V352zM153.3 275.7H204.6V101.3H153.3V275.7z" />
+    <glyph glyph-name="digital-ocean"
+      unicode="&#xF391;"
+      horiz-adv-x="512" d=" M256 -56V40.1C357.8 40.1 436.8 141 397.7 248.1C383.4 287.7000000000001 351.6 319.5 311.9 333.8C204.8 372.6 103.8 293.9000000000001 103.8 192.1H8C8 354.3 164.9 480.8 335 427.7C409.2 404.4 468.6 345.3 491.6 271.1C544.8 100.8 418.6 -56 256 -56zM256.3 135.4H160.7V39.8H256.3V135.4zM160.7 39.8H87V-33.8000000000001H160.7V39.8zM87 101.4H25.4V39.8H87V101.4z" />
+    <glyph glyph-name="discord"
+      unicode="&#xF392;"
+      horiz-adv-x="448" d=" M297.216 204.8C297.216 189.184 285.6960000000001 176.384 271.104 176.384C256.768 176.384 244.992 189.184 244.992 204.8S256.512 233.216 271.104 233.216C285.696 233.216 297.216 220.416 297.216 204.8zM177.664 233.216C163.072 233.216 151.552 220.416 151.552 204.8S163.328 176.384 177.664 176.384C192.256 176.384 203.776 189.184 203.776 204.8C204.032 220.416 192.256 233.216 177.664 233.216zM448 395.264V-64C383.506 -7.006 404.132 -25.872 329.216 43.776L342.784 -3.584H52.48C23.552 -3.584 0 19.968 0 49.152V395.264C0 424.448 23.552 448 52.48 448H395.5200000000001C424.448 448 448 424.448 448 395.264zM375.04 152.576C375.04 235.0080000000001 338.1760000000001 301.824 338.1760000000001 301.824C301.3120000000001 329.472 266.24 328.704 266.24 328.704L262.656 324.608C306.176 311.296 326.4 292.096 326.4 292.096C265.589 325.425 194.156 325.4310000000001 135.168 299.52C125.696 295.168 120.064 292.096 120.064 292.096S141.312 312.32 187.392 325.632L184.832 328.704S149.76 329.472 112.896 301.824C112.896 301.824 76.032 235.008 76.032 152.576C76.032 152.576 97.536 115.456 154.112 113.6640000000001C154.112 113.6640000000001 163.584 125.184 171.264 134.912C138.752 144.6400000000001 126.464 165.12 126.464 165.12C130.23 162.484 136.44 159.067 136.96 158.72C180.17 134.5220000000001 241.548 126.5940000000001 296.704 149.7600000000001C305.664 153.088 315.648 157.9520000000001 326.144 164.864C326.144 164.864 313.344 143.872 279.808 134.4C287.488 124.672 296.704 113.6640000000001 296.704 113.6640000000001C353.28 115.456 375.04 152.576 375.04 152.576z" />
+    <glyph glyph-name="discourse"
+      unicode="&#xF393;"
+      horiz-adv-x="448" d=" M225.9 416C103.3 416 0 317.5 0 195.9C0 192 0.1 -32 0.1 -32L225.9 -31.8C348.6 -31.8 448 70.5 448 192.1C448 313.7 348.6 416 225.9 416zM224 64C204.6 64 186.1 68.3 169.6 76.1L88.5 56L111.4 131C101.6 149.1 96 169.9 96 192C96 262.7 153.3 320 224 320S352 262.7 352 192S294.7 64 224 64z" />
+    <glyph glyph-name="dochub"
+      unicode="&#xF394;"
+      horiz-adv-x="416" d=" M397.9 288H256V428.4L397.9 288zM304 256V126C304 59.2 267.5 25.9 190.7 25.9H96V363.2H190.7C202.7 363.2 213.8 362.4 223.8 360.7V444.7C212.9 446.9 201.4 448 189.2 448H0V-64H189.2C329.7 -64 400 0.6 400 129.9V256H304z" />
+    <glyph glyph-name="docker"
+      unicode="&#xF395;"
+      horiz-adv-x="640" d=" M349.9 211.7H283.8V271.1H349.9V211.7zM349.9 416H283.8V355.3H349.9V416zM428.1 271.2H362V211.8H428.1V271.2zM271.8 343.3H205.7V283.2H271.8V343.3zM349.9 343.3H283.8V283.2H349.9V343.3zM626.7 243.3C612.3000000000001 253 579.1 256.5 553.6 251.7C550.3000000000001 275.7 536.9 296.6 512.5 315.4L498.5 324.7L489.2 310.7C470.8 282.9 465.8 237.1 485.5 206.9C476.8 202.2 459.7 195.8 437.1 196.2H2.4C-6.3 145.4 8.2 79.4 46.4 34.1C83.5 -9.8 139.1 -32.1 211.8 -32.1C369.2000000000001 -32.1 485.7 40.4 540.2 172.1C561.6 171.7000000000001 607.8000000000001 172 631.5 217.3C633 219.8 638.1 230.5 640 234.4L626.7 243.3zM115.6 271.2H49.6V211.8H115.7V271.2zM193.7 271.2H127.6V211.8H193.7V271.2zM271.8 271.2H205.7V211.8H271.8V271.2zM193.7 343.3H127.6V283.2H193.7V343.3z" />
+    <glyph glyph-name="draft2digital"
+      unicode="&#xF396;"
+      horiz-adv-x="480" d=" M369.9 22.6V77L417 49.8L369.9 22.6zM82.4 67.4C107.9 94.7 180.1 172.1 233.3 237.4C268.4000000000001 280.5 273.6 319.8 261.7 350.1C254.3 368.9 244.2 380.3 237.4 385.8C282.7 383.7 305.4 362.4 319.6 347.5C319.6 347.5 362 299.3 325.4 234.2C288.4 168.3 214.5 86.7 196.9 67.5H82.4zM134.2 286.6C134.2 274.2 124.2 264.2 111.8 264.2C99.4 264.2 89.4 274.2 89.4 286.6C89.4 299 99.4 309 111.8 309C124.2 309 134.2 298.9 134.2 286.6M336 132.1V67.4H244.7C275.5 102.4 326.5 163.3000000000001 356.5 216.7000000000001C391.7 279.3000000000001 372.6 340.1 343.7 370.0000000000001C339.3 374.6 281.5 432.9000000000001 177.7 411.2000000000001C118.6 398.8000000000001 88.3 367.8000000000001 73.4 343.9000000000001C60.3 323.0000000000001 56.4 304.1000000000001 55.2 296.2000000000001C49.7 263.2000000000001 74.6 229.1000000000001 111.9 229.1000000000001C143.6 229.1000000000001 169.2 254.8000000000001 169.2 286.5000000000001C169.2 313.6 149.5 338.6 121.2 343.3000000000001C123 350.6 138.9 364.4000000000001 147.5 368.0000000000001C188.6 385.3000000000001 225.5 362.8000000000001 230.8 334.5000000000001C239.1 290.2000000000001 193.7 244.1000000000001 161.1 206.9000000000001C84.5 119.9 18.3 51.2 0 32.1L336 32.2V-32L480 49.9L336 132.1z" />
+    <glyph glyph-name="dribbble-square"
+      unicode="&#xF397;"
+      horiz-adv-x="448" d=" M90.2 219.8C99.1 262.2000000000001 127.6 297.5 165.9 315.5C169.5 310.6 193.9 276.7 216.6 236.5C152.6 219.5 96.3 219.7 90.2 219.8zM314.6 294C281 323.8 235.3 335.1 192 324.6C195.8000000000001 319.5 220.6 285.7 243.0000000000001 244.6C291.6 262.9 312.1 290.5 314.6 294zM140.1 84C180.6 52.4 233.4 47.3 277.4 66C275.4 78 267.4 119.8 248.2 169.6C193.1 150.8 154.4 113.2000000000001 140.1 84zM238.9 192.2C235.5 200 231.7 207.7 227.8 215.4C159.6 195 93.4 195.8 87.4 196C87.4 194.6 87.3 193.2 87.3 191.8C87.3 156.7 100.6 124.7000000000001 122.4 100.4C144.6 138.3 189.5 178.3 238.9 192.2zM273.8 175.9C291.7 126.8 298.9 86.8 300.3 78.5C331 99.2 352.8 132.1 358.9 170.1C354.3 171.6 316.6 182.8 273.8 175.9zM253.5 224.3C258.3 214.5 261.8 206.5 265.5 197.5C311 203.2 356.2 194.1 360.7 193.1C360.3999999999999 225.4 348.8999999999999 255 329.8 278.2C326.9 274.3 304 245 253.5 224.3zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM384 192C384 280.2 312.2 352 224 352S64 280.2 64 192S135.8 32 224 32S384 103.8 384 192z" />
+    <glyph glyph-name="dribbble"
+      unicode="&#xF17D;"
+      horiz-adv-x="512" d=" M256 440C119.252 440 8 328.748 8 192S119.252 -56 256 -56S504 55.252 504 192S392.748 440 256 440zM419.9700000000001 325.634C449.473 289.588 467.3390000000001 243.677 467.805 193.679C460.821 195.156 390.7870000000001 209.361 320.303 200.497C314.551 214.538 309.122 226.89 301.686 242.111C380.007 274.088 415.504 319.593 419.97 325.634zM396.421 350.13C392.611 344.703 360.724 301.844 285.4 273.611C250.688 337.387 212.215 389.779 206.36 397.619C273.536 413.812 344.326 396.349 396.421 350.13zM165.941 383.38C171.526 375.721 209.379 323.264 244.478 260.871C145.391 234.558 58.118 234.937 48.644 235.062C62.38 300.795 106.678 355.427 165.941 383.38zM44.17 191.677C44.17 193.843 44.213 195.999 44.278 198.15C53.546 197.96 156.198 196.637 261.984 228.2960000000001C268.048 216.4280000000001 273.841 204.3810000000001 279.158 192.347C202.559 170.7720000000001 132.964 108.8200000000001 98.627 50.0410000000001C64.794 87.595 44.17 137.27 44.17 191.677zM125.977 24.564C148.104 69.797 208.155 128.186 293.5560000000001 157.3200000000001C323.2960000000001 80.037 335.5950000000001 15.2670000000001 338.7450000000001 -3.318C270.6330000000001 -32.331 188.7300000000001 -24.371 125.9770000000001 24.564zM374.357 16.075C372.186 28.9610000000001 360.911 90.972 333.205 167.1080000000001C399.585 177.734 457.905 160.3400000000001 465.152 158.0530000000001C455.71 99.1120000000001 421.879 48.2090000000001 374.357 16.075z" />
+    <glyph glyph-name="dropbox"
+      unicode="&#xF16B;"
+      horiz-adv-x="528" d=" M264.4 331.7L132.4 247.4L264.4 163.1L132.4 78.8L0 163.9L132.3 248.2L0 331.7L132.3 416L264.4 331.7zM131.6 52.3L263.6 136.6L395.6 52.3L263.6 -32L131.6 52.3zM264.4 163.9L396.4 248.2L264.4 331.8L395.7 416L528 331.7L395.7 247.4L528 163.2L395.7 78.9L264.4 163.9z" />
+    <glyph glyph-name="drupal"
+      unicode="&#xF1A9;"
+      horiz-adv-x="448" d=" M319.5 333.3C297.3 347.3 276 352.8 254.8 366.8C241.8 375.6 223.5 396.8 208.3 415.1C205.6 385.8 196.8 373.9 186.3 365.6C165 348.6 151.5 343.4 132.8 333.3C117 325 32 266.5 32 157.5C32 48.3 123.8 -32 225.8 -32C327.5 -32 416 42 416 154C416 266.3 333 325 319.5 333.3zM322 7.7C301.9 -12.4 231.9 -21 205.3 3.5C200.5 8.3 205.6 15.5 211.8 15.5C211.8 15.5 228.8 2.2 263.3 2.2C290.3 2.2 309.3 9.9 317.8 16.2C323.9000000000001 20.8 326.2 11.9 322 7.7zM267.5 60.3C276.2 63.9 296.5 64.1 304.3 59C308.4000000000001 56.2 320.4000000000001 40.2 310.5 35.3C302.1 31.1 309.3 51 284 51C269.3 51 264.5 45.8 257.3 40C250.3 34 247.5 32 245.1 35.3C239.1 43.5 261 57.6 267.5 60.3zM360 43C344.8 44 314.5 91.8 295 92.5C264.1 93.4 190.9 11.8 133.7 50.5C94.9 77.1 119.1 155.3 185.5 155.7C235 156.2 269.3 106.7 294 107.2C315.3 107.5 355.8 149 375.8 149C424.5 149 399.1 39.7 360 43z" />
+    <glyph glyph-name="dyalog"
+      unicode="&#xF399;"
+      horiz-adv-x="416" d=" M0 416V296.8H64V352H171.2C284.6 352 352 271.8 352 192.1C352 116 293.4 32 171.2 32H0V-32H171.2C331.9 -32 416 80.7 416 192.1C416 250.8 393.9 305.5 353.7 346.4C308.9 392 245.7 416 171.2 416H0z" />
+    <glyph glyph-name="earlybirds"
+      unicode="&#xF39A;"
+      horiz-adv-x="480" d=" M313.2 400.5C314.4 413.5 334.5 414.5 349.8 409.2C350.7 408.9 376 399.5 368.8 394C340.9000000000001 401.4 312.4000000000001 375.8 313.2 400.5zM112.2 393.6C142.9 401.7 174.2 373.6 173.3 400.7C172 414.9 149.9 416 133.1 410.3C132.1 410 104.4 399.8 112.2 393.6zM319.4 288C310.6 288 303.4 280.8 303.4 272S310.6 256 319.4 256S335.4 263.2 335.4 272S328.2 288 319.4 288zM159.7 288C150.9 288 143.7 280.8 143.7 272S150.9 256 159.7 256S175.7 263.2 175.7 272S168.5 288 159.7 288zM478.2 124.8C468.3 100.8 437.5 113.8 414.3 126C400.8 56.9 356.2 14.6 288 1.8C288.3 0.9 286 1.9 312 0.8C345.6 -0.6 375.8 3.9 409.4 8.8C389.6 22.6 398 45.9 399.6 46.9C401 47.8 414.3 45.2 421.2 35.4C429.8 47.9 449.6 50.2 451.4 49.0000000000001C453 47.9 458 28.1000000000001 444.5 14.4C449.2 15.3 452.7 16.0000000000001 454.3 16.5000000000001C456.9 17.3000000000001 472 5.2 457.4 3.2C443.1 0.9 434.8 -1.9 410.3 -7.6C364.4000000000001 -18.3 324.4 -19.4 292.6 -20.4L293.6 -32C297.4000000000001 -50.1 270.2000000000001 -56.3 266 -38.2C266.8 -56.1 238.9 -60 237.6 -37.2L237.1 -42.5C236.4 -60.9 208.7 -60.4 208.8 -41.9C201.3 -55.4 180.7 -48.7 182.4 -33.4L183.6 -21C146.9 -21.9 123.9 -24.1 121.8 -24.1C100.9 -24.1 100.9 7.5 121.8 7.5C124.2 7.5 149.5 6.2 185 4.7C123.9 20.2 81.3 59.7 70.1 122.9C45.1 110.1 12.6 96.1 1.9 122.1C-8.6 147.5 23.4 164.7 68.7 195.5C69.4 202.1 70.3 208.8 71.4 215.3C57 234.9 59.8 251.6 55.3 275.7C38.5 273.3 32.1 284.8 31.7 298.8C32 306.1 33.8 313.7 34.1 314.2C35.2 316 44.2 316.2 46.8 316.8C52.8 348.5 97.4 350 137.7 351.3C157.4 373.1 182.9 392.8 218.6 399.6C203.3 419 215.2 439.5 216.2 440C217.9 440.8 237.4 435.7 242.5 416.8C247.7 425.6 260.8 428.2 262.1 427.5C263.2000000000001 426.9 268.5 412.5 257.2000000000001 401.6C297.5000000000001 398.1 329.4000000000001 376.9 353.2000000000001 350.9C389.3000000000001 349.4 425.0000000000001 345 430.3000000000001 316.9C433.0000000000001 316.3 441.9000000000001 316.1 443.0000000000001 314.3C443.3000000000001 313.8 445.1000000000001 306.2000000000001 445.4000000000001 298.9C444.9000000000001 285 438.6 273.5 421.8 275.8C418.6 258.5 419.1 242.9 413.1 228.1C415.5 216.4 417.1 204.3 417.9000000000001 191.7000000000001C454.9 166.3000000000001 488.2 149.2000000000001 478.2 124.8000000000001zM207.4 288.1C208.3 332.1 169.5 330.3 128.8 328.4C107.1 327.4 89.9 326.5 83.3 314.5C71.9 293.6 89.2 221.6 106.5 213.3C116.3 208.6 179.9 205.4 192.8 220.4C201 229.8 207.8 269.8 207.4 288.1zM259.4 229.8C255.1 242.2 253.4 259.9 244.1 262.5C242.1 263 235.1 263 233.1 262.5C223.1 259.7 222.3 240.4 216.1 225.3C231.5 225.3 235.4 215.6 239.8 215.6C244.1 215.6 246.1 226.9000000000001 259.4 229.8zM395.1 314.5C388.5 326.6 370.3 327.4 348.6 328.4C308.4 330.3 270.4 332.2 271.3 288.1C270.8 269.8 276.3 229.8 284.5 220.3C297.5 205.4 361.0999999999999 208.5 370.8 213.2C386.6 220.8 407.3 292.1 395.1 314.5z" />
+    <glyph glyph-name="edge"
+      unicode="&#xF282;"
+      horiz-adv-x="512" d=" M25.714 219.837C25.825 219.999 25.944 220.16 26.056 220.322C26.035 220.16 26.011 219.999 25.991 219.837H25.714zM486.286 204.329C486.286 248.361 478.532 288.794 457.485 326.734C416.498 400.121 343.912 439.999 258.893 439.999C118.962 440.276 40.617 334.786 26.056 220.321C68.485 281.633 143.129 341.697 246.431 345.287C246.431 345.287 356.097 345.287 345.85 240.33H169.997C176.366 277.716 188.551 299.316 204.336 319.256C129.288 284.363 82.486 223.16 83.594 130.941C84.424 59.493 133.718 -13.895 204.337 -41.035C287.694 -72.8820000000001 397.113 -48.235 444.469 -19.711V84.693C363.605 28.199 173.598 23.768 172.214 152.265H486.287V204.329z" />
+    <glyph glyph-name="elementor"
+      unicode="&#xF430;"
+      horiz-adv-x="448" d=" M425.6 416H22.4C10 416 0 406 0 393.6V-9.6C0 -22 10 -32 22.4 -32H425.6C438 -32 448 -22 448 -9.6V393.6C448 406 438 416 425.6 416M164.3 92.5H124.5V291.5H164.3V92.5zM323.6 92.5H204.1V132.3H323.6V92.5zM323.6 172.1H204.1V211.9H323.6V172.1zM323.6 251.8H204.1V291.6H323.6V251.8z" />
+    <glyph glyph-name="ember"
+      unicode="&#xF423;"
+      horiz-adv-x="640" d=" M639.9 193.4C638.8 204.1 629.1999999999999 200.2 629.1999999999999 200.2S613.5999999999999 188.1 599.9 189.5C586.1999999999999 190.8 590.5 221.5 590.5 221.5S593.5 249.6 585.4 251.9C577.3 254.3 567.4 244.6 567.4 244.6S555 230.9 549.1 213.4L547.5 212.9S549.4 243.5 547.2 250.5C545.6 254 530.8000000000001 253.7 528.4000000000001 247.5S514.2 198.3 513.4000000000001 180.3C513.4000000000001 180.3 490.3000000000001 160.7 470.1000000000001 157.5S445.1000000000001 166.9 445.1000000000001 166.9S499.9000000000001 182.2 498.0000000000001 226C496.1000000000001 269.8 453.8000000000001 253.6 449.0000000000001 250C444.4000000000001 246.5 419.6000000000001 231.6 412.4000000000001 190.3C412.2000000000001 188.9 411.7000000000001 182.8 411.7000000000001 182.8S390.5000000000001 168.6 378.7000000000001 164.8C378.7000000000001 164.8 411.7000000000001 220.4 371.4000000000001 245.7C353.1 256.7 338.6 233.6 338.6 233.6S393.1 294.3 381.1 345.6C375.3 370 363.1 372.7 351.9000000000001 368.7C334.9000000000001 362 328.4000000000001 352 328.4000000000001 352S306.4000000000001 320 301.3 272.5S288.7 167.4 288.7 167.4S278.2 157.2 268.5 156.7S263.1 185.4 263.1 185.4S270.6 230 270.1 237.5S269 249.1 260.2000000000001 251.7C251.3000000000001 254.4 241.7000000000001 243.1 241.7000000000001 243.1S216.2000000000001 204.4 214.0000000000001 198.5L212.7000000000001 196.1L211.4 197.7S229.4000000000001 250.4 212.2000000000001 251.2C195.0000000000001 252 183.7000000000001 232.4 183.7000000000001 232.4S164.1000000000001 199.6 163.3000000000001 195.9L162 197.5S170.1 235.7 168.4 245.1C166.8000000000001 254.5 157.9 252.6 157.9 252.6S146.6 253.9 143.7000000000001 246.7S130.0000000000001 191.3999999999999 128.7000000000001 176C128.7000000000001 176 100.5 155.8 81.9000000000001 155.6C63.4000000000001 155.3 65.2000000000001 167.4 65.2000000000001 167.4S133.2000000000001 190.7 114.6000000000001 236.6C106.3000000000001 248.4 96.6000000000001 252.1 82.9000000000001 251.9C69.2000000000001 251.6 52.6000000000001 243.3 41.6000000000001 218.6C36.3000000000001 206.8 34.8000000000001 195.6 33.8000000000001 187.1C33.8000000000001 187.1 21.5000000000001 184.7 15.0000000000001 190S5.0000000000001 190 5.0000000000001 190S-6.1999999999999 176 4.9000000000001 171.6999999999999S33.0000000000001 165.5999999999999 33.0000000000001 165.5999999999999C34.6000000000001 158.0999999999999 39.2000000000001 146.0999999999999 52.6000000000001 135.8999999999999C72.8000000000001 120.5999999999999 111.4000000000001 137.1999999999999 111.4000000000001 137.1999999999999L127.3000000000001 146S127.8000000000001 131.3999999999999 139.4000000000001 129.3C151.0000000000001 127.1999999999999 155.8000000000001 128.3 175.9000000000001 177.1999999999999C187.7000000000001 202.1999999999999 188.5000000000001 200.7999999999999 188.5000000000001 200.7999999999999L189.8000000000001 201.0999999999999S180.7000000000001 154.3 184.2000000000001 141.3999999999999C187.7 128.6 203 130 203 130S211.3 127.6 218 151.2C224.7 174.8 237.6 201.1 237.6 201.1H239.2S233.6 153 242.2 137.4C250.8 121.8 273.1 132.1 273.1 132.1S288.7 139.9 291.1 142.3C291.1 142.3 309.6 126.5 335.7 129.4C394 140.9 414.8 155.3 414.8 155.3S424.8 130.9 455.9 128.6C491.4 125.9 510.7 147.2 510.7 147.2S510.4 133.7 522.8 128.6C535.1999999999999 123.5 543.5 151.4 543.5 151.4L564.2 208.6H566.1S567.2 171.3 587.6 165.4S634.6 179.1 634.6 179.1S641 182.6 639.9 193.4zM61.9 188.1C62.7 220.1 83.7 234.0000000000001 90.9 227.1C98.2 220.1 95.5 205.1 81.8 195.7C68.1 186.2000000000001 61.9 188.1 61.9 188.1zM334.7 311.9000000000001S353.8 361.6 358.3 337.4000000000001S318.3 241.2000000000001 318.3 241.2000000000001C318.8 257.4000000000001 334.7 311.9000000000001 334.7 311.9000000000001zM357.5 173.5C344.9 140.5 314.2 153.9 314.2 153.9S310.7 165.7 320.6 198.8S353.9 219 353.9 219S370.1 206.6 357.5 173.5zM442.1 188.1S439.1 198.6 450.2000000000001 218.7C461.2 238.9 469.8000000000001 227.8 469.8000000000001 227.8S479.2 217.6 468.5000000000001 202.3S442.1000000000001 188.1 442.1000000000001 188.1z" />
+    <glyph glyph-name="empire"
+      unicode="&#xF1D1;"
+      horiz-adv-x="496" d=" M287.6 393.8C276.8 396 265.5 397.1 254.1 397.4V415.6C332.2000000000001 413.4 400.2000000000001 371.6 438.7000000000001 309L422.9000000000001 299.9C416.8 309.6 410.2000000000001 318.7000000000001 402.7000000000001 327L384.7000000000001 311.5C358.7000000000001 341.1 323.3000000000001 362.2 282.8000000000001 369.9L287.6000000000001 393.8zM53.4 125.6L76.4 133.3C70 151.6 66.4 171.5 66.4 192S69.7 232.4 76.1 250.7L53.4 258.4C57 269.2 61.7 279.7 67 289.4L51.2 298.5C34 267 24.1 230.5 24.1 192S34.1 117 51.2 85.4L67 94.5C61.7 104.5 57.3 114.8 53.4 125.6zM213.1 14C172.7 22 137.3 43.1 111.2 72.7L93.2 56.9C85.7 65.5 78.8 74.6 73 84.3L57 74.9C95.5 12.6 163.8 -29.4 241.9 -31.7V-13.4C230.6 -13.1 219.2 -11.7 208.4 -9.8L213.1 14zM93.3 327.1L111.3 311.6C137.3 341.2 172.7 362.3 213.2 370L208.5 393.8C219.3 396 230.6 397.1 242 397.4V415.6C163.9 413.4 95.9 371.6 57.4 309L73.2 299.9C79.2 309.6 85.8 318.8 93.3 327.1zM402.7 56.9L384.7 72.7C358.7 43.1 323.3 22 282.8 14L287.5 -9.8C276.7 -11.7 265.3999999999999 -13.1 254 -13.4V-31.7C332.0999999999999 -29.5000000000001 400.4 12.6 438.9 74.9L422.8 84.3C417.1 74.6 410.2 65.4999999999999 402.7 56.9zM496 192C496 55 385 -56 248 -56S0 55 0 192S111 440 248 440S496 329 496 192zM483.8 192C483.8 322.1 378.1 427.8 248 427.8S12.2 322.1 12.2 192S117.9 -43.8 248 -43.8S483.8 61.9 483.8 192zM444.8 298.6L429 289.5C434.3 279.8 439 269.3 442.6 258.5L419.9000000000001 250.8C426.3 232.5 429.6 212.6 429.6 192.1S426 151.7000000000001 419.6 133.4L442.6 125.7000000000001C438.7000000000001 114.9 434.3 104.7000000000001 429 94.7000000000001L444.8 85.6C462 117 471.9 153.5 471.9 192S462 267 444.8 298.6zM261.8 120.9C278.1 124.2 292.2 132.5 302.5 144.4L353.7 99.6C365.6 113.2 375 128.9 380.8 146.4L316.6 168.5C319.1 176 320.5 183.7 320.5 192S319.1 208.1 316.6 215.5L381.1 237.6C375 255 365.6 270.8 353.7000000000001 284.4L302.5000000000001 239.6C292.3000000000001 251.5 278.1000000000001 260.1 261.8000000000001 263.4L275.1000000000001 329.8C266.5000000000001 331.7 257.4000000000001 332.6 248.0000000000001 332.6C238.6000000000001 332.6 229.5000000000001 331.8 220.9000000000001 329.8L234.2000000000001 263.4C217.9000000000001 260.1 203.8000000000001 251.5 193.5000000000001 239.6L142.3000000000001 284.4C130.4000000000001 270.8 121.0000000000001 255.1 114.9000000000001 237.6L179.4000000000001 215.5C176.9000000000001 208 175.5000000000001 200.3 175.5000000000001 192S176.9000000000001 175.9 179.4000000000001 168.5L115.2000000000001 146.4C121.0000000000001 129 130.4000000000001 113.2 142.3000000000001 99.6L193.5000000000001 144.4C203.7000000000001 132.5 217.9000000000001 124.2 234.2000000000001 120.9L220.9000000000001 54.2C229.5000000000001 52.5 238.6000000000001 51.4 248.0000000000001 51.4C257.4000000000001 51.4 266.5000000000001 52.5 275.1000000000001 54.2L261.8000000000001 120.9z" />
+    <glyph glyph-name="envira"
+      unicode="&#xF299;"
+      horiz-adv-x="448" d=" M0 416C477.6 416 366.6 98.7 367.1 49.7L448 -32H422L351.6 39.2C312.6 35 227.2 4.7 137.2 76.2C47 147.7 52 233.3 0 416zM79.7 370C30 393.5 74.5 360.8 74.5 360.8C119.7 329.6 140.5 287.1 164.7 240.9C196.2 180.7 243.7 101.2 308.9 73.2C373.9 45.2 343.1 60.7 314.9 81.7C286.7 102.9 246.7 168.7 223.9 211.9C192.2 271.9 162.9 330.5 79.7 370z" />
+    <glyph glyph-name="erlang"
+      unicode="&#xF39D;"
+      horiz-adv-x="640" d=" M21.7 201.6C21.6 114.8 50.7 42.1 100.4 -10.5H0V394.5H87.2C45.7 344.3 21.6 278.3 21.7 201.6zM640 394.4H556.4C587.8 351.7 605.1 296.9 602.6 231.7C603.1 225.7 603.1 220 602.6 207.6H230.2C230 97.9 269.1 12.7 368.8 12.3C437.3 12.6 486.8 63.3 520.6999999999999 118.4L617.0999999999999 70.2C599.6999999999999 39.3 580.5999999999999 12.4 559.1999999999999 -10.6H640V394.4zM559.2 -10.6S559.2 -10.5 559.2 -10.6H559H559.2zM556.1 394.4H556.4L556.3 394.5L556.0999999999999 394.4zM325.4000000000001 384.8C279.5000000000001 384.7 240.3000000000001 351.3 236.2000000000001 301.6H406.1C405 351.3 371.6 384.7 325.4000000000001 384.8z" />
+    <glyph glyph-name="ethereum"
+      unicode="&#xF42E;"
+      horiz-adv-x="320" d=" M311.9 187.2L160 94.4L8 187.2L160 448L311.9 187.2zM160 64.6L8 157.4L160 -64L312 157.4L160 64.6z" />
+    <glyph glyph-name="etsy"
+      unicode="&#xF2D7;"
+      horiz-adv-x="384" d=" M384 100C382.25 89.25 370.25 -10 368.5 -32C250.621 -27.701 148.605 -27.257 0 -32V-6.5C45.457 2.448 60.627 1.519 61 28.75C62.793 101.072 64.524 272.8930000000001 61 350.75C59.971 379.2100000000001 48.87 377.515 0 386.75V412.25C73.886 409.892 255.933 403.699 362.999 416C359.499 377.75 355.249 289.5 355.249 289.5H332C320.947 332.335 313.241 380 277.25 380H140.25C130 380 129.5 376.5 129.5 370.25V206.5C187.5 206 218 209 218 209C247.77 209.951 245.56 217.502 258.75 274.251H284.5C280.093 172.9 280.59 212.422 282.75 114.001H257C247.845 154.087 247.935 175.046 217.499 175.501C217.499 175.501 195.999 177.501 129.499 177.501V38.501C129.499 12.501 143.749 0.251 173.749 0.251H263C326.636 0.251 329.564 25.247 361.751 100.001H384z" />
+    <glyph glyph-name="expeditedssl"
+      unicode="&#xF23E;"
+      horiz-adv-x="496" d=" M248 404.6C130.6 404.6 35.4 309.4 35.4 192S130.6 -20.6 248 -20.6S460.6 74.6 460.6 192S365.4 404.6 248 404.6zM150.6 271.7C150.6 325.4 194.3 369.1 248 369.1S345.4 325.4 345.4 271.7V245.1C345.4 240.1 341.5 236.2 336.5 236.2H318.8C313.8 236.2 309.9000000000001 240.1 309.9000000000001 245.1V271.7C309.9000000000001 353.8 185.9 353.8 185.9 271.7V245.1C185.9 240.1 182 236.2 177 236.2H159.3000000000001C154.3000000000001 236.2 150.4 240.1 150.4 245.1V271.7zM389.7 68C389.7 58.3 381.7 50.3 372 50.3H124C114.3 50.3 106.3 58.3 106.3 68V209.7C106.3 219.4 114.3 227.4 124 227.4H372C381.7 227.4 389.7 219.4 389.7 209.7V68zM141.7 205.3V72.4C141.7 69.9 139.8 68 137.3 68H128.4C125.9 68 124 69.9 124 72.4V205.3C124 207.8 125.9 209.7 128.4 209.7H137.3C139.8 209.7 141.7 207.8 141.7 205.3zM283.4 156.6C283.4 143.6 276.2 132.2000000000001 265.7 126.2000000000001V94.6C265.7 89.6 261.8 85.7000000000001 256.8 85.7000000000001H239.1C234.1 85.7000000000001 230.2 89.6 230.2 94.6V126.2000000000001C219.7 132.3000000000001 212.5 143.6 212.5 156.6C212.5 176.3 228.3000000000001 192 247.9000000000001 192S283.4000000000001 176.2000000000001 283.4000000000001 156.6zM248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM248 -38.3C121 -38.3 17.7 65 17.7 192S121 422.3 248 422.3S478.3 319 478.3 192S375 -38.3 248 -38.3z" />
+    <glyph glyph-name="facebook-f"
+      unicode="&#xF39E;"
+      horiz-adv-x="264" d=" M76.7 -64V165H0V256H76.7V327.7C76.7 405.6 124.3 448 193.8 448C227.1 448 255.7 445.5 264 444.4V363H215.8C178 363 170.7 345 170.7 318.7V256H256L244.3 165H170.7V-64" />
+    <glyph glyph-name="facebook-messenger"
+      unicode="&#xF39F;"
+      horiz-adv-x="448" d=" M224 416C15.9 416 -77.5 170 84.6 47.4V-32L160.3 10C302.5 -29.8 445.7 69.9 445.7 208.7C445.8 323.2 346.5 416 224 416zM247.4 137.9L190 197.5L79.6 136.4L200.7 264.9L258.1 205.3L368.5 266.4L247.4 137.9z" />
+    <glyph glyph-name="facebook-square"
+      unicode="&#xF082;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H314.7V145.2H375.3L384 212.8H314.7V256C314.7 275.6 320.1 288.9 348.2 288.9H384V349.3C377.8 350.1 356.6 352 331.8 352C280.2 352 244.8 320.5 244.8 262.6V212.7H184V145.1H244.9V-32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368z" />
+    <glyph glyph-name="facebook"
+      unicode="&#xF09A;"
+      horiz-adv-x="448" d=" M448 391.3V-7.2C448 -20.9 436.9 -31.9 423.3 -31.9H309.1V141.5H367.3L376 209.1H309V252.3C309 271.9 314.4 285.2000000000001 342.5 285.2000000000001H378.3V345.7000000000001C372.1 346.5 350.9000000000001 348.4000000000001 326.1 348.4000000000001C274.5 348.4000000000001 239.1 316.9000000000001 239.1 259V209.1H180.7V141.5H239.1V-32H24.7C11.1 -32 0 -20.9 0 -7.3V391.3C0 404.9 11.1 416 24.7 416H423.2C436.9 416 448 404.9 448 391.3z" />
+    <glyph glyph-name="firefox"
+      unicode="&#xF269;"
+      horiz-adv-x="480" d=" M478.1 212.7C477.4 217.2 476.7 219.8 476.7 219.8S474.9 217.8 472.0000000000001 213.9C471.1000000000001 224.6 469.2 235.1 466.2 245.5C462.5000000000001 258.4 457.7 270.9 451.7 282.9C447.9000000000001 290.9 443.5000000000001 298.5 438.4000000000001 305.7C436.6 308.4 434.7000000000001 311.1 432.8 313.6C424 328 413.8 336.9 402.1 353.6C394.5 366.4 389.2000000000001 380.5 386.7000000000001 395.2C383.5000000000001 386.3 381.0000000000001 377.2 379.3000000000001 367.9C367.2000000000001 380.1 356.8000000000001 388.7 350.4000000000001 394.6C319.4 423.8 323 438.9 323 438.9S264.7 373.8 289.9 306C298.6 283 313.7 262.9 333.3 248.1C357.7 227.9 384.1 212.1 398 171.5C386.8 192.8 369.8999999999999 210.7 349.2 223C355.3999999999999 208.3 358.5999999999999 192.4 358.5 176.5C358.5 115.5 308.8999999999999 66 247.9 66.1C239.6 66.1 231.4 67 223.4 68.9C213.9 70.7000000000001 204.7 73.8 196 78.2000000000001C183.0999999999999 86.0000000000001 172 96.3000000000001 163.1999999999999 108.5000000000001L163 108.8000000000001L165 108.1000000000001C169.5999999999999 106.5000000000001 174.1999999999999 105.3000000000001 179 104.4000000000001C197.6999999999999 100.4000000000001 217.3 102.7000000000001 234.6 111.0000000000001C252.1 120.7000000000001 262.5999999999999 127.9000000000001 271.2 125.0000000000001H271.3999999999999C279.7999999999999 122.3000000000001 286.3999999999999 130.5000000000001 280.3999999999999 139.0000000000001C270 152.4000000000001 252.9999999999999 159.0000000000001 236.2 156.0000000000001C218.6999999999999 153.5000000000001 202.6999999999999 141.0000000000001 179.7999999999999 153.1000000000001C178.2999999999999 153.9000000000002 176.8999999999999 154.7000000000002 175.4999999999999 155.6000000000001C173.8999999999999 156.5000000000001 180.3999999999999 154.3000000000001 178.8999999999999 155.3000000000001C173.8999999999999 157.8000000000001 169.0999999999999 160.7000000000001 164.4999999999999 163.9000000000002C164.1999999999999 164.2000000000002 167.9999999999999 162.8000000000001 167.5999999999999 163.1000000000001C161.6999999999999 167.1000000000001 156.5999999999999 172.3000000000001 152.5999999999999 178.3000000000001C148.4999999999999 185.7000000000001 148.0999999999999 194.7000000000001 151.5999999999999 202.4000000000001C153.6999999999999 206.2000000000001 156.9999999999999 209.3000000000001 160.8999999999999 211.1000000000001C163.8999999999999 209.6000000000001 165.6999999999999 208.5000000000001 165.6999999999999 208.5000000000001S164.3999999999999 211.0000000000001 163.5999999999999 212.3000000000001C163.9 212.4000000000001 164.0999999999999 212.3000000000001 164.4 212.5000000000001C167 211.4000000000001 172.7 208.5000000000001 175.8 206.7000000000001C177.9 205.6000000000001 179.6 204.0000000000001 181 202.0000000000001C181 202.0000000000001 182 202.5000000000001 181.3 204.7000000000001C180.2 207.4000000000001 178.4 209.7000000000001 175.9 211.3000000000001H176.0999999999999C178.4 210.1000000000001 180.5999999999999 208.7000000000001 182.6999999999999 207.2000000000001C184.5999999999999 211.6000000000001 185.5 216.4000000000001 185.2999999999999 221.2000000000001C185.4999999999999 223.8000000000001 185.0999999999999 226.5000000000001 184.1999999999999 229.0000000000001C183.3999999999999 230.6000000000001 184.6999999999999 231.2000000000001 186.0999999999999 229.5000000000001C185.9 230.8000000000002 185.4 232.0000000000001 184.9 233.2000000000001V233.3000000000001S185.7 234.4000000000001 186.0999999999999 234.8000000000001C187.0999999999999 235.8000000000001 188.1999999999999 236.7000000000001 189.5 237.5000000000001C196.6999999999999 242.0000000000001 204.3 245.9000000000001 212.1999999999999 249.1000000000001C218.5999999999999 251.9000000000001 223.8999999999999 254.0000000000001 225 254.7000000000001C226.6 255.7000000000001 228.1 256.9000000000001 229.5 258.2000000000001C234.8 262.7000000000001 238.5 269.0000000000001 239.7 275.9000000000001C239.8 276.8000000000001 239.8999999999999 277.7000000000001 240 278.7000000000001V280.2000000000001C239.1 283.7000000000001 233.1 286.3000000000001 201.5999999999999 289.3000000000001C190.5 291.1000000000001 181.5999999999999 299.4000000000001 179.0999999999999 310.4000000000001V310.3000000000001C178.6999999999999 309.2000000000001 178.1999999999999 308.0000000000001 177.7999999999999 306.8000000000001C178.1999999999999 308.0000000000001 178.5999999999999 309.1000000000001 179.0999999999999 310.3000000000001V310.5000000000001C185.0999999999999 326.2000000000001 195.9 339.6 209.9 348.8000000000001C210.7 349.5000000000001 206.7 348.6 207.5 349.3000000000001C210.1999999999999 350.6 212.9 351.8000000000001 215.6999999999999 352.8000000000001C217.0999999999999 353.4000000000001 209.6999999999999 356.2000000000001 203.0999999999999 355.5000000000001C199.0999999999999 355.3000000000001 195.0999999999999 354.3000000000001 191.4 352.7000000000001C193 354.0000000000001 197.5999999999999 355.8000000000001 196.5 355.8000000000001C188.0999999999999 354.2000000000001 180 351.1 172.5999999999999 346.8000000000001C172.5999999999999 347.6 172.6999999999999 348.3000000000001 173.0999999999999 349.0000000000001C167.1999999999999 346.5000000000001 162.0999999999999 342.5000000000001 158.0999999999999 337.5000000000001C158.1999999999999 338.4000000000001 158.2999999999999 339.3000000000001 158.2999999999999 340.2000000000001C155.5999999999999 338.2000000000001 153.0999999999999 335.9000000000001 150.9999999999999 333.3000000000001L150.8999999999999 333.2000000000001C133.4999999999999 339.9000000000001 114.5999999999999 341.5000000000001 96.2999999999999 337.9000000000001L96.0999999999999 338.0000000000001H96.2999999999999C92.4999999999999 341.1 89.1999999999999 344.7000000000001 86.5999999999999 348.9000000000001L86.3999999999999 348.8000000000001L85.9999999999999 349.0000000000001C84.7999999999999 350.8000000000001 83.5999999999999 352.8000000000001 82.2999999999999 355.0000000000001C81.3999999999999 356.6000000000001 80.4999999999999 358.4000000000001 79.5999999999999 360.2000000000001C79.5999999999999 360.3000000000001 79.4999999999999 360.4000000000001 79.3999999999999 360.4000000000001C78.9999999999999 360.4000000000001 78.7999999999999 358.7000000000001 78.4999999999999 359.1000000000001V359.2000000000001C75.2999999999999 367.5000000000001 73.7999999999999 376.4000000000001 74.0999999999999 385.4000000000001L73.8999999999999 385.3000000000001C68.7999999999999 381.8000000000001 64.8999999999999 376.7000000000001 62.7999999999999 370.8000000000001C61.8999999999999 368.7000000000001 61.1999999999999 367.5000000000001 60.5999999999999 366.3000000000001V366.8000000000001C60.6999999999999 367.9000000000001 61.1999999999999 370.1000000000001 61.0999999999999 369.9000000000001C60.9999999999999 369.7000000000001 60.8999999999999 369.6000000000001 60.7999999999999 369.5000000000001C59.2999999999999 367.8000000000001 57.8999999999999 365.8000000000001 56.8999999999999 363.7000000000001C55.9999999999999 361.8000000000001 55.1999999999999 359.8000000000001 54.5999999999999 357.8000000000001C54.4999999999999 357.5000000000001 54.5999999999999 358.1 54.5999999999999 358.8000000000001S54.6999999999999 360.8000000000001 54.5999999999999 360.5000000000001L54.2999999999999 359.8000000000001C47.5999999999999 344.9000000000001 43.3999999999999 329.0000000000001 41.8999999999999 312.7000000000001C41.4999999999999 309.9000000000001 41.2999999999999 307.1 41.3999999999999 304.4000000000001V304.2000000000001C36.5999999999999 299.0000000000001 32.3999999999999 293.2000000000001 28.6999999999999 287.1C16.5999999999999 266.7000000000001 7.5999999999999 244.6000000000001 1.8999999999999 221.5000000000001C5.8999999999999 230.3000000000001 10.6999999999999 238.7000000000001 16.1999999999999 246.6000000000001C5.5 219.5 0 190.6 0 161.4C1.8 170 4.2 178.4 7 186.7C5.3 152.2 11.9 117.8 26.4 86.4C45.8 42.9 78 6.4 118.7 -18.3C135.3 -29.5 153.4 -38.2 172.5 -44.1C175 -45 177.6 -45.9 180.2 -46.8C179.4 -46.5 178.6 -46.1 177.8 -45.8C200.4 -52.6 224 -56.1 247.6 -56.1C331.3 -56.1 358.9 -24.2 361.4 -21.1C365.5 -17.4 368.9 -12.9 371.3 -7.8C372.9 -7.1 374.5 -6.4 376.2 -5.7L377.2 -5.2L379.0999999999999 -4.3C391.7 1.6 403.5999999999999 9.1 414.3999999999999 17.8C430.7 29.5 442.2999999999999 46.5 447.2999999999999 65.9C450.2999999999999 73.0000000000001 450.3999999999999 80.9 447.6999999999999 88.1C448.5999999999999 89.5 449.3999999999999 90.9 450.3999999999999 92.4C468.3999999999999 121.3 478.5999999999999 154.3 479.9999999999999 188.3000000000001V191.1000000000001C479.9999999999999 198.4000000000001 479.3999999999999 205.6000000000001 478.0999999999999 212.7000000000001z" />
+    <glyph glyph-name="first-order"
+      unicode="&#xF2B0;"
+      horiz-adv-x="448" d=" M12.9 218.8C13 218.9 13.1 219.1 13.2 219.2C13.2 219.1 13.2 218.9 13.1 218.8H12.9zM224 351.4C216.9 351.4 209.4 350.8 202.6 349.7L206.3 282.3L184.3 346.3C170 342.6 156.6 336.9 144.3 329.7000000000001L173.7 268.3L128.6 319.2000000000001C117.2 310.3 106.9 300.1 98 288.3L148.6 242.9L87.5 272.6C80.4 260.3 74.6 246.9 70.9 232.6L135.2 210L67.2 214C66.3 206.9 65.8 199.4 65.8 192S66.4 177.4 67.2 170.3L134.9 174.3L70.9 151.7C74.6 137.4 80.3 124 87.5 111.4L148.6 141.1L97.7 96C106.6 84.3 116.8 73.7 128.6 65.1L173.5 116L144 54.6C156.3 47.2 169.7 41.5 184 37.7L206.3 102.3000000000001L202.3 34.3000000000001C209.4 33.2 216.9 32.6000000000001 224 32.6000000000001C231.4 32.6000000000001 238.6 33.2000000000001 245.7 34.3000000000001L241.7 102.9000000000001L264.3 37.8000000000001C278.6 41.8000000000001 292 47.2 304.3 54.7L274.9 116L319.8 65.1C331.5 74 341.8 84.2000000000001 350.4 96L299.8 141.1L360.9 111.7000000000001C368 124.0000000000001 373.8 137.4 377.5 152.0000000000001L313.5 174.3000000000001L380.9 170.3000000000001C382 177.4000000000001 382.3 184.6000000000001 382.3 192.0000000000001S382 206.9000000000001 380.9 214.0000000000001L313.2 210.0000000000001L377.2 232.3000000000001C373.5 246.6000000000001 368.1 260.3000000000001 360.6 272.6000000000001L299.7 242.9000000000001L350.3 288.3000000000001C341.4000000000001 300.0000000000001 331.2 310.3000000000001 319.7 319.2000000000001L274.6 268.3000000000001L304 329.4000000000001C291.7 336.8000000000001 278.3 342.5000000000001 264 346.3000000000001L241.7 282L245.7 349.7C238.6 350.9 231.4 351.4 224 351.4zM443.4 320V64L224 -64L4.6 64V320L224 448L443.4 320zM426.3 309.7L224 427.1L21.7 309.7V74.6L224 -43.1L426.3 74.6V309.7zM224 410.9L411.7 301.5V82.6L224 -26.9L36.3 82.6V301.4L224 410.9zM224 360C131.7 360 57.1 284.9 57.1 192C57.1 99.4 131.7 24.3 224 24.3C316 24.3 390.9 99.4 390.9 192C390.9 284.9 316 360 224 360z" />
+    <glyph glyph-name="firstdraft"
+      unicode="&#xF3A1;"
+      horiz-adv-x="384" d=" M384 256H320V128H192V0H0V25.6H166.4V153.6H294.4V281.6H384V256zM358.4 217.6V89.6H230.4V-38.4H64V-64H256V64H384V217.6H358.4zM384 25.6H294.4V-64H320V0H384V25.6zM0 448V64H128V192H256V320H384V448H0z" />
+    <glyph glyph-name="flickr"
+      unicode="&#xF16E;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM144.5 129C109.4 129 81 157.4 81 192.5S109.4 256 144.5 256S208 227.6 208 192.5S179.6 129 144.5 129zM303.5 129C268.4 129 240 157.4 240 192.5S268.4 256 303.5 256S367 227.6 367 192.5S338.6 129 303.5 129z" />
+    <glyph glyph-name="flipboard"
+      unicode="&#xF44D;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM358.4 236.8H268.8V147.2000000000001H179.2V57.6H89.6V326.4H358.4V236.8z" />
+    <glyph glyph-name="fly"
+      unicode="&#xF417;"
+      horiz-adv-x="384" d=" M197.8 20.2C210.7 8.5 231.5 -13.1 231 -30.5C231 -31.3 230.9 -32.1 230.9 -33C229.1 -52.8 212.1 -64.1 191.8 -64C166.8 -63.9 151.9 -47.2 153.1 -28.2C154.1 -12 173.6 8.5 185.5 19.4C187.8000000000001 21.5000000000001 188.2 22.1 191.1 23.0000000000001C194.5 23.0000000000001 195 22.7 197.8 20.2zM331.9 380.7C315.6 406.4 293.3 421.3 268.6 432.8C243.1 443.5 214 448.2 192 448C147.9 448 120.8 434.8 110.9 430.7C57.3 402.8 26.5 360.8 28 289.4C35.1 207.2 125 113.4 183.8 55.6C185.5 54 188.3 51.1 190 50.5L193.3 50.4C195.4 51.1 195.1 50.9 196.8 52.5C249.1 101.7 337.5 198.3 352.7000000000001 268.2C359.7000000000001 307.4 355.8000000000001 340.7 331.9000000000001 380.7zM186.8 96.1C158.8 147.2000000000001 121.6 226.8 117.5 285.1C114.1 332.6 128.9 416.3 186.8 421.8V96.1zM328.7 268C312.3 211.2 251.4 140 209.8 97.7C237.6 149.6 275 231 277 289.6C278.6 335.5 267.2 395.4 229 421C317.8 402.7 344.5 322.9 328.7 268z" />
+    <glyph glyph-name="font-awesome-alt"
+      unicode="&#xF35C;"
+      horiz-adv-x="448" d=" M397.8 380.2C405.6 380.2 412.1 373.6 412.1 365.9V18.3C412.1 10.4999999999999 405.5 3.9999999999999 397.8 3.9999999999999H50.2C42.4 3.9999999999999 35.9 10.6 35.9 18.3V365.8C35.9 373.6 42.5 380.1 50.2 380.1H397.8M397.8 416H50.2C22.7 416 0 393.3 0 365.8V18.2C0 -9.3 22.7 -32 50.2 -32H397.8C425.3 -32 448 -9.3 448 18.2V365.8C448 393.3 425.3 416 397.8 416zM339.3 276.8C333.3 276.8 309.4000000000001 261.3 286.7 261.3C282.5 261.3 278.3 261.9 274.2 263.7000000000001C254.5 271.5 237.2 277.4 215.1 277.4C194.8 277.4 173.3 270.8 155.4 263.7000000000001C153.6 263.1 151.8 262.5 150.6 261.9V279.8C158.4 285.8 163.1 294.7000000000001 163.1 305.5C163.1 323.4 148.8 337.8 130.8 337.8S98.5 323.5 98.5 305.5C98.5 295.3 103.3 285.8 111 279.8V67.7000000000001C111 56.9 120 48.0000000000001 130.7 48.0000000000001C139.7 48.0000000000001 146.8 54.0000000000001 149.2 61.7000000000001V63C149.8 64.8 149.8 66 149.8 67.8V112C151 112 152.2 112.6 152.8 113.2C172.5 121.6 195.8 129.9 218.5 129.9C249.6 129.9 261.5 113.8 287.8 113.8C306.3 113.8 324.2 120.4 339.8 127.5C344 129.3 347 131.1 347 135.3V269.7C348.8 273.8 344.7 276.8 339.3 276.8z" />
+    <glyph glyph-name="font-awesome-flag"
+      unicode="&#xF425;"
+      horiz-adv-x="448" d=" M444.373 88.576C444.373 81.408 438.229 78.336 431.061 75.264C402.389 62.976 371.669 51.712 338.901 51.712C292.821 51.712 271.317 80.384 216.021 80.384C176.085 80.384 134.101 66.048 100.309 50.688C98.261 49.664 96.213 49.664 94.165 48.64V-29.184C94.165 -50.5890000000001 78.043 -64 60.373 -64C40.9169999999999 -64 25.5569999999999 -48.64 25.5569999999999 -29.184V345.6C12.245 355.8400000000001 3.029 372.224 3.029 390.656C3.029 422.4 28.629 448 60.373 448S117.717 422.4 117.717 390.656C117.717 372.224 109.525 355.8400000000001 95.189 345.6V313.856C99.313 315.23 153.957 342.528 209.877 342.528C275.147 342.528 307.553 314.88 336.853 314.88C375.765 314.88 418.773 342.528 429.0130000000001 342.528C437.2050000000001 342.528 444.3730000000001 336.384 444.3730000000001 329.216V88.576z" />
+    <glyph glyph-name="font-awesome"
+      unicode="&#xF2B4;"
+      horiz-adv-x="448" d=" M397.8 416H50.2C22.7 416 0 393.3 0 365.8V18.2C0 -9.3 22.7 -32 50.2 -32H397.8C425.3 -32 448 -9.3 448 18.2V365.8C448 393.3 425.3 416 397.8 416zM352.4000000000001 131.7C352.4000000000001 127.5 348.8 125.7 344.6 123.9C327.9000000000001 116.7 310 110.2 290.8 110.2C263.9000000000001 110.2 251.4 126.9 219.1 126.9C195.8 126.9 171.3 118.5 151.6 109.6C150.4 108.9999999999999 149.2 108.9999999999999 148 108.4V63C148 61.2 148 59.4 147.4 58.2V57C145 48.6 137.2000000000001 42.7 128.3000000000001 42.7C117.0000000000001 42.7 108 51.7 108 63V281.6C100.2000000000001 287.6 94.9000000000001 297.1 94.9000000000001 307.9C94.9000000000001 326.4 109.8000000000001 341.4 128.4 341.4C146.9 341.4 161.9 326.5 161.9 307.9C161.9 297.1 157.1 287.6 148.8000000000001 281.6V263.1C150.6000000000001 263.7 152.4 264.3 154.2000000000001 265.5C172.7000000000001 273.3 194.8000000000001 279.8 215.7000000000001 279.8C238.4000000000001 279.8 256.3000000000001 273.8 276.6 266.1C280.8 264.3 285 263.7000000000001 289.7000000000001 263.7000000000001C312.4000000000001 263.7000000000001 337.5000000000001 279.8 343.5000000000001 279.8C348.3000000000001 279.8 352.5000000000001 276.2000000000001 352.5000000000001 272V131.7z" />
+    <glyph glyph-name="fonticons-fi"
+      unicode="&#xF3A2;"
+      horiz-adv-x="384" d=" M114.4 224H206.8L191.6 172.8H115.2V15C115.2 7 112.4 5.8 119.6 5L179.2 -0.6V-35H0V0.2L29.2 3C36.4 3.8 38.4 6.2 38.4 13.8V169.6C38.4 172.8 34.4 172.8 30.4 172.8H0V224H38.4V252.8C38.4 320.8 74.8 348.8 144.4 348.8C191.2 348.8 233.2 337.6 233.2 276.4L163.6 268C164 293.6 157.6 299.6 141.2 299.6C116 299.6 115.2 286 115.2 262V230C115.2 226.8 110.4 224 114.4 224zM384 -35H243.2V-0.6L271.2 3C278.4 3.8 281.6 5.4 281.6 13V161C281.6 166.6 277.6 170.2 272.4 171.8L239.2 180.6L248.4 221H358.4V13C358.4 5 354.8 4.2 362.4 3L384 -0.6V-35zM354 312.2L366.4 266.6L356.4 256.6L313.6 279.4L270.8 256.6L260.8 266.6L273.2 312.2L243.2 348.6L248 358.6H286L307.2 397H320L341.2 358.6H379.2L384 345.4L354 312.2z" />
+    <glyph glyph-name="fonticons"
+      unicode="&#xF280;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM167.4 220H234.8L223.7 182.7H168V69.8C168 63.9999999999999 166 63.1 171.2 62.4999999999999L214.7 58.3999999999999V33.2999999999999H84V59L105.3 61C110.5 61.6 112 63.3 112 68.9V180.3C112 182.6 109.1 182.6 106.2 182.6H84V220H112V241C112 290.6 138.5 311 189.3 311C223.4 311 254 302.8 254 258.2L203.3 252.1C203.6 270.8 198.9 275.1 187 275.1C168.6 275.1 168 265.2 168 247.7V224.4C168 222 164.5 220 167.4 220zM364 33.3H261.3V58.4L281.7 61.0000000000001C286.9 61.6000000000001 289.3 62.7000000000001 289.3 68.3000000000001V176.2C289.3 180.3 286.4000000000001 182.9 282.6 184.1L258.4000000000001 190.5L265.1 220H345.3V68.3C345.3 62.4999999999999 342.7 61.9 348.2 60.9999999999999L363.9 58.3999999999999V33.2999999999999zM342.1 288.8L351.1 255.6L343.8 248.3L312.6 264.9L281.4000000000001 248.3L274.1 255.6L283.1 288.8L261.3 313L264.8 322.6H292.5L308 350.6H317.3L332.8 322.6H360.5L364 313L342.1 288.8z" />
+    <glyph glyph-name="fort-awesome-alt"
+      unicode="&#xF3A3;"
+      horiz-adv-x="512" d=" M211.7 206.9V155.2C211.7 153.1 210.1 151.5 208 151.5H185.8C183.7 151.5 182.1 153.1 182.1 155.2V206.9C182.1 209 183.7 210.6 185.8 210.6H208C210.1 210.6 211.7 209 211.7 206.9zM326.2 210.6H304C301.9 210.6 300.3 209 300.3 206.9V155.2C300.3 153.1 301.9000000000001 151.5 304 151.5H326.2C328.3 151.5 329.9 153.1 329.9 155.2V206.9C329.8 209 328.2 210.6 326.2 210.6zM297.1 -52.6C296.2 -52.7 295.4 -52.9 294.5 -53C293.5 -53.2 292.3999999999999 -53.3 291.3999999999999 -53.5C290.5 -53.6 289.5999999999999 -53.8 288.5999999999999 -53.9C287.5999999999999 -54 286.5999999999999 -54.2 285.5999999999999 -54.3C284.5999999999999 -54.4 283.5999999999999 -54.4999999999999 282.7 -54.6C281.7 -54.7 280.8 -54.8 279.8 -54.9C278.8 -55 277.7 -55.1 276.7 -55.2C275.8 -55.3 274.8999999999999 -55.4 274 -55.4C272.8999999999999 -55.5 271.7 -55.5 270.6 -55.6C269.8 -55.6 268.9 -55.7 268.1 -55.7C266.8 -55.8 265.5 -55.8 264.2 -55.8C263.5 -55.8 262.8 -55.9 262.1 -55.9C260.1 -55.9 258.1 -56.0000000000001 256.1 -56.0000000000001S252.1 -56.0000000000001 250.1 -55.9C249.4 -55.9 248.7 -55.9 248 -55.8C246.7 -55.8 245.4 -55.7 244.1 -55.7C243.3 -55.7 242.4 -55.6 241.6 -55.6C240.5 -55.4999999999999 239.3 -55.4999999999999 238.2 -55.4C237.3 -55.3 236.4 -55.3 235.5 -55.2C234.5 -55.1 233.4 -55 232.4 -54.9C231.4 -54.8 230.5 -54.7 229.5 -54.6C228.5 -54.4999999999999 227.5 -54.4 226.6 -54.3C225.6 -54.1999999999999 224.6 -54.1 223.6 -53.9C222.7 -53.8 221.8 -53.6 220.8 -53.5C219.8 -53.4 218.7 -53.2 217.7 -53C216.8 -52.9 216 -52.7 215.1 -52.6C149.5 -41.7 92.6 -4.9 55.1 46.8C54.9 46.9999999999999 54.8 47.3 54.6 47.4999999999999C53.8 48.6 53 49.6999999999999 52.3 50.8C52 51.1999999999999 51.7 51.6 51.5 51.9999999999999C50.8 53.1 50.1 54.1 49.4 55.1999999999999C49.1 55.6999999999999 48.8 56.0999999999999 48.5 56.5999999999999C47.8 57.6999999999999 47.1 58.6999999999999 46.5 59.7999999999999C46.2 60.2999999999999 45.9 60.6999999999999 45.6 61.1999999999999C44.9 62.2999999999999 44.3 63.3999999999999 43.6 64.4999999999999C43.4 64.8999999999999 43.1 65.2999999999999 42.9 65.6999999999999C40.5 69.6999999999999 38.3 73.7999999999999 36.1 77.8999999999999C36 78.0999999999999 35.9 78.1999999999999 35.8 78.3999999999999C35.2 79.4999999999999 34.7 80.5999999999999 34.1 81.6999999999999C33.8 82.2999999999999 33.5 82.7999999999999 33.3 83.3999999999999C32.8 84.3999999999999 32.3 85.4999999999999 31.8 86.4999999999999C31.5 87.1999999999999 31.2 87.7999999999999 30.9 88.4999999999999C30.4 89.4999999999999 30 90.4999999999999 29.5 91.4999999999999L28.6 93.5999999999999C28.2 94.5999999999999 27.7 95.5999999999999 27.3 96.5999999999999C27 97.2999999999999 26.7 98.0999999999999 26.4 98.7999999999999L25.2 101.7999999999999C24.9 102.5999999999999 24.6 103.2999999999999 24.3 104.0999999999999C23.9 105.0999999999999 23.5 106.0999999999999 23.2 107.0999999999999C22.9 107.9999999999999 22.6 108.8999999999999 22.2 109.8999999999999C21.6 111.4999999999999 21.1 113.1999999999999 20.5 114.7999999999999C20.2 115.6999999999999 19.9 116.5999999999999 19.6 117.5999999999999C19.3 118.4999999999999 19.1 119.3999999999999 18.8 120.2999999999999C18.5 121.1999999999999 18.2 122.1999999999999 18 123.0999999999999C17.7 123.9999999999999 17.5 124.8999999999999 17.2 125.7999999999999C16.9 126.7999999999999 16.7 127.6999999999999 16.4 128.6999999999999C16.2 129.5999999999999 15.9 130.4999999999999 15.7 131.3999999999999C15.4 132.3999999999999 15.2 133.3999999999999 15 134.3999999999999C14.8 135.2999999999999 14.6 136.0999999999999 14.4 136.9999999999999C14.2 138.0999999999999 13.9 139.1999999999999 13.7 140.1999999999999C13.5 140.9999999999999 13.4 141.7999999999999 13.2 142.5999999999999C12.9 143.8999999999999 12.7 145.2999999999999 12.4 146.5999999999999C12.3 147.1999999999999 12.2 147.6999999999999 12.1 148.2999999999999L11.2 153.9999999999998C11.1 154.5999999999999 11 155.2999999999999 10.9 155.8999999999998C10.7 157.1999999999998 10.5 158.4999999999998 10.4 159.7999999999998C10.3 160.5999999999998 10.2 161.2999999999998 10.1 162.0999999999998C10 163.2999999999998 9.8 164.4999999999998 9.7 165.6999999999998C9.6 166.4999999999998 9.5 167.2999999999999 9.5 168.0999999999998C9.4 169.2999999999998 9.3 170.4999999999998 9.2 171.5999999999998C9.1 172.3999999999998 9.1 173.1999999999998 9 173.9999999999998C8.9 175.1999999999998 8.8 176.3999999999998 8.8 177.6999999999998C8.8 178.4999999999998 8.7 179.1999999999998 8.7 179.9999999999998C8.6 181.2999999999998 8.6 182.6999999999998 8.5 183.9999999999998C8.5 184.6999999999998 8.5 185.2999999999998 8.4 185.9999999999998C8.4 187.9999999999998 8.3 189.9999999999998 8.3 191.9999999999998C8.3 245.4999999999998 25.2 294.9999999999998 54.1 335.5999999999998C56.4 338.7999999999998 58.8 341.9999999999998 61.2 345.0999999999998C66.1 351.2999999999998 71.3 357.3999999999998 76.8 363.0999999999998C79.5 365.9999999999998 82.3 368.7999999999998 85.2 371.4999999999998C88.1 374.1999999999998 91 376.8999999999998 94 379.4999999999998C98.5 383.3999999999998 103.1 387.0999999999998 107.9 390.6999999999998C109.5 391.8999999999998 111.1 393.0999999999998 112.7 394.1999999999998C140 413.8 171.7 427.9 206 435C222.1 438.3 238.9 440 256 440S289.8 438.3 306 435C340.3 428 372 413.9 399.6 394.3C401.2000000000001 393.1 402.8 392 404.4000000000001 390.8C409.2000000000001 387.2 413.8 383.5 418.3 379.6C430.3 369.2 441.3 357.7 451.1 345.2C453.6 342.1 455.9 338.9 458.2 335.7C487.1 295 504 245.5 504 192C504 190 504 188 503.9 186C503.9 185.3 503.9 184.7 503.8 184C503.8 182.7 503.6999999999999 181.3 503.6 180C503.6 179.2 503.4999999999999 178.5 503.4999999999999 177.7C503.3999999999999 176.5 503.3999999999999 175.3 503.3 177C503.1999999999999 176.2 503.1999999999999 175.4 503.1 174.6C502.9999999999999 173.4 502.9 172.2000000000001 502.8 171.1C502.6999999999999 170.3 502.6 169.5 502.6 168.7000000000001C502.4999999999999 167.5000000000001 502.3 166.3000000000001 502.2 165.1C502.1 164.3 502 163.6 501.9 162.8C501.7 161.5 501.5 160.2 501.4 158.9C501.3 158.3 501.2 157.6 501.1 157.0000000000001L500.2 151.3000000000001C500.1 150.7000000000001 500 150.2000000000001 499.9 149.6000000000001C499.7 148.3000000000001 499.4 146.9000000000001 499.1 145.6000000000001C498.9 144.8000000000001 498.8 144.0000000000001 498.6 143.2000000000001C498.4 142.1000000000001 498.1 141.0000000000001 497.9 140.0000000000001C497.7 139.1000000000001 497.5 138.3000000000001 497.3 137.4000000000001C497.1 136.4000000000001 496.8 135.4000000000001 496.6 134.4000000000001C496.4 133.5000000000001 496.1 132.6000000000001 495.9 131.7000000000001C495.6 130.7000000000001 495.4 129.8000000000001 495.1 128.8000000000001C494.9 127.9000000000002 494.6 127.0000000000001 494.3 126.1000000000001C493.9999999999999 125.2000000000002 493.6999999999999 124.2000000000002 493.4999999999999 123.3000000000001C493.1999999999999 122.4000000000002 492.9999999999999 121.5000000000001 492.6999999999999 120.6000000000001C492.3999999999999 119.7000000000002 492.0999999999999 118.8000000000001 491.8 117.8000000000001C491.3 116.2000000000001 490.6999999999999 114.5000000000001 490.1 112.9000000000002C489.8 112.0000000000002 489.4999999999999 111.1000000000001 489.1 110.1000000000001C488.7 109.1000000000001 488.4 108.1000000000001 487.9999999999999 107.1000000000001C487.6999999999999 106.3000000000001 487.3999999999999 105.6000000000001 487.1 104.8000000000001L485.9 101.8000000000001C485.6 101.1000000000001 485.3 100.3000000000001 485 99.6000000000001C484.6 98.6000000000001 484.2 97.6000000000001 483.7 96.6000000000001L482.8 94.5000000000001C482.4 93.5000000000001 481.9 92.5000000000001 481.4 91.5000000000001C481.1 90.8000000000001 480.8 90.2000000000001 480.5000000000001 89.5000000000001C480.0000000000001 88.5000000000001 479.5000000000001 87.4000000000001 479.0000000000001 86.4000000000001C478.7 85.8000000000001 478.4 85.3000000000001 478.2 84.7000000000001C477.6 83.6000000000001 477.1 82.5000000000001 476.5000000000001 81.4000000000001C476.4 81.2000000000001 476.3000000000001 81.1000000000001 476.2 80.9000000000001C474.0000000000001 76.8000000000001 471.8000000000001 72.7000000000001 469.4 68.7000000000001C469.2 68.3000000000001 468.9 67.9000000000001 468.7 67.5000000000001C468.0000000000001 66.4000000000001 467.4 65.3000000000001 466.7 64.2000000000001C466.4 63.7000000000001 466.1 63.3000000000001 465.8000000000001 62.8000000000001C465.1000000000001 61.7000000000001 464.4000000000001 60.7000000000001 463.8000000000001 59.6000000000001C463.5000000000001 59.1000000000001 463.2 58.7000000000002 462.9000000000001 58.2000000000002C462.2000000000001 57.1000000000001 461.5000000000001 56.1000000000001 460.8000000000001 55.0000000000002C460.5000000000001 54.6000000000002 460.2 54.2000000000002 460.0000000000001 53.8000000000002C459.2 52.7000000000002 458.5000000000001 51.6000000000002 457.7 50.5000000000002C457.5000000000001 50.3000000000002 457.4 50.0000000000002 457.2 49.8000000000002C419.6 -4.8999999999998 362.7000000000001 -41.5999999999998 297.1 -52.5999999999998zM414.4 33.6C427.4 46.6 438.6 60.9999999999999 448 76.4999999999999V147.8C448 149.9 446.4 151.5 444.3 151.5H422.1C420 151.5 418.4000000000001 149.8999999999999 418.4000000000001 147.8V122H388.9000000000001V266C388.9000000000001 268.1 387.3 269.7 385.2000000000001 269.7H363.1C361 269.7 359.4000000000001 268.1 359.4000000000001 266V240.1H329.9000000000001V266C329.9000000000001 268.1 328.3 269.7 326.2000000000001 269.7H304C301.9 269.7 300.3 268.1 300.3 266V240.1H270.8V266C270.8 270.8 264.3 269.7 261.3 269.7V300.4C268 302 275.1 303.2 282.1 303.2C290.9000000000001 303.2 298.9000000000001 299.7 307.5 299.7C311.2 299.7 329.9 300.6 329.9 306.2V354.6C329.9 356.7 328.3 358.3 326.2 358.3C322 358.3 314 354.8 306.8 354.8C298.9000000000001 354.8 289.9000000000001 358.3 280.5 358.3C274 358.3 267.6 357.4 261.3 356V359.9C265.7 362 268.7 366.6 268.7 371.4C268.7 388.2 243.3 388.2 243.3 371.4C243.3 366.6 246.3 361.9 250.7 359.9V269.7C247.7 269.7 241.2 270.8 241.2 266V240.1H211.7V266C211.7 268.1 210.1 269.7 208 269.7H185.8C183.7 269.7 182.1 268.1 182.1 266V240.1H152.6V266C152.6 268.1 151 269.7 148.9 269.7H126.8000000000001C124.7000000000001 269.7 123.1 268.1 123.1 266V122H93.5V147.8C93.5 149.9 91.9 151.5 89.8 151.5H67.7C65.6 151.5 64 149.9 64 147.8V76.5C73.4 61 84.6 46.6 97.6 33.6C118.2 13 142.1 -3.1 168.8 -14.4C182.7 -20.3 197 -24.7 211.7 -27.6V48.2C211.7 106.8000000000001 300.3 106.8000000000001 300.3 48.2V-27.6C315 -24.7 329.3 -20.2 343.2 -14.4C369.9 -3.1 393.8 13 414.4 33.6" />
+    <glyph glyph-name="fort-awesome"
+      unicode="&#xF286;"
+      horiz-adv-x="512" d=" M489.2 160.1H461.8C459.2 160.1 457.2 158.1 457.2 155.5V123.5H420.6V301.8C420.6 304.4 418.6 306.4 416 306.4H388.6C386 306.4 384 304.4 384 301.8V269.8H347.3999999999999V301.8C347.3999999999999 304.4 345.3999999999999 306.4 342.7999999999999 306.4H315.3999999999999C312.7999999999999 306.4 310.7999999999999 304.4 310.7999999999999 301.8V269.8H274.1999999999999V301.8C274.1999999999999 307.8 266.1999999999999 306.4 262.4999999999999 306.4V344.4C270.7999999999999 346.4 279.5999999999999 347.8 288.1999999999999 347.8C299.0999999999999 347.8 309.0999999999999 343.5 319.5999999999999 343.5C324.1999999999999 343.5 347.2999999999999 344.6 347.2999999999999 351.5V411.5C347.2999999999999 414.1 345.2999999999999 416.1 342.6999999999998 416.1C337.5999999999998 416.1 327.5999999999998 411.8 318.6999999999998 411.8C308.9999999999999 411.8 297.7999999999999 416.1 286.0999999999998 416.1C278.0999999999998 416.1 270.0999999999998 415 262.3999999999998 413.2000000000001V418.1C267.7999999999998 420.7000000000001 271.4999999999999 426.4000000000001 271.4999999999999 432.4000000000001C271.4999999999999 453.1 240.0999999999998 453.2 240.0999999999998 432.4000000000001C240.0999999999998 426.4000000000001 243.7999999999998 420.7000000000001 249.1999999999998 418.1V306.4C245.4999999999999 306.4 237.4999999999999 307.8 237.4999999999999 301.8V269.8H200.8999999999998V301.8C200.8999999999998 304.4 198.8999999999998 306.4 196.2999999999999 306.4H168.8999999999998C166.2999999999999 306.4 164.2999999999999 304.4 164.2999999999999 301.8V269.8H128V301.8C128 304.4 126 306.4 123.4 306.4H96C93.4 306.4 91.4 304.4 91.4 301.8V123.5H54.8V155.5C54.8 158.1 52.8 160.1 50.2 160.1H22.8C20.2 160.1 18.2 158.1 18.2 155.5V-64H201.1V32C201.1 104.6 310.8 104.6 310.8 32V-64H493.7V155.5C493.8000000000001 158.1 491.8000000000001 160.1 489.2 160.1zM201.1 164.6C201.1 162 199.1 160 196.5 160H169.1C166.5 160 164.5 162 164.5 164.6V228.6C164.5 231.2 166.5 233.2 169.1 233.2H196.5C199.1 233.2 201.1 231.2 201.1 228.6V164.6zM347.5 164.6C347.5 162 345.5 160 342.9 160H315.5C312.9 160 310.9 162 310.9 164.6V228.6C310.9 231.2 312.9 233.2 315.5 233.2H342.9C345.5 233.2 347.5 231.2 347.5 228.6V164.6z" />
+    <glyph glyph-name="forumbee"
+      unicode="&#xF211;"
+      horiz-adv-x="448" d=" M5.8 138.3C2 155.3 0 172.5 0 189.7C0 313 99.8 413 223.1 413C239.7 413 256.4 411 272.4 407.5C149 360.5 51.9 262 5.8 138.3zM398.7 327.5C385 345 369 360.2 350.9 372.8C201.3 328.5 84.6 210.7 41.2 60.8C53.7 42.7 69.2 25.2 86.4 11.8C129.5 163.1 247.6 283.5 398.7 327.5zM414.5 74.8C429.7 99.9 439.9 128.5 444 157.6C364.6 114.7000000000001 299 47 256.4 -32.7C286.4 -28.3 315.3 -17.4 341 -1.4C376 -14.5 411.9 -25.7 448 -35C438.7 1.5 427.6 39.5 414.5 74.8zM444.2 220.3C441.6 239.8 436.3 259 428.4 277.1C290.5 231.3 182 120.5 137.1 -18C155.2 -25.6 174.1 -30.5 193.7 -33.2C240 80.9 330.5 173.6 444.2 220.3z" />
+    <glyph glyph-name="foursquare"
+      unicode="&#xF180;"
+      horiz-adv-x="368" d=" M323.1 445H49.9C12.4 445 0 416.7 0 398.9V-34.9C0 -55.2 12.1 -62.6 18.2 -65C24.4 -67.5 41 -69.6 51.1 -57.9C180 91.5 182.2 94 182.2 94C185.3 97.4 185.6 97.1 189 97.1H272.4C307.5 97.1 313 122.3 316.7 136.8L365.3 379.8C373.8 422.2 363.1 445 323.1 445zM306.8 371.2L295.4000000000001 311.5C294.2000000000001 305 285.9000000000001 298.3 278.5000000000001 298.3H172.1C160.1 298.3 151.5 290 151.5 278V265C151.5 253 160.1 244.4 172.1 244.4H262.5C270.8 244.4 279.1 235.2 277.3 226.2C275.5 217.3 266.8 172.4 265.9000000000001 167.4C265.0000000000001 162.5000000000001 259.1 153.9 249.0000000000001 153.9H175.5C162 153.9 158.3000000000001 152.1 149 141.3C149 141.3 140.1 129.9 59.5 33C58.6 32.1 57.7 32.4 57.7 33.3V372.1C57.7 379.8 64.5 388.7 74.3 388.7H293.3000000000001C301.5000000000001 388.7 308.9000000000001 381 306.8000000000001 371.2z" />
+    <glyph glyph-name="free-code-camp"
+      unicode="&#xF2C5;"
+      horiz-adv-x="576" d=" M69.3 303.5C28.3 235 32.9 140.5 70.3 76.5C92.5 38.3 120 24.1 120 10C120 3.2 114 -3 107.2 -3C87.7 -3 8 72.5 8 194.8C8 306.3 86 380.8 105.1 380.8C111.1 380.8 120 376 120 369.7000000000001C120 357 91.7 341.1 69.3 303.5zM265.1 89.7C269.6 87.9 277.4000000000001 84.5 277.4000000000001 90.9C277.4000000000001 93.6 275.2000000000001 93.8 273.1 94.5C264.6 97.9 259.1 102.2 254.0000000000001 109.7C245.8000000000001 121.8 243.9000000000001 133.9 243.9000000000001 148.3C243.9000000000001 180.4 288.1 186.2 288.1 218.3C288.1 230.6 280.4000000000001 234.2 280.4000000000001 237.6C280.4000000000001 239.8 281.1 239.8 283.3 239.8C291.3 239.8 302.4000000000001 226.5 305.8 220C308 215.4 308.2 214 308.2 208.9C308.2 201.9 307.5 194.7 307.5 187.6C307.5 160.6 339.4 167.8 339.4 180.8C339.4 186.8 335.8 192.4 335.8 198.2C335.8 198.9 335.8 199.4 336.5 199.4C339.8999999999999 199.4 345.8999999999999 191.7 347.6 189.3C353.4 180.4 356.1 168.5 356.1 157.9C356.1 125.5000000000001 326.6 108.9 326.6 101.9C326.6 100.9 329.5 94.2000000000001 338.7 100.0000000000001C368.4 115.1000000000001 391.8 147.6000000000001 391.8 189.8000000000001C391.8 223.4000000000001 383.1 247.5000000000001 359.7 272.4000000000001C355.8 276.5000000000001 343.3 289.3000000000001 337.2 289.3000000000001C329 289.3000000000001 344.4 270.7000000000001 344.4 258.1000000000001C344.4 250.9000000000001 339.6 245.8000000000001 332.1 245.8000000000001C320.5 245.8000000000001 317.6 271.2000000000001 316.2 279.1000000000001C310.4 312.9000000000001 303.4 337.3000000000001 269.8 353.2000000000001C259.4000000000001 358.2000000000001 233.3 365.0000000000001 233.3 355.4000000000001C233.3 353.0000000000001 236 351.3000000000001 237.9 350.3000000000001C247.1 344.7000000000001 257.5 328.9000000000001 257.5 312.1000000000001C257.5 266.0000000000001 199.8 223.9000000000001 199.8 175.9000000000001C199.6 135.6000000000001 227.9 103.3000000000001 265.1 89.7000000000001zM470.4 381C464.4 381 456 374.5 456 368.4C456 359.7 468.1 348.8 473.6 343C555.2 257.9 552.2 128.7 491.2 52C484.2 43.1 455.9 16.7 455.9 8.5C455.9 3.4 464.1 -2.9 469.1 -2.9C494.5 -2.9 567.9 77.9 567.9 182.8C568 302.1 491.8 381 470.4 381zM428.1 57.9H167C157.6 57.9 151.5 50.4 151.5 41.5C151.5 33 158.5 26 167 26H428.1C437.5 26 440 33.5 440 42.4C440 50.9 436.5 57.9 428.1 57.9z" />
+    <glyph glyph-name="freebsd"
+      unicode="&#xF3A4;"
+      horiz-adv-x="448" d=" M303.7 351.8C314.8 362.9 419.2 428.8 442.9 405C466.6 381.3 400.8 276.9 389.7 265.8C378.6 254.7 350.3 264.9 326.6 288.7000000000001C302.8 312.4 292.5 340.7000000000001 303.7 351.8zM109.9 379.9C73.6 400.5 22 423.4 5.6 406.9C-11 390.3 12.7 337.5 33.5 301.2C52 333.4 78.3 360.5 109.9 379.9zM406.7 274C410 262.7 409.4 253.3 404 247.9C383.7 227.6 316.5 274.9 294.7 318C276.7 350.3 283.6 371.4 309.6 366.7C315.3 370.3 321.9 374.3 329.2 378.3C299.4 393.8 265.6 402.6 229.7 402.6C110.6 402.6 14.1 306.1 14.1 187C14.1 68 110.6 -28.6 229.7 -28.6S445.3 67.9 445.3 187C445.3 225.4 435.2 261.5 417.6 292.8C413.7000000000001 285.8 410 279.5 406.7000000000001 274z" />
+    <glyph glyph-name="get-pocket"
+      unicode="&#xF265;"
+      horiz-adv-x="448" d=" M407.6 384H40.6C18.5 384 0 365.5 0 343.4V208.2C0 83.5 99.7 -16 224.2 -16C348.2 -16 448 83.5 448 208.2V343.4C448 365.8 430.3 384 407.6 384zM245.6 115.5C233.2 103.7 214.2 104.4 203.2 115.5C89.5 224.4 88.3 220.6 88.3 238.7C88.3 255.6 102.1 269.4 119 269.4C136 269.4 135.1 265.6 224.2 180.1C314.8 267 312.8 269.4 329.7 269.4C346.6 269.4 360.4 255.6 360.4 238.7C360.4 220.9 357.5 223 245.6 115.5z" />
+    <glyph glyph-name="gg-circle"
+      unicode="&#xF261;"
+      horiz-adv-x="512" d=" M257 440C120 440 9 329 9 192S120 -56 257 -56S505 55 505 192S394 440 257 440zM207.5 65.2L81.8 190.9L207.5 316.6L242.7 281.2L218.5 257L207.4 268.1L130.2 190.9L207.4 113.7L234 140.3L180.9 193.2L205.3 217.6L282.5 140.4L207.5 65.2000000000001zM306.5 67.4L271.3 102.6L295.4000000000001 127L306.5000000000001 115.8999999999999L383.7000000000001 193.0999999999999L306.5000000000001 270.2999999999999L280.0000000000001 243.7999999999999L333.1000000000001 190.8999999999999L308.7000000000001 166.5L231.5000000000001 243.7L306.5000000000001 318.7L432.2 193L306.5 67.4z" />
+    <glyph glyph-name="gg"
+      unicode="&#xF260;"
+      horiz-adv-x="512" d=" M179.2 217.6L281.6 115.2L179.2 12.8L0 192L179.2 371.2L224 326.4L198.4 300.8L179.2 320L51.2 192L179.2 64L230.7 115.5L153.6 192L179.2 217.6zM332.8 371.2L230.4 268.8L332.8 166.4L358.4000000000001 192L281.3000000000001 268.5L332.8000000000001 320L460.8000000000001 192L332.8000000000001 64L313.6000000000001 83.2L288.0000000000001 57.6L332.8000000000001 12.8L512 192L332.8 371.2z" />
+    <glyph glyph-name="git-square"
+      unicode="&#xF1D2;"
+      horiz-adv-x="448" d=" M140.1 99.5C152.2 99.5 169.6 97.4 169.6 81.6C169.6 66.1 155.7 62.8 142.6 62.8C130.3 62.8 111.7 64.8 111.7 80.8S127.4 99.5 140.1 99.5zM115.4 216.1C115.4 201.3 122 192 137.7 192C153.2 192 158.9 202 158.9 216.5C159 250.9 115.4 251.3 115.4 216.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM207 274.3C194.7 269.5 181.5 265.9 168.1 265.9C129.6 288 77.4 265 77.4 216.4C77.4 198.4 89 173.5 107 167.5V166.8C93.6 160.9 89.9 130.7 107.7 119.8V119.1C88.2 112.7000000000001 75.4 100.3 75.4 78.9C75.4 42.1 110.2 31.9 140.8 31.9C177.9 31.9 205.6 45.3 205.6 86.2000000000001C205.6 136.6 133.5 118.0000000000001 133.5 145.3000000000001C133.5 154.9000000000001 138.7 158.7000000000001 147.6 160.5000000000001C177.2 166.0000000000001 195.8 189.1000000000001 195.8 219.2000000000001C195.8 224.4 194.7 229.4000000000001 192.9 234.2000000000001C197.7 235.3000000000001 202.4 236.5000000000001 207 238.1000000000001V274.3000000000001zM263.8 272.5H224.2C225.5000000000001 261.9 225.3 129.9 224.2 117H263.8C262.7 129.8 262.6 262.1 263.8 272.5zM268.3 325.8C268.3 339.2 258.3 352 244.2 352C229.9 352 219.6 339.5 219.6 325.8C219.6 312.2 230.1 299.9 244.2 299.9C257.9000000000001 299.9 268.3 312.4 268.3 325.8zM372.6 272.5H336.2000000000001C336.2000000000001 282.3 335.8000000000001 292.1 337.3000000000001 302H296.8000000000001C298.1000000000001 294.7 297.9000000000001 288.4 297.9000000000001 272.5H280.8000000000001V238.6C292.7000000000001 240.5 292.9000000000001 239.3 297.9000000000001 239.3V238.6H297.5000000000001V175.9C297.5000000000001 144.8 302.0000000000001 114.7 340.2000000000001 114.7C350.9000000000001 114.7 363.2000000000001 116.5 372.7000000000001 121.7V156.7C367.0000000000001 152.8 358.8000000000002 150.8 351.8000000000002 150.8C338.6000000000002 150.8 336.3000000000002 163.7 336.3000000000002 174.2V239.4C359.0000000000001 239.4 372.7000000000001 238.7 372.7000000000001 238.7V272.5z" />
+    <glyph glyph-name="git"
+      unicode="&#xF1D3;"
+      horiz-adv-x="448" d=" M18.8 226.3C18.8 201 35 166.3 60.3 157.8V156.8C41.5 148.5 36.3 106.2 61.3 91V90C34 81 16 63.7 16 33.8C16 -17.7 64.8 -32 107.5 -32C159.5 -32 198.2 -13.3 198.2 44C198.2 114.5 97.2 88.5 97.2 126.8C97.2 140.3 104.4 145.5 116.9 148.1C158.4 155.8 184.4 188.1 184.4 230.3C184.4 237.6 182.9 244.5 180.4 251.3C187.1 252.8 193.6 254.6 200.1 256.8V307.3C182.9 300.5 164.4 295.5 145.6 295.5C91.8 326.5 18.8 294.2 18.8 226.3zM106.5 62.5C123.5 62.5 147.7 59.5 147.7 37.5C147.7 15.7 128.2 11.2 110 11.2C92.7 11.2 66.7 13.9 66.7 36.4C66.8 58.7 88.8 62.5 106.5 62.5zM103.3 192C81.3 192 72 205 72 225.8C72 275.1 133 274.6 133 226.3C133 206 125 192 103.3 192zM432 142.5V93.5C418.7 86.2 401.5 83.7 386.5 83.7C333 83.7 326.7 125.9 326.7 169.4V257.1H327.2V258.1C320.2 258.1 319.9 259.7 303.2 257.1V304.6H327.2C327.2 326.9 327.5 335.6 325.7 345.8H382.4C380.4 332 380.9 318.3 380.9 304.6H431.9V257.1S412.6 258.1 380.9 258.1V167C380.9 152.2 384.2 134.2 402.7 134.2C412.5 134.2 424 137 432 142.5zM286 379.3C286 360.6 271.5 343.1 252.2 343.1C232.4 343.1 217.7 360.3 217.7 379.3C217.7 398.6 232.2 416 252.2 416C272 416 286 398 286 379.3zM279.8 304.8C278 290.2000000000001 278.2 105 279.8 87H224.3C225.9 105.1 226.1 290 224.3 304.8H279.8z" />
+    <glyph glyph-name="github-alt"
+      unicode="&#xF113;"
+      horiz-adv-x="480" d=" M186.1 119.3C186.1 98.4 175.2 64.2 149.4 64.2S112.7 98.4 112.7 119.3S123.6 174.4 149.4 174.4S186.1 140.2000000000001 186.1 119.3zM480 169.8C480 137.9 476.8 104.1 462.5 74.8C424.6 -1.8 320.4 0 245.8 0C170 0 59.6 -2.7 20.2 74.8C5.6 103.8 0 137.9 0 169.8C0 211.7 13.9 251.3 41.5 283.4C36.3 299.2000000000001 33.8 315.8 33.8 332.2C33.8 353.7 38.7 364.5 48.4 384C93.7 384 122.7 375 157.2 348C186.2 354.9 216 358 245.9000000000001 358C272.9000000000001 358 300.1 355.1 326.3000000000001 348.8C360.3000000000001 375.5 389.3000000000001 384 434.1000000000001 384C443.9000000000001 364.5 448.7000000000001 353.7 448.7000000000001 332.2C448.7000000000001 315.8 446.1000000000001 299.5 441.0000000000001 284C468.5000000000001 251.6 480.0000000000001 211.7 480.0000000000001 169.8zM415.7 119.3C415.7 163.2 389 201.9 342.2 201.9C323.3 201.9 305.2 198.5 286.2 195.9C271.3 193.6 256.4 192.7 241.1 192.7C225.9 192.7 211 193.6 196 195.9C177.3 198.5 159 201.9 140 201.9C93.2 201.9 66.5 163.2 66.5 119.3C66.5 31.5 146.9 18 216.9 18H265.1C335.4000000000001 18 415.7000000000001 31.4 415.7000000000001 119.3zM333.1 174.4C307.3 174.4 296.4000000000001 140.2000000000001 296.4000000000001 119.3S307.3 64.2 333.1 64.2S369.8 98.4 369.8 119.3S358.9000000000001 174.4 333.1 174.4z" />
+    <glyph glyph-name="github-square"
+      unicode="&#xF092;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM277.3 32.3C268.9000000000001 30.8 265.8 36 265.8 40.3C265.8 45.7 266 73.3 266 95.6C266 111.2000000000001 260.8 121.1 254.7 126.3C291.7 130.4 330.7 135.5 330.7 199.4C330.7 217.6 324.2 226.7 313.6 238.4C315.3 242.7 321 260.4 311.9 283.4C298 287.7000000000001 266.2 265.5 266.2 265.5C253 269.2 238.7 271.1 224.6 271.1C210.5 271.1 196.2 269.2 183 265.5C183 265.5 151.2 287.7 137.3 283.4C128.2 260.5 133.8 242.8 135.6 238.4C125 226.7 120 217.6 120 199.4C120 135.8 157.3 130.4 194.3 126.3C189.5 122 185.2 114.6 183.7 104C174.2 99.7 149.9 92.3 135.4 117.9C126.3000000000001 133.7 109.9 135 109.9 135C93.7 135.2 108.8 124.8 108.8 124.8C119.6 119.8 127.2000000000001 100.6 127.2000000000001 100.6C136.9 70.9 183.3000000000001 80.9 183.3000000000001 80.9C183.3000000000001 67.0000000000001 183.5 44.4 183.5 40.3C183.5 36 180.5 30.8 172 32.3C106 54.4 59.8 117.2000000000001 59.8 190.6C59.8 282.4000000000001 130 352.1 221.8 352.1S388 282.4 388 190.6C388.1 117.2000000000001 343.3 54.3 277.3 32.3zM179.2 93.4C177.3 93.0000000000001 175.5 93.8 175.3 95.1C175.1 96.6 176.4 97.9 178.3 98.3C180.2 98.5 182 97.7 182.2 96.4C182.5 95.1 181.2 93.8 179.2 93.4zM169.7 94.3C169.7 93 168.2 91.9 166.2 91.9C164 91.7000000000001 162.5 92.8 162.5 94.3C162.5 95.6 164 96.7 166 96.7C167.9 96.9 169.7 95.8 169.7 94.3zM156 95.4C155.6 94.1 153.6 93.5000000000001 151.9 94.1C150 94.5 148.7000000000001 96 149.1 97.3C149.5 98.6 151.5 99.2 153.2 98.8C155.2 98.2 156.5 96.7 156 95.4zM143.7 100.8C142.8 99.7 140.9 99.9 139.4 101.4C137.9 102.7000000000001 137.5 104.6 138.5 105.5000000000001C139.4 106.6000000000001 141.3 106.4 142.8 104.9C144.1 103.6 144.6 101.6 143.7 100.8zM134.6 109.9C133.7 109.3 132 109.9 130.9 111.4S129.8000000000001 114.6 130.9 115.3C132 116.2 133.7000000000001 115.5 134.6 114C135.7 112.5 135.7 110.7 134.6 109.9zM128.1 119.6C127.2 118.7000000000001 125.7 119.2000000000001 124.6 120.2000000000001C123.5 121.5000000000001 123.3 123.0000000000001 124.2 123.7000000000001C125.1 124.6 126.6 124.1 127.7 123.1C128.8 121.8 129 120.3 128.1 119.6zM121.4 127C121 126.1 119.7 125.9 118.6 126.6C117.3 127.2000000000001 116.7 128.3 117.1 129.2000000000001C117.5 129.8000000000001 118.6 130.1 119.9 129.6C121.2 128.9 121.8 127.8 121.4 127z" />
+    <glyph glyph-name="github"
+      unicode="&#xF09B;"
+      horiz-adv-x="496" d=" M165.9 50.6C165.9 48.6 163.6 47 160.7 47C157.4 46.7 155.1 48.3 155.1 50.6C155.1 52.6 157.4 54.2 160.3 54.2C163.3 54.5000000000001 165.9 52.9 165.9 50.6zM134.8 55.1C134.1 53.1 136.1 50.8 139.1 50.2C141.7 49.2 144.7 50.2 145.3 52.2S144 56.5000000000001 141 57.4C138.4 58.1 135.5 57.1 134.8 55.1zM179 56.8C176.1 56.1 174.1 54.2 174.4 51.9C174.7 49.9 177.3 48.6 180.3 49.3C183.2 50 185.2 51.9 184.9 53.9C184.6 55.8 181.9 57.1 179 56.8zM244.8 440C106.1 440 0 334.7 0 196C0 85.1 69.8 -9.8 169.5 -43.2C182.3 -45.5 186.8 -37.6 186.8 -31.1C186.8 -24.9 186.5 9.3 186.5 30.3C186.5 30.3 116.5 15.3 101.8 60.1C101.8 60.1 90.4 89.2000000000001 74 96.7000000000001C74 96.7000000000001 51.1 112.4 75.6 112.1C75.6 112.1 100.5 110.1 114.2 86.3C136.1 47.7 172.8 58.8 187.1 65.4C189.4 81.4 195.9 92.5000000000001 203.1 99.1C147.2 105.3 90.8 113.4 90.8 209.6C90.8 237.1 98.4 250.9000000000001 114.4 268.5C111.8 275 103.3 301.8 117 336.4000000000001C137.9 342.9000000000001 186 309.4000000000001 186 309.4000000000001C206 315 227.5 317.9000000000001 248.8 317.9000000000001S291.6 315 311.6 309.4000000000001C311.6 309.4000000000001 359.7000000000001 343 380.6 336.4000000000001C394.3 301.7000000000001 385.8 275 383.2000000000001 268.5C399.2000000000001 250.8000000000001 409.0000000000001 237.0000000000001 409.0000000000001 209.6C409.0000000000001 113.1 350.1000000000001 105.4 294.2000000000001 99.1C303.4000000000001 91.2000000000001 311.2000000000001 76.2000000000001 311.2000000000001 52.7C311.2000000000001 19.0000000000001 310.9000000000001 -22.6999999999999 310.9000000000001 -30.9C310.9000000000001 -37.4 315.5000000000001 -45.3 328.2000000000001 -43C428.2 -9.8 496 85.1 496 196C496 334.7 383.5 440 244.8 440zM97.2 95.1C95.9 94.1 96.2 91.8 97.9 89.9C99.5 88.3 101.8 87.6 103.1 88.9C104.4 89.9 104.1 92.2000000000001 102.4 94.1C100.8 95.7000000000001 98.5 96.4 97.2 95.1zM86.4 103.2000000000001C85.7 101.9 86.7 100.3000000000001 88.7 99.3000000000001C90.3 98.3000000000001 92.3 98.6000000000001 93 100.0000000000001C93.7 101.3000000000001 92.7 102.9 90.7 103.9C88.7 104.5000000000001 87.1 104.2000000000001 86.4 103.2000000000001zM118.8 67.6C117.2 66.3 117.8 63.3 120.1 61.4C122.4 59.1 125.3 58.8 126.6 60.4C127.9 61.7000000000001 127.3 64.7000000000001 125.3 66.6C123.1 68.9 120.1 69.2000000000001 118.8 67.6zM107.4 82.3C105.8 81.3 105.8 78.7 107.4 76.4C109 74.1 111.7 73.1 113 74.1C114.6 75.4 114.6 78 113 80.3C111.6 82.6 109 83.6 107.4 82.3z" />
+    <glyph glyph-name="gitkraken"
+      unicode="&#xF3A6;"
+      horiz-adv-x="592" d=" M565.7 329.9C563.4000000000001 336 556.4000000000001 339.1 550.4000000000001 336.5C544.7 334.1 541.9000000000001 327.6 544.1000000000001 321.9C555.0000000000001 292.9 561.0000000000001 261.4 561.0000000000001 228.6C561.0000000000001 94 460.7000000000001 -17.1 330.8000000000002 -34.1V89.6C338.7000000000001 91.1 346.3000000000002 93.2000000000001 353.8000000000002 95.8V-8.2C460.5000000000001 17.7 539.7000000000002 113.9 539.7000000000002 228.6C539.7000000000002 320.4000000000001 488.9000000000001 400.4000000000001 413.9000000000002 441.9000000000001C408.2000000000002 445.1 400.9000000000002 442.8 398.0000000000002 436.9000000000001C395.3000000000002 431.4000000000001 397.4000000000002 424.7000000000001 402.7000000000002 421.8C470.6000000000001 384.2000000000001 516.6000000000001 311.8000000000001 516.6000000000001 228.6000000000001C516.6000000000001 135.3000000000001 458.7000000000002 55.5000000000001 376.8000000000002 23.2V115.4C391.0000000000001 119.9 401.7000000000001 133.1 401.7000000000001 148.9C401.7000000000001 162.0000000000001 394.9000000000001 173.3 384.4000000000001 179.4C392.7000000000001 258.9000000000001 428.9000000000001 238.0000000000001 428.9000000000001 263.3000000000001V278C428.9000000000001 316 341.0000000000001 439.8 299.9000000000001 442.7C297.4000000000001 442.9 294.9000000000001 442.9 292.3000000000001 442.7C251.1 439.7 163.2 316 163.2 278V263.2C163.2 237.9 199.5 258.9 207.7 179.3C197.1 173.1999999999999 190.4 161.9 190.4 148.8C190.4 133 201 119.8 215.2 115.3V23.1C133.3 55.3 75.4 135.1 75.4 228.5C75.4 311.6 121.4 384 189.3 421.7C194.7 424.7 196.7 431.3 194 436.8C191.1 442.7 183.9 445 178.1 441.8C103.1 400.3 52.3 320.3 52.3 228.5C52.3 113.8 131.5 17.6999999999999 238.2 -8.3000000000001V95.6999999999999C245.8 93.1999999999999 253.3 91.0999999999999 261.2 89.4999999999999V-34.2C131.4 -17.2 31 93.9 31 228.5C31 261.3 37 292.8 47.9 321.8C50.1 327.6 47.3 334 41.6 336.4C35.6 339 28.6 336 26.3 329.8C14.5 298.3 8 264.2 8 228.5C8 73.4 130.6 -53.1 284.3 -59.3V86.6C291.1 86.2000000000001 299.3 86.1 307.7 86.6V-59.2C461.4 -53.1 584 73.4 584 228.5C584 264.2 577.5 298.3 565.7 329.9zM365.9 172.5C378.9 172.5 389.6 162 389.6 148.8C389.6 135.7 379 125.1 365.9 125.1C352.9 125.1 342.2 135.6 342.2 148.8C342.2 161.9 352.8 172.5 365.9 172.5zM226.1 125.2C212.9 125.2 202.4 135.9 202.4 148.9S212.9 172.6 226.1 172.6C239.2 172.6 249.8 162 249.8 148.9C249.8 135.9 239.3 125.2 226.1 125.2z" />
+    <glyph glyph-name="gitlab"
+      unicode="&#xF296;"
+      horiz-adv-x="512" d=" M29.782 248.268L256 -45.714L8.074 138.301C1.218 143.443 -1.638 152.297 0.933 160.294L29.782 248.268zM105.187 423.074C102.045 431.928 89.478 431.928 86.336 423.074L29.782 248.268H161.743L105.187 423.074zM161.743 248.268L256 -45.714L350.257 248.2680000000001H161.743zM511.067 160.294L482.218 248.268L256 -45.714L503.926 138.301C510.781 143.443 513.637 152.297 511.067 160.294zM425.663 423.074C422.521 431.928 409.954 431.928 406.812 423.074L350.257 248.268H482.218L425.663 423.074z" />
+    <glyph glyph-name="gitter"
+      unicode="&#xF426;"
+      horiz-adv-x="384" d=" M66.4 125.5H16V448H66.4V125.5zM166.9 371.9H116.5V-64H166.9V371.9zM267.5 371.9H217.1V-64H267.5V371.9zM368 372H317.6V125H368V372z" />
+    <glyph glyph-name="glide-g"
+      unicode="&#xF2A6;"
+      horiz-adv-x="448" d=" M407.1 236.8C403.6 238.2 395.5 240.6 391.7000000000001 240.6C354.6 240.6 329.5000000000001 223.8 298.2000000000001 206.1L297.3000000000001 207C304.3000000000001 254.3 320.8000000000001 298.9000000000001 320.8000000000001 347.4000000000001C320.8 418.9 282.6 448 212.4 448C97.3 448 39 334.3 39 249.6C39 161.7 90.3 113 177.6 113C189.6 113 188.6 114 188.6 109.2C171.7 -19.7 97.8 -23.9 97.8 14.6C97.8 53.8 142.8 73.2000000000001 143.3 75.6C143 87.8 96.3 103.2000000000001 84.4 103.2000000000001C50.5 103.1 32 52.0000000000001 32 23.9C32 -28 64.8 -64 117.5 -64C194.9 -64 251.5 13.8 268.9 81.4C284 141.9 280.1 144.7 288.6 149C320.8 165.2 346.1 176 382.4 176C400.2 176 412.9 172.3 441.3 167.6C444.2 167.6 448 170.5 448 173.4C448 181.4 414.6 233.9000000000001 407.1 236.8000000000001zM231.8 321.2000000000001C222.5 276.5 213.2 231.6 204 186.9C201.7 176.7 190.7 179.1 182 179.1C143.7 179.1 133 220.9 133 252.2C133 299.2 151 361.5 194.8 385.6C201.8 389.7 209.6 392.3 217.4 392.3C236 392.3 237.4 379 237.4 363.6C237.3 349.3 234.7 335.1 231.8 321.2z" />
+    <glyph glyph-name="glide"
+      unicode="&#xF2A5;"
+      horiz-adv-x="448" d=" M252.8 299.4C252.8 290.6 251.2 281.7000000000001 249.4 273C243.6 245.2 237.8 217.2 232.1 189.4C230.7 183.1 223.8 184.5 218.4 184.5C194.6 184.5 187.9 210.5 187.9 230C187.9 259.3 199.1 298.1 226.4 313.1C230.7 315.6 235.6 317.3 240.5 317.3C251.9 317.3 252.8 309 252.8 299.4zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM384 181C384 186.1 363.2 218.7 358.5 220.5C356.3 221.4 351.3 222.8 348.9 222.8C325.8 222.8 310.2 212.3 290.7 201.3L290.2 201.8C294.5 231.2 304.8 259 304.8 289.2000000000001C304.8 333.8 281 351.9000000000001 237.3 351.9000000000001C165.6 351.9000000000001 129.3 281.1 129.3 228.4000000000001C129.3 173.7000000000001 161.3 143.4 215.6 143.4C223.1 143.4 222.5 144.0000000000001 222.5 141.1C212 60.8 166 58.2000000000001 166 82.2000000000001C166 106.6 194 118.7000000000001 194.3000000000001 120.2000000000001C194.1000000000001 127.8000000000001 165 137.4 157.6 137.4C136.5 137.4 124.9 104.4 124.9 86.8C124.9 54.5 145.3 32.1 178.2 32.1C226.4000000000001 32.1 261.6 81.8 272.5 123.8C281.9 161.5 279.5 163.2 284.8 165.9C304.8 176.0000000000001 320.6 182.7000000000001 343.2 182.7000000000001C354.3 182.7000000000001 362.2 180.4 379.9 177.5000000000001C381.7 177.4 384 179.2000000000001 384 181.0000000000001z" />
+    <glyph glyph-name="gofore"
+      unicode="&#xF3A7;"
+      horiz-adv-x="400" d=" M324 128.2H310.8V93.5C286.3 70.4 254.5 57.7 220.9 57.7C147.7 57.7 88.5 117.9 88.5 192.1C88.5 266.2 147.7 326.5 220.9 326.5C256.2 326.5 289.5 312.5 314.5 287.1L376.8 350.4C335 392.7 279.7 416 220.7 416C98 416 0 315.4 0 192C0 69.5 97 -32 220.7 -32C283.9 -32 345.2 -5.8 391.7 50.5C389.7 78.1 378.3 128.2 324 128.2zM311.9 240.7H205.6V151.7H324C357.5 151.7 384.5 136.6 400 109.9V140.5C400 205.7 359.6 240.7 311.9 240.7z" />
+    <glyph glyph-name="goodreads-g"
+      unicode="&#xF3A9;"
+      horiz-adv-x="384" d=" M42.6 44.7H45.4C58.1 44.7 70.9 44.7 83.6 44.6C85.2 44.6 86.7 44.9999999999999 87.2 42.4999999999999C94.3 7.6 117.2 -12.1000000000001 150.1 -21.4C177 -29.0000000000001 204.2 -29.2 231.4 -23.2C265.2 -15.8000000000001 287.4 5.1 299.4 37.1999999999999C307.4 58.6999999999999 310.1 80.9999999999999 310.4 103.6999999999999C310.5 109.4999999999999 310.7 150.6999999999999 310.2 156.5L309.3 156.8C308.5 155.3 307.6 153.9 306.8 152.4C284.7 109.3 245.5 85 201.4 83.3C98.4 79.3 32 140.3 29.4 259.5C28.9 283.2 31.2 306.4 37.7 329.2C58.3 400.3 112.3 447.4 191.6 448C252.9 448.4 293.1 409.3 307.8 377.7C308.3 376.6 309.1 375.4 310.2 375.8V437.4H354.5C354.5 157.1 354.6 105.2 354.6 105.2C354.5 26.7 327.9000000000001 -38.5 251.6 -57C182.1 -73.9 92.6 -61.8 55.6 0.2C47.6 13.7 43.8 28.5 42.6 44.7zM188.9 411.5C136.4 412 80.4 370.8 73.9 277.7C69.8 218.7 88.7 155.5 145.4 129.1C173 116.2000000000001 219.7 114.1 253.7 137.8C301.3 171 316.4 234.8 308.5 291.8C298.8 362.9 260.7 411.8 188.9 411.5z" />
+    <glyph glyph-name="goodreads"
+      unicode="&#xF3A8;"
+      horiz-adv-x="448" d=" M299.9 256.8C305 219.5 295.2 177.8 264 156.1C241.7 140.6 211.2 142 193.2 150.4C156.1 167.7000000000001 143.7 209 146.4 247.6C150.7 308.5 187.3 335.5 221.7 335.1C268.6 335.3 293.5 303.3 299.9 256.8zM448 360V24C448 -6.9 422.9 -32 392 -32H56C25.1 -32 0 -6.9 0 24V360C0 390.9 25.1 416 56 416H392C422.9 416 448 390.9 448 360zM330 134.8S329.9 168.8 329.9 352.1H300.9V311.8C300.1 311.5 299.7 312.3 299.3 313C289.7 333.7 263.4 359.3 223.3 359C171.4 358.6 136.1 327.8 122.7 281.2C118.4 266.3 116.9 251.1 117.2 235.6C118.9 157.7 162.3 117.8 229.6 120.4C258.5 121.5 284.1 137.4 298.6 165.6C299.1 166.6 299.7 167.5 300.3 168.5C300.5 168.3999999999999 300.7 168.3999999999999 300.9 168.3C301.2 164.5 301.1 137.6 301 133.8C300.8 119 299 104.3 293.8 90.3C286 69.3 271.5 55.6 249.3 50.8C231.5 46.9 213.7 46.9999999999999 196.1 51.9999999999999C174.6 58.1 159.6 70.9999999999999 155 93.8C154.7 95.4 153.7 95.1 152.7 95.1H125.9C126.7 84.4999999999999 129.1 74.8 134.4 65.9C158.6 25.4 217.1 17.4 262.6 28.5C312.5 40.8 329.9000000000001 83.4 330 134.8z" />
+    <glyph glyph-name="google-drive"
+      unicode="&#xF3AA;"
+      horiz-adv-x="512" d=" M339 133.1L175.4 416H336.6L500.2 133.1H339zM201.5 109.5L120.9 -32H431.4L512 109.5H201.5zM154.1 380.6L0 109.5L80.6 -32L237 239.2L154.1 380.6z" />
+    <glyph glyph-name="google-play"
+      unicode="&#xF3AB;"
+      horiz-adv-x="512" d=" M325.3 213.7L104.6 435L385.4 273.8L325.3 213.7zM47 448C34 441.2 25.3 428.8 25.3 412.7V-28.6C25.3 -44.7 34 -57.1 47 -63.9L303.6 192.1L47 448zM472.2 222.4L413.3 256.5L347.6 192L413.3 127.5L473.4 161.6C491.4 175.9 491.4 208.1 472.2 222.4zM104.6 -51L385.4 110.2L325.3 170.3L104.6 -51z" />
+    <glyph glyph-name="google-plus-g"
+      unicode="&#xF0D5;"
+      horiz-adv-x="640" d=" M386.061 219.504C387.895 209.812 389.204 200.12 389.204 187.548C389.204 77.795 315.599 0 204.8 0C98.716 0 12.8 85.915 12.8 192S98.716 384 204.8 384C256.664 384 299.8830000000001 365.141 333.411 333.708L281.2850000000001 283.678C267.1400000000001 297.299 242.2570000000001 313.277 204.8 313.277C139.316 313.277 85.88 259.056 85.88 192C85.88 124.944 139.316 70.723 204.8 70.723C280.761 70.723 309.313 125.468 313.765 153.496H204.8V219.505H386.0610000000001zM571.467 213.067V268.8H515.466V213.067H459.733V157.066H515.466V101.333H571.467V157.066H627.2V213.067H571.4670000000001z" />
+    <glyph glyph-name="google-plus-square"
+      unicode="&#xF0D4;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM164 92C108.7 92 64 136.7 64 192S108.7 292 164 292C191 292 213.5 282.2 231 265.8L203.9 239.7C196.5 246.8 183.6 255.1 164.1 255.1C130 255.1 102.2 226.9000000000001 102.2 191.9C102.2 157.0000000000001 130 128.7000000000001 164.1 128.7000000000001C203.7 128.7000000000001 218.5 157.2000000000001 220.9 171.8000000000001H164V206.2000000000001H258.4C259.4 201.2000000000001 260 196.1000000000001 260 189.6000000000001C260 132.5000000000001 221.7 92.0000000000001 164 92.0000000000001zM384 173.8H355V144.8H325.8V173.8H296.8V203H325.8V232H355V203H384V173.8z" />
+    <glyph glyph-name="google-plus"
+      unicode="&#xF2B3;"
+      horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM177.3 68C108.5 68 53.3 123.5 53.3 192S108.5 316 177.3 316C208.6 316 237.4 305 260.3 283.7L226.7 251.1C213.5 264 195.4 270.2 177.3 270.2C134.4 270.2 100.1 234.7 100.1 192.1S134.3 114 177.3 114C209.9 114 242.2 133.1 247.4 167.3H177.3V209.9H294.2000000000001C295.5000000000001 203.1 296.1 196.3 296.1 189.2C296.1 118.4 248.6 68 177.3 68zM407.5 174.2V138.7H372V174.2H336.5V209.7H372V245.2H407.5V209.7H442.7V174.2H407.5z" />
+    <glyph glyph-name="google-wallet"
+      unicode="&#xF1EE;"
+      horiz-adv-x="448" d=" M156.8 321.2C194.4 260.6 221 208.1 241.1 158.7C232.8 124.9 222.3 92.2 209.8 60.4C196.6 112.7 183.3 161.7 153.8 208.9C160.3 245.3 156.1 282.5 156.8 321.2zM109.3 248H16.1C9.6 248 5.6 240.5 9.6 235.3C51.8 181 81.3 117.5 101.3 48H204.8C188.6 117.7 166.1 181.7 122.3 241.5C119.3 245.5 114.3 248 109.3 248zM157.1 336C225.6 228 287.1 101.5 295.3 -32H409C397 106 340.6 233 265.8 336H157.1zM408.9 404.5C407.1 411.3 400.7 416 393.7 416H305.4C300.1 416 296.4 411 297.6 405.7C310.8 359.2 319.9 310.2 324.1 259.7C372.3 173.5 403.8 81.4 414.7 -11.1C430.5 49.4 440 122.4 440 191.9C440 265.5 427.8999999999999 337 408.8999999999999 404.5z" />
+    <glyph glyph-name="google"
+      unicode="&#xF1A0;"
+      horiz-adv-x="488" d=" M488 186.2C488 44.7 391.1 -56 248 -56C110.8 -56 0 54.8 0 192S110.8 440 248 440C314.8 440 371 415.5 414.3 375.1L346.8 310.2C258.5 395.4 94.3 331.4 94.3 192C94.3 105.5 163.4 35.4 248 35.4C346.2 35.4 383 105.8 388.8 142.3H248V227.6H484.1C486.4 214.9 488 202.7 488 186.2z" />
+    <glyph glyph-name="gratipay"
+      unicode="&#xF184;"
+      horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM362.6 213.6L249.6 60.9L136.9 213.6C128.2000000000001 225.5 117.8000000000001 264 150.5 285.6C178.6 303.7 205.1 289.8 219 273.7C234.9000000000001 255.8 265.6 256.8 280.7000000000001 273.7C294.6 289.8 321.1 303.7 348.8000000000001 285.6C381.7000000000001 264 371.4000000000001 225.6 362.6000000000001 213.6z" />
+    <glyph glyph-name="grav"
+      unicode="&#xF2D6;"
+      horiz-adv-x="512" d=" M301.1 236C305.5 231.6 305.5 224.1 301.1 219.7L291.4000000000001 210C287.0000000000001 205.3 279.5000000000001 205.3 274.8 210L264.3 220.5C259.9000000000001 225.2 259.9000000000001 232.4 264.3 237.1L274 246.8C278.4 251.2 285.9 251.2 290.6 246.8L301.1 236zM270.9000000000001 255.7C273.9000000000001 258.7 273.9000000000001 263.5 270.9000000000001 266.2C268.1 269.2 263.4000000000001 269.2 260.4000000000001 266.2C257.6 263.4 257.6 258.7 260.4000000000001 255.7C263.5000000000001 252.9 268.2000000000001 252.9 270.9000000000001 255.7zM244.9000000000001 250.4C241.9000000000001 247.6 241.9000000000001 242.9 244.9000000000001 240.2C247.7000000000001 237.2 252.4000000000001 237.2 255.4000000000001 240.2C258.2000000000001 243 258.2000000000001 247.7 255.4000000000001 250.4C252.4000000000001 253.4 247.7000000000001 253.4 244.9000000000001 250.4zM317.4000000000001 263.7C297.5000000000001 278.1 283.6 306.9 305.5000000000001 331.8C327.1000000000001 356.7 346.2000000000001 349 365.3000000000001 331C377.2000000000001 319.7 394.6000000000001 306.1 382.5000000000001 282.8C370.0000000000001 259.3 337.4000000000001 249.6 317.4000000000001 263.7zM365.1 308.2C356.2000000000001 318.2 341.8 301.3 349.6 292.1C357 283.1 381.7000000000001 289.7 365.1 308.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM437.8 149.4C440.3 165.5 417.6 166 412.6 175.1C399 199.2 384.9000000000001 211.9 358.1 205.5C369.7000000000001 213.5 381.6 211.6 381.6 211.6C381.9000000000001 218 381.6 224.6 372.2000000000001 236.5C376.1 249 372.5000000000001 258.9 372.5000000000001 258.9C388.0000000000001 267.5 399.3000000000001 283.3 401.6000000000001 302.1C405.2000000000001 333.1 382.8000000000001 361.3 351.8000000000001 364.9C329.7000000000001 367.4 308.1000000000001 357.2 297.5000000000001 339.2C274.3000000000001 299.1 298.9000000000001 268.3 319.9000000000001 257.8C305.5000000000001 259.2 285.6 269.7 279.8 292.1C273.2 317.8 282.6 341.9 288.7 353.5C288.7 353.5 284.3 359.3 280.7 362.4C280.7 362.4 266.9 362.4 256.1 357.1C268 372.3 281.3 371.5 281.3 371.5C281.3 377.9 280.7 386.4 277.7 393.1C272.3 404.1 253.8999999999999 406 246 390.3C246.1 390.5 246.3 390.7 246.4 390.8C241.4 378.9 245.3 334.9 263.3 303.6C260.8 302.2 254.2 297.5 250.3 293.6C228.7 283.9 194.1 233.3 194.1 233.3C165.9 222.5 116.9 182.4 123.5 153.6C123.8 150.6 124.9 148.1 126.5 146.1C123.7 143.9 121 141.1 118.2 137.8C106.3 124 112.9 102.6 135.9 113.4C151.7 120.6 165.5 133.6 172.2 143.8C172.2 143.8 166.7 148.8 155.9 148.2C183.6 154.8 190.2 157.6 202.1 157.3C210.1 153.4 210.1 191.6 210.1 191.6C210.1 206.3 207.9 222.6 199 233.1C211.5 220.9 228.1 200.4 227 172.5C226.2 154.2 211.8 149.5 211.8 149.5C202.7 132.9 168.6 83.6 181.4 43.5C181.4 43.5 171.7 58.4 171.2 65.6C153.8 46.2 124.7 13.3 146.6 1.1C173.2 -13.6 255.4 89.7000000000001 272.8 143.4C307.4000000000001 164.2000000000001 328.2 190.7000000000001 336.7 208.4C358.7 164.9 432 113.9 437.8 149.4z" />
+    <glyph glyph-name="gripfire"
+      unicode="&#xF3AC;"
+      horiz-adv-x="384" d=" M171.8 -55.8C171.8 -50.5 176.6 -43.6 176.6 -33.5C176.6 -18.3 163.6 6.4 98.5 53.1C64.2 82.2 32 111.6 32 161.4C32 276.1 179.1 337.9 179.1 430C179.1 433.3 178.9 436.7 178.5 440C183.6 437.6 217.6 396.7 217.6 349.6C217.6 269.1 112.5 220.4 112.5 146.6C112.5 119.7000000000001 129.1 99.4 145.1 77.1C167.6 46.9 189.3 20.2 189.3 -9.4C189.2 -23.9 184.9 -39.1 171.8 -55.8zM317.8 185.6C319.3 177.2000000000001 320 169 320 161C320 109.2 290.6 63.5 252.7 24.2C251.7 23.2 250.5 21.8 249.5 21.8C245.9 21.8 214 63.4 214 75C214 75 255.8 130.7 255.8 171.9C255.8 182.7 253.1 193.6 246.7 205.3C245.2 173 191 117.6 188.6 117.6C185.9 117.6 170.7 139.6 170.7 159.7C170.7 165 171.7 170.4 173.9 175.5C176.3 181 230.5 247.5 230.5 292.2C230.5 298.4 229.5 304.2 227.1 309.3L223.1 316.5C239.8 310 305.7 252.4 317.8 185.6" />
+    <glyph glyph-name="grunt"
+      unicode="&#xF3AD;"
+      horiz-adv-x="384" d=" M61.3 258.7C60.2 248.7 66.5 239.6 66.5 239.6C67.2 247.1 68.7 252.4 70.5 256.2C70.9 245.9 73.7 232.7 83.3 222.1C90.2 214.5 118.9 198.8 138.2 216C139.2 213.6 140.3 210.7 141.2 207.5C144.1 197.2 138.5 182.2 138.5 182.2S153.6 199.3 152.4 214.7C163.2 215.2 173.8 223.1 173.5 234.2C173.5 234.2 154.6 223.8 138 243C128.3 254.2 97.1 285 54.9 274.8C59.2 273.8 63.8 272.4 68.4 270.7000000000001H68.3C64.1 268.7000000000001 61.8 263.6 61.3 258.7000000000001zM89.6 260.5C109.1 249.5 127 234.8 134.5 223.5C128.8 220.2 112.8 213.1 96.5 225.2C86.2 232.8 86.7 251.4 89.6 260.5zM168.8 26.8C171 24.5 170.3 21.5 169.7 20C168.6 17.3 164.2 8.4 156.7 0.2C154 -2.7 150.1 -4.4 145.7 -4.4C141.4 -4.4 137 -2.8 133.9 -0.1C131.6 2 123.7 9.4 120.2 18.5C118.9 21.9 119.2 24.6 121.1 26.6C122.4 27.9 125.1 29.5 130.6 29.5H160C164.1 29.5 167 28.6 168.8 26.8zM231.7 214.7C230.5000000000001 199.2 245.6 182.2000000000001 245.6 182.2000000000001S240.0000000000001 197.2000000000001 242.9000000000001 207.5000000000001C243.8000000000001 210.7000000000001 244.9000000000001 213.5000000000001 245.9000000000001 216.0000000000001C265.2000000000001 198.7000000000001 293.9000000000001 214.5000000000001 300.7000000000001 222.1000000000001C310.3000000000001 232.7000000000001 313.0000000000001 245.9000000000001 313.5000000000001 256.2000000000001C315.3000000000001 252.4000000000001 316.9000000000001 247.1000000000001 317.5000000000001 239.6000000000001C317.5000000000001 239.6000000000001 323.9000000000001 248.7000000000001 322.7000000000001 258.7000000000001C322.1 263.7000000000001 319.8000000000001 268.7000000000001 315.7000000000001 270.5000000000001H315.6C320.2000000000001 272.3000000000001 324.8 273.7000000000001 329.1 274.6C286.8 284.8000000000001 255.7 254.0000000000001 246.0000000000001 242.8000000000001C229.3000000000001 223.6000000000001 210.5 234.0000000000001 210.5 234.0000000000001C210.3000000000001 223.1 220.9 215.1 231.7 214.7zM249.5000000000001 223.5C257 234.9000000000001 274.9000000000001 249.5000000000001 294.4000000000001 260.5C297.4000000000001 251.4000000000001 297.8 232.8000000000001 287.4000000000001 225.1C271.1 213 255.2000000000001 220.1 249.5000000000001 223.5C249.4000000000001 223.4 249.5000000000001 223.5 249.5000000000001 223.5zM263 26.6C264.9 24.7 265.2 22 263.9 18.7C260.4 9.8000000000001 252.5 2.6 250.2 0.6C247.1 -2 242.8 -3.6 238.4 -3.6S230.1 -1.9999999999999 227.4 0.9C219.9 8.9 215.4 17.6 214.4 20.2C213.8 21.7 213.1 24.6 215.3 26.9C217 28.7 220 29.6 224.2 29.6H253.6C259 29.5 261.7 27.9 263 26.6zM164.7 278.1C174.6 272.1 183.5 270 192 269.8C200.5 270 209.4 272.1 219.3 278.1C219.3 278.1 204.8 260.4000000000001 192.1 260.3H191.9C179.2000000000001 260.5 164.7000000000001 278.1 164.7000000000001 278.1zM349.2 130.7000000000001C346.8 112.8000000000001 336.2 96.9 324.6 87.0000000000001C321.5 109.7000000000001 320.9 142.5000000000001 320.9 149.4C320.9 164.1 330.4 173.9 333.1 175.5000000000001C335.6 177.0000000000001 338.5 178.5000000000001 341.4 180.1000000000001C359.4 189.7000000000001 381.8 201.7000000000001 381.8 223.8000000000001C381.8 240.0000000000001 372.5 247.0000000000001 366.4 251.6000000000001C365.6 252.2000000000001 364.9 252.7000000000001 364.2 253.3000000000001C362.1 255.0000000000001 360.5 256.3000000000001 359.9 257.7000000000001C355.5 267.5000000000001 356.3 291.9000000000001 358.2 295.3000000000001C358.8 295.9000000000001 374.9 316.2000000000001 370 334.5000000000001C368 341.9000000000001 363.1 347.8000000000001 355.9 351.5000000000001C350.6 354.2000000000001 344 355.7000000000001 336.4 356.0000000000001C336.3 358.0000000000001 335.9 359.9000000000001 335.5 361.9000000000001C334.9 364.5000000000001 334.4 367.2000000000001 334.6 370.0000000000001C335 374.7000000000001 335.4000000000001 379.0000000000001 336.8 381.3000000000001C345.2 394.6000000000001 365.6 398.9000000000001 365.8 398.9000000000001L378.1 401.3000000000001L370 410.8000000000001C369.9 411.0000000000001 352.7 428.3000000000001 323.7 428.3000000000001C315.8 428.3000000000001 307.7 427.0000000000001 299.6 424.4000000000001C275.4 416.6000000000001 256.7 393.9000000000001 250.2 385.1000000000001C247.1 386.1000000000001 243.9 387.0000000000001 240.6 387.8000000000001C236.4 403.6000000000001 249.6 426.3000000000001 249.6 426.3000000000001S236 429.3000000000001 215.9 411.1000000000001C213.3 417.6000000000001 207.8 431.6000000000001 214.1 448.3000000000001C184.6 437.9 177.2 422 175 407.6C167.4 413 168.3 430.7 167.8 435.2C160.3 434.3 138.6 413.3 139.6 386.9C137.6 386.4 135.7 385.8 133.7 385.2C127.2 394 108.6 416.7 84.3 424.5C76.4 426.7 68.3 428 60.4 428C31.4 428 14.3 410.7 14.1 410.5L6 401.1L18.3 398.7C18.5 398.7 38.9 394.4 47.3 381.1C48.7 378.9 49.1 374.5 49.5 369.8C49.7 367 49.1 364.3 48.6 361.7C48.2 359.8 47.8 357.8 47.7 355.8C40 355.5 33.5 354 28.2 351.3C21 347.6 16.1 341.7 14.1 334.3C9.1 316.1 25.3 295.8 25.9 295.1C27.8 291.7 28.6 267.3 24.2 257.5C23.6 256.1 22 254.8 19.9 253.1C19.2 252.6 18.5 252 17.7 251.4C11.6 246.8 2.3 239.7 2.3 223.6C2.3 201.5 24.7 189.5 42.7 179.9C45.7 178.3 48.5 176.8 51 175.3C53.7 173.6999999999999 63.2 163.9 63.2 149.1999999999999C63.2 142.3 62.6 109.4999999999999 59.5 86.8C47.9 96.6999999999999 37.3 112.6999999999999 34.9 130.6C34.9 130.6 5.7 107.9999999999999 14.3 59.8C19.5 30.3 37.5 13.6999999999999 61.3 5.1C70.1 -14.0000000000001 90.7 -40.6 128.6 -44.5000000000001C143 -56.3 163 -64 192.2 -64H192.4C221.5 -64 241.5 -56.3 256 -44.5C293.9 -40.6 314.5 -14 323.3 5.1C347.1 13.8 365 30.3 370.3 59.8C378.5 108.2 349.2 130.7000000000001 349.2 130.7000000000001zM305.7 410.3C311.3 412.1 317.3 413 323.4 413C334.4 413 343.3 410 348.1 408C345 406.6 341.7 404.8 338.4 402.7C336 403.1 332.8 403.5 329.2 403.5C318.7 403.5 308.7 400.4 300.5 394.6C288.2 385.9 282.5 377.7 279.8 372.2C277.6 373.5 275.3 374.7 272.7 375.9C271.1 376.7 269.6 377.4 268 378.1C274.1 387.2 287.9 404.6 305.7 410.3zM326.7 392.1C325.9 391.1 325.1 390 324.4 388.9C321.1 383.7 320.5 377.3 320 371.1C319.5 364.7 318.9 358.6 315.6 354.1C311.4000000000001 353.3 307.5 352.4 304.1 351.4C301.8 354.5 298.5 358.4 293.6 362.6C295 367.4 299.1 378.7 307.1 385.1C312.7000000000001 389.4 319.3 391.8 326.7000000000001 392.1zM45.6 402.7C42.3 404.9 39 406.7 35.9 408C40.7 410 49.6 413 60.6 413C66.7 413 72.6 412.1 78.3 410.3C96.1 404.5 109.9 387.1 116 378.2C114.4 377.5 112.8 376.8 111.2 376C108.7 374.8 106.3 373.5 104.1 372.3C101.5 377.7 95.8 386 83.4 394.7C75.1 400.5 65.2 403.6 54.6 403.6C51.2 403.5 48 403.1 45.6 402.7zM90.3 362.6C85.4 358.4 82 354.6 79.8 351.4C76.4 352.3 72.5 353.3 68.3 354.1C65 358.5 64.5 364.6 64 371C63.5 377.2 62.9 383.6 59.6 388.8C58.9 389.9 58.1 391 57.3 392C64.7 391.7 71.3 389.4 76.8 385C84.8 378.7 88.9 367.4 90.3 362.6zM58.1 188.1C55.4 189.7000000000001 52.5 191.2000000000001 49.7 192.7C34.8 200.7 19.5 209 19.5 223.2C19.5 234.3 23.8 237.8 28.4 241.4L28.9 241.8C29.6 242.4 30.3 243 31.1 243.6C30.2 236.4000000000001 29.2 230.3 28.4 228.7C28.4 228.7 40.5 243.7 44.1 273C45.5 284.5 43 307.3 39 316C39.2 311.1 39 306.2 38.7 301.6C38.3 302.4 37.9 303.2 37.4 303.8C34.2 307.8 25.6 321.3 28 330.4C28.9 333.9 31.1 336.4 34.7 338.2C38.5 340.1 43.5 341.1 49.8 341.1C62.1 341.1 75.7 337.4 82.7 335.1C107.8 327.1 138.1 304.2 146.8 297.4C147 297.2 147.2 297.1 147.2 297.1L152.8 293.2L149.3 299C149.1 299.3 130.2 330.4 96.1 345.5C98.1 348.4 103.5 353.6 117.7 360.6C139.1 371.1 164.2 376.4 192 376.4C219.9 376.4 244.9 371.1 266.3 360.6C280.5 353.7 285.9000000000001 348.4 287.9000000000001 345.5C253.9000000000001 330.4 235.0000000000001 299.3 234.8000000000001 299L231.3000000000001 293.2L236.9000000000001 297.1S237.1 297.2 237.3000000000001 297.4C246.0000000000001 304.2 276.3000000000001 327.2 301.4000000000001 335.1C308.4000000000001 337.3 322.0000000000001 341.1 334.3 341.1C340.6 341.1 345.6 340.1 349.4000000000001 338.2C352.9000000000001 336.4 355.1 333.8 356.1 330.4C358.6 321.3 350 307.8 346.7000000000001 303.8C346.2000000000001 303.2 345.8000000000001 302.5 345.4000000000001 301.6C345.1 306.2 344.9000000000001 311.1 345.1 316C341.1 307.2 338.6 284.5 340 273C343.6 243.7 355.7 228.7 355.7 228.7C354.9 230.3 353.9 236.4 353 243.6C353.7 243 354.5 242.4 355.2 241.8L355.7 241.4C360.3 237.7 364.6 234.3 364.6 223.2C364.6 209 349.2 200.7 334.4 192.7C331.5 191.2 328.7 189.6 326 188.1C317.3 183.1 308 171.4 306.9 153.9C306 139.3 307.8 104 310.3 78C297.9 73.2 283.6 71.6 270.6 71.2C268.6 75.3 266.7 79.7 265.1 84.3C264.4 86.3 245.5 135.4 238.7 146.5C244.2 107.5 256.2 72.8 262.2 56.9C258.7 57.4 254.8999999999999 57.6 250.5 57.6H133.5C129.0999999999999 57.6 125.2 57.3 121.8 56.9C127.8 72.8 139.9 107.5 145.3 146.5C138.5 135.3 119.6 86.2 118.9 84.3C117.3 79.7 115.4 75.3 113.4 71.2C100.4 71.6 86.2 73.2 73.7 78C76.2 104 77.9999999999999 139.2 77.1 153.9C76.2 171.3 66.8 183.1 58.1 188.1zM34.8 43.4C22.7 63.4 26.1 97.5 31.1 102.5C42 68.1 78.3 58.2 105.5 57.1C102.8 52.9 100.3 49.5 98.5 47.1L97.1 45.7C89.9 37.9 88.5 27.2 93 13.9C70.3 14.0000000000001 46.7 23.7 34.8 43.4zM80.5 -0.1C86.5 -1.2 92.7 -2 99.1 -2.5C102.6 -10.5 106.5 -18.4 111.4 -25.6C97 -19.7 87 -9.6 80.5 -0.1zM192 -50.2C131.4 -50.1 113.7 -4.4 107.1 14.5C103.4 25 103.7 32.7 108 37.6C110.9 40.9 117.5 44.8 132.6 44.8H251.4C266.5 44.8 273.2 40.9 276 37.6C280.2 32.8 280.5 25 276.9 14.5C270.3 -4.3 252.6 -50.1 192 -50.2zM272.6 -25.6C277.5 -18.4 281.4000000000001 -10.4999999999999 284.9000000000001 -2.4999999999999C291.3 -1.9999999999999 297.5000000000001 -1.1999999999999 303.5000000000001 -0.1C297.0000000000001 -9.6 287.0000000000001 -19.7 272.6000000000001 -25.6zM349.2000000000001 43.4C337.2000000000001 23.7 313.6 14.1 291.1 13.7C295.6 27.0000000000001 294.2000000000001 37.8000000000001 287 45.5000000000001C286.6 46.0000000000001 286.1 46.5000000000001 285.6 47.0000000000001C283.8 49.4 281.3 52.8000000000001 278.6 57.0000000000001C305.8 58.2000000000001 342.1 68.0000000000001 353 102.4C358 97.4 361.4 63.3 349.2 43.4z" />
+    <glyph glyph-name="gulp"
+      unicode="&#xF3AE;"
+      horiz-adv-x="256" d=" M209.8 56.9L195.7 32.3L191.1 -47.9C191.1 -56.8 162.8 -64 128 -64S64.9 -56.8 64.9 -47.9L59.1 31.5L44.2 56.9C85.4 39.6 170.2000000000001 40.2 209.8000000000001 56.9zM13.8 310.2L27.4 184.7C33.3 204.7 48.2 231.7 67.4 239.9C73.7 242.6 80.1 242.6 86.1 239C91.3 236 95.7 229.7 96.2 227.2C97.4 220.7 94.2 218.1 91.7 218.1C88.7 218.1 86.4 222.7 84.9 225.4C80.8 232.7 74.6 233 68 228.2C61.1 223.2 55.1 214.8 50.9 207.5C45.8 198.7 41.5 189 38.9 179.3C37.4 173.7 36 164.7 38.3 159.4C39.3 157.2000000000001 40.8 155.8 43.2 155.8C48.2 155.8 55.5 162.4 59 165.9C63.5 170.4 69.3 177.4 71.5 181.9L76.7 197.4C79.3 204.2000000000001 86.6 203 86.6 197.4C86.6 187.2000000000001 82.9 183.8 76.6 162.7000000000001C70.8 143.2000000000001 69 136.9 69 136.9C68.3 134.1 65.6 129.4 62.7 129.4C61.5 129.4 60.6 129.8 60.1 130.6C59.1 132 59.2 135.9 59.3 136.9C59.5 140.1 65.6 159.1 66.6 162.1C64.6 159.9 62.5 157.7000000000001 60.2 155.5C54.8 150.4 46.1 143.7 38.7 143.7C35.3 143.7 33.1 144.6 31 146.1L38.6 66.5C40.6 61.5 77.8 49.4 126.8 49.4C175.9 49.4 213.1 61.6 215 66.5L225.9000000000001 161.1C220.2000000000001 155.9 213.6 149.5 206.3000000000001 146.3C200.9 144 188.9 142.5 188.9 152C188.9 157.2 198 166.8 203.3000000000001 173.5C204.7000000000001 175.2 208 179.4 208 181.6C208 184.5 202 183.8 196.3000000000001 179.1C193.1000000000001 176.4 190.1000000000001 172.8 187.6000000000001 169.4C183.3000000000001 163.4 181.0000000000001 158.2000000000001 179.1000000000001 153.9C172.9000000000001 139.7000000000001 175.0000000000001 145.3 170.0000000000001 131.9C165.0000000000001 118.6 165.8000000000001 120.1 164.8000000000001 117.9C163.9000000000001 116.0000000000001 162.6000000000001 114.4 160.8000000000001 113.4C158.9000000000001 112.4 156.3000000000001 112.5000000000001 154.7000000000001 113.7000000000001C153.8000000000001 114.3000000000001 153.4000000000001 115.6 153.4000000000001 117.4C153.4000000000001 118.3 153.5000000000001 119.2000000000001 153.7000000000001 120.1C155.2000000000001 126.2000000000001 161.5000000000001 138.2000000000001 168.7000000000001 154.4C170.3000000000001 158.1 169.7000000000001 157.0000000000001 169.5000000000001 156.7000000000001C163.3000000000001 150.7000000000001 158.6000000000001 147.8000000000001 155.1000000000001 146.2000000000001C149.3000000000001 143.6 142.1000000000001 143.6 140.6000000000001 150.3000000000001C140.5000000000001 150.7000000000001 140.5000000000001 151.1000000000001 140.4000000000001 151.5000000000001C128.6000000000001 142.3000000000001 116.1000000000001 139.8000000000001 120.4000000000001 159.6000000000001C115.8000000000001 151.4000000000001 107.8000000000001 144.7000000000001 98.0000000000001 144.7000000000001C93.9000000000001 144.7000000000001 90.9000000000001 146.1000000000001 89.4000000000001 149.8000000000001C87.1000000000001 155.3000000000001 90.7000000000001 164.7000000000001 94.0000000000001 173.6000000000001C95.7000000000001 178.1000000000001 98.0000000000001 183.5000000000001 101.1000000000001 189.8000000000001C102.7000000000001 193.2000000000001 105.3000000000001 195.2000000000001 108.7000000000001 194.3000000000001C109.3000000000001 194.1000000000001 109.8000000000001 193.9000000000001 110.3000000000001 193.6000000000001C112.9000000000001 191.8000000000001 111.9000000000001 189.1000000000001 110.6000000000001 186.4000000000002C106.8000000000001 178.9000000000002 103.5000000000001 173.4000000000002 101.3000000000001 165.6000000000001C100.4000000000001 162.3000000000001 99.3000000000001 156.6000000000001 102.8000000000001 156.6000000000001C105.2000000000001 156.6000000000001 107.5000000000001 157.4000000000002 109.7000000000001 159.0000000000001C114.3000000000001 162.4000000000001 118.0000000000001 167.5000000000001 120.8000000000001 172.5000000000001C122.8000000000001 176.1000000000001 125.2000000000001 180.8000000000001 126.4000000000001 184.8000000000001C126.9000000000001 186.5000000000001 127.5000000000001 188.1000000000001 128.2000000000001 189.6000000000001C129.3000000000001 192.1000000000001 130.8000000000001 194.7000000000001 133.4000000000001 194.7000000000001C134.7000000000001 194.7000000000001 135.8000000000001 194.2000000000001 136.6000000000001 193.2000000000001C138.3000000000001 191.0000000000001 137.9000000000001 188.7000000000002 137.0000000000001 186.3000000000001C135.0000000000001 180.7000000000001 132.3000000000001 175.7000000000001 130.1000000000001 169.6000000000001C128.8000000000001 166.1000000000001 127.4000000000001 161.6000000000001 127.4000000000001 157.9000000000002C127.4000000000001 154.5000000000002 131.1000000000001 155.3000000000001 134.2000000000001 156.7000000000002C136.6000000000001 157.8000000000002 139.0000000000001 159.5000000000002 141.0000000000001 161.2000000000002C142.2000000000001 166.1000000000001 141.9000000000001 165.0000000000002 167.4000000000001 229.4000000000002C168.7000000000001 232.7000000000002 171.1000000000001 234.1000000000002 173.5000000000001 234.1000000000002C174.7000000000001 234.1000000000002 175.7000000000001 233.7000000000002 176.7000000000001 233.0000000000002C178.4 231.7000000000002 178.4 228.9000000000002 177.7000000000001 226.8000000000002C177.0000000000001 224.9000000000002 177.1000000000001 225.5000000000002 173.2000000000001 216.3000000000002C168.0000000000001 204.2000000000002 164.6000000000001 195.5000000000002 160.0000000000001 184.4000000000002C158.1000000000001 179.8000000000001 152.3000000000001 165.5000000000002 151.3000000000001 162.1000000000001C150.7000000000001 159.9000000000002 150.0000000000001 156.3000000000001 152.3000000000001 156.3000000000001C157.7000000000001 156.3000000000001 171.6000000000001 169.4000000000002 175.4000000000001 173.3000000000001C175.6000000000001 173.6000000000001 175.9000000000001 173.7000000000001 176.3000000000001 173.9000000000002C176.9000000000001 175.8000000000001 177.5000000000001 177.6000000000001 178.0000000000001 179.4000000000002C179.4000000000001 183.2000000000002 180.7000000000001 187.6000000000001 183.3000000000001 190.7000000000002C184.1000000000001 191.7000000000002 185.0000000000001 192.3000000000002 186.0000000000001 192.3000000000002C188.8000000000001 192.3000000000002 190.2000000000001 191.1000000000001 190.2000000000001 188.3000000000002C190.2000000000001 187.2000000000002 189.5000000000001 183.2000000000002 189.1000000000001 182.1000000000002C190.5000000000001 183.6000000000002 192.0000000000001 185.1000000000002 193.6000000000001 186.6000000000002C208.6000000000001 200.5000000000002 219.3000000000001 193.4000000000002 219.3000000000001 186.4000000000002C219.3000000000001 179.0000000000002 210.4 168.7000000000002 205.5 163.0000000000002C203.9 161.1000000000003 200.6 157.6000000000003 200.5 156.6000000000003C200.5 155.3000000000003 201.4 154.8000000000003 202.7 154.8000000000003C204.7 154.8000000000003 209.1 158.3000000000003 210.7 159.5000000000002C215.7 163.4000000000002 222.5 169.4000000000002 227.3 173.6000000000003L242.1 310.4000000000003C211.6 293.3000000000003 44.5 293.2000000000003 13.8 310.2000000000003zM243.5 318.7C243.5 297.7 12.3 297.7 12.3 318.7C12.3 327.5 64.1 334.6 127.9 334.6C136.9 334.6 145.7 334.5 154.2 334.2L166.8 382.9L228.1 447.4C229.5 448.8 233.9 447.6 238 443.9S244.6 436 243.3 434.6L243.2 434.5L185.9 374L175.9 333.3C215.8 330.7 243.5 325.2 243.5 318.7zM174.1 314.1C174.1 314.9 173.2 315.6 171.6 316.2L171.4 315.4C171.4 314.1 166.4 313 160.3 313S149.2 314.1 149.2 315.4C149.2 315.5 149.2 315.6 149.3 315.7L149.5 316.4C147.7 315.8 146.5 315 146.5 314.1C146.5 312 152.7 310.4 160.2 310.4C167.9 310.3 174.1 312 174.1 314.1z" />
+    <glyph glyph-name="hacker-news-square"
+      unicode="&#xF3AF;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM21.2 218.8H21C21.1 218.9 21.2 219.1 21.3 219.2C21.3 219.1 21.3 218.9 21.2 218.8zM239.2 164.9V64H207.8V166.7L128 320H165.3C217.8 221.7 214.5 218.8 224.6 194.4C236.9000000000001 221.4 230.4000000000001 218.8 285.2000000000001 320H320L239.2 164.9z" />
+    <glyph glyph-name="hacker-news"
+      unicode="&#xF1D4;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM21.2 218.8H21C21.1 218.9 21.2 219.1 21.3 219.2C21.3 219.1 21.3 218.9 21.2 218.8zM239.2 164.9V64H207.8V166.7L128 320H165.3C217.8 221.7 214.5 218.8 224.6 194.4C236.9000000000001 221.4 230.4000000000001 218.8 285.2000000000001 320H320L239.2 164.9z" />
+    <glyph glyph-name="hips"
+      unicode="&#xF452;"
+      horiz-adv-x="640" d=" M0 367.8C0 369.6 0.9 370.5 2.7 370.5H43.6C45.5 370.5 46.4 369.6 46.4 367.8V286.6C61.6 294.3 78.1 298.1 96.2 298C120.2 297.9 140.4 291.8 156.5 280C175.2 266.5 184.5 248.1 184.5 224.7V88.6C184.5 86.7000000000001 183.6 85.8 181.8 85.8H154.5C145.4 85.8 138.1 93.1 138.1 102.1V224.7C138.1 225.6 140.8 251.7 92.3 251.7C43.7 251.7 46.5 225.5 46.5 224.7V88.6C46.5 86.7000000000001 45.6 85.8 43.7 85.8H2.7C0.9 85.8 0 86.7 0 88.6V367.8zM497.7 146.3C511.4 136.1 531.8 127.2 556.1 127.2C579.4 127.2 588.9 131.7 592.6 140.8C595.6 148.7 592 156.9 580.4 162L526.8 185.5C505.4 194.9 492.9999999999999 209.5 489.6 229.1C483.9 262.8 511.8 282.4 512.3 282.8C525.5 292.4 544.3 298.2000000000001 570.8 298.2000000000001C589.8 298.2000000000001 608.1999999999999 294.9 625.9 288.3C627.1999999999999 287.8 627.8 287 627.8 285.7000000000001V241C627.8 238.9 625.5 237.6 623.8 238.6C584.0999999999999 259.3 547.1999999999999 250.9 539.8 245.4C533.1999999999999 240.5 533.8 232.9 542.4 229.3L600 204C616.5 196.9 628.1 185.6 634.9 169.9C640.4 157.3 641.5 144.3 638 130.8C628.4 93.9 593.1 85.3 592.4 84.9999999999999C581.9 81.8999999999999 568.8 80.6999999999999 556.1 80.6999999999999C539.5 80.6999999999999 523.5 83.3999999999999 507.9 88.8999999999999C498.2 92.2999999999999 493.3 99.1999999999999 493.3 109.5999999999999V144C493.3 146.1 495.6 147.7 497.7 146.3zM376.2 298.2C344.5 298.2 272 278.1 272 194.7V11.2C272 10.4 272.6 8.5 274.7 8.5H315.6C317.5 8.5 318.4 9.4 318.4 11.2V100C334.9 87.3 354.2 80.9 376.1 80.9C436.6 80.9 484.8 129.4 484.8 189.6C484.9 249.9 436.6 298.2 376.2 298.2zM376.2 127.3C359 127.3 344.3 133.4 332.2 145.5C320 157.6999999999999 314 172.3 314 189.5C314 224 341.6 251.7 376.2 251.7C410.7 251.7 438.4 224.0999999999999 438.4 189.5C438.5 155.1999999999999 411.1 127.3 376.2 127.3zM251.6 88.6C251.6 86.7 250.7 85.8 248.8 85.8H207.9C206.3 85.8 205.2 87.1999999999999 205.2 88.6V290.4C205.2 291.8 206.3 293.2000000000001 207.9 293.2000000000001H248.8C250.7 293.2000000000001 251.6 292.3 251.6 290.4V88.6M228.3 375.5C244.2 375.5 257.2 362.8 257.2 346.6C257.2 330.8 244.5 317.7 228.3 317.7S199.4 331 199.4 346.6C199.5 362.6 212.4 375.5 228.3 375.5" />
+    <glyph glyph-name="hire-a-helper"
+      unicode="&#xF3B0;"
+      horiz-adv-x="512" d=" M443.1 448H71.9C67.9 410.7 37.4 380.2 0 376.3V4.8C37.4 -0.1 66 -27.6 71.9 -64H444.1C447.1 -27.6 476.6 1.8 512 5.8V376.3C475.6 382.2 447 411.6 443.1 448zM406.1 43.1C369.8 43.1 387.3 45.1 351 45.1C315.2 45.1 330 43.1 294.9 43.1C289 43.1 290 51.3 294.9 52.9C317.7 60.5000000000001 317.8 63.1 319.5 65.7000000000001C329.9 81.3000000000001 325.4 148.7000000000001 325.4 178.7000000000001C325.4 184.0000000000001 319 191.5000000000001 311.6 191.5000000000001H200.4C193 191.5000000000001 186.6 184.0000000000001 186.6 178.7000000000001C186.6 148.7000000000001 182.1 81.3000000000001 192.5 65.7000000000001C194.2 63.2000000000001 194.3 60.5000000000001 217.1 52.9C222 51.3 223.1 43.1 217.1 43.1C182 43.1 196.8 45.1 161 45.1C124.7 45.1 142.2 43.1 105.9 43.1C98 43.1 100.1 53.9 105.9 53.9C116.1 57.3 119.4 57.4 127.6 67.7000000000001C135.3 80.6 135.5 112.1 135.5 195.5000000000001V296.7C135.5 318.9 123.3 325 106.9 329.1C98.1 331.3 102.9 340.9 107.9 340.9C144.4 340.9 128.5 338.9 165 338.9C197.7 338.9 181.5 340.9 214.2 340.9C217.5 340.9 222.7 332.6 215.2 330.1C210.3 328.5 187.6 326.4 187.6 290.8C187.6 245.2 187.4 235 188.6 222C188.6 220.7 190.9 209.2 201.4 209.2H310.6C321.1 209.2 323.4000000000001 220.7 323.4000000000001 222C324.6 235 324.4000000000001 245.2 324.4000000000001 290.8C324.4000000000001 326.4 301.7000000000001 328.5 296.8 330.1C289.3 332.6 294.5 340.9 297.8 340.9C330.5 340.9 314.3 338.9 347 338.9C383.5 338.9 367.6 340.9 404.1 340.9C409 340.9 414 331.3 405.1 329.1C388.7000000000001 325 376.5 318.8 376.5 296.7000000000001V195.5C376.5 112.1 376.6 80.6 384.4 67.7C392.6 57.5 395.8 57.3 406.1 53.9C411.9 53.9 413.9 43.1 406.1 43.1z" />
+    <glyph glyph-name="hooli"
+      unicode="&#xF427;"
+      horiz-adv-x="640" d=" M508.4 96H566.3V291.3L508.4 264V96zM582.1 206.5V96H640V206.5H582.1zM331.4000000000001 215.4C313.2000000000001 233.6 281.0000000000001 232.5 281.0000000000001 232.5S248.8000000000001 233.6 230.6000000000001 215.4C228.7000000000001 213.5 226.9000000000001 211.5 225.3000000000001 209.4C187.1 239 152.8000000000001 255.9 123.2000000000001 270.5V291.2L100.7000000000001 280.6C46.3000000000001 302.7 11.7 298.8 3.4 280.5C3.4 280.5 -21.4999999999999 247.7 65.3 169.6V200.6C16.5 255.2 26.3 276.7000000000001 30 279.8C43.5 291.2000000000001 67.5 287.8 94.4000000000001 277.7000000000001L65.2 264V200.7C78.3 186 95.7 169.2 118.7 150.3L123.2 146.7V176.5C123.2 183.4 124.9 194.7 134 194.7S144.6 187.8 144.6 179.7V131C162.6 118.8 181.9 108.9 202.3 101.4V195.3C202.3 214 188.9 232.7 161.7 232.7C145.9 232.8 131.2 224.5 123.2 210.8V265.1C165.1 244.2 207.1 218.6 223.1 206.8C212.9 192.2 213.8 178.6999999999999 213.8 163.1C213.8 144.4 212.4 128.8 230.6 110.6C248.8 92.4 281 93.4999999999999 281 93.4999999999999S313.3 92.3999999999999 331.4 110.6C349.6 128.8 348.1 144.4 348.1 163.1C348.1 181.6 349.6 197.3 331.4 215.4zM291.7000000000001 143.5C291.7000000000001 139.9 289.9000000000001 131 281.0000000000001 131C272.1000000000001 131 270.3000000000001 139.9 270.3000000000001 143.5V183.9C270.3000000000001 192.6 277.6000000000001 194.8 281.0000000000001 194.8C284.4000000000001 194.8 291.7000000000001 192.7 291.7000000000001 183.9V143.5zM477.4 215.4C459.2 233.6 427.0000000000001 232.5 427.0000000000001 232.5S394.7000000000001 233.6 376.6000000000001 215.4C358.4000000000001 197.2 359.8000000000001 181.5 359.8000000000001 162.8C359.8000000000001 144.1 358.4000000000001 128.5 376.6000000000001 110.3C394.8000000000001 92.1 427.0000000000001 93.2 427.0000000000001 93.2S459.3000000000001 92.1 477.4 110.3C495.6 128.5 494.2 144.1 494.2 162.8C494.1 181.6 495.5000000000001 197.3 477.4 215.4zM437.6 143.5C437.6 139.9 435.8 131 426.9000000000001 131C418.0000000000001 131 416.2000000000001 139.9 416.2000000000001 143.5V183.9C416.2000000000001 192.6 423.5000000000001 194.8 426.9000000000001 194.8C430.3 194.8 437.6 192.7 437.6 183.9V143.5zM611.1 216.5C627 216.5 640 229.4 640 245.4S627.1 269.9 611.1 269.9C595.2 269.9 582.2 261.3 582.2 245.4S595.1 216.5 611.1 216.5zM144.5 96L182.8 95.2C169.6 99.8 156.8 105.4 144.5 112V96zM123.1 96V124.6C116.6 128.8 110.1 133.3 103.7 138.2000000000001C88.9 149.4 76.2 159.9 65.2 169.7000000000001V96H123.1zM182.8 95.2C219.3 82.7 252.7 81 277.5 88C257.6 87.8 231.7 90.6 202.2 101.3V96L182.8 95.2z" />
+    <glyph glyph-name="hotjar"
+      unicode="&#xF3B1;"
+      horiz-adv-x="448" d=" M414.9 286.5C340.2 419 121.1 448 121.1 448S222.2 337.6 93 250.3C11.3 195.2 -21 123.6 14 45.4C40.8 -14.5 97.5 -38.9 158.6 -48C129.4 7.1 152 74.4 154.5 81.6C211.6 -4.8 319.5 81.6 265.3 175.5C336.3 160.1 346.9 36.9 292.4000000000001 -40C372.9000000000001 -14.7 426.5 48.9 441.2000000000001 105.6C456.7 164.9 444.9000000000001 233.5000000000001 414.9000000000001 286.5z" />
+    <glyph glyph-name="houzz"
+      unicode="&#xF27C;"
+      horiz-adv-x="414.6" d=" M258.9 117.3H154.3V-32H0V416H109.5V311.5L414.6 225.9V-32H258.9V117.3z" />
+    <glyph glyph-name="html5"
+      unicode="&#xF13B;"
+      horiz-adv-x="384" d=" M0 416L34.9 20.2L191.5 -32L349.1 20.2L384 416H0zM308.2 288.1H124.4L128.5 238.7H304.1L290.5 90.3L192.6 63.3V62.9999999999999H191.5L92.8 90.3L86.8 166.1H134.5L138 128L191.5 113.5L245.2 128L251.2 190.2H84.3L71.5 335.8H312.6L308.2000000000001 288.1z" />
+    <glyph glyph-name="hubspot"
+      unicode="&#xF3B2;"
+      horiz-adv-x="512" d=" M267.4 236.4C242.3 212.7 226.6 179.1 226.6 141.8C226.6 112.5 236.3 85.5 252.6 63.8L203.1 14C198.7 15.6 194 16.5 189.1 16.5C178.3 16.5 168.2 12.3 160.6 4.7C153 -2.9 148.8 -13.1 148.8 -23.9S153 -44.8 160.6 -52.4C168.2 -60.0000000000001 178.4 -64 189.1 -64C199.9 -64 210 -60.1 217.7 -52.4C225.3 -44.8 229.5 -34.6 229.5 -23.9C229.5 -19.7 228.9 -15.7 227.6 -11.8L277.6 38.4C299.6 21.5000000000001 327 11.5000000000001 356.9000000000001 11.5000000000001C428.8000000000001 11.5000000000001 486.9 69.8000000000001 486.9 141.7000000000001C486.9 206.9 439.2000000000001 260.9000000000001 376.7000000000001 270.4000000000001V332C394.2000000000001 339.4 404.9000000000001 355.8 404.9000000000001 374.9C404.9000000000001 401 384.0000000000001 422.8 357.9000000000001 422.8S311.2 401 311.2 374.9C311.2 355.8 321.9 339.4 339.4 332V270.8C324.2 268.7000000000001 309.8 264.1 296.7 257.2000000000001C269.1 278.1 179.2 342.9000000000001 127.8 382C129 386.4000000000001 129.8 391 129.8 395.8C129.8 424.6 106.3 448 77.4 448C48.6 448 25.2 424.6 25.2 395.8C25.2 366.9 48.6 343.5 77.4 343.5C87.2 343.5 96.3 346.4 104.2 351.1L267.4 236.4zM356.9 72.8C318.8 72.8 287.9 103.7 287.9 141.8S318.8 210.8 356.9 210.8S425.9 179.9 425.9 141.8S395 72.8 356.9 72.8z" />
+    <glyph glyph-name="imdb"
+      unicode="&#xF2D8;"
+      horiz-adv-x="448" d=" M350.5 159.3C350.5 153.9 352.1 144.9 344.3 144.9C342.7 144.9 341.3 145.7000000000001 340.5 147.3C338.3 152.4 339.4 191.4 339.4 192C339.4 195.8 338.3 204.7 344.3 204.7C351.6 204.7 350.5 197.4 350.5 192V159.3zM265 218.1C265 227.8 266.6 234.1 254.7 234.1V150.4C266.9 150.1 265 159.1 265 168.8V218.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM21.3 219.2C21.2 219.1 21.1 218.9 21 218.8H21.3V219.2zM97 256H64V128.2H97V256zM210.3 256H167.2L159.6 196.1C156.9 216.1 154.2 236.2 150.9 256H108.1V128.2H137.1V212.7L149.3 128.2H169.9L181.5 214.6V128.2H210.2V256zM296.6 210.7C296.6 218.8 296.9000000000001 227.5 295.2000000000001 235.1C290.9000000000001 257.6 263.8000000000001 256 246.2000000000001 256H221.6000000000001V128.2C307.7000000000001 128.1 296.6 122.2 296.6 210.7zM382.5 193.4C382.5 210.7 381.7 223.5 360.3 223.5C351.4000000000001 223.5 345.4000000000001 220.8 339.4000000000001 214.3V256H307.7000000000001V128.2H337.5000000000001L339.4000000000001 136.3C345.1 129.5 351.3 126.5 360.3 126.5C380.1 126.5 382.5 141.7 382.5 157.4V193.4z" />
+    <glyph glyph-name="instagram"
+      unicode="&#xF16D;"
+      horiz-adv-x="448" d=" M224.1 307C160.5 307 109.2 255.7 109.2 192.1S160.5 77.2 224.1 77.2S339 128.5 339 192.1S287.7 307 224.1 307zM224.1 117.4C183 117.4 149.4 150.9 149.4 192.1S182.9 266.8 224.1 266.8S298.8 233.3 298.8 192.1S265.2 117.4 224.1 117.4zM370.5 311.7C370.5 296.8 358.5 284.9 343.7 284.9C328.8 284.9 316.9 296.9 316.9 311.7S328.9 338.5 343.7 338.5S370.5 326.5 370.5 311.7zM446.6 284.5C444.9000000000001 320.4 436.7000000000001 352.2 410.4000000000001 378.4C384.2000000000001 404.6 352.4000000000001 412.8 316.5 414.6C279.5 416.7 168.6 416.7 131.6 414.6C95.8 412.9 64 404.7 37.7 378.5S3.3 320.5 1.5 284.6C-0.6 247.6 -0.6 136.7 1.5 99.7C3.2 63.8 11.4 32 37.7 5.8S95.7 -28.6 131.6 -30.4C168.6 -32.5000000000001 279.5 -32.5000000000001 316.5 -30.4C352.4 -28.7 384.2 -20.5000000000001 410.4 5.8C436.6 31.9999999999999 444.8 63.8 446.6 99.6999999999999C448.7 136.6999999999999 448.7 247.5 446.6 284.5zM398.8 60C391 40.4 375.9000000000001 25.3 356.2 17.4C326.7 5.7 256.7 8.4 224.1 8.4S121.4 5.8 92 17.4C72.4 25.2 57.3 40.3 49.4 60C37.7 89.5 40.4 159.5 40.4 192.1S37.8 294.8 49.4 324.2C57.2 343.8 72.3 358.9 92 366.8C121.5 378.5 191.5 375.8 224.1 375.8S326.8 378.4 356.2 366.8C375.8 359 390.9 343.9 398.8 324.2C410.5 294.7 407.8 224.7 407.8 192.1S410.5 89.4 398.8 60z" />
+    <glyph glyph-name="internet-explorer"
+      unicode="&#xF26B;"
+      horiz-adv-x="512" d=" M483.049 288.294C493.904 312.8690000000001 504.473 348.7320000000001 504.473 376.165C504.473 448.887 424.832 474.536 294.8 414.742C187.168 421.923 83.579 341.072 57.7019999999999 228.2850000000001C88.554 263.1470000000001 135.973 310.5830000000001 179.679 329.4430000000001C125.404 281.15 79.128 219.998 43.992 156.275C23.246 118.349 0 57.06 0 11.253C0 -87.322 92.854 -75.2470000000001 180.251 -30.753C211.674 -46.183 246.81 -46.326 281.9460000000001 -46.326C379.0700000000001 -46.326 466.1950000000001 7.968 498.76 99.696H377.927C325.418 11.103 181.108 46.7 181.108 147.132H509.9C516.307 190.713 508.245 242.847 483.049 288.294zM64.559 101.123C82.27 49.973 118.262 5.252 164.825 -22.181C76.084 -71.1210000000001 -8.442 -51.277 64.559 101.1229999999999zM180.536 209.996C182.536 265.147 230.812 304.867 284.516 304.867C337.9340000000001 304.867 386.497 265.147 388.497 209.996H180.536zM365.072 397.596C386.497 407.883 413.635 419.599 437.63 419.599C469.052 419.599 491.904 397.882 491.904 365.877C491.904 345.874 484.477 316.87 477.335 298.01C451.0549999999999 340.302 411.349 379.594 365.072 397.596z" />
+    <glyph glyph-name="ioxhost"
+      unicode="&#xF208;"
+      horiz-adv-x="640" d=" M616 288H548.7C511.2 377.3 422.9 440 320 440C183 440 72 329 72 192C72 175.6 73.6 159.5 76.7 144H24C10.7 144 0 133.2 0 120C0 106.7 10.7 96 24 96H91.3C128.8 6.7 217.1 -56 320 -56C457 -56 568 55 568 192C568 208.4 566.4 224.5 563.3 240H616C629.3 240 640 250.8 640 264C640 277.3 629.3 288 616 288zM520 192C520 81.5 430.5 -8 320 -8C244.3 -8 178.4 34 144.5 96H424C437.3 96 448 106.8 448 120C448 133.3 437.3 144 424 144H125.8C122 159.4 120 175.4 120 192C120 302.5 209.5 392 320 392C395.7 392 461.6 350 495.5 288H216C202.7 288 192 277.2 192 264C192 250.7 202.7 240 216 240H514.2C518 224.6 520 208.6 520 192zM216 216H424C437.3 216 448 205.3 448 192C448 178.8 437.3 168 424 168H216C202.7 168 192 178.7 192 192C192 205.2 202.7 216 216 216z" />
+    <glyph glyph-name="itunes-note"
+      unicode="&#xF3B5;"
+      horiz-adv-x="384" d=" M381.9 59.8C375.5 32.4 354.7 17 326.8 11.8C302.3 7.3 281.9 6.2 262.3 22C238.4 42.1 238.1 75.4 259.6 96.4C276.6 112.6 300.5 115.9 336.4 122.2C342.4 123.3 347.6 124.7 352 129.6C358.4 136.8 356.4 133.7 356.4 292.8C356.4 304 350.9 307.1 339.4 305.1C331.2 303.7 153.7 270.5 153.7 270.5C143.5 268.3 140.3 265.3 140.3 253.8C140.3 19.1 141.4 29.9 137.8 14.3C133.6 -3.9 122.4 -17.6 107.6 -25.2C90.8 -34.5000000000001 60.4 -38.6 44.2 -35.6C1 -27.5 -14.2 22.4 15.1 51C32.1 67.2 56 70.5 91.9 76.8C97.9 77.9 103.1 79.3 107.5 84.2C117.6 95.7 109.3 340.8 112.7 354.4C113.5 359.6 115.7 364 119.8 367.3C124 370.8 131.6 372.8 133.2 372.8C337.2 411 362.1 415.9 365.6 415.9C377.1 416.7 383.7 409.9 383.7 398.3C383.9 53.8 384.8 72.3 381.9 59.8z" />
+    <glyph glyph-name="itunes"
+      unicode="&#xF3B4;"
+      horiz-adv-x="448" d=" M223.6 367.7C129 367.7 52.5 291 52.5 196.5S129 25.2 223.6 25.2S394.8 101.9 394.8 196.4C394.8 291 318.1 367.7 223.6 367.7zM303 127.7C299.8 114.1 289.5 106.5 275.7 103.9C263.6 101.7 253.5 101.1 243.8 108.9C232 118.9 231.8 135.3 242.4 145.7C250.8 153.7 262.7 155.3 280.4 158.5C283.4 159 286 159.7 288.1 162.2C291.3 165.8 290.3 164.2 290.3 243C290.3 248.6 287.6 250.1 281.9 249.1C277.9 248.4 190 232 190 232C185 230.9 183.3 229.4 183.3 223.7C183.3 107.6 183.8 112.9 182.1 105.2C180 96.2 174.5 89.4 167.2 85.6C158.9 80.9999999999999 143.8 78.9999999999999 135.8 80.4C114.4 84.4 106.9 109.1 121.4 123.3C129.8 131.3 141.7 132.9 159.4 136.1C162.4 136.6 165 137.3 167.1 139.8C172.1 145.5 168 266.8 169.7 273.5C170.1 276.0999999999999 171.2 278.3 173.2 279.9C175.3 281.5999999999999 179 282.5999999999999 179.9 282.5999999999999C280.9 301.5999999999999 293.2 304 295 304C300.7 304.4 304 301 304 295.3C303.8999999999999 124.6999999999999 304.3999999999999 133.9 303 127.6999999999999zM345.2 416H102.8C45.9 416 0 370.1 0 313.2V70.8C0 13.9 45.9 -32 102.8 -32H345.2C402.2 -32 448 13.9 448 70.8V313.2C448 370.1 402.1 416 345.2 416zM223.6 4C117.3 4 31.1 90.2 31.1 196.5S117.3 389 223.6 389S416.1 302.8 416.1 196.5S329.9 4 223.6 4z" />
+    <glyph glyph-name="jenkins"
+      unicode="&#xF3B6;"
+      horiz-adv-x="512" d=" M487.1 23C485.7 34.2 468.1 46.1 458.9 54.9C453.8 59.9 429.9000000000001 78 428.5000000000001 84.8C427.1000000000001 91.4 438.2000000000001 106.3 441.8000000000001 113.6999999999999C446.9000000000001 124.3999999999999 450.6000000000001 137.3999999999999 453.1000000000001 146.3C471.9000000000001 212.4 473.8000000000001 303.2 446.9000000000001 357.5C436.7000000000001 378.0999999999999 408.3000000000001 406.5 390.5000000000001 420C348.5000000000001 451.6999999999999 270.9000000000001 455.3 220.4000000000001 436.6C206.3000000000001 431.3999999999999 192.6000000000001 426.8 180.3000000000001 419.5C147.2000000000001 400.1 112.0000000000001 387 102.2000000000001 347.9C78.0000000000001 337.1 70.7000000000001 306.1 71.9000000000001 270.1C72.1000000000001 263.1 76.0000000000001 254.3 74.6000000000001 247.7C73.9000000000001 244.4 69.4000000000001 240.1 68.5000000000001 237.9C56.9000000000001 210.2 66.2000000000002 173.9 79.6000000000001 154.1999999999999C87.7000000000001 142.3 101.1000000000001 131.8 118.8000000000002 129C119.5000000000002 118.3999999999999 122.1000000000001 109.3 127.0000000000002 98.6C130.1000000000001 91.8 141.7000000000001 79.6 137.4000000000002 70.9C135.2000000000002 66.5 116.4000000000002 57.1 110.1000000000002 53.3C89 40.8 73.7 33 54.2 19C41.6 10 21.9 8.8 25 -12.1C27.1 -26.2 35.1 -43.7 39.7 -57.9C40.4 -59.9 41.1 -62.0000000000001 41.8 -63.9H463.8C468.7 -48.6 473.5 -33.0000000000001 478.4 -16.7C481.8 -5.3000000000001 488.6 11.1 487.1 22.9999999999999zM205.9 414.3C207.7 414.8 209.3 413.6 210.8 411.9C210.6 406.7 205.4 406.8 201.9 405.1C196.5 398.4 188.5 395.3 181.9 387.9C175.1 380.4 167.5 360.2 158.5 357.9C154 356.8 148.8 358.7 144.9 358.4C134.5 357.7 127.2 352.4 116.6 350.9C130.2 380.8 172.7 404.9 205.9 414.3zM101.1 320.7C114.6 335.6 133.2 344.8 155.9 346.6C167.6 316.9 147.5 281.6 155 249C157.3 239.1 165.2 223.6 152.6 223.3C152.9 251.6 117.8 269.6 91.3 252.9C89.5 274.4 86.4 304.6 101.1 320.7zM137.8 120.5C136.8 124.6 135.1 133.4 135.5 135.6C137.1 144.3 152.6 148.1 146.5 160.3C135.2 160.4 132.7 150.1 122.4 149C95.7 146.4 76.8 184.4 78 207.4C79 226.9 95.6 245.6 118.1 243.2C134.1 241.4 139.5 224 142.6 208.5C151.8 208 165.1 208.9 169.5 216.1C168.9 233.6 160.7 247.7 161.3 263.8C162.3 294.1 178.8 321.4 166.1 351.2000000000001C179.7 382.1 219.6 406.5 249.2 421.2000000000001C285.8 439.5 344.1 424.9000000000001 378.5 405.4000000000001C398.2 394.3 412.9 372.7000000000001 426.8 354.7000000000001C407.3 360.5 390.7 350.5 393.7 334.4000000000001C410 349.3 437.9 334.6 446.2 318C454.1 302.2000000000001 454 278.7000000000001 455.2 255.2000000000001C458.1 198.2000000000001 444.8 139.3000000000001 416.1 98.1C408.4 87.1 402 75.1 391.2 67.5C365.2 49.3 325.8 32.8 292 44.1C247.3 59.1 227 88.9 202.5 122.9C203.2 104.2000000000001 216.3 88.8 229.3 74.5000000000001C240.6 62.0000000000001 254.3 47.9 269 42.1000000000001C256.7 45.0000000000001 237.9 45.9000000000001 232.8 34.9000000000001C204.2 36.8000000000001 177.7 39.7000000000001 164.1 59.1000000000001C153.5 74.5000000000001 142.7 100.5000000000001 137.8 120.5000000000001zM359.8 -3.6C363.9000000000001 -0.6 370.9000000000001 -0.7 377.2 0C371.8 2.7 364.2 3.7 357.9 2.2C357.8 6.4 355.9 9 354.7 12.4C365.3 16.2 390.2 40.9 404.3 32.7C411 28.8 413.8 6.5 414.4000000000001 -4.3C414.8 -13.3 413.6 -22.3 409.9000000000001 -27.1C391.1 -26.5 374.1 -24.3 359.2000000000001 -20.1C360.1 -14 358.2000000000001 -8 359.8000000000001 -3.6zM342.6 16.4C325.8 15.6 316.6 17.6 304.3 27.2C304.5 28 305.7 27.7 305.8 28.6C323.8 20.6 346.6 31.9 364.8 33.4999999999999C356.9000000000001 28.3999999999999 350.2 21.8999999999999 342.6 16.3999999999999zM330.5 -16.8C328.9 -7.4 327 -4.8 327.7 3.4C352.7 20 357.4 -25.2 330.5 -16.8zM226 9.4C214.4 10.1 177.9 23.4 187.5 33.1C196.9 26.6 215 28.2 228.8 25.8C229.6 21.4 226 15.6 226 9.4zM57.7 -49.1C53.4 -36.4 48.5 -24 42.9 -12.2C73.7 11.6 108.2 36.6999999999999 145.1 51.3C147.9 52.4 168.3 25.9 171.3 23.6999999999999C187.8 11.9999999999999 208.3 2.6999999999999 227.5 -6.5000000000001C228.7 -15.3000000000001 231.4 -26.7 236.2 -42.0000000000001C236.9 -44.3000000000001 237.6 -46.7 238.4 -49.2H57.7zM298.3 -54.8H297.5C297.8 -54.6 298 -54.4 298.3 -54.3V-54.8zM305.8 -49.1C307.9000000000001 -47.7 310.1 -46.3 312.2 -44.8C313.3 -46.2 314.4 -47.6 315.4 -49.1H305.8zM320.9000000000001 -24.4C310.1 -31.7 300.3 -42.7 287.6 -49.6C281.6 -52.9 260.6 -61.3 254.2 -59.8C250.6 -59 250.3 -54.5 248.8 -50.3C245.7 -41.3 238.7 -26.9 238 -13.3C237.2 3.9 235.5 32.7 254 29.1C268.9 26.2 286.3 19.4 297.9 12.9999999999999C305 9.1 309 4.3999999999999 319.8 3.4999999999999C319.7 2.1 319.7 0.6999999999999 319.6 -0.8000000000001C313.7 -4.7 304.3 -4.6000000000001 297.8 -7.9000000000001C307.3 -8.3000000000001 314.8 -10.6000000000001 321.3 -13.8000000000001C321.2 -17.2 321 -20.8000000000001 320.9 -24.4000000000001zM374.3 -49.1H360.3C360.2 -45.9 357.5 -43.3 354.2 -43.3S348.3 -45.9 348.1 -49.1H330.7C327.9 -44.7 325 -40.5 321.8 -36.6C323.9000000000001 -34.4 325.8 -31.9 327.8 -29.7C336.8 -33.4 342.6 -24.8000000000001 349.5 -25.5000000000001C357.4 -26.3000000000001 363.7 -37.2 374.9 -36.5000000000001L374.3 -49.1000000000001zM383 -49.1C383.2 -45.1 383.4 -41.3 383.6 -37.6C399.2000000000001 -30.3 412.6 -38.9 419.3 -49.1H383zM466.4 -12.1C464.1 -23.3 460.6 -36.1 456.5 -49.2C456.3 -49.1 456.1 -49.1 455.9 -49.1H428C428.6 -48 429.2 -46.9 429.9 -45.8C427.3 -39.7 420.9 -37.1 419 -30.3C431.1 -7.6 425.5 63.1 394.8 48.2C399.1 54.5 410.4000000000001 59.7 415.6 67.5C428.6 57.1 436.4000000000001 47.2 448.8 36.1C455.6 30.1 468.8 22.8 470.2 13C471 7.5 467.6 -5.9 466.4 -12.1zM222.2 317.5C227.6 332.4 249.4 352.2 267.2 349.5C274.9 348.3 285.2 341.3 279.4 331.8C249.2 338.8 234.2 319.2 225 298.7C216.9 300.7 220.1 311.8 222.2 317.5zM406.3 254.4C414.5 258 428.7 255.1 435.9 259.7000000000001C431.7 271.2000000000001 425.6 281.1 426.6 297.4000000000001C427.1 297.4000000000001 427.6 297.4000000000001 428 297.3000000000001C434.8 283.1 440.7 268.1 449.3999999999999 255.6C443.7 242.1 405.7999999999999 230.2 406.2999999999999 254.4000000000001zM426.7 297.4zM309.5 251.7C302.7 262.6 290.5 284.2 295 297C301.5 285.1 303.6 272.6 312.8 263.7C316.9 259.7 325 254.7 321 243.5C320.1 240.8 313.2 234.9 309.3 233.8C294.9 229.5 261.4 232.9 272.7 250.9C284.5999999999999 250.2 300.5999999999999 243.1 309.5 251.7zM336.8 181.7C340.6 175.1 338.2 163 348.9 161.1C369.1 157.7 392.5 173.4 407 178.9C416 194.1 406.2 199.6 398.1 209.4C381.5 229.4 359.3 254.2 360.1 284.1C366.8 289 367.4000000000001 276.7 368.3 274.4C377 254.1 398.7 228.2 414.6 210.9C418.5 206.6 424.9000000000001 202.5 425.6 199.7C427.7000000000001 191.5 420.2000000000001 181.7 421.1 176.2C399.4000000000001 162.3 375.3 147.1 339.7000000000001 150.6C332.3000000000001 157.3 329.4000000000001 172 336.8000000000001 181.7zM135.5 190.9C128.6999999999999 194.8 127.0999999999999 211.9 119.0999999999999 212.3C107.6999999999999 213 109.7999999999999 190.1 109.7999999999999 176.8C101.9999999999999 183.9 100.5999999999999 205.9 106.2999999999999 217.1C99.7 220.3 96.7999999999999 213.5 93.2 211.2C97.9 245.3 143 227 135.5 190.9zM435.1 162.1C425 142.9 410.7 121.7 381.1 121.1C380.5 127.3 380 136.7 381.1 140.5C403.8 142.6999999999999 417.7 154.1999999999999 435.1 162.1zM293.2 149.7C312.0999999999999 139.8 346.8 138.7 372.5 139.5C373.8999999999999 133.9 373.8 126.9 373.8999999999999 120.1C340.8999999999999 118.3 301.8999999999999 126.5 293.2 149.7000000000001zM385.3999999999999 103C383.7 98.7 380.0999999999999 93.7 375.5999999999999 91.9C363.4999999999999 87 329.9999999999999 83.2 313.2 92.2C302.5 97.9 295.7 110.7 289.8 118.2C287 121.8 272.9 131.1 289.6 131.1C302.7 98.4 347.6 102.1 385.4 102.9999999999999z" />
+    <glyph glyph-name="joget"
+      unicode="&#xF3B7;"
+      horiz-adv-x="496" d=" M227.5 -20.7C218.5 -7.1 207.6 12.6 203.8 21.7C198.1 35.4 176.6 67.3 235 88.8C286.7 107.9 411.7 105.3 443.8 106.4C439.8 97.4 435.2 88.5 429.9000000000001 79.8C389.5000000000001 14.3 319.5 -21.7 247.9000000000001 -21.7C241.1 -21.7 234.3000000000001 -21.3000000000001 227.5000000000001 -20.7M66.1 304.1C128 404.6 259.6 435.8 360.1 373.9C434.9000000000001 327.8 471.3 243 459.4 161.2000000000001C434.5000000000001 161.7000000000001 280.1 164.8000000000001 229.1 166.1C173.6 167.5 147.4 186.9 170.6 214.3C193.8 241.7 221.7 255 239.5000000000001 265.5C257.4000000000001 276 266.8 299.2 215.9 295.2C87.3 286.5 48.6 195.9 37.6 155C28.8 204.7 37.5 257.7 66.1 304.1M36.9 322.1C-35 205.5 1.3 52.8 117.9 -19.1C234.5 -91 387.2 -54.7 459.1 61.8C531 178.4 494.7 331.2 378.1 403C337.6 428.1 292.6 440 248.2 440C165 440 83.8 398.1 36.9 322.1M281.3 211.7C249.8 191.2 216 180.4 216 180.4L385.5 182L432 205.4S435.6 214.9 412.9 220.9C390.2 226.9 355.9 209.6 326.2 193.7C296.5 177.9 295.1 185.5 295.1 185.5S335.3 213.6 345.8 220C356.3 226.4 377.7 234 359.2 244.6C356 246.4 352.5 247.3 348.8 247.3C331 247.3 307.3 228.6 281.3 211.7" />
+    <glyph glyph-name="joomla"
+      unicode="&#xF1AA;"
+      horiz-adv-x="448" d=" M0.6 355.9C0.6 389.2 27.4 416 60.4 416C90.4 416 114.9 394.1 119.6 365.8C152.2 373.4 186.7 365.2 216.1 335.8L171.8 291.5C151.3 312 129.2 307.8 116.4 295C102.1 280.7 102.1 257.1 116.4 242.8L215.9 143.3L171.9 99C84.2 186.2 122.2 148.7 72.1 198.7C45.3 225.2 37.1 263.5 47.3 297.6C20.4 303.4 0.6 327.3 0.6 355.9zM130.1 239.5L174.4 195.2C184.4 205.2 264.1 284.9 274.1 295C288.4 309.3 311.7 309.3 326 295C338.8 282.2 343 260 322.5 239.6L366.5 195.3C397.7 226.5 405 262.9 395.3999999999999 296.5C424.5999999999999 300.6 447.2999999999999 325.7 447.2999999999999 356C447.2999999999999 389.2 420.4999999999999 416.1 387.4999999999999 416.1C357.1999999999999 416.1 332.0999999999999 393.6 327.9999999999999 364.5C294.1999999999999 374.4 256.2999999999999 366 229.6999999999999 339.4C211.3999999999999 320.3 158.5999999999999 267.9 130.0999999999999 239.5zM396.4 87.3C404.6 120 395.5 155.8 370.1 181.2000000000001C358.3 193.4 375.1 176.5000000000001 270.6 280.9000000000001L226.3 236.6L326 136.9C340.3 122.6 340.3 99.3 326 85.0000000000001C313.2 72.2000000000001 291 68.0000000000001 270.6 88.5000000000001L226.6 44.2C254.2 14.0000000000001 294.6 5.4 329.3 16.2C334.8 -11.1999999999999 359 -31.9 388.2 -31.9C421.2 -31.9 448 -5.1 448 28.2C448 58.4 425.5 83.2000000000001 396.3999999999999 87.3000000000001zM312.1 140.4L268.1 184.7000000000001C181.1 98.3000000000001 217.7 134.3000000000001 168.4 84.9C154.1 70.6 130.8 70.6 116.5 84.9C103.4 98.3 99.6 120.2000000000001 119.7 140.3L75.7 184.6C45.5 154.4 37.7 119.4 46.2 86.3C19.5 80.3 0 56.4 0 28.1C0 -5.2 26.8 -32 59.8 -32C88.4 -32 112.3 -12.2 118.4 14.7C151.1 6.5 186.9 15.3 212.6 40.7C244.7 72.7 224.8 53.1 312.1 140.4z" />
+    <glyph glyph-name="js-square"
+      unicode="&#xF3B9;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM243.8 66.6C243.8 23 218.2 3.1 180.9 3.1C147.2 3.1 127.7 20.5 117.7 41.6L152 62.3C158.6 50.6 164.6 40.7 179.1 40.7C192.9 40.7 201.7 46.1 201.7 67.2V210.3H243.8V66.6zM343.4 3.1C304.3 3.1 279 21.7 266.7 46.1L301 65.9C310 51.2 321.8 40.3 342.5 40.3C359.9 40.3 371.1 49 371.1 61.1C371.1 75.5 359.7000000000001 80.6 340.4000000000001 89.1L329.9000000000001 93.6C299.5000000000001 106.5 279.4000000000001 122.8 279.4000000000001 157.1C279.4000000000001 188.7000000000001 303.5000000000001 212.7 341.0000000000001 212.7C367.8000000000001 212.7 387.0000000000001 203.4 400.8000000000001 179L368 158C360.8 170.9 353 176 340.9 176C328.6 176 320.8 168.2 320.8 158C320.8 145.4 328.6 140.3 346.7 132.4L357.2 127.9C393 112.6 413.0999999999999 96.9 413.0999999999999 61.7C413.0999999999999 23.9 383.2999999999999 3.1 343.3999999999999 3.1z" />
+    <glyph glyph-name="js"
+      unicode="&#xF3B8;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM243.8 66.6C243.8 23 218.2 3.1 180.9 3.1C147.2 3.1 127.7 20.5 117.7 41.6L152 62.3C158.6 50.6 164.6 40.7 179.1 40.7C192.9 40.7 201.7 46.1 201.7 67.2V210.3H243.8V66.6zM343.4 3.1C304.3 3.1 279 21.7 266.7 46.1L301 65.9C310 51.2 321.8 40.3 342.5 40.3C359.9 40.3 371.1 49 371.1 61.1C371.1 75.5 359.7000000000001 80.6 340.4000000000001 89.1L329.9000000000001 93.6C299.5000000000001 106.5 279.4000000000001 122.8 279.4000000000001 157.1C279.4000000000001 188.7000000000001 303.5000000000001 212.7 341.0000000000001 212.7C367.8000000000001 212.7 387.0000000000001 203.4 400.8000000000001 179L368 158C360.8 170.9 353 176 340.9 176C328.6 176 320.8 168.2 320.8 158C320.8 145.4 328.6 140.3 346.7 132.4L357.2 127.9C393 112.6 413.0999999999999 96.9 413.0999999999999 61.7C413.0999999999999 23.9 383.2999999999999 3.1 343.3999999999999 3.1z" />
+    <glyph glyph-name="jsfiddle"
+      unicode="&#xF1CC;"
+      horiz-adv-x="576" d=" M510.634 210.538C505.907 213.159 504.97 216.286 504.253 221.314C501.9010000000001 237.802 500.7140000000001 254.933 495.1560000000001 270.409C459.2610000000001 370.366 341.1660000000001 413.795 248.3070000000001 362.055C220.9370000000001 346.805 199.3360000000001 325.6860000000001 182.8140000000001 298.1520000000001C179.6300000000001 299.6600000000001 177.3560000000001 300.862 174.9900000000001 301.838C144.8880000000001 314.259 115.9410000000001 311.9590000000001 89.6590000000001 292.6710000000001C64.1280000000001 273.9340000000001 53.2370000000001 248.123 56.9830000000001 216.263C57.3380000000001 213.238 55.0160000000001 208.642 52.4690000000001 206.7180000000001C12.7570000000001 176.7260000000001 -3.5619999999999 128.653 10.5670000000001 82.1030000000001C24.3980000000001 36.5340000000001 68.0810000000001 2.3070000000001 116.1750000000001 0.6700000000001C146.4660000000001 -0.3609999999999 176.8120000000001 0.1240000000001 207.1340000000001 0.1310000000001C291.1750000000001 0.1520000000001 375.2240000000001 -0.3999999999999 459.2540000000001 0.6110000000001C511.9180000000001 1.2450000000001 555.3620000000001 37.4840000000001 567.4660000000001 87.9040000000001C579.0060000000001 135.9780000000001 556.3220000000001 185.2040000000001 510.6340000000001 210.5380000000001zM531.741 53.658C513.511 31.226 489.398 18.405 460.461 18.008C403.587 17.227 346.694 17.778 289.8090000000001 17.778C289.8090000000001 17.078 126.781 17.619 126.081 17.624C82.22 17.956 49.342 37.39 30.906 77.619C12.004 118.864 26.902 168.4670000000001 65.092 193.725C74.274 199.798 77.597 205.291 75.188 216.861C69.698 243.222 79.641 264.817 101.608 279.842C124.595 295.5650000000001 149.03 295.988 173.642 282.925C183.911 277.475 188.249 271.361 195.84 285.452C210.0620000000001 311.851 230.3970000000001 332.179 256.511 346.746C353.971 401.112 484.881 339.178 486.751 214.049C486.873 205.899 489.163 201.621 496.599 198.155C554.1590000000001 171.326 571.0550000000001 102.033 531.7410000000001 53.658zM443.952 134.1570000000001C438.104 103.0000000000001 409.33 79.061 377.286 79.062C360.3330000000001 79.063 345.228 85.607 333.207 96.767C305.51 122.48 262.066 171.747 237.27 190.154C217.214 205.042 195.28 202.487 176.998 186.372C127.002 142.3010000000001 192.857 64.597 244.061 109.184C248.609 113.144 251.901 118.727 256.805 122.028C264.989 127.537 277.571 122.912 269.973 111.406C252.615 85.122 220.643 73.209 191.11 82.105C162.213 90.809 142.27 118.073 142.484 152.284C143.709 174.769 154.848 195.344 177.898 208.249C200.473 220.887 224.267 221.395 244.889 205.775C295.68 167.3 320.467 124.03 352.185 104.53C376.743 89.431 406.439 97.167 421.008 122.036C449.838 171.245 386.416 227.052 342.14 185.4959999999999C338.151 181.7519999999999 335.223 176.5639999999999 330.73 173.7759999999999C319.755 166.9649999999999 313.397 177.8889999999999 317.921 184.1289999999999C338.6239999999999 212.6829999999999 368.385 224.5689999999999 401.192 212.3429999999999C432.6209999999999 200.6289999999999 450.3 167.9769999999999 443.952 134.1569999999999z" />
+    <glyph glyph-name="keycdn"
+      unicode="&#xF3BA;"
+      horiz-adv-x="512" d=" M63.8 38.7L124.3 97.7C156.4 54.9 195.4 31.7 250.9 30.3C281.4 29.6 311.2 37.3 337.3 52.6999999999999C342.4 47.3999999999999 355.8 33.1999999999999 358.2 30.6999999999999C326 9.9999999999999 288.5999999999999 -0.4000000000001 250.1 0.4999999999999C206.8 1.6 165.5 17.1999999999999 132.3999999999999 44.8999999999999C132.6999999999999 45.4999999999999 94.1999999999999 7.3999999999999 93.7999999999999 6.9999999999999C103.2999999999999 -22.8000000000001 80.6999999999999 -55.4 47.4999999999999 -55.4C20.7 -55.3 0 -33.7 0 -6.9C0 27.4 33.1 49.7 63.8 38.7zM418.7 291.1C437.8 259.8 448.3 223.7 447.4 187.1C446.3 142.3 428.4 99.6 398.8 66.1C399.1 65.8 422.6 40.9 422.9 40.6C432.5 41.9 442.1 38.6 448.8 31.5C460.1 19.5 459.6999999999999 0.6 447.7 -10.9C435.7 -22.2 416.8 -21.8 405.3 -9.8C398.6 -2.8 395.9 7.0000000000001 397.7 16.5000000000001C372.8 43.1000000000001 353.3 63.7000000000001 353.3 63.7000000000001C396 97.8000000000001 416.6 143.3000000000001 417.7 187.9C418.3999999999999 216.8000000000001 410.5 245.1 396.5999999999999 270.1L418.7 291.1zM104 394.9C110.7 387.9 113.4 378.1 111.6 368.6L157.5 320.5C152.8 316.7 144.2 310.1 134.7 299.2C109.3 270.7 95.1 234.4 94 196.3C93.3 167.4 100.1 139.1 114 113.9L92 92.4C72.7 124 63.1 160.1 64.2 197.1C65.2 241.7 82.5 284.7 111.7 318.2L86.4 344.6C76.8 343.3 67.2 346.6 60.5 353.7C49.2 365.7 49.6 384.6 61.6 396.1C73.5 407.3 92.2 407 104 394.9zM464.9 440C490.9 440 512 417.6 512 391.7S490.9 344 464.9 344C458.6 343.9 450.9 345.1 449 345.8L386.1 286.1C353.4000000000001 329.7 309.4000000000001 352 259.2000000000001 353.3C228.7000000000001 354 198.9 346.5 173.0000000000001 330.9L151.9000000000001 352.9C184.1 373.7 221.5 384 260 383.1C303.3 382 344.6 366.4 377.7 338.5L418.8 377.1C417.3 381.8 416.6 386.7 416.6 391.6C416.5 418.3 438.9 440 464.9 440zM256.7 334.6C262.2 334.6 267.6 334.2 273.1 333.5C351.2 323.7 406.5 252.4 396.9 174.4C387.1 96.3 315.8 41 237.8 50.6C159.7 60.4 104.4 131.6999999999999 114 209.8C123.3 282.2 184.1 334.4 256.7 334.6zM197.7 215.2C198.3 192.5 209.9 173.4 230.1 163L219.1 111.3H292.8L281.8 163C301.9000000000001 173.9 313.9000000000001 192 314.2 215.2C313.8 248 288.4 272.7 255.9 273.5C223.8 272.7 198.6 248.7 197.7 215.2zM256 288" />
+    <glyph glyph-name="kickstarter-k"
+      unicode="&#xF3BC;"
+      horiz-adv-x="384" d=" M147.3 333.6C147.3 389.8 114.8 416 73.9 416C26.2 416 0 379.8 0 334.6V51.6C0 4.3 25.3 -31.8 74.9 -31.8C114.7 -31.8 147.3 -6.1999999999999 147.3 51.6V128.1L259.4 -10.2C282.1 -37.4 331.5 -40.9 362.6 -10.2C389.6 17.4 389.9 57.2000000000001 370 82L279.2 196.8L354.0999999999999 304.2000000000001C371.4999999999999 328.9000000000001 371.5999999999999 367.3 343.7 394C313.3999999999999 423 261.3 425.6 230.1 381.2000000000001L147.3 263V333.6z" />
+    <glyph glyph-name="kickstarter"
+      unicode="&#xF3BB;"
+      horiz-adv-x="448" d=" M400 -32H48C21.6 -32 0 -10.4 0 16V368C0 394.4 21.6 416 48 416H400C426.4 416 448 394.4 448 368V16C448 -10.4 426.4 -32 400 -32zM199.6 269.5C199.6 300.2 182 314.6 159.9 314.6C134.1 314.6 119.9 294.8 119.9 270.1V115.3C119.9 89.4999999999999 133.6 69.6999999999999 160.4 69.6999999999999C181.9 69.6999999999999 199.6 83.6999999999999 199.6 115.3V157.1L260.2 81.4C272.5 66.5 299.2 64.6 316 81.4C330.6 96.5 330.8 118.2 320 131.8L270.9 194.6L311.4 253.3C320.8 266.8 320.9 287.8 305.8 302.4C289.4 318.3 261.2 319.7 244.4 295.4L199.6 230.7V269.5z" />
+    <glyph glyph-name="korvue"
+      unicode="&#xF42F;"
+      horiz-adv-x="446" d=" M386.5 414H59.5C26.8 414 0 387.2 0 354.5V27.4C0 -5.2 26.8 -32 59.5 -32H386.6C419.6 -32 446.1 -5.2 446.1 27.5V354.5C446 387.2 419.2 414 386.5 414zM87.1 327.2H183.1V211.2L244.9 327.2H355.8L274.6 195.2H87.1V327.2zM248.9 55.1L183.2 168.6999999999999V55.0999999999999H87.2V185.9H278.7L367.3 55.1H248.9z" />
+    <glyph glyph-name="laravel"
+      unicode="&#xF3BD;"
+      horiz-adv-x="640" d=" M637.5 206.4C633.3 211.2 574.7 284.5 564.4 296.9C554.1 309.3 549 307.1 542.6999999999999 306.2000000000001C536.3 305.3 462.1999999999999 292.8 453.5999999999999 291.4C444.9999999999999 289.9 439.5999999999999 286.5 444.8999999999999 279.1C449.5999999999999 272.5 498.2999999999999 203.4 509.0999999999999 188.2L315.3999999999999 141.8L161.2 399.3C155.1 408.4 153.8 411.6 139.8 410.9C125.8 410.3 18.9 401.4 11.3 400.7C3.7 400.1 -4.7 396.7 2.9 378.7S131.9 99.1 135.3 91.5C138.7 83.9 147.5 71.5 168.1 76.5C189.2 81.6 262.4 100.7 302.4 111.2C323.5 72.9 366.6 -4.7 374.6 -15.8C385.2 -30.7 392.6 -28.2 408.9 -23.2C421.7 -19.3 608.5 47.9 616.9 51.3C625.3 54.8 630.5 57.2 624.8 65.7C620.5999999999999 71.9 571.3 137.9 545.5 172.5C563.2 177.2 626.1 193.9 632.8 195.8C640.6999999999999 197.8 641.8 201.6 637.5 206.4zM285.3 134.4C283 133.9 174.5 107.9 168.7 106.6C162.9 105.3 162.9 105.9 162.2 107.9C161.5 109.9 33.2 374.6 31.4 377.9C29.6 381.2 29.7 383.8 31.4 383.8S133.9 392.8 137.4 393C141 393.2 140.6 392.4 141.9 390.2C141.9 390.2 284.1 144.8 286.5 140.5C289.1 136.2 287.6 134.9 285.3 134.4zM591.3 77C593 74.3 594.8 72.5 589.3 70.6C583.9 68.6 405.6 8.5 402.2 7C398.7 5.5 396 5 391.5999999999999 11.5S329.2 118.3 329.2 118.3L518 167.4C522.7 168.9 524.2 169.9 527.2 165.2C530.1 160.4 589.6 79.7 591.3000000000001 77zM603.4 211.1C599.1999999999999 210.2 529.8 193 529.8 193L473.1 270.8C471.4999999999999 273.1 470.2 275.3 474.2 275.8S542.6 288 545.5 288.6C548.4 289.3 550.9 290.1 554.5 285.2000000000001C558.1 280.3 607.1 218.2 609 215.8C610.8 213.5 607.6 212.1 603.4 211.1z" />
+    <glyph glyph-name="lastfm-square"
+      unicode="&#xF203;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM307.8 103.1C244.4 103.1 222.4 131.7000000000001 210.7 167.2000000000001C194.4 218.2000000000001 189.2 251.5000000000001 147.7 251.5000000000001C125.3 251.5000000000001 102.6 235.4000000000001 102.6 190.3000000000001C102.6 155.1000000000001 120.6 133.1000000000001 145.9 133.1000000000001C174.5 133.1000000000001 193.5 154.4000000000001 193.5 154.4000000000001L205.2 122.5000000000001S185.4 103.1000000000001 144 103.1000000000001C92.7 103.1000000000001 64.1 133.2000000000002 64.1 188.9000000000002C64.1 246.8000000000002 92.7 280.9000000000002 146.6 280.9000000000002C220.1 280.9000000000002 227.4 239.5000000000002 247.4 179.0000000000001C256.2 152.2000000000001 271.6 132.8000000000001 308.6 132.8000000000001C333.5 132.8000000000001 346.7 138.3000000000001 346.7 151.9000000000002C346.7 171.8000000000001 324.9 173.9000000000002 296.8 180.5000000000002C266.4000000000001 187.8000000000002 254.3 203.6000000000002 254.3 228.5000000000002C254.3 268.5000000000002 286.6 280.9000000000002 319.5 280.9000000000002C356.9 280.9000000000002 379.6 267.3000000000002 382.5 234.3000000000002L345.8 229.9000000000002C344.3 245.7000000000002 334.8 252.3000000000002 317.2 252.3000000000002C301.1 252.3000000000002 291.2 245.0000000000002 291.2 232.5000000000002C291.2 221.5000000000002 296 214.9000000000002 312.1 211.2000000000002C344.8 204.1000000000002 383.9 199.2000000000002 383.9 153.7000000000002C384 117.0000000000002 353.2 103.1000000000001 307.8 103.1000000000001z" />
+    <glyph glyph-name="lastfm"
+      unicode="&#xF202;"
+      horiz-adv-x="512" d=" M225.8 80.9L207 131.9S176.5 97.9 130.8 97.9C90.3 97.9 61.6 133.1 61.6 189.4C61.6 261.5 98 287.3 133.7 287.3C200.2 287.3 208.5 234 234.6 152.4C253.4 95.5 288.6 49.8 390 49.8C462.7 49.8 512 72.1 512 130.6999999999999C512 203.5999999999999 449.3 211.2999999999999 397 222.7999999999999C371.2 228.7 363.6 239.2 363.6 256.8C363.6 276.7 379.4000000000001 288.4999999999999 405.2000000000001 288.4999999999999C433.4000000000001 288.4999999999999 448.6 277.8999999999999 450.9 252.7L509.5000000000001 259.7C504.8000000000001 312.5 468.4 334.2 408.6 334.2C355.8 334.2 304.2000000000001 314.3 304.2000000000001 250.3C304.2000000000001 210.3999999999999 323.6 185.1999999999999 372.2000000000001 173.5C417.1 162.8999999999999 452.0000000000001 159.6999999999999 452.0000000000001 127.8C452.0000000000001 106.1 430.9000000000001 97.3 391.0000000000001 97.3C331.8000000000001 97.3 307.1 128.4 293.1 171.1999999999999C261.1 268 249.5000000000001 334.2 131.8 334.2C45.7 334.2 0 279.7 0 187C0 97.9 45.7 49.8 127.9 49.8C194.1 49.8 225.8 80.9 225.8 80.9z" />
+    <glyph glyph-name="leanpub"
+      unicode="&#xF212;"
+      horiz-adv-x="576" d=" M386.539 336.515L401.635 87.56L390.656 87.835C354.424 88.659 319.016 79.052 287.999 59.838C256.983 79.052 221.575 87.835 185.3420000000001 87.835C139.7780000000001 87.835 103.2720000000001 77.13 61.826 60.112L93.117 318.4C121.663 330.203 154.601 336.515 185.343 336.515C226.516 336.515 259.1790000000001 323.3400000000001 288 293.971C315.723 322.242 347.013 335.692 386.539 336.515zM569.07 0C543.5440000000001 0 521.585 5.215 498.528 15.645C464.218 31.29 428.5350000000001 40.623 390.6570000000001 40.623C351.6800000000001 40.623 315.7230000000001 27.722 288.0000000000001 0C260.2770000000001 27.723 224.3200000000001 40.623 185.3430000000001 40.623C147.4650000000001 40.623 111.7820000000001 31.29 77.4720000000001 15.645C55.239 5.764 32.731 0 8.303 0H6.93L49.475 349.141C88.726 371.374 136.486 384 181.775 384C218.83 384 256.984 376.315 288 354.905C319.016 376.315 357.17 384 394.225 384C439.514 384 487.274 371.374 526.5250000000001 349.141L569.07 0zM525.702 44.741L491.666 324.987C460.924 338.986 424.418 346.397 390.657 346.397C352.229 346.397 316.272 334.32 288 307.695C259.728 334.32 223.772 346.397 185.343 346.397C151.582 346.397 115.076 338.986 84.334 324.987L50.298 44.741C97.509 64.228 133.192 78.227 185.343 78.227C222.947 78.227 256.16 68.621 288 48.583C319.84 68.621 353.052 78.227 390.657 78.227C442.808 78.227 478.491 64.228 525.702 44.741z" />
+    <glyph glyph-name="less"
+      unicode="&#xF41D;"
+      horiz-adv-x="640" d=" M612.7 229C612.7 249.5 615.9000000000001 261.6 615.9000000000001 283.6C615.9000000000001 317.8 603.3000000000001 328.8 575.4000000000001 328.8H554.9000000000001V304.6H561.2C575.4000000000001 304.6 578.5 299.9 578.5 282.5C578.5 266.2 576.9 249.9 576.9 231C576.9 206.8 584.8 197.4 600.5 193.7V192.1C584.7 188.4 576.9 179 576.9 154.8C576.9 135.9 578.5 120.6 578.5 103.3C578.5 85.4 574.8 80.7 561.2 80.7V80.2H554.9000000000001V55H575.4000000000001C603.2 55 615.9000000000001 66 615.9000000000001 100.2C615.9000000000001 122.8 612.7 134.4 612.7 154.8C612.7 165.8 619.5 177.4 640 178.4V205.7000000000001C619.5 206.4 612.7 218.0000000000001 612.7 229.0000000000001zM507.1 197C491.3 203.3 476.6 207 476.6 217.5C476.6 225.4 482.9 230.1 494.5 230.1S516.6 225.4 528.1 217L549.1 244.8C536 254.8 518.1 265.3 493.9 265.3C458.2 265.3 434.0000000000001 244.8 434.0000000000001 215.9C434.0000000000001 190.2 456.6000000000001 177 475.5000000000001 169.7C491.8000000000001 163.4 507.6000000000001 158.1 507.6000000000001 147.6C507.6000000000001 139.7 501.3000000000001 134.5 487.1000000000001 134.5C474.0000000000001 134.5 460.8000000000001 139.8 446.6000000000001 150.8L425.6000000000001 120.3C441.4000000000001 107.1999999999999 465.5000000000001 98.1999999999999 485.5000000000001 98.1999999999999C527.5 98.1999999999999 550.1 120.3 550.1 149.1999999999999S527.6 190.1999999999999 507.1 197zM148.2000000000001 137.6C144.5000000000001 137.6 139.8000000000001 140.8 139.8000000000001 150.7000000000001V328.9H65.2C36.8 328.9 24.2 317.9 24.2 283.7C24.2 261.1 27.4 248.5 27.4 229.1C27.4 218.1 20.6 206.5 0.1 205.5V178.2C20.6 177.7 27.4 166.1 27.4 155.1C27.4 135.7 24.2 124.1 24.2 101.4999999999999C24.2 67.3 36.8 56.3 64.7 56.3H85.2V80.4999999999999H78.9C65.8 80.4999999999999 61.6 85.8 61.6 103.1S63.2 135.2 63.2 154.6C63.2 178.8 55.3 188.2 39.6 191.9V193.5C55.4 197.2 63.2 206.6 63.2 230.8C63.2 249.7 61.6 265 61.6 282.3S65.3 304.4 78.9 304.4H93V153.5999999999999C93 121.4999999999999 104 100.4999999999999 136.1 100.4999999999999C146.1 100.4999999999999 154 102.0999999999999 159.7 104.1999999999999L154.4 138.3999999999999C151.3 137.5999999999999 149.8 137.5999999999999 148.2 137.5999999999999zM379.9 197C363.6 203.3 348.9 207 348.9 217.5C348.9 225.4 355.2 230.1 366.8 230.1C378.4 230.1 388.9 225.4 400.4 217L421.4 244.8C408.3 254.8 390.4 265.3 366.2 265.3C330.5 265.3 306.3 244.8 306.3 215.9C306.3 190.2 328.9000000000001 177 347.8 169.7C364.1 163.4 379.9000000000001 158.1 379.9000000000001 147.6C379.9000000000001 139.7 373.6 134.5 359.4000000000001 134.5C346.3 134.5 333.1 139.8 318.9000000000001 150.8L298.4000000000001 120.3C314.2000000000001 107.1999999999999 338.3 98.1999999999999 358.3 98.1999999999999C400.3 98.1999999999999 422.9 120.3 422.9 149.1999999999999C423 178.0999999999999 400.4 190.1999999999999 379.9 197zM224.9 265.8C186.5 265.8 149.8 233.7 150.8 183.3C150.8 131.3 185 100.8 230.1 100.8C249 100.8 270 107.6 286.3 118.7L270.5 146.5C258.8999999999999 139.7 247.9 136.5 236.3 136.5C215.3 136.5 199 146.5 194.8 170.7H290C290.5 174.4 291.6 181.7 291.6 190.1C292.2000000000001 232.7 269 265.8 224.9 265.8zM194.9 199.6C198.1 220.6 210.7 230.6 225.4 230.6C244.3 230.6 251.7 217.5 251.7 199.6H194.9z" />
+    <glyph glyph-name="line"
+      unicode="&#xF3C0;"
+      horiz-adv-x="448" d=" M272.1 243.8V172.7000000000001C272.1 170.9 270.7000000000001 169.5000000000001 268.9000000000001 169.5000000000001H257.5000000000001C256.4000000000001 169.5000000000001 255.4000000000001 170.1000000000001 254.9000000000001 170.8000000000001L222.3000000000001 214.8000000000001V172.6000000000001C222.3000000000001 170.8000000000001 220.9000000000001 169.4000000000001 219.1000000000001 169.4000000000001H207.7000000000001C205.9000000000001 169.4000000000001 204.5000000000001 170.8000000000001 204.5000000000001 172.6000000000001V243.7000000000001C204.5000000000001 245.5000000000001 205.9000000000001 246.9000000000001 207.7000000000001 246.9000000000001H219C220 246.9000000000001 221.1 246.4000000000001 221.6 245.5000000000001L254.2 201.5000000000001V243.7000000000001C254.2 245.5000000000001 255.6 246.9000000000001 257.4 246.9000000000001H268.8C270.6 247.0000000000001 272.1 245.5000000000001 272.1 243.8000000000001zM190.1 247H178.7C176.9 247 175.5 245.6 175.5 243.8V172.7000000000001C175.5 170.9 176.9 169.5000000000001 178.7 169.5000000000001H190.1C191.9 169.5000000000001 193.3 170.9 193.3 172.7000000000001V243.8000000000001C193.3 245.5000000000001 191.9 247.0000000000001 190.1 247.0000000000001zM162.6 187.4H131.5V243.8C131.5 245.6 130.1 247 128.3000000000001 247H116.9C115.1 247 113.7 245.6 113.7 243.8V172.7C113.7 171.8 114 171.1 114.6 170.5C115.2 170 115.9 169.6 116.8000000000001 169.6H162.5000000000001C164.3000000000001 169.6 165.7000000000001 171 165.7000000000001 172.8V184.2C165.7000000000001 185.9 164.3000000000001 187.4 162.6000000000001 187.4zM332.1 247H286.4000000000001C284.7000000000001 247 283.2000000000001 245.6 283.2000000000001 243.8V172.7000000000001C283.2000000000001 171.0000000000001 284.6 169.5000000000001 286.4000000000001 169.5000000000001H332.1C333.9000000000001 169.5000000000001 335.3 170.9 335.3 172.7000000000001V184.1C335.3 185.9 333.9000000000001 187.3 332.1 187.3H301V199.3H332.1C333.9000000000001 199.3 335.3 200.7 335.3 202.5V214C335.3 215.8 333.9000000000001 217.2 332.1 217.2H301V229.2H332.1C333.9000000000001 229.2 335.3 230.6 335.3 232.4V243.8C335.2 245.5 333.8 247 332.1 247zM448 334.3V49C447.9 4.2 411.2 -32.1 366.3 -32H81C36.2 -31.9 -0.1 4.9 0 49.7V335C0.1 379.8 36.9 416.1 81.7 416H367C411.8 415.9 448.1 379.2 448 334.3zM386.4 211.7C386.4 284.7 313.2 344.1 223.3 344.1C133.4 344.1 60.2 284.7 60.2 211.7C60.2 146.3 118.2 91.5 196.6 81.1C215.7 77 213.5 70 209.2 44.3C208.5 40.2 205.9 28.2 223.3 35.5C240.7 42.8 317.2 90.8 351.5 130.2C375.1 156.2 386.4 182.5 386.4 211.7z" />
+    <glyph glyph-name="linkedin-in"
+      unicode="&#xF0E1;"
+      horiz-adv-x="448" d=" M100.3 -32H7.4V267.1H100.3V-32zM53.8 307.9C24.1 307.9 0 332.5 0 362.2C0 391.9 24.1 416 53.8 416C83.5 416 107.6 391.9 107.6 362.2C107.6 332.5 83.5 307.9 53.8 307.9zM448 -32H355.3V113.6C355.3 148.3 354.6 192.8 307 192.8C258.7 192.8 251.3 155.1 251.3 116.1V-32H158.5V267.1H247.6V226.3H248.9C261.3 249.8 291.6 274.6 336.8 274.6C430.8 274.6 448.1 212.7 448.1 132.3V-32z" />
+    <glyph glyph-name="linkedin"
+      unicode="&#xF08C;"
+      horiz-adv-x="448" d=" M416 416H31.9C14.3 416 0 401.5 0 383.7V0.3C0 -17.5 14.3 -32 31.9 -32H416C433.6 -32 448 -17.5 448 0.3V383.7C448 401.5 433.6 416 416 416zM135.4 32H69V245.8H135.5V32zM102.2 275C80.9 275 63.7 292.3 63.7 313.5S80.9 352 102.2 352C123.4 352 140.7 334.7 140.7 313.5C140.7 292.2 123.5 275 102.2 275zM384.3 32H317.9V136C317.9 160.8 317.4 192.7 283.4 192.7C248.8 192.7 243.5 165.7 243.5 137.8V32H177.1V245.8H240.8V216.6H241.7C250.6 233.4000000000001 272.3 251.1 304.6 251.1C371.8 251.1 384.3 206.8 384.3 149.2000000000001V32z" />
+    <glyph glyph-name="linode"
+      unicode="&#xF2B8;"
+      horiz-adv-x="448" d=" M437.4 221.7C437.1 222.6 436.5 223.1 436 223.7L366 262.3C365.1 262.9 364 262.9 362.9 262.3L304 226.3C303.1 225.7 302.6 224.6 302.6 223.7L301.7000000000001 192.3L277.7000000000001 208.3C276.8000000000001 208.9 275.4000000000001 208.9 274.6 208.3L240 187.1L238.6 222.2C238.6 223.1 238 224.2 237.2 224.5L201.2 248.8000000000001L234.9 266.2000000000001C236 266.8000000000001 236.6 267.9000000000001 236.6 269.1L230.9 401.4000000000001C230.9 402.3000000000001 230 403.4000000000001 229.2 404.0000000000001L138.6 447.7C137.7 448 136.9 448 136.3 448L12.6 409.4C11.2 408.8 10.3 407.4 10.6 405.7L38 272.6C38.9 269.2 72 245.2 76.6 241.7L49.7 228.8C48.3 227.9 47.7 226.5 48 225.4L68.6 125.1C69.2 122.2 92.3 101.9999999999999 95.7 98.8L78.3 88.1999999999999C77.4 87.5999999999999 76.6 86.1999999999999 76.9 85.0999999999999C78.3 77.9999999999999 92.3 7.3999999999999 93.8 5.9999999999999L158.9 -63.1000000000001C159.5 -63.7000000000002 160.3 -63.7000000000002 161.2 -64.0000000000001C161.8 -64.0000000000001 162.3 -63.7000000000001 162.9 -63.4000000000001L246.6 3.4999999999999C247.5 4.0999999999999 247.7 4.8999999999999 247.7 5.7999999999999L245.7 51.7999999999999L273.7 28.0999999999999C274.8 27.1999999999999 276.5999999999999 27.1999999999999 277.7 28.0999999999999L344.5999999999999 81.4999999999999C345.4999999999999 82.0999999999999 345.7 82.8999999999999 345.7 83.7999999999999L348 117.1999999999999L368.3 103.1999999999999C369.4 102.2999999999999 370.9 102.2999999999999 372 103.1999999999999L426.6 146.8999999999999C427.2 147.1999999999999 427.7 147.9999999999999 427.7 148.8999999999999C428.6 155.3999999999999 438 219.6999999999999 437.4 221.6999999999999zM232.6 216.9L236.6 124.3L146 63.1L132 159.6999999999999L232.6 216.8999999999999zM224.9 396.9L230.3 270.9L123.7 215.5L104 350.3L224.9 396.9zM44 274.9L18 400L97.7 350.6L117.1 217.7L44 274.9zM74.6 127.1L55.7 218L125.7 159.7L139.4 66.3L74.6 127.1zM98.9 9.4L85.2 76.5L146.9 15.6L156.6 -51.8L98.9 9.4zM163.4 -55.1L152.8 15.8000000000001L238.5 77.2000000000001L241.6 7.2L163.4 -55.1zM245.4 60C245.4 63.4 246.3 82.9 243.4 85.1L219.1 105.1L241.4 120C243.7 121.7 242.5 125.7 242.5 128L271.9 105.4L272.5 37.1L245.4 59.9999999999999zM339.7 85.4L278.8 36.8L278.2 105.4L343.9 152.3L339.7 85.4zM367.4 111.1L348.3 124.5L350.3 158.5C350.6 159.3999999999999 350 160.5 349.2 161.1L308 188.3L308.6 218.3L373.2000000000001 177.7L367.4000000000001 111.1zM422 150.9L373.7 112.6L379.4 177.6999999999999L430.5 214.2999999999999L422 150.8999999999999z" />
+    <glyph glyph-name="linux"
+      unicode="&#xF17C;"
+      horiz-adv-x="448" d=" M196.1 324.4C195.9 325.8 198 326.7 199.3 327.3C201 328 203.2 328.3 204.8 327.4C205.2 327.2 205.6 326.7 205.4 326.3C205 325.1 203 325.3 201.9 324.7000000000001C200.9 324.2000000000001 200.1 323 198.9 323C197.9 322.9000000000001 196.2 323.4000000000001 196.1 324.4000000000001zM220.8 324.7C221.8 324.2 222.6 323 223.8 323C224.9 323 226.6 323.4 226.7 324.5C226.9 325.9 224.8 326.8 223.5 327.4C221.8 328.1 219.6 328.4 218 327.5C217.6 327.3 217.2 326.8 217.4 326.4C217.7 325.1 219.7 325.3 220.8 324.7zM435.5 14.5C435 6.3 429 0.7 421.6 -3.8C406.7000000000001 -12.8 384.3 -19.6 370.7000000000001 -36L368.1 -33.8L370.7000000000001 -36C356.5000000000001 -52.9 339.0000000000001 -62.6 322.4000000000001 -63.9C305.9000000000001 -65.1999999999999 290.4000000000001 -57.6 282.1 -40.9V-40.8C281 -38.6999999999999 280.2000000000001 -36.4 279.6 -34.1C258.1 -35.3 239.4000000000001 -28.8 224.5 -29.9999999999999C202.5 -31.1999999999999 188.7000000000001 -36.4999999999999 176.2000000000001 -36.6C171.4 -47.2 161.9 -54.2 150.3000000000001 -56.7999999999999C134.3000000000001 -60.4999999999999 114.2000000000001 -56.7999999999999 94.4 -46.4L96 -43.4L94.4 -46.4C75.9 -36.6 52.4 -37.5 35.1 -33.9C26.4 -32.1 18.8 -28.9 15 -21.6C11.3 -14.3 12 -4.3 17.2 10.1C18.9 15.2 17.6 22.8 16.4 30.9C15.8 34.8 15.2 38.8 15.2 42.7C15.2 47.0000000000001 15.9 51.2 18 55.1C22.5 63.6 29.8 67.2000000000001 36.5 69.6C43.2 72 49.3 73.6 53.5 77.9C58.7 83.4 63.6 92.3 70.1 98.1C67.5 115.3 70.3 133.5 76.3 151.4C88.9 189.3 115.5000000000001 225.6 134.4 248.1C150.5 271 155.2000000000001 289.4000000000001 156.9 312.8C158 344.6 132.4 448.2 234.8 448C315.7000000000001 447.9 311.1 362.6 310.6 316.7C310.3 286.6 326.9000000000001 266.2 344 244.7C359.2 226.7 379.1 200.4 390.5 170.3C399.8 145.6999999999999 403.4 118.5 394.2 91.1999999999999C395.6 90.6999999999999 397 89.9999999999999 398.3 89.1999999999999C399.7 88.3999999999999 401 87.3999999999999 402.3 86.3C408.9000000000001 80.6999999999999 411 71.9999999999999 412.8 63.9C414.7 55.8 416.4000000000001 48.2 420 44.2C431.1 31.8 435.9 22.7 435.5 14.5zM220.8 338.9C224.4 338 229.7 336.5 233.8 334.5C231.7 346.7 238.3 358 245.6 357.5C254.5000000000001 357.2 259.5 342 254.7 330.2C253.9 328.3 251.9 326.8 250.8 325.6C257.5 323.3 261.8 321.5 263.4000000000001 320.7C271.3 330.2 274.2000000000001 346.9 267.7000000000001 361.1C257.9000000000001 382.5 233.5000000000001 382.9 223.7000000000001 360.7C220.5000000000001 353.5 219.8000000000001 345.8 220.8000000000001 338.9zM174.6 320.1C182.4 325.8 181.5 324.8 180.5 325.6C172.5 332.5 173.9 353 182.3000000000001 353.7000000000001C188.6000000000001 354.2000000000001 193.1000000000001 343 191.9 334.1C195 336.2000000000001 198.6 337.7000000000001 202.1 338.7000000000001C203.8 358 193.1 372.2000000000001 183 372.2000000000001C164.1 372.2000000000001 159 334.7000000000001 174.6 320.1zM165.2 299.2000000000001C166.7 294.3 171.3 288.7000000000001 179.9 283.9C187.7 279.3 191.9 272.4 199.9 268.9C202.5 267.8 205.6 267 209.5 266.8C227.9 265.7000000000001 236.6 278.1 247.7 281.7000000000001C259.4 285.4 267.8 292.7000000000001 270.4 299.8C273.6 308.3 268.3 314.5 259.9 318C248.6 322.9 243.6 323.2 237.3 327.3C227 333.9 218.5 336.2 211.4 336.2C197 336.2 188.2 326.4 183.5 322C183 321.5 175.6 316.1 169.4 311.5C165.2 308.2 163.8 304.1 165.2 299.2zM131.7 46.4L112.1 82C105.3 91.2 98.3 96.8 90.2 98C82.5 99.2 77.6 96.6 72.5 91.1C67.7 86 63.7 78.8 58.2 73.1C50.4 66.6 48.9 66.9 38.6 63.2000000000001C32.3 61.0000000000001 27.3 58.6 23.8 51.9C21.1 46.9 21.7 39.7 22.9 31.9C24.1 24.0000000000001 25.9 15.6 23.5 8.0000000000001V7.8000000000001C18.5 -5.8999999999999 18.5 -13.8999999999999 20.9 -18.5999999999999C28.8 -33.9999999999999 67.5 -24.6999999999999 97.4 -40.4999999999999C128.8 -56.8999999999999 170 -57.5999999999999 172.7 -22.4999999999999C174.8 -1.9999999999999 141.2 26.5000000000001 131.7 46.4000000000001zM285.6 10.6C288.8 21.6 291.9000000000001 31.9 292.4000000000001 39.6C293.2000000000001 54.8 294.0000000000001 68.3 296.8 79.4999999999999C299.9000000000001 92.1 306.1 102.6 318.2 106.8C320.5 127.9 336.9 127.9 356.5 119.3C375.4 110.8 382.5 103.3 379.3 93.1999999999999C380.3 93.1999999999999 381.3 93.3 383.5 93.1999999999999C388.7 110.0999999999999 369.2 121.1999999999999 352.8 128C355.7 140 355.2 152.1 352.4000000000001 163.6999999999999C346.4000000000001 189 329.8 211.5 317.2000000000001 222.6999999999999C314.9000000000001 222.7999999999999 315.1 220.7999999999999 319.8000000000001 216.1999999999999C331.4000000000001 205.5 356.9000000000001 167 343.1000000000001 131.3C339.2000000000001 132.3 335.5000000000001 132.8 332.2000000000001 132.6999999999999C326.9000000000001 161.8 314.7000000000001 185.8999999999999 308.6000000000001 197.2999999999999C297.1000000000001 218.6999999999999 279.1000000000001 262.5999999999999 271.4000000000001 293C266.9000000000001 286.5999999999999 259.0000000000001 281.0999999999999 249.1000000000001 278C244.4000000000001 276.5 239.4000000000001 272.5 233.2000000000001 269C219.3000000000001 261 203.2000000000001 260.2 190.8000000000001 270.2C186.3000000000001 273.8 182.8000000000001 277.8 178.2000000000001 280.5C176.6000000000001 281.4 173.1000000000001 283.8 172.0000000000001 284.5999999999999C170.0000000000001 246.8 144.7000000000001 199.3 132.7000000000001 171.8999999999999C124.4000000000001 152.1999999999999 119.5000000000001 131.0999999999999 118.9000000000001 110.3999999999999C97.1000000000001 139.5 113.0000000000001 176.6999999999999 121.5000000000001 192.7999999999999C131.0000000000001 210.3999999999999 132.5000000000001 215.2999999999999 130.2000000000001 213.5999999999999C121.6000000000001 199.5999999999999 108.2000000000001 177.3 103.0000000000001 154.3999999999999C100.3000000000001 142.5 99.8000000000001 130.3999999999999 103.3000000000001 119.1999999999999C106.8000000000001 107.9999999999999 114.4000000000001 97.6999999999999 127.9000000000001 89.3C127.9000000000001 89.3 152.7000000000001 74.9999999999999 166.2000000000001 56.8C173.6000000000001 46.8 175.9000000000001 38.1 173.6000000000001 31.9C171.1000000000001 25.2 164.0000000000001 23 156.9000000000001 23C161.7000000000001 17 167.2000000000001 10 171.3000000000001 3.4C208.9000000000001 -22.3 253.5000000000001 -12.3 285.6000000000002 10.6zM415 39.5C405 50.8 407.8 72.6 397.9 81.1C391 87.1 384.3 86.5 375.3 86.2000000000001C367.6 77.4 349.5 66.6 336.9 69.9C325.4 72.8 318.9 86.2000000000001 318.1 99.4C317.8 99.2000000000001 317.4 99.1 317.1 98.9C310 95.0000000000001 306 88.1 303.4 77.8C300.9 67.6 300 54.3 299.2 39.1C298.5 27.3 293 12.7 289.3 -1.5C285.8 -14.7 283.5 -26.7 288.2 -37.8C295.4 -52.3 307.7 -58.2 321.9 -57.1C336.1 -56 352.3 -47.3 365.5 -31.6C387.5 -5 427.8 -1.9 428.7 14.9C429 20 425.6 27.9 415 39.5zM173.3 299.3C175.3 297.4 178 294.8 181.3 292.2000000000001C187.9 287 197.1 281.6 208.6 281.6C220.2 281.6 231.1 287.5 240.4000000000001 292.4000000000001C245.3000000000001 295 251.3000000000001 299.4000000000001 255.2000000000001 302.8000000000001C259.1 306.2000000000001 261.1 309.1 258.3000000000001 309.4000000000001C255.5000000000001 309.7000000000001 255.7000000000001 306.8000000000001 252.3000000000001 304.3000000000001C247.9000000000001 301.1 242.6000000000001 296.9000000000001 238.4000000000001 294.5C231.0000000000001 290.3000000000001 218.9000000000001 284.3000000000001 208.5000000000001 284.3000000000001C198.1000000000001 284.3000000000001 189.8000000000001 289.1 183.6000000000001 294C180.5000000000001 296.5 177.9000000000001 299 175.9000000000001 300.9000000000001C174.4000000000001 302.3000000000001 174.0000000000001 305.5 171.6000000000001 305.8000000000001C170.2000000000001 305.9000000000001 169.8000000000001 302.1 173.3000000000001 299.3000000000001z" />
+    <glyph glyph-name="lyft"
+      unicode="&#xF3C3;"
+      horiz-adv-x="512" d=" M0 366.9H77.8V158.2000000000001C77.8 125.1 92.8 105.4 105 97.2000000000001C92.3 86.1 53.8 76.3000000000001 24.8 100.0000000000001C7.8 114 0 137.3 0 159V366.9zM485.9 193.4V215.4H509.7V292.2H483.6C473.4999999999999 338.5 432.4 372.9 383.3 372.9C326.7 372.9 280.6 326.9 280.6 270.2V91C296.6 88.7 316 91.3 332.3 105C349.4 119 357.1 142.2 357.1 164V170.7H395.9V247.5H357.1V270.8C357.1 305.4 409.3 305.4 409.3 270.8V193.7C409.3 137.1 455.3 91 511.9999999999999 91V167.5C497.4999999999999 167.5 485.8999999999999 179.2 485.8999999999999 193.4zM191.6 292.4V179.4C191.6 164 167.8 164 167.8 179.4V292.4H91V159.7C91 135.9 99 105.7 136 95.8C173 86 194.2 106.4 194.2 106.4C192.1 93.0000000000001 179.7 83.1 159.3 81.1C143.8 79.5 124.1 84.7000000000001 114.3 88.9V18.6C139.4 11.1 165.8 8.8 191.9 13.9C239 23.0000000000001 268.7 62.3 268.7 114.7000000000001V292.9H191.6V292.4z" />
+    <glyph glyph-name="magento"
+      unicode="&#xF3C4;"
+      horiz-adv-x="448" d=" M445.7 320.1V64L382.3 27.5V283.3L223.8 374.9L65.2 283.3L65.6 27.4L2.3 64V319.9L224.2 448L445.7 320.1zM255.6 27.5L224 9.1L192.2 27.3V283.3L128.9 246.7L129 -9.2L223.9 -64.1L319 -9.2V246.8L255.6 283.4V27.4999999999999z" />
+    <glyph glyph-name="maxcdn"
+      unicode="&#xF136;"
+      horiz-adv-x="512" d=" M461.1 5.3H363.7000000000001L415.6 248C417.9000000000001 258.2 416.5 267.5 411.2000000000001 273.7C406.2000000000001 279.8 397.5000000000001 283.3 387.0000000000001 283.3H337.7000000000001L278.2000000000001 5.3H180.8000000000001L240.3000000000001 283.3H156.9L97.4 5.3H0L59.5 283.3L14.9 378.7H387C426.4 378.7 462.3 362.4 485.3 333.8C508.6 305.2 517.1 266.4 508.9 227.9L461.1 5.3z" />
+    <glyph glyph-name="medapps"
+      unicode="&#xF3C6;"
+      horiz-adv-x="320" d=" M118.3 209.6C121.8 222.1 125.2 243.2 131.5 243.2C139.8 241.4 141.1 219.8 150.1 206.6C154.7 230.1 155.4 291.7 164.2 293.3C173.2 294 183.9 226.8 186.2 215.8C196.1 211.7 235.1 209.2 235.1 209.2C237 201.9 211.1 201.6 195.1 201.4C190.5 186.6 189.7 173.7 183.7 173.4C179 173.2 175.5 202.2 166.2 223L156.8 157.5C152.4 144.5 141.3 180 134.9 196.8C131.6 196.9 72.5 198.4 87.3 204.6L118.3 209.6zM228 0C249.2 0 249.2 32 228 32H92C70.8 32 70.8 0 92 0H228zM204 -64C225.2 -64 225.2 -32 204 -32H116C94.8 -32 94.8 -64 116 -64H204zM238.2 77.5C241.4 96.4 243.4 113.9 250.1 126.3C258 141 266.2 154.4 274.1 167.3C298.7000000000001 207.7 320 242.5 320 292.8C320 378.4 248.2 448 160 448S0 378.4 0 292.8C0 242.6 21.3 207.7 45.9 167.3C53.8 154.4 61.9 141 69.9 126.3C76.6 113.8 78.6 96.5 81.8 77.4C85.3 56.4 117.9 61.7000000000001 114.4 82.5000000000001C110.8 104.2000000000001 108.8 123.2000000000001 99.1 141.1000000000001C66.5 201.5 33 236.7 33 292.8C33 360.7 90 416 160 416S287 360.7 287 292.8C287 236.7 253.5 201.5 220.9 141.2000000000001C211.2 123.2000000000001 209.2 103.8000000000001 205.6 82.6C202.2 62 234.6 56.2 238.2 77.5z" />
+    <glyph glyph-name="medium-m"
+      unicode="&#xF3C7;"
+      horiz-adv-x="512" d=" M71.5 305.7C72.1 311.6 69.8 317.5 65.4 321.5L20.3 375.9V384H160.5L268.9 146.3L364.2 384H497.9V375.9L459.3 338.9C455.9999999999999 336.4 454.3 332.2 454.9999999999999 328.1V56.1C454.3 52 455.9999999999999 47.8 459.3 45.3L496.9999999999999 8.3V0.2H307.3V8.3L346.4000000000001 46.2C350.2000000000001 50 350.2000000000001 51.2 350.2000000000001 57V276.8L241.5 0.9H226.8L100.4 276.8V91.9C99.3 84.1 101.9 76.3 107.4 70.7L158.2 9.1V0.9999999999999H14.2V8.9999999999999L65 70.7C70.4 76.3 72.9 84.2 71.5 91.9V305.7z" />
+    <glyph glyph-name="medium"
+      unicode="&#xF23A;"
+      horiz-adv-x="448" d=" M0 416V-32H448V416H0zM372.2 309.9L348.2 286.9C346.1 285.3 345.1 282.7000000000001 345.5 280.2000000000001V110.9C345.1 108.3 346.1 105.7 348.2 104.2L371.7 81.2V76.1H253.7V81L278 104.6C280.4 107 280.4 107.7000000000001 280.4 111.3V248.2L212.8 76.6H203.7L125 248.2V133.2C124.3 128.4 126 123.5 129.4 120L161 81.7V76.6H71.2V81.7L102.8 120C106.2 123.5 107.7 128.4 106.9 133.2V266.2C107.3 269.9 105.9 273.5 103.1 276L75 309.9V315H162.3L229.7 167L289 314.9H372.2V309.9z" />
+    <glyph glyph-name="medrt"
+      unicode="&#xF3C8;"
+      horiz-adv-x="544" d=" M113.7 192C113.7 70.2 197.6 -30.8 307.2 -49.1C288.5 -53.6 269 -56 249 -56C111.4 -56 0 55 0 192S111.4 440 248.9 440C269 440 288.5 437.6 307.1 433.1C197.5 414.8 113.7 313.8 113.7 192M411.1 91.7C333.4 36.3 231.5 44.2 170.7 106.3C176.2 92.2 183.4 78.6 192.4 65.8C254 -22.4 374.8 -43.5 462.0999999999999 18.8C549.3999999999999 81.1 570.1999999999999 203.1 508.5999999999999 291.4000000000001C499.5999999999999 304.3000000000001 489.2999999999999 315.7000000000001 478.0999999999999 325.6C515.4999999999999 246.8000000000001 488.7999999999999 147.1 411.0999999999999 91.7000000000001M192.2999999999999 335.7000000000001C190.8999999999999 334.7000000000001 189.5999999999999 333.6 188.2999999999999 332.6C252.5999999999999 350.4000000000001 324.2 328.6 367.2 272.1C402.8999999999999 225.1000000000001 410.0999999999999 165.5000000000001 391.5999999999999 114.1C448.2999999999999 170.3 459.1999999999999 256.2000000000001 413.8999999999999 315.9000000000001C363.8999999999999 381.4000000000001 264.8 390.3000000000001 192.2999999999999 335.7000000000001M296 224C291.6 224 288 227.6 288 232V272C288 276.4 284.4 280 280 280H232C227.6 280 224 276.4 224 272V232C224 227.6 220.4 224 216 224H176C171.6 224 168 220.4 168 216V168C168 163.6 171.6 160 176 160H216C220.4 160 224 156.4 224 152V112C224 107.6 227.6 104 232 104H280C284.4 104 288 107.6 288 112V152C288 156.4 291.6 160 296 160H336C340.4 160 344 163.6 344 168V216C344 220.4 340.4 224 336 224H296z" />
+    <glyph glyph-name="meetup"
+      unicode="&#xF2E0;"
+      horiz-adv-x="512" d=" M99 33.7C100.1 28 96.7 22.6 91 21.4C85.6 20.3 80.1 23.7 79 29.4C77.9 34.8 81.3 40.5 86.7 41.7C92.1 42.9 97.8 39.4 99 33.7zM242.1 -37.7C235.8 -42.3000000000001 234.1 -51.1 238.4 -57.7C243 -64.3000000000001 251.8 -66 258.4 -61.4C264.7 -56.8 266.4 -48.0000000000001 261.8 -41.4C257.6 -34.9 248.7 -33.1 242.1 -37.7zM156.1 424.6C162.4 426 166.4 432.3 165 438.6C163.9 445.2 157.6 449.2 151.3 447.7C145 446.3 141 440 142.2 433.7C143.6 427.1 149.8 423.1 156.1 424.6zM34.4 221.7C24.4 228.6 10.7 226 3.8 215.7C-3.1 205.7 -0.5 191.7 9.5 184.8C19.5 177.7 33.2 180.2 40.1 190.5C47 200.9 44.4 214.6 34.4 221.7zM306.4 392.6C317 398.9 320.1 412.6 314.1 422.9C307.8 433.5 294.4 436.9 284.1 430.6S270.4 410.6 276.7 400C282.7 389.7 296.1 386.3 306.4 392.6zM115.3 334.6C123 340 124.7 350.6 119.6 358.3S103.9 367.7 96.5 362.6C88.8 357.2 87.1 346.6 92.2 338.9C97.3 331.1 107.8 329.4 115.3 334.6zM487.6 178.6C480.2 176.9 475.3 169.5 477 161.7000000000001C478.4 154.3000000000001 485.9 149.4 493.3 151.1C500.7 152.5 505.6 160 503.9 167.7000000000001C502.4 175.1 495.0000000000001 180.0000000000001 487.6 178.6zM527.3000000000001 235.4000000000001C526.2 241.1 520.7 244.5000000000001 515.3000000000001 243.4000000000001C509.6000000000001 242.3000000000001 506.2 236.5000000000001 507.3000000000001 230.8000000000001C508.4000000000001 225.4000000000001 513.9000000000001 221.7000000000001 519.6 222.8000000000001C525 224.3000000000001 528.7 229.7000000000001 527.3000000000001 235.4000000000001zM447 309.1C438.4 303.1 436.4 291.4 442.1 282.8C447.8 274.2 459.5 272.2 468.1 277.9C476.4 283.9 478.4 295.6 472.7 304.2C467.0000000000001 312.9 455.3000000000001 315.1 447.0000000000001 309.1zM440.7 169.7C467 126.6 455.8 69.7 414.4 40.6C397 28.3 377.3 22.9 357.5 23.5C345.5 -23.6 288.1 -41.1 252.4 -9.1C251.3 -10 249.8 -10.8 248.7 -12C209.6 -39.1 156.4 -29.4 129.3 10.3C119.6 24.6 114.7 40.9 114.2 57.2C48.8 68.1 24.2 151.2 73.1 196.9C44.8 243.8 73.7 304.3 126.5 311.8C151.6 378 234.1 409.4 290.1 366C357.5 388.3 426.4000000000001 336.6 421 264.9C462.1 252.3 473.8 198 440.7 169.7zM370.7 95.4C367.6 116 329.8 100 327.6 122.5C324.5 154.5 371.3 223.6 367.6 250.5C364.2 274.5 348.2 279.6 334.2 279.9C320.8 280.2000000000001 317.3 277.9 312.8 275.3C309.9000000000001 273.6 306.2 270.4 301.1 275.6C294.8 281.6 290 287.3 281.7000000000001 288.5C269.4000000000001 290.5 264.0000000000001 286.5 255.1000000000001 278.8000000000001C251.7000000000001 275.9000000000001 243.1000000000001 265.9000000000001 235.1000000000001 269.7000000000001C231.7000000000001 271.4000000000001 219.7000000000001 277.4000000000001 211.1000000000001 281.1C194.8000000000001 288.2000000000001 171.1000000000001 276.5000000000001 162.5000000000001 261.1C149.6000000000001 238.2000000000001 124.5000000000001 148.0000000000001 120.8000000000001 136.0000000000001C112.2000000000001 109.4 131.7000000000001 87.4 157.7000000000001 88.9C168.8000000000001 89.5000000000001 176.0000000000001 93.5000000000001 183.1000000000001 106.3C187.1000000000001 113.7 224.8000000000001 214 227.7000000000001 218.9C229.7000000000001 222.3 236.6000000000001 226.9 242.3000000000001 224C248.0000000000001 220.9 249.2000000000001 214.6 248.3000000000001 208.9C247.2000000000001 199.2 220.3000000000001 138 219.4 131.2C216 108.3 246.3000000000001 104.6 258.0000000000001 127.2C261.7000000000001 134.3 303.7000000000001 219.8 307.4000000000001 225.5C311.7000000000001 231.8 314.8 233.8 319.1 233.5C322.2000000000001 233.5 327.4000000000001 232.6 326.2000000000001 222.6C324.8000000000001 213.2 291.1 150.3 287.3000000000001 134.9C282.7000000000001 114.3 293.9000000000001 93.5 312.2000000000001 84.3C323.6 78.6 374.7000000000001 68.6 370.7000000000001 95.4zM376.4 3.1C366.1 -4.3 363.5 -18.9 370.7 -29.5000000000001C377.8 -40.1000000000001 392.1 -42.6000000000001 402.7 -35.5000000000001C413.3 -28.1000000000001 415.8 -13.5000000000001 408.7 -2.9C401.3 7.7 387 10.6 376.4 3.1z" />
+    <glyph glyph-name="microsoft"
+      unicode="&#xF3CA;"
+      horiz-adv-x="448" d=" M0 416H214.6V201.4H0V416zM233.4 416H448V201.4H233.4V416zM0 182.6H214.6V-32H0V182.6zM233.4 182.6H448V-32H233.4V182.6z" />
+    <glyph glyph-name="mix"
+      unicode="&#xF3CB;"
+      horiz-adv-x="448" d=" M0 384V35.1C0 -21.1 88 -23 88 35.1V273.7C95.9 326.6 176 324.1 176 267.2V91.9C176 34 272 33.9 272 91.9V208C277.3 262.7 360 260.5 360 203.7V179.9C360 120 448 123.3 448 179.9V384H0z" />
+    <glyph glyph-name="mixcloud"
+      unicode="&#xF289;"
+      horiz-adv-x="640" d=" M424.43 228.271C416.124 313.273 344.135 380 256.919 380C184.653 380 120.695 333.4840000000001 97.714 265.926C43.169 257.897 1.084 211.104 1.084 154.344C1.084 92.046 51.752 41.378 114.327 41.378H403.9409999999999C456.2699999999999 41.378 498.9099999999999 83.74 498.9099999999999 136.071C498.9099999999999 181.202 466.7919999999999 219.134 424.4299999999999 228.271zM403.9410000000001 83.741H114.327C75.287 83.741 43.446 115.305 43.446 154.345S75.287 224.949 114.327 224.949C133.154 224.949 150.875 217.474 164.165 204.183C184.128 184.22 214.298 214.41 194.345 234.363C179.67 248.761 161.673 258.728 142.292 263.712C162.227 308.012 207.082 337.638 256.92 337.638C326.416 337.638 382.899 281.155 382.899 211.936C382.899 198.368 380.6840000000001 185.079 376.53 172.342C367.587 144.825 408.663 133.403 416.677 159.052C419.446 167.358 421.661 175.941 423.046 184.524C442.4269999999999 177.048 456.5479999999999 158.221 456.5479999999999 136.0709999999999C456.5479999999999 107.2759999999999 433.0129999999999 83.7409999999999 403.9409999999999 83.7409999999999zM639.01 136.071C639.01 92.047 626.273 49.6849999999999 601.908 13.414C597.755 7.322 591.11 4 584.188 4C567.871 4 557.061 22.826 566.745 36.949C586.126 66.298 596.648 100.631 596.648 136.071S586.1270000000001 205.844 566.745 234.9160000000001C551.09 257.747 586.106 282.1560000000001 601.908 258.4500000000001C626.274 222.457 639.01 180.0940000000001 639.01 136.071zM568.13 136.071C568.13 104.506 558.9929999999999 74.05 541.273 47.746C537.12 41.655 530.475 38.61 523.553 38.61C506.352 38.61 496.531 57.5889999999999 506.11 71.5579999999999C519.123 90.6619999999999 525.768 112.8129999999999 525.768 136.0709999999999C525.768 159.0519999999999 519.123 181.4789999999999 506.11 200.5829999999999C490.349 223.5689999999999 525.118 247.6779999999999 541.273 224.1179999999999C558.9920000000001 198.0919999999999 568.13 167.6349999999999 568.13 136.0709999999999z" />
+    <glyph glyph-name="mizuni"
+      unicode="&#xF3CC;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 328.9 0 192C0 55 111 -56 248 -56S496 55 496 192C496 328.9 385 440 248 440zM168 88.1C136.6 77.5 109.2 60.8 88 39.9V312C88 334.1 105.9 352 128 352S168 334.1 168 312V88.1zM288 98C275.1 100 261.8 101.1 248.2 101.1C234.4 101.1 221 100 208 98V312C208 334.1 225.9 352 248 352S288 334.1 288 312V98zM408 40.3C386.8 61.1 359.4 77.7 328 88.3V312C328 334.1 345.9 352 368 352S408 334.1 408 312V40.3z" />
+    <glyph glyph-name="modx"
+      unicode="&#xF285;"
+      horiz-adv-x="448" d=" M356 206.2L392.7 182.5V-32L259.7 51.8L356 206.2zM440 373H226.3L203.3 335.2L356.8 238.7L440 373zM351 230.2L55.2 416V201.5L101.2 172.5L351 230.2zM97 153.8L8 11H221.7L346.7 211.5L97 153.8z" />
+    <glyph glyph-name="monero"
+      unicode="&#xF3D0;"
+      horiz-adv-x="496" d=" M352 64H460.4C417 -7.9 338.1 -56 248 -56S79 -7.9 35.6 64H144V191.8L248 87L352 192V64zM88 112V320L247.4 160.6L408 320V112H482.8C491.3 137.1 496 164 496 192C496 329 385 440 248 440S0 329 0 192C0 164 4.6 137.1 13.2 112H88z" />
+    <glyph glyph-name="napster"
+      unicode="&#xF3D2;"
+      horiz-adv-x="496" d=" M298.3 74.4C284.1 60.8 267 50.3 247.9 43.9C228.9 50.3 211.7 60.8 197.6 74.4H298.3zM342.3 274C362.3 290.9 385.9000000000001 303.2 411.9 310.2V149C411.9 -70.4 83.9 -68.6 83.9 148.7V310.3C109.8 303.4 133.5 290.7000000000001 153.4 273.9C210.2 313.9 285.9 313.8 342.3 274zM133.5 332.5C197.9 392.5 297.8 392.6 362.4 332.7C355.3 329.2 348.5 325.4 341.8 321.2C283.1 351.7 212.6 351.6 153.9 321.1C147.5999999999999 325.1 140 329.3 133.5 332.5zM43.8 354.8V285.5C-14.6 249 -14.6 164.4 43.9 127.2C70.3 -117.9 425.6 -113.1 451.5 125.7L451.8 127.4C510.5 163.7 510.7 249.1 452 285.6V354.8C434.7 354.3 418 351.8 401.9 347.4C319.9 438.9 176.4 438.9 94.4 347.3C78.1 351.7 61.3 354.3 43.8 354.8zM259.2 96S295.2 96.3 320.5 97.5C330.7 98 341.6 101.5 346 104C372.3 119.1 371.4 143.2 372.2 151.4C292.7 152 272.3 155.3 259.2 96zM123.7 151.3C124.5 143.1 123.6 119 149.9 103.9C154.3 101.4 165.1 97.9 175.4 97.4C200.7 96.3 236.7 95.9 236.7 95.9C223.5 155.3 203 152.0000000000001 123.7 151.3zM292.8 27.9C289.6 33.2 285.9 35.2 285.9 35.2C261.1 27.9 233.7 28.3 210 35.2C210 35.2 207.1 33.7 203.6 28.6C200.8 24.4999999999999 199.9 18.9999999999999 199.9 18.9999999999999C229 1.3999999999999 267 1.3999999999999 296.1 18.9999999999999C296 19.1 295.8 22.9999999999999 292.8 27.8999999999999z" />
+    <glyph glyph-name="nintendo-switch"
+      unicode="&#xF418;"
+      horiz-adv-x="448" d=" M95.9 414.5C51.3 406.5 15.4 373.5 4.1 330.1C0 314.4 -0.3 305.2 0.2 183.6C0.4 72 0.5 69.4 2.4 60.7C12.7 14.2 45.7 -18.9 92.7 -29.8C98.8 -31.2 106.6 -31.5 156.8 -31.7C208.7 -32.1 214.1 -32 215.5 -30.6C216.9 -29.2 217 -11.3 217 191.6C217 342.1 216.7 412.9000000000001 216.1 414.2000000000001C215.2 415.9000000000001 213.6 416 159.2 415.9000000000001C115 415.8 101.7 415.5 95.9 414.5zM179.8 191.9V4L142 4.5C107.2 4.9 103.5 5.1 96.5 6.8C66.6 14.5 44.5 37.5 38.2 67.5C36.2 76.9 36.2 307.6 38.1 316.8C43.7 342.9 61.8 364.5 86.1 374.2000000000001C98.3 379.1 104 379.7000000000001 143.7 379.8L179.6 379.9V191.9zM103.9 323.1C98.1 322 89.2 317.5 84.4 313.4C74.7 305 69.8 293 70.6 278.9C71 271.6 71.4 269.6 74.4 263.7C78.8 254.7 85.3 248.1 94.3 243.7C100.5 240.6 102.1 240.3 110.2 240C117.5 239.7 120.1 240 125 241.7C145.1 248.5 157.3 268 153.8 288.1C149.9 311.8 127.2 327.8 103.9 323.1zM262.1 415.4C261.7000000000001 415.1 261.5 314.6 261.5 191.9C261.5 -10.4 261.6 -30.9 263 -31.5C265.5 -32.4 337.5 -32.1 346.4 -31.1C384.1 -26.8 417.4 -3.9 435.4 30.1C437.7 34.4999999999999 440.8 41.8 442.4 46.3C448.2 63.6999999999999 448.1 59.1 448.1 192.4C448.1 298.8 447.9 314.7 446.6 321.4C437.4 369.7 400.5 406.2 352.1 414.5C345.6 415.6 335.6 415.8999999999999 303.3 415.8999999999999C280.9 416 262.4 415.7 262.1 415.3999999999999zM361.2000000000001 213.3C375.7000000000001 209.5 387.5000000000001 198.5 392.4000000000001 184.4C395.5000000000001 175.7 395.4000000000001 162.9 392.3 154.9C386.6 140.2 375.5 129.9 361.2 126.1C338 120.1 313.3 134.1 306.6 157.1C304.6 164.1 304.7 176 307 183.3C313.8999999999999 206 338 219.4 361.2 213.3z" />
+    <glyph glyph-name="node-js"
+      unicode="&#xF3D3;"
+      horiz-adv-x="448" d=" M224 -60C217.3 -60 210.5 -58.2 204.6 -54.8L142.9 -18.3C133.7 -13.1 138.2 -11.3 141.2 -10.3C153.5 -6 156 -5.1 169.1 2.4C170.5 3.2 172.3 2.9 173.7 2L221.1 -26.1C222.8 -27.1 225.2 -27.1 226.8 -26.1L411.5 80.5C413.2 81.5 414.3 83.5 414.3 85.5V298.7C414.3 300.8 413.2 302.7 411.4000000000001 303.8L226.8 410.3C225.1 411.3 222.8 411.3 221.1 410.3L36.6 303.7C34.8 302.7 33.7 300.7 33.7 298.6V85.5C33.7 83.5 34.8 81.5 36.6 80.6L87.2 51.4C114.7 37.7 131.5 53.8 131.5 70.1V280.5C131.5 283.5 133.9 285.8 136.9 285.8H160.3C163.2 285.8 165.7 283.5 165.7 280.5V70C165.7 33.4 145.7 12.4 111 12.4C100.3 12.4 91.9 12.4 68.5 24L20.1 51.9C8.1 58.8 0.7 71.7 0.7 85.6V298.7C0.7 312.5 8.1 325.5 20.1 332.4L204.6 439C216.3 445.6 231.8 445.6 243.4 439L428.1 332.3C440.1 325.4 447.5 312.5 447.5 298.6V85.5C447.5 71.7 440.1 58.8 428.1 51.8L243.4 -54.8C237.5 -58.2 230.8 -60 224 -60zM373.1 150.1C373.1 190 346.1 200.6 289.4000000000001 208.1C232.0000000000001 215.7 226.2000000000001 219.6 226.2000000000001 233.0000000000001C226.2000000000001 244.1 231.1000000000001 258.9000000000001 273.6 258.9000000000001C311.5 258.9000000000001 325.5 250.7000000000001 331.3 225.1C331.8 222.7 334 220.9 336.5 220.9H360.5C362 220.9 363.4 221.5 364.4 222.6S365.9 225.2 365.8 226.7C362.1 270.8 332.8 291.3 273.6 291.3C220.9 291.3 189.5 269.1 189.5 231.8C189.5 191.4 220.8 180.2 271.3 175.2C331.8 169.3 336.5 160.4 336.5 148.5C336.5 127.9 319.8999999999999 119.1 281 119.1C232.1 119.1 221.4 131.4 217.8 155.7000000000001C217.4 158.3000000000001 215.2 160.2000000000001 212.5 160.2000000000001H188.5999999999999C185.5999999999999 160.2000000000001 183.2999999999999 157.8000000000001 183.2999999999999 154.9C183.2999999999999 123.8 200.1999999999999 86.7000000000001 281.0999999999999 86.7000000000001C339.4999999999999 86.8000000000001 373.0999999999999 109.9 373.0999999999999 150.1z" />
+    <glyph glyph-name="node"
+      unicode="&#xF419;"
+      horiz-adv-x="640" d=" M316.3 -4C314.2 -4 312.1 -3.4 310.2 -2.4L291 9C288.1 10.6 289.5 11.2 290.5 11.5C294.3 12.8 295.1 13.1 299.2 15.5C299.6 15.7 300.2 15.6 300.6 15.4L315.4 6.6C315.9 6.3 316.7 6.3 317.2 6.6L375 40C375.5 40.3 375.9 40.9 375.9 41.6V108.3C375.9 109 375.6 109.6 375 109.9L317.2 143.2000000000001C316.7 143.5000000000001 316 143.5000000000001 315.4 143.2000000000001L257.6 109.9C257 109.6 256.7 108.9 256.7 108.3V41.6C256.7 41 257.1 40.4 257.6 40.1L273.4 31C282 26.7 287.3 31.8 287.3 36.8V102.7000000000001C287.3 103.6 288 104.4 289 104.4H296.3C297.2 104.4 298 103.7000000000001 298 102.7000000000001V36.8000000000001C298 25.3000000000001 291.8 18.8000000000001 280.8999999999999 18.8000000000001C277.5999999999999 18.8000000000001 274.8999999999999 18.8000000000001 267.5999999999999 22.4000000000001L252.3999999999999 31.1000000000001C248.7 33.3000000000001 246.3 37.3000000000001 246.3 41.6000000000001V108.3000000000001C246.3 112.6000000000001 248.6 116.7000000000001 252.3999999999999 118.8000000000001L310.2 152.2000000000001C313.8999999999999 154.3000000000001 318.7 154.3000000000001 322.3 152.2000000000001L380.1 118.8000000000001C383.8 116.6000000000001 386.2 112.6000000000001 386.2 108.3000000000001V41.6000000000001C386.2 37.3000000000001 383.9 33.2000000000001 380.1 31.1000000000001L322.3 -2.2999999999999C320.6 -3.3999999999999 318.5 -3.9999999999999 316.3 -3.9999999999999zM363 61.8C363 74.3 354.6 77.6 336.8 80C318.8 82.4 317 83.6 317 87.8C317 91.3 318.5 95.9 331.8 95.9C343.7 95.9 348.1 93.3 349.9000000000001 85.3C350.1 84.5 350.7000000000001 84 351.5000000000001 84H359.0000000000001C359.5000000000001 84 359.9000000000001 84.2 360.2000000000001 84.5C360.5000000000001 84.9 360.7000000000001 85.3 360.6 85.8C359.4000000000001 99.6 350.3 106 331.8 106C315.3 106 305.5 99 305.5 87.4C305.5 74.7 315.3 71.3 331.1 69.7C350 67.8 351.5 65.1 351.5 61.4C351.5 54.9 346.3 52.2 334.1 52.2C318.8 52.2 315.4000000000001 56 314.3 63.6C314.2 64.4 313.5 64.9999999999999 312.6 64.9999999999999H305.1C304.2000000000001 64.9999999999999 303.4000000000001 64.3 303.4000000000001 63.3C303.4000000000001 53.6 308.7000000000001 41.9999999999999 334.0000000000001 41.9999999999999C352.5000000000001 41.9999999999999 363.0000000000001 49.1999999999999 363.0000000000001 61.8zM417.5 111.9C417.5 105.8 412.5 100.8 406.4 100.8S395.3 105.8 395.3 111.9C395.3 118.2000000000001 400.5 123.0000000000001 406.4 123.0000000000001C412.4 123.1000000000001 417.5 118.2000000000001 417.5 111.9zM415.7 111.9C415.7 117.1 411.5 121.2000000000001 406.3 121.2000000000001C401.2 121.2000000000001 397 117.1 397 111.9C397 106.7000000000001 401.2 102.5000000000001 406.3 102.5000000000001C411.5 102.6000000000001 415.7 106.8000000000001 415.7 111.9zM411.2 105.7000000000001H408.6C408.5 106.3000000000001 408.1 109.5000000000001 408.1 109.6C407.9 110.3 407.7 110.7000000000001 406.8 110.7000000000001H404.6V105.7000000000001H402.2V118.2000000000001H406.5C408 118.2000000000001 410.9 118.2000000000001 410.9 114.9C410.9 112.6 409.4 112.1 408.5 111.8C410.2 111.7 410.3 110.6 410.6 109C410.7000000000001 108 410.9000000000001 106.3 411.2000000000001 105.7zM408.4 114.5000000000001C408.4 116.2000000000001 407.2 116.2000000000001 406.6 116.2000000000001H404.6V112.7000000000001H406.5C408.1 112.7000000000001 408.3999999999999 113.8000000000001 408.3999999999999 114.5000000000001zM137.3 257C137.3 259.7 135.9 262.1 133.6 263.4L72.3 298.7C71.3 299.3 70.1 299.6 68.9 299.7H68.3C67.1 299.7 66 299.3 64.9 298.7L3.7 263.4C1.4 262.1 0 259.6 0 257L0.1 162C0.1 160.7 0.8 159.5 1.9 158.8C3 158.1 4.4 158.1 5.6 158.8L42 179.7C44.3 181.1 45.7 183.5 45.7 186.1V230.5C45.7 233.1 47.1 235.6 49.4 236.9L64.9 245.8C66.1 246.5 67.3 246.8 68.6 246.8C69.9 246.8 71.2 246.5 72.3 245.8L87.8 236.9C90.1 235.6 91.5 233.1 91.5 230.5V186.1C91.5 183.5 92.9 181 95.2 179.7L131.6 158.8C132.7 158.1 134.2 158.1 135.3 158.8C136.4 159.4 137.1 160.7 137.1 162L137.3 257zM472.5 360.7V184.3C472.5 181.7 471.1 179.2 468.8 177.9L407.5 142.5000000000001C405.2 141.2000000000001 402.4 141.2000000000001 400.1 142.5000000000001L338.8 177.9C336.5 179.2000000000001 335.1 181.7000000000001 335.1 184.3V255.1C335.1 257.7000000000001 336.5 260.2000000000001 338.8 261.5L400.1 296.9000000000001C402.4000000000001 298.2000000000001 405.2000000000001 298.2000000000001 407.5 296.9000000000001L422.8 288.1C424.5 287.1 426.7 288.4000000000001 426.7 290.3V384.3C426.7 387.1 429.7 388.9000000000001 432.2 387.5L468.7 367.1C471 365.9000000000001 472.5 363.4000000000001 472.5 360.7000000000001zM426.5 231.8C426.5 232.5 426.1 233.1 425.6 233.4L404.6 245.6C404 245.9 403.3 245.9 402.7000000000001 245.6L381.7000000000001 233.4C381.1 233.1 380.8000000000001 232.5 380.8000000000001 231.8V207.5C380.8000000000001 206.8 381.2000000000001 206.2 381.7000000000001 205.9L402.7000000000001 193.8C403.3000000000001 193.5 404.0000000000001 193.5 404.5000000000001 193.8L425.5000000000001 205.9C426.1000000000001 206.2 426.4000000000001 206.8 426.4000000000001 207.5V231.8zM636.3 232.5C638.5999999999999 233.8 640 236.3 640 238.9V256C640 258.6 638.6 261.1 636.3 262.4L575.4 297.8C573.1 299.1 570.3 299.1 568 297.8L506.7 262.4C504.4 261.1 503 258.6 503 256V185.2C503 182.5 504.4 180.1 506.7 178.8L567.6 144.1C569.8000000000001 142.8 572.6 142.8 574.9 144.1L611.6999999999999 164.6C614.1999999999999 166 614.1999999999999 169.6 611.6999999999999 171L550 206.4C548.8 207.1 548.1 208.3 548.1 209.6V231.8C548.1 233.1 548.8000000000001 234.3 550 235L569.2 246.1C570.3000000000001 246.8 571.8000000000001 246.8 572.9000000000001 246.1L592.1000000000001 235C593.2000000000002 234.3 594.0000000000001 233.1 594.0000000000001 231.8V214.4C594.0000000000001 211.6 597.1000000000001 209.8 599.6000000000001 211.2L636.3000000000002 232.5zM559 229C558.6 228.7 558.3 228.3 558.3 227.8V214.2C558.3 213.7 558.5999999999999 213.2 559 213L570.8 206.2C571.1999999999999 205.9 571.8 205.9 572.1999999999999 206.2L584 213C584.4 213.3 584.7 213.7 584.7 214.2V227.8C584.7 228.3 584.4000000000001 228.8 584 229L572.2 235.8C571.8000000000001 236.1 571.2 236.1 570.8000000000001 235.8L559 229zM304.8 185.5V255.9C304.8 258.5 303.2 261 300.9000000000001 262.3L239.8000000000001 297.5C237.7000000000001 298.7 234.8000000000001 298.9 232.4000000000001 297.5L171.3000000000001 262.3C169 261 167.4 258.6 167.4 255.9V185.5C167.4 182.7 169.3000000000001 180.3 171.4 179.1L232.6 143.9C235.0000000000001 142.5000000000001 237.8 142.6 240.0000000000001 143.9L301 179.1C302.8 180.1 304.1 181.8 304.6 183.8C304.7000000000001 184.3 304.8 184.9 304.8 185.5zM230.5 310.4L229.7 309.9H230.8L230.5 310.4zM306.7 180.2000000000001L306.3 180.9V180.0000000000001L306.7 180.2000000000001z" />
+    <glyph glyph-name="npm"
+      unicode="&#xF3D4;"
+      horiz-adv-x="576" d=" M288 160H256V224H288V160zM576 288V96H288V64H160V96H0V288H576zM160 256H32V128H96V224H128V128H160V256zM320 256H192V96H256V128H320V256zM544 256H352V128H416V224H448V128H480V224H512V128H544V256z" />
+    <glyph glyph-name="ns8"
+      unicode="&#xF3D5;"
+      horiz-adv-x="640" d=" M187.1 288.1L152.9 174.4L98.4 288.1H49L0 128H44.9L76 234.5L126.6 128H183.5L232 288.1H187.1zM639.6 289C636.7 307 615.7 317.1 597.5 320.3C552.9 328.1 495.6 304 509 261.5V261.4C465.2 252.7 434.7 234.6 414.8 213.2C411.8 223 401.2 229.8 380.8 229.8H293.2000000000001C283.9000000000001 229.8 280.3000000000001 232.1 281.7000000000001 237.2C283.3000000000001 242.7 283.6 244 285.4000000000001 249.4C287.5000000000001 255.8 293.2000000000001 256.5 298.7000000000001 256.5H432.2000000000001L441.9000000000001 288C302.2000000000001 288 297.4000000000001 288.5 281.8000000000001 286.8C269.5000000000001 285.5 258.3000000000001 282 251.2000000000001 271.8C244.4000000000001 261.9 236.8000000000001 236.2 233.6000000000001 224.7C228.2000000000001 205.3 233.0000000000001 196.1 266.4000000000001 196.1H353.7000000000001C361.5000000000001 196.1 362.5000000000001 193.4 361.4000000000001 189.5C360.3000000000001 185.1 358.6000000000001 179.5 356.9000000000001 174.9C355.3000000000001 170.7 352.2000000000001 167.5 343.1000000000001 167.5H216.3L204.7 128C344.6 128 350 128.6 365.6 130.3C372.2000000000001 131 378.6 132.4 384.1 135.2C384.3 131.5 384.6 127.9 385.3 124.4C390.7 93.9 412.7 72.1 442.1 64.9C490.7 53 550.8000000000001 81.7 577.2 132.9C595.9000000000001 169.1 591.3000000000001 209.1 573.8000000000001 238.4H573.9000000000001C603.5000000000001 244.3 644.2 260.4 639.6000000000001 289zM530.7 184.3C524.8000000000001 154.8 494.1 136.5 469.1 140.4C438.2000000000001 145.2000000000001 430.6 179.9 455 205.2000000000001C471.2 222.0000000000001 500.2 229.2000000000001 523.5 232.1000000000001C530.2 218.0000000000001 533.8 200.1000000000001 530.7 184.3000000000001zM552.5 267.4C548.3 273.4 542.7 285.9 550 293.7000000000001C556.7 300.9 570.9 303.8 581.8 301.4C597.0999999999999 298 601.5 285.5 586.6999999999999 277C575.9999999999999 270.9 563.0999999999999 268.9 552.4999999999999 267.4z" />
+    <glyph glyph-name="nutritionix"
+      unicode="&#xF3D6;"
+      horiz-adv-x="400" d=" M88 439.9S221.4 448.1 209 335.5C209 335.5 228.1 410.4 312 376.1C312 376.1 294.3 302.1 224 320.1C224 320.1 238.6 374.7 290.1 376.7C290.1 376.7 250.2 387 208 327.9C208 327.9 188.2 422.4 114.4 427.6C114.4 427.6 189.6 408.2 192 320.1C192 320 85.6 313.1 88 439.9zM400 124.3C400 75.8 390.3 28.9999999999999 368 -8.0000000000001C325.8 -38.9 263 -56.0000000000001 200 -56.0000000000001C137.1 -56.0000000000001 74.2 -38.9 32 -8.0000000000001C9.7 29 0 75.8 0 124.3C0 172.7 17.7 219 40 256C82.2 286.9 137.1 304.6 200 304.6C263 304.6 317.8 287 360 256C382.3 219 400 172.7 400 124.3zM120 20C120 35.5 107.5 48 92 48S64 35.5 64 20S76.5 -8 92 -8S120 4.5 120 20zM120 86.2C120 101.7 107.5 114.2 92 114.2S64 101.7 64 86.2S76.5 58.2 92 58.2S120 70.7 120 86.2zM120 152.4C120 167.9 107.5 180.4 92 180.4S64 167.9 64 152.4S76.5 124.4 92 124.4S120 136.9 120 152.4zM192 20C192 35.5 179.5 48 164 48S136 35.5 136 20S148.5 -8 164 -8S192 4.5 192 20zM192 86.2C192 101.7 179.5 114.2 164 114.2S136 101.7 136 86.2S148.5 58.2 164 58.2S192 70.7 192 86.2zM192 152.4C192 167.9 179.5 180.4 164 180.4S136 167.9 136 152.4S148.5 124.4 164 124.4S192 136.9 192 152.4zM264 20C264 35.5 251.5 48 236 48S208 35.5 208 20S220.5 -8 236 -8S264 4.5 264 20zM264 86.2C264 101.7 251.5 114.2 236 114.2S208 101.7 208 86.2S220.5 58.2 236 58.2S264 70.7 264 86.2zM264 152.4C264 167.9 251.5 180.4 236 180.4S208 167.9 208 152.4S220.5 124.4 236 124.4S264 136.9 264 152.4zM336 20C336 35.5 323.5 48 308 48S280 35.5 280 20S292.5 -8 308 -8S336 4.5 336 20zM336 86.2C336 101.7 323.5 114.2 308 114.2S280 101.7 280 86.2S292.5 58.2 308 58.2S336 70.7 336 86.2zM336 152.4C336 167.9 323.5 180.4 308 180.4S280 167.9 280 152.4S292.5 124.4 308 124.4S336 136.9 336 152.4zM360 192C355.2 214.3 352.6 228.9 344 248C305.2 267.9 253.5 280 200 280S94.8 267.9 56 248C47.2 228.5 44.8 214.1 40 192C82.2 199.9 138.7 206.8 200 206.8S317.8 199.9 360 192z" />
+    <glyph glyph-name="odnoklassniki-square"
+      unicode="&#xF264;"
+      horiz-adv-x="448" d=" M184.2 270.9C184.2 293 202.1 310.9 224 310.9S263.8 293 263.8 270.9C263.8 248.9 245.9 231.1 224 231.1S184.2 249.0000000000001 184.2 270.9000000000001zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM142.9 270.9C142.9 226.3 179.3 190 224 190S305.1 226.2 305.1 270.9C305.1 315.7 268.7 352 224 352S142.9 315.8 142.9 270.9zM317.4 180.2C312.8 189.3 300.1 197 283.3 183.8C283.3 183.8 260.6 165.8 224 165.8S164.6999999999999 183.8 164.6999999999999 183.8C147.8999999999999 197 135.1999999999999 189.3 130.5999999999999 180.2C122.6999999999999 164.1 131.6999999999999 156.5 152 143.2C169.3 132.1 193.1999999999999 128 208.5999999999999 126.4L195.6999999999999 113.5C177.5 95.5 160.1999999999999 78 148 65.8C130.4 48.2 158.6999999999999 20 176.4 37.2L224.1 85.1C242.3 66.9 259.8 49.4 271.8 37.2C289.4 20 317.8 47.9 300.4 65.8L252.7 113.5L239.7 126.4C255.2 128 278.8 132.3 295.9 143.2C316.3 156.5 325.2 164.2 317.4 180.2z" />
+    <glyph glyph-name="odnoklassniki"
+      unicode="&#xF263;"
+      horiz-adv-x="320" d=" M275.1 114C247.7 96.6 210 89.7 185.1 87.1L206 66.5L282.3 -9.8C310.2 -38.4 264.8 -83.1 236.6 -55.5C217.5 -36.1 189.5 -8.1 160.3 21.1L84 -55.4C55.8 -82.9 10.4 -37.8 38.6 -9.7C58 9.7 85.7 37.7 114.9 66.6L135.5 87.2000000000001C110.9 89.8000000000001 72.6 96.3000000000001 44.9 114.1C12.3 135.1 -2 147.4 10.6 173.1C18 187.7000000000001 38.3 200 65.2 178.8C65.2 178.8 101.5 149.9 160.1 149.9S255.0000000000001 178.8 255.0000000000001 178.8C281.9000000000001 199.9 302.1 187.7 309.6 173.1C322 147.4 307.7000000000001 135.1 275.1 114zM30.3 318.3C30.3 390 88.6 448 160 448S289.7 390 289.7 318.3C289.7 246.9 231.4 188.9 160 188.9S30.3 246.9 30.3 318.3zM96.3 318.3C96.3 283.2000000000001 124.9 254.6 160 254.6S223.7 283.2000000000001 223.7 318.3C223.7 353.7000000000001 195.1 382.3 160 382.3S96.3 353.7000000000001 96.3 318.3z" />
+    <glyph glyph-name="opencart"
+      unicode="&#xF23D;"
+      horiz-adv-x="640" d=" M423.3 7.3C423.3 -18 403 -38.3 377.7 -38.3S331.9 -18 331.9 7.3S352.5 53.1 377.7 53.1C403.1 53.1 423.3 32.6 423.3 7.3zM169.4 53.1C144.1 53.1 123.8 32.5 123.8 7.3S144.1 -38.3 169.4 -38.3S215.2 -18 215.2 7.3S194.7 53.1 169.4 53.1zM461.1 323.1C158.9 323.1 81.9 335.9 0 422.3C34.4 370.6 53.3 273.4 373.1 278.1C706.4000000000001 283.1 503.1 192 443.9000000000001 89.2000000000001C630.6 255.9000000000001 763.3 323.1 461.1 323.1z" />
+    <glyph glyph-name="openid"
+      unicode="&#xF19B;"
+      horiz-adv-x="448" d=" M271.5 16L203.5 -16C88.5 -5.7 0 55.5 0 129.8C0 201.3 82.5 260.8 191.7 274.1V231.1C120.2 218.6 67.7 178.1 67.7 129.8C67.7 78.8 126.2 36.5 203.4 26.8V366.8L271.4 400V16zM448 157L316.7 185.5L353.5 206.2C334 217.7 310 226.2 283.5 231V274C329.7 268.5 371.2 254.5 403.8 234.7L438.8 254.5L448 157z" />
+    <glyph glyph-name="opera"
+      unicode="&#xF26A;"
+      horiz-adv-x="496" d=" M313.9 415.3C143.7 415.3 61.3 191.5 166.4 60.2C202.9 14.8 255 -15.4 313.9 -15.4C350.2 -15.4 384.2 -4.3 413.3 15C369.5 -24.2 311.4 -48 248 -48C244.1 -48 240 -48 236.1 -47.7C104.6 -41.6 0 66.9 0 200C0 337 111 448 248 448H248.8C311.9000000000001 447.7 369.5 423.9 413.2000000000001 384.9C384.2000000000001 404.3 350.1 415.3 313.9000000000001 415.3zM415.7 17.6C374.8 -7.1 325 -6 283.7 23.4C339.9 43.9 381.4 115 381.4 200C381.4 284.7000000000001 340.2 355.8000000000001 284 376.6C325.8 405.8 375.2 406.9000000000001 416.9 381.6C522.8 282.9000000000001 522.4 115.9 415.7 17.6z" />
+    <glyph glyph-name="optin-monster"
+      unicode="&#xF23C;"
+      horiz-adv-x="576" d=" M550.671 -2.303C550.671 -13.923 534.998 -21.76 518.513 -17.166C506.353 -13.923 487.167 0.399 482.302 10.128C476.628 21.748 486.356 42.826 501.218 40.934C516.892 39.313 550.671 15.533 550.671 -2.3030000000001zM372.86 372.777C369.077 444.928 272.064 452.495 246.932 396.2870000000001C291.5200000000001 420.608 337.189 411.9600000000001 372.86 372.777zM74.795 40.934C59.122 39.313 25.343 15.533 25.343 -2.303C25.343 -13.923 41.016 -21.76 57.5 -17.166C69.66 -13.923 88.576 0.399 93.44 10.128C99.386 21.748 89.658 42.826 74.795 40.934zM572.56 26.612C573.641 23.099 574.452 19.586 574.452 15.803C575.262 -15.813 530.135 -48.242 500.949 -49.322C483.654 -50.132 466.359 -40.945 458.253 -25.812C344.7560000000001 -29.865 231.2590000000001 -30.676 118.033 -25.812C109.656 -40.945 92.361 -49.862 75.066 -49.322C46.151 -48.241 1.023 -15.813 1.563 15.803C1.833 19.586 2.374 23.099 3.455 26.612C-2.111 36.075 -1.39 41.894 8.86 38.232C12.103 43.366 15.886 47.6900000000001 19.94 52.014C17.37 62.931 21.21 66.108 31.019 61.202C35.613 64.445 41.017 67.687 46.963 70.39C46.963 86.147 58.802 81.521 64.258 76.065C76.725 77.845 84.387 75.356 91.011 70.39V90.116C78.024 90.116 50.37 101.491 45.071 126.328C40.097 147.053 47.678 164.403 70.203 173.888C71.013 179.833 78.31 187.94 85.065 189.832C92.632 191.724 97.496 185.238 99.117 179.563C106.542 179.563 116.874 178.098 120.195 171.456C125.6 171.997 131.274 172.808 136.679 173.348C134.2470000000001 175.24 131.545 176.861 128.572 177.942C123.438 186.859 114.79 189.021 103.981 189.562C103.981 190.372 103.981 191.183 104.251 192.264C84.524 192.805 60.203 197.939 49.394 210.099C28.073 233.737 33.459 293.6760000000001 61.554 313.5970000000001C69.931 319.2720000000001 83.172 314.408 84.253 303.8690000000001C86.678 283.271 84.652 277.0360000000001 110.465 277.927C118.572 285.7630000000001 127.22 292.519 136.948 297.9240000000001C122.086 299.2760000000001 108.034 296.303 93.17 294.1410000000001C105.922 306.6210000000001 117.123 319.5830000000001 149.918 336.5680000000001C173.429 348.4580000000001 199.911 357.3760000000001 226.123 359.807C207.477 367.6440000000001 186.13 371.6980000000001 166.402 376.2910000000001C242.877 392.5050000000001 340.971 398.4500000000001 410.691 338.7290000000001C428.796 323.326 443.118 302.5180000000001 453.3869999999999 278.7370000000001C493.1859999999999 273.884 489.857 284.3180000000001 492.03 303.8690000000001C493.111 314.1380000000001 506.352 319.2720000000001 514.7289999999999 313.3270000000001C529.5909999999999 302.7880000000001 536.8879999999999 282.5210000000001 539.319 265.2260000000001C541.481 247.3910000000001 539.5889999999999 223.8810000000001 526.889 210.0990000000001C516.08 197.9390000000001 492.569 192.5340000000001 473.113 191.994V189.2910000000001C462.033 189.0210000000001 452.845 186.859 447.44 177.6710000000001C444.468 176.59 441.766 174.9680000000001 439.063 173.0770000000001C444.738 172.537 450.413 171.7260000000001 455.818 171.186C457.687 176.8050000000001 468.353 179.5630000000001 476.895 179.5630000000001C478.516 184.968 483.651 191.453 490.947 189.8320000000001S504.999 179.8340000000001 505.81 173.888C516.619 169.564 527.969 161.728 530.941 148.216C532.8330000000001 140.109 532.562 133.083 531.211 126.328C525.485 101.066 497.85 90.116 485.272 90.116C485.272 83.36 485.272 76.8750000000001 485.002 70.39C493.012 76.3960000000001 501.369 77.5480000000001 511.754 76.0650000000001C517.673 81.984 529.3190000000001 85.4750000000001 529.3190000000001 70.39C534.994 67.6870000000001 540.6680000000001 64.4450000000001 545.263 61.2020000000001C555.363 66.253 558.932 61.741 556.072 52.0140000000001C560.125 47.6910000000001 564.179 43.0970000000001 567.151 38.2320000000001C577.2869999999999 41.8520000000001 578.1719999999999 36.1540000000001 572.56 26.6120000000001zM498.7869999999999 280.6280000000001C516.0819999999999 273.872 524.9989999999999 258.4690000000001 529.0519999999999 244.9580000000001C530.1329999999999 255.497 526.3499999999999 284.4110000000001 515.2699999999999 296.0310000000001C507.9739999999999 303.327 501.2179999999998 301.165 501.2179999999998 295.221C501.2189999999998 289.005 499.8679999999998 283.601 498.7869999999999 280.6280000000001zM480.1409999999999 268.198C493.1119999999999 252.525 497.1649999999999 226.583 492.8409999999999 205.235C503.6499999999999 207.397 513.3779999999999 211.45 519.0529999999999 217.395C520.9449999999999 219.557 522.8359999999999 222.259 523.9169999999999 224.961C522.8359999999999 246.3090000000001 513.6479999999999 267.658 494.1919999999999 273.8730000000001C490.9499999999999 270.63 485.0049999999999 269.009 480.1409999999999 268.198zM458.2519999999999 267.387C465.8189999999999 246.85 470.6829999999999 224.691 472.5739999999999 202.802C476.0869999999999 202.802 480.1409999999999 203.072 484.1939999999999 203.613C490.1389999999999 227.9340000000001 483.9239999999999 255.2270000000001 470.1419999999999 267.117C466.3589999999999 267.117 462.0349999999999 267.117 458.2519999999999 267.3870000000001zM77.768 280.628C76.687 283.601 75.336 289.005 75.336 295.221C75.336 301.166 68.31 303.328 61.284 296.031C49.934 284.411 46.421 255.497 47.502 244.958C51.555 258.47 60.473 273.873 77.768 280.628zM83.443 205.234C79.119 226.582 83.173 252.525 96.144 268.197C91.279 269.008 85.335 270.629 82.092 273.872C62.635 267.657 53.717 246.309 52.366 224.96C53.717 222.258 55.338 219.556 57.23 217.394C62.905 211.179 72.633 207.396 83.443 205.234zM124.788 266.307C119.654 265.226 114.79 263.334 109.926 261.442L97.766 256.308V256.578C90.47 242.526 87.767 222.259 92.361 203.613C96.955 203.072 101.008 202.802 105.061 202.802C107.493 224.961 114.249 246.58 124.788 266.307zM212.883 289.546C212.883 247.391 247.202 213.341 289.088 213.341S365.293 247.391 365.293 289.546C365.293 331.432 330.974 365.481 289.088 365.481S212.883 331.432 212.883 289.546zM365.293 192.263C375.262 141.655 368.592 127.571 381.777 134.164C397.721 142.271 404.476 173.347 404.747 191.183C391.776 191.993 378.534 191.993 365.293 192.263zM293.682 192.804V193.074C293.4120000000001 187.94 293.952 154.971 298.0060000000001 151.999C309.0850000000001 146.594 337.4590000000001 147.405 349.079 150.918C354.484 152.5389999999999 351.511 187.94 350.7 192.804C331.784 193.074 312.598 193.074 293.682 192.804zM279.629 192.804V193.074C260.173 192.804 240.987 192.804 221.8 192.263C219.908 183.076 217.206 143.352 223.692 140.649C236.663 134.974 265.308 135.515 278.278 139.028C282.8730000000001 141.46 280.711 184.427 279.629 192.804zM193.967 135.244C199.372 132.812 202.614 132.812 203.695 139.568C205.587 148.215 206.127 176.32 208.56 191.723C196.4 191.453 183.969 190.912 171.808 190.102C166.403 170.375 172.078 144.973 193.967 135.244zM128.301 146.324C172.079 99.304 220.99 60.661 284.2240000000001 39.8539999999999C351.7820000000001 59.0399999999999 399.8830000000001 99.8449999999999 447.4430000000001 146.8649999999999C436.348 151.1799999999999 439.7280000000001 157.2279999999999 440.1470000000001 158.4849999999999C431.2290000000001 159.2949999999999 422.3120000000001 160.3769999999999 413.6640000000001 161.1869999999999C404.206 128.2189999999999 377.7240000000001 108.2219999999999 366.9140000000001 129.5709999999999C364.2120000000001 134.7049999999999 363.4010000000001 141.1909999999999 362.3200000000001 146.3249999999999C358.5370000000001 137.9479999999999 349.0780000000001 138.218 337.7290000000001 137.4069999999999C324.4880000000001 136.3259999999999 306.112 136.0559999999999 293.6810000000001 140.3789999999999C290.7090000000001 127.4079999999999 282.6020000000001 127.4079999999999 266.9290000000001 126.0569999999999C252.8770000000001 124.7049999999999 218.287 122.0029999999999 212.072 136.8659999999999C210.9910000000001 108.2219999999999 176.942 126.868 166.9430000000001 143.892C163.7000000000001 149.567 161.5380000000001 155.242 159.917 161.4569999999999C152.0800000000001 160.6469999999999 144.244 159.836 136.406 158.755C138.8490000000001 155.0919999999999 137.9550000000001 149.7029999999999 128.3010000000001 146.324zM115.6 -5.545C109.926 17.694 96.954 44.177 82.092 48.501C59.663 55.257 13.183 24.991 15.885 -6.085C28.586 -25.542 55.879 -41.755 75.066 -42.566C92.901 -43.376 111.006 -31.486 114.79 -13.652C115.329 -11.22 115.6 -8.518 115.6 -5.5450000000001zM122.896 0.399C156.405 19.856 192.075 36.07 228.827 47.419C190.184 67.956 160.729 95.25 131.544 124.435C129.382 123.083 126.41 122.003 123.708 120.922C122.071 116.012 132.426 115.5920000000001 129.113 108.491C126.951 104.4370000000001 120.465 100.924 113.98 99.3030000000001C111.819 96.6010000000001 108.846 94.4390000000001 106.144 92.818H105.874C105.604 79.307 105.604 65.794 106.144 52.283C115.083 36.319 121.57 18.969 122.896 0.399zM443.6600000000001 -12.301C406.908 9.047 369.6160000000001 29.044 328.0010000000001 40.664C314.2190000000001 34.449 300.168 29.315 285.846 25.261C283.6840000000001 24.45 283.6840000000001 24.45 281.522 25.261C269.632 29.044 258.283 33.3679999999999 246.663 38.502C206.398 26.8819999999999 169.377 9.317 134.247 -12.301H133.977V-12.571C134.247 -12.571 134.247 -12.571 134.247 -12.301C237.474 -16.355 340.702 -15.814 443.66 -12.301zM470.683 51.744L470.4130000000001 51.474C470.9540000000001 65.256 471.224 79.037 471.224 92.8190000000001C468.251 94.4400000000001 465.549 96.8730000000001 463.1170000000001 99.5750000000001C456.6320000000001 100.9260000000001 450.1460000000001 104.7090000000001 447.9840000000001 108.4930000000001C446.0920000000001 112.5460000000001 449.3350000000001 116.059 453.9290000000001 118.7620000000001C453.6590000000001 119.3030000000001 453.3880000000001 120.3830000000001 453.3880000000001 121.1940000000001C450.4160000000001 122.0050000000001 447.9830000000001 123.0860000000001 445.8210000000001 124.4370000000001C414.2050000000001 94.9820000000001 380.4250000000001 67.6880000000001 342.3230000000001 47.6910000000001C381.2370000000001 36.0710000000001 418.2580000000001 19.5870000000001 454.1980000000001 0.1300000000001C455.2480000000001 14.8220000000001 461.4290000000001 35.8790000000001 470.6830000000001 51.7440000000001zM493.9230000000001 48.5C479.33 44.177 466.0890000000001 17.694 460.414 -5.546C460.414 -29.372 481.6920000000001 -43.443 500.948 -42.568C520.134 -41.757 547.428 -25.544 560.129 -6.087C563.102 24.99 516.6220000000001 55.257 493.923 48.5zM290.709 313.867C290.754 313.867 290.798 313.8640000000001 290.843 313.8640000000001C290.889 313.8640000000001 290.933 313.867 290.9790000000001 313.867H290.7090000000001zM290.709 217.124C319.354 217.124 342.593 238.742 342.593 265.495C342.593 301.587 302.086 323.574 270.442 309.813C279.9000000000001 306.841 286.926 298.193 286.926 288.195C286.926 264.938 253.635 256.24 240.446 276.8450000000001C233.149 242.778 259.814 217.124 290.709 217.124zM68.039 -26.083C68.579 -32.569 80.199 -38.784 89.657 -35.5410000000001C96.413 -32.8380000000001 104.25 -25.0020000000001 106.952 -19.3270000000001C109.925 -12.301 105.871 0.67 97.224 -0.9520000000001C88.307 -2.573 67.499 -17.7060000000001 68.039 -26.0830000000001zM478.789 -0.952C470.412 0.669 466.358 -12.301 469.331 -19.327C471.763 -25.002 479.6 -32.838 486.626 -35.541C495.813 -38.784 507.704 -32.569 507.974 -26.083C508.785 -17.706 487.707 -2.573 478.789 -0.952z" />
+    <glyph glyph-name="osi"
+      unicode="&#xF41A;"
+      horiz-adv-x="495.8" d=" M0 188.8C2.3 324.6 97.4 421.2 213.8 436.9C352.6 455.5 469.4 361.1 491.8 235.8C513.1 117 447.8 5.8 340.2000000000001 -38.2C330.9000000000001 -42 325.8000000000001 -39.9 322.2000000000001 -30.5C304.4000000000001 15.8 286.6 62.2 268.8000000000001 108.5C265.7000000000001 116.6 267.8000000000001 121.7 275.8000000000001 125.3C300.0000000000001 136.3 315.1000000000001 154.7 319.1000000000001 181.1C325.5000000000001 223.5 294.6000000000001 259.8 254.6000000000001 263.3C215.6000000000001 266.7000000000001 182.8000000000001 239.6 177.1000000000001 203.6C171.9000000000001 170.6 188.2000000000001 139.9 219.0000000000001 125.9C228.6000000000001 121.5000000000001 230.5000000000001 117.3 226.8000000000001 107.5000000000001C208.9000000000001 60.9 191.0000000000001 14.3000000000001 173.1000000000001 -32.4C170.5000000000001 -39.3 164.8000000000001 -41.7 157.6000000000001 -38.9C105.0000000000001 -18.6 56.2000000000001 22.1 26.8000000000001 80.1C1.9 129.3 1.6 167.8 0 188.8zM20.9 190.7C21.3 184.1 21.5 176.4 22.2 168.6C28.5 96.6999999999999 71.8 25.1 153.2 -14.5C156.4 -16 157.6 -15.3 158.8 -12.2C173.7 26.9 188.7 66 203.8 105.1C205.1 108.4 204.4 109.9 201.4 111.8C169.8 131.7 154.1 160.3 155.8 197.8C156.8 219.4 165.1 238.3 179.6 254.1C209.6 286.8 256.6 293.9000000000001 295.1 271.7000000000001C327 253.3 344.6 217.9 340.3 181.3C336.7 150.7 321 127.4 294.6 111.5C291.9000000000001 109.9 291.1 108.6 292.3 105.5C307.5 66.3 322.5 27.1 337.5 -12.2C338.7 -15.3 339.9 -16 343.1 -14.5C378.6 2.1 408.3 25.8 431.2000000000001 57.5C466.0000000000001 105.7 480.3000000000001 159.4 473.5000000000001 218.5C459.8 336 354.1 433.3 218 416.5C111.9 403.5 22.7 314 20.9 190.7z" />
+    <glyph glyph-name="page4"
+      unicode="&#xF3D7;"
+      horiz-adv-x="496" d=" M248 -56C111 -56 0 55 0 192S111 440 248 440C268.9 440 289.3 437.4 308.7 432.5L42.3 56H248V-56zM248 87.6V301.2L98.6 87.6H248zM344 56V-36.7C389.7 -17.5 428.5 15 455.4 56H344zM401.4 194.2L380.2 185.8L401.4 177.5V194.2zM381.1 139.7C374.4 139.7 373.1 133.4 373.1 126.8V119.1H389.3V129.1C389.3 135 387 139.7000000000001 381.1 139.7000000000001zM496 192C496 154.7 487.8 119.3 473 87.6H344V420.7C433.3 383.2 496 294.9 496 192zM360.4 304.4H428.6V352H414.7V319.4H400.8V349H386.9000000000001V319.4H374.2000000000001V352H360.3000000000001V304.4zM428.5 119.1H402V130.1C402 145.5 396.4 155.3 381.1 155.3C365.7000000000001 155.3 360.4000000000001 144.7 360.4000000000001 129.4V104.1H428.6V119.1zM428.5 222.1L360.3 192.4V180L428.5 150.5V167.1L414.1 172.8V199.3L428.5 205.2V222.1zM423.7 290.6H388.1V264H402V276.2H413C421.6 260.4 414.3 240.9 394.4 240.9C371.9 240.9 366.1 266.2 378.9 278.6L367.3 289.2C351.1 271.7 355.1 225.3 394.4 225.3C428.4 225.3 439.1 261.2 423.7 290.6z" />
+    <glyph glyph-name="pagelines"
+      unicode="&#xF18C;"
+      horiz-adv-x="384" d=" M384 135.3C328.9 -1.4 196.9 81.3 196.9 81.3C156.4 -0.5 89.5 -53.1 12.3 -53.4C-3.8 -53.4 -4.3 -29 12.3 -29C76.7 -28.7 132.8 13.7 169.5 81.1C128.4 65.2000000000001 50.9 53.2 7.9 163.3C116.9 208.2 167 152.1 186.2 117.8C196.1 142.2 203.2 168.7 207.8 197.5C207.8 197.5 68.1 175.6 58.3 295.6C177.4 343.5 210.9 218.9 210.9 218.9C212.5 235.6 214.2 271.5 214.2 272.3C214.2 272.3 107.9 346 176.1 437.5C300.7000000000001 394.5 237.5000000000001 275.1 237.5000000000001 275.1C238.0000000000001 273.5 238.0000000000001 251.3 237.5000000000001 241.7C237.5000000000001 241.7 282.7000000000001 330.7 373.9000000000001 299.2C369.7000000000001 165.1999999999999 232.0000000000001 192.8 232.0000000000001 192.8C227.6 165.4 220.8000000000001 139.4 212 115.3C212 115.3 295 207.1 384 135.3z" />
+    <glyph glyph-name="palfed"
+      unicode="&#xF3D8;"
+      horiz-adv-x="576" d=" M384.9 254.1C384.9 301.5 329.7 298.3 289.5 283.9C288.2 244.5 287 203.2 286.5 164.1C287.2 161.3 289.1 157.9 301.6 157.9C338.4000000000001 157.9 385 200.7000000000001 384.9000000000001 254.1zM190.4 181.9C190.6 181.9 196.9 184.6 201.6 184.6C228.2 184.6 222.3 140.5 187.2 140.5C165.7 140.5 150.1 158.6 150.1 183.5C150.1 225.5 193 279.0999999999999 250.8 310C251.8 322.4 253.8 332 261.3 338.2C272.5 347.2 287.9 341.7 290.8 327.1C363 349.3 426 326.1 426 255.1C426 177.1999999999999 346.7 102.5 285.9 116.9C285.8 77.5 286.8 42.5 288.6 16.9V16.7C288.8 13.3 289.2 4.2 283.3 -2.4C273.7 -13.0000000000001 249.9 -12.4 246.9 19.9C242.8 64.3 247.1 226 248.3 262.4C226.8 247.4 189.8 212.1 189.8 186.5C190 184 190.2 182.5 190.4 181.9zM8 266.9S7.9 229.5 46.4 229.5H76.4L98.8 12.3S98.8 -32 143.5 -32H432.4S477.1 -31.6 477.1 12.3L499.4999999999999 229.5H529.5S567.9 228.3 567.9 266.9C567.9 266.9 568 304.3 529.5 304.3H499.4C492.1 329.9 469.2 378.6 380 378.6H352V397.7S349.3 416.1 330.9 416.1H245.1S224 416.1 224 397.7V378.6H195.9S90.9 374.4 75.4 304.3H46.4S8 305.5 8 266.9z" />
+    <glyph glyph-name="patreon"
+      unicode="&#xF3D9;"
+      horiz-adv-x="512" d=" M512 253.2C512 151.9 429.6 69.4 328.2 69.4C226.5 69.4 143.8 151.8 143.8 253.2C143.8 354.8 226.5 437.5 328.2 437.5C429.6 437.5 512 354.8 512 253.2zM0 -53.5H90V437.5H0V-53.5z" />
+    <glyph glyph-name="paypal"
+      unicode="&#xF1ED;"
+      horiz-adv-x="384" d=" M111.4 152.1C107.9 132.9 94 43.4 89.9 18.1C89.6 16.3 88.9 15.6 86.9 15.6H12.3C4.7 15.6 -0.8 22.2 0.2 29.5L58.8 401.4C60.3 411 68.9 418.3 78.8 418.3C231.1 418.3 243.9 422 282.8 406.9C342.9000000000001 383.6 348.4 327.4 326.8 266.6C305.3 204 254.3 177.1 186.7 176.3C143.3 175.6 117.2 183.3 111.4 152.1zM357.1 296C355.3 297.3 354.6 297.8 354.1 294.7C352.1 283.3 349 272.2 345.3 261.1C305.4000000000001 147.3 194.8 157.2 140.8 157.2C134.7 157.2 130.7 153.9 129.9 147.8C107.3 7.4 102.8 -21.9 102.8 -21.9C101.8 -29 106.3 -34.8 113.4 -34.8H176.9C185.5 -34.8 192.6 -28.4999999999999 194.3 -19.9C195 -14.5 193.2 -26 208.7 71.4C213.3 93.4 223 91.1 238.0000000000001 91.1C309 91.1 364.4000000000001 119.9 380.9000000000001 203.4C387.4000000000001 238.2000000000001 385.5000000000001 274.8000000000001 357.1 296z" />
+    <glyph glyph-name="periscope"
+      unicode="&#xF3DA;"
+      horiz-adv-x="448" d=" M370 384.4C331.4 425.4 280.5 448 226.6 448C111.9 448 18.5 351.8 18.5 233.6C18.5 158.5 76.3 73.8 101.2 40.9C137.8 -7.5 192.6 -64 226.6 -64C268.2 -64 339.5 30.2 347.5 41C372.1 74.1 429.5 159.3 429.5 233.6C429.5 290.1 408.4 343.7 370 384.4zM226.6 -45.9C184.1 -45.9 36.6 121.4 36.6 233.5C36.6 340.9 120.5 429.8 226.6 429.8C327.4 429.8 411.3 340.8 411.3 233.5C411.4 121.4 263.9 -45.9 226.6 -45.9zM338 241.2C338 182.1 286.9 131.5 227.2 131.5C126.6 131.5 76.5 239.7 134.3 313.3V312.9C134.3 288.4 154.4 268.5 179.1 268.5C203.8 268.5 223.9 288.4 223.9 312.9C223.9 331.1 212.8 346.7 197 353.6C273.6 372.8 338 314.3 338 241.2z" />
+    <glyph glyph-name="phabricator"
+      unicode="&#xF3DB;"
+      horiz-adv-x="496" d=" M323 185.9L322.9 198.9S344.6 218.7 344 220.1L334.5 240.1C333.9 241.5 305 240.6 305 240.6L295.6 249.9S295.8 278.4 294.4000000000001 279L274.3 288.2C272.9000000000001 288.8 253.6 267.2 253.6 267.2L240.5000000000001 267.4S220 288.8 218.6 288.2L198.6 279.9C197.2 279.4 198.8 251 198.8 251L189.7 241.9S160.5 242.8 160 241.5L151.9 221.6999999999999C151.3000000000001 220.2999999999999 172.9 200.6999999999999 172.9 200.6999999999999L173 187.8S151.3000000000001 168 151.9 166.6L161.4 146.6C162 145.2 190.9 146.1 190.9 146.1L200.3000000000001 136.8S200.1000000000001 104.9999999999999 201.5 104.4999999999999L221.6 96.1999999999999C223 95.5999999999999 242.3 119.6999999999999 242.3 119.6999999999999L255.4 119.5S275.9 95.6999999999999 277.2 96.1999999999999L297.2 103.6999999999999C298.6 104.3 297 135.8 297 135.8L306.1 144.9S335.3 144 335.8 145.4L343.9000000000001 165.2C344.6 166.3 323.0000000000001 185.9 323.0000000000001 185.9zM278.1 194.6C278.8 177.5 265.3 163 248.0000000000001 162.2C230.7 161.4 215.9 174.7 215.2000000000001 191.8C214.5000000000001 208.9 228.0000000000001 223.4 245.3000000000001 224.1C262.6 224.9 277.4000000000001 211.6 278.1 194.6zM479.3 232.5L382.3 329.5L382.2 329.4C307.1 402.7 186.8 402.2 112.4 327.8C61.5 276.8 84.6 299.9 16.7 232.5C-5.6 210.2 -5.6 173.8 16.7 151.5C86.6 82.1 63.1 105.5 114.1 54.5L114.2 54.6C189.3 -18.7 309.6 -18.3 384 56.2C435 107.1 411.9 84.1 479.3 151.5000000000001C501.6 173.8000000000001 501.6 210.2000000000001 479.3 232.5000000000001zM140.4 84.2C80.8 143.7 80.8 240.2 140.4 299.7C199.9 359.3 296.4 359.2 356 299.7C415.5 240.2 415.6 143.7 356 84.1C296.4 24.6 200 24.7 140.4 84.2000000000001z" />
+    <glyph glyph-name="phoenix-framework"
+      unicode="&#xF3DC;"
+      horiz-adv-x="640" d=" M212.9 103.7C216.7 103.8 235.7 105.1 238.5 105.9C236.1 108.5 194.9 106.9 170.5 155.5C166.2 164.1 163 173.1 164.1 183.1C167 208.6 197 213.1 216.1 201.6C252.1 180 279.4 110.3 329.8 104.1C366.8 99.6 414.4 121.1 438 149.5C437.4 149.6 437.2 149.7 437 149.6C436.6 149.5 436.2 149.4 435.9 149.3C402.6 137.2 341.6 139.6 301.2 164.1C263.6 186.9 248.1 222.8 249.4 238.7C251.2 260 272.3 261.9 285.3 258.3C299.7 254.4 309.7 240.7 324.2 230.9C339.8 220.5 357.0999999999999 217.2 375.5 220.6C390.3999999999999 223.3 409.8999999999999 232.9 412 235.1C410.8999999999999 235.2 410.2 235.2 409.5 235.3C403.3 235.9 397.1 236.1 391 237C279.8 253.5 262.1 400.6 138.5 410.1C94.2 413.5 39.1 402 2.2 375.1C1.4 374.5 0.7 373.9 0 373.3C0.1 373.1 0.1 373 0.2 372.8C1 372.8 1.8 372.9 2.6 373C8.9 374 15.1 373.8 21.3 372.7C45.1 368.4 69 349.6 77.2 296.2C82.5 261.9 76.5 245.4 85.2 210.1C104.2 133 176.2 102.5 212.9 103.7zM75.3 383.1C74.4 384.1 74.4 384.3 74 385.1C86.1 387.7 98.2 389.2 110.6 389.9C109.5 375.2 88.4 368.6 75.3 383.1zM272.2 32.6C229.4 31.4 180.2 59.3 148.7 94C144.1 99 131.9 114.2 130.1 117.4L130.5 117.8C137.1 113.6999999999999 156.2 99.1999999999999 185.3 90.8C209.5 83.8 233.4 84.4999999999999 256.9 94.1C279.6 103.4 297.9 94.6 300 91.2C281.5 87.4 279.9 86.8 276 83.3C270.9 78.9 271.4 71.6 283 66.1C309.2 53.7 346 68.9 380.2 40.7C382.6 38.7 388.3 32.9 390.3 30.0000000000001C390.2 29.8000000000001 390 29.7 389.9000000000001 29.5000000000001C385.1 31.0000000000001 373.5000000000001 37.0000000000001 349.7000000000001 38.8000000000001C325.0000000000001 40.8000000000001 303.4000000000001 33.5000000000001 272.2000000000001 32.6000000000001zM447 284.6C463.4 289.8 488.3 298 513.5 287.9000000000001C529.6 281.4000000000001 539.7 269.2000000000001 545.6 253.3000000000001C549.1 243.9000000000001 550.7 233.6000000000001 550.7 224.6000000000001C550.5 224.6000000000001 550.3000000000001 224.6000000000001 550.1 224.5000000000001C549.9 224.9000000000001 549.7 225.4000000000001 549.6 225.8000000000001C544.6 247.8000000000001 519.7 269.6000000000001 482 255.7000000000001C431.8 237.1000000000001 351.6 246.0000000000001 305.1 303.7000000000001C304.4000000000001 304.6000000000001 302.7000000000001 305.4000000000001 303.8 306.9000000000001C303.9000000000001 307.1 305.9000000000001 306.3000000000001 306.8 305.6C324.9000000000001 292.2000000000001 345.1 283.7000000000001 367.1 279.4000000000001C397.6 273.3000000000001 421.7000000000001 276.5000000000001 447 284.6zM549.7 167.1C517.3000000000001 166.9 515.9000000000001 117 446.1 102.7000000000001C427.9000000000001 99.0000000000001 407.4000000000001 98.1 401.2000000000001 98.5000000000001V98.9C404.0000000000001 100.4 415.9000000000001 101.5000000000001 430.9000000000001 115.5000000000001C438.8 122.8000000000001 446.2000000000001 130.6000000000001 453.7 138.4C473.2 158.6 495.1 180.6 535.6 177.4C558.7 175.6 564.9 169.2000000000001 571.7 164.7000000000001C572 164.5000000000001 572.1 164.2000000000001 572.4000000000001 163.8000000000001C571.9000000000001 163.8000000000001 571.7 163.7000000000001 571.5000000000001 163.8000000000001C564.5000000000001 166.5000000000001 557.2000000000002 167.1000000000001 549.7000000000002 167.1000000000001zM537.4000000000001 191.2000000000001C537.3000000000001 191.0000000000001 537.3000000000001 190.8000000000001 537.2 190.6C508.3000000000001 195 489.2 198.5 468.7 186.6C451.7 176.7000000000001 437.3000000000001 166.1 406.7000000000001 162.2000000000001C379.6 158.8000000000001 361.6 159.8000000000001 340.6 170.2000000000001C340.3 170.4 340 170.6 339.6 170.8000000000001C339.6 171.0000000000001 339.7000000000001 171.1000000000001 339.7000000000001 171.3000000000001C364.6 167.5000000000001 376.1 166.2000000000001 395.2000000000001 177.1000000000001C417.5000000000001 190.0000000000001 435.3000000000001 203.7000000000001 466.5000000000001 208.1000000000001C496.1000000000001 212.2000000000001 517.8000000000001 205.6000000000001 537.4000000000001 191.2000000000001zM268.6 350.7C268 351.3 267.5 351.9 266.5 353C274.1 353 296.2 354.2 319.9 344.6C339.6 336.6 352.1 323.6 370.1 311.7C381.2 304.4 393.5 302.4 406.5 303.6C410.8 304 415 304.8 419.3 305.3C419.7 305.4 420.2 305.3 420.8 305C420.2 304.6 419.6 304.1 419 303.8C410.8999999999999 299.8 402.3 297.5 393.3999999999999 296.7C367.2999999999999 294.1 343.0999999999999 300.4 319.9999999999999 312.1C300.6999999999999 322 283.5999999999999 335 268.5999999999999 350.7zM640 112.3C636.5 109.2 617.3 100.7 597.3 107C585 110.9 577.8 121.9 565.6999999999999 131.1C555.6999999999999 138.7000000000001 544.8 139 537.5999999999999 139.5C538.1999999999999 140.3 538.4999999999999 140.7 538.8 140.9C553.5999999999999 150.1 569.3 153.1 586.0999999999999 147.4C598.5999999999999 143.2 605.3 133.9 616.4999999999999 123.2C627.2999999999998 112.8 637.4999999999999 113.3 639.5999999999999 112.7C639.6999999999999 112.8 639.8 112.7 639.9999999999999 112.3zM427.5 -24.7C429.7 -25.9 429.1 -26.2 429 -26.7C410.5 -25.3 395.1 -19.1 382.2 -4.5C360.4 20.2 340.5 23.4 333.6 25.2C334.1 25.4 334.4 25.6 334.7 25.6C347.8 25.4999999999999 360.8 24.9 373.6 21.7C398.9 15.3 408.6 -3.7 415.2 -13.6C418.4 -18.4 422.5 -21.9 427.5 -24.7z" />
+    <glyph glyph-name="php"
+      unicode="&#xF457;"
+      horiz-adv-x="640" d=" M320 343.5C491.4 343.5 623.2 271.3 623.2 192S491.3 40.5 320 40.5C148.6 40.5 16.8 112.7 16.8 192S148.7 343.5 320 343.5M320 360.3C143.3 360.3 0 285 0 192S143.3 23.7 320 23.7S640 99 640 192S496.7 360.3 320 360.3zM218.2 205.5C210.3 165 182.4 169.2 148.1 169.2L161.8 239.8C199.8 239.8 225.6 243.9 218.2 205.5zM97.4 97.7H134.1L142.8 142.5C183.9 142.5 209.4 139.5 233 161.6C259.1 185.6 265.9 228.3 247.3 249.7C237.6 260.9 222 266.4 200.8 266.4H130.1L97.4 97.7zM283.1 311.3H319.6L310.9000000000001 266.5C342.4000000000001 266.5 371.6 268.8 385.7000000000001 255.8C400.5000000000001 242.2 393.4000000000001 224.8 377.4000000000001 142.7000000000001H340.4000000000001C355.8 222.1000000000001 358.7000000000001 228.7000000000001 353.1 234.7000000000001C347.7000000000001 240.5000000000001 335.4000000000001 239.3000000000001 305.7000000000001 239.3000000000001L286.9000000000001 142.7000000000001H250.4000000000001L283.1 311.3000000000001zM505 205.5C497 164.4 468.3 169.2 434.9 169.2L448.6 239.8C486.8 239.8 512.4 243.9 504.9999999999999 205.5zM384.2 97.7H421L429.7 142.5C472.9 142.5 496.8 140 519.9 161.6C546 185.6 552.8 228.3 534.1999999999999 249.7C524.4999999999999 260.9 508.8999999999999 266.4 487.6999999999999 266.4H417L384.2 97.7000000000001z" />
+    <glyph glyph-name="pied-piper-alt"
+      unicode="&#xF1A8;"
+      horiz-adv-x="576" d=" M242 261C248.3 272.8 255.2 278 267.9 282.8C295.2 293.1 308.1 313.3 326.8 333.9C338.7 325.5 338.8 309.3 358.4 310.9V289.1L364.7 288.8C402.1 303.2 439.4 319 471.3 343.4C519.5999999999999 380.2 524.1999999999999 393.4 552.5999999999999 443.4L554.5999999999999 446C553.9999999999999 431.9 548.3 418.7 542.1999999999999 406.1C511.6999999999999 342.3 463.4999999999999 305.8 395.3999999999999 289.4C383 286.5 369 286.2 357.7999999999999 280.5C359.1999999999999 270.7 370.9999999999999 262.4 370.9999999999999 257.5C370.9999999999999 254.1 365.4999999999999 250.3 363.4999999999999 248.9C352.2999999999999 261.8 347.3999999999999 268.2 340.7999999999999 271C333.1999999999999 274.5 276.8999999999999 277.4 241.9999999999999 261zM379.9 4.1C360.9 4.1 315.8 -5.4 300 -15.7L306.9 -60.8C342.6 -66.9 377 -64.4 412.9 -51C408.1 -41 389.4 4.1 379.9 4.1zM244 202C240.8 204 237.7 204.9 233.9 204.9C227.3 204.9 221.3 201.7 214.6 201.2L216.3 196.3L244 202zM231.4 170.2L255.5 109L276.5 122.8L245.2 173.7L231.4 170.2zM555.5 448L554.9 446.9L554.6 446L555.2 446.6L555.5 448zM496.3 65.9C462.4 122.8 421 184.3 346.3 181.4L346 187.4C344.9 200.9 378.8 184.2 381.1 218.4L366.7000000000001 211.2C346.9000000000001 256.9 358.1 265.5 301.2000000000001 265.5C286.5000000000001 265.5 274.5000000000001 263.8 259.8000000000001 260.9C262.7000000000001 242.3 262.0000000000001 224.2 248.9000000000001 210.6L268.4000000000001 205.1C266.7000000000001 201.9 265.5000000000001 198.8 265.5000000000001 195.3C265.5000000000001 174.3 308.3000000000002 192.4 308.3000000000002 161.7C308.3000000000002 143.3 271.5000000000001 101.6 253.4000000000001 101.6C245.4000000000001 101.6 199.7000000000001 151.6 200.0000000000001 161.7L200.3000000000001 166.3L252.6000000000002 177.8C265.6000000000002 180.4 264.9000000000002 200.5 249.7000000000002 200.5C246.0000000000002 200.5 206.6000000000001 191.3 200.3000000000001 189.9C198.3000000000001 195.1 192.8000000000001 204 186.5000000000001 204C183.3000000000001 204 180.2000000000001 200.8 177.0000000000001 200C167.8000000000001 197.4 146.0000000000001 197.1 155.5000000000001 179.9L15.9 149.5C10.4 148.4 7 143.2 7 137.7C7 131.7 12.5 126.8 18.5 126.8C26.5 126.8 149.8 155.2 165.9 159C168.5 155.8 170.5 152.7 173.7 150.4C193.8 136 233.5 64.5 250.1 64.5C274.2000000000001 64.5 308.1 86.9 321.4000000000001 106.4C324.6 110.7 328.3 113.9 333.8 113.3C334.4000000000001 99.4999999999999 302.2 79.1 300.8 69.6C299.4000000000001 59.4 299.8 34.4 300.5 28.4999999999999C327.2 20.3999999999999 352.5 32.1 378.4 31.3999999999999C382.7 52.3999999999999 389 73.2999999999999 388.2 94.8999999999999L387.9 104.3999999999999C386.5 138.5999999999999 377 142.8999999999999 353.1 163C352 164.1 350.5 165.6 349.4 167C351.6 168.3999999999999 350.5 168 354 168.6999999999999C442.5 168.6999999999999 410.3 -14.9000000000001 465.5 -61.2C498.6 -46.2 538 -33.3000000000001 569 -14.0000000000001C540 11.6 516.4 31.6999999999999 496.3 65.9zM300.1 19.9V-7.4L311.9000000000001 -4.0000000000001L309.0000000000001 19.8H300.1000000000001zM376.2000000000001 17C376.2000000000001 18.4 375.6 20.2 375.3000000000001 21.6C348.5000000000001 21.6 338.4000000000001 17.8 315.8000000000001 15.3L317.8000000000001 2.9C326.8000000000001 4.4 376.2000000000001 9.5000000000001 376.2000000000001 17.0000000000001z" />
+    <glyph glyph-name="pied-piper-pp"
+      unicode="&#xF1A7;"
+      horiz-adv-x="448" d=" M205.3 273.4C205.3 252.3 191.1 235.3 173.6 235.3C166.5 235.3 160.8 236.5 156.4 239V307C160.8000000000001 309.7 166.5 311.2 173.6 311.2C191.1 311.2 205.3 294.3 205.3 273.4zM257.9000000000001 206.4C250.8000000000001 206.4 245.1 204.9 240.7000000000001 202.2V134.2000000000001C245.1000000000001 131.7000000000001 250.8000000000001 130.5000000000001 257.9000000000001 130.5000000000001C275.3 130.5000000000001 289.6 147.4 289.6 168.3000000000001C289.6 189.4000000000001 275.3 206.4000000000001 257.9000000000001 206.4000000000001zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM185 192.9C226 192.9 259.2 228.5 259.2 272.5C259.2 316.5 226 352.1 185 352.1C173 352.1 160.9 348.9 150.4 343.3H104.7V137L156.5 147.1V197.7C165.1 194.6 174.6 192.9 185 192.9zM343.4 167.6C343.4 211.6 310.2 247.2 269.5 247.2C266.3 247.2 263.1 247.0000000000001 259.9 246.5000000000001C256.2 234.0000000000001 249.8 222.7 240.7 213.1C226.9 198.1 208.5 189.3 188.9 188.3V32L240.7 42.1V92.7000000000001C249.3 89.5000000000001 258.9 88.0000000000001 269.4 88.0000000000001C310.2 88.0000000000001 343.4 123.6000000000001 343.4 167.6z" />
+    <glyph glyph-name="pied-piper"
+      unicode="&#xF2AE;"
+      horiz-adv-x="640" d=" M640 423.1C559.2 369.5 550.6 330.6 543.6 318.7C536.9 306.5 531.9 258.4 520.3000000000001 235.1C508.6000000000001 211.5 466.1000000000001 192.9 454.2 185.1C442.5000000000001 177.3 425.9000000000001 147 412.3000000000001 120.9C304.2000000000001 125.3 244.9000000000001 82.1 153.1000000000001 27.3000000000001C182.5000000000001 37.0000000000001 196.4000000000001 44.0000000000001 196.4000000000001 44.0000000000001C290.6000000000001 80.0000000000001 335.7000000000001 112.3000000000001 477.5000000000001 93.2000000000001C478.6000000000001 93.2000000000001 479.4000000000001 92.6 480.3000000000001 92.4C484.2000000000001 90.2000000000001 485.6000000000001 85.5000000000001 483.4000000000001 81.6L429.5000000000002 -14.2C427.0000000000002 -18.9 421.7000000000002 -21.4 416.4000000000002 -20.3C289.6000000000002 3.5 189.5000000000002 -37.6 97.5000000000002 -38.9C24.1 -40 0 -5.4 0 -3.8C0 -2.7 0.6 -2.1 1.7 -2.1C1.7 -2.1 40 -2.1 104.8 13.2C178.4 153.5 244 202.6 315.4 202.6C315.4 202.6 387.1 202.6 406 140.7C428.8 180.4 434.3 189.9 434.3 189.9C439.6 199.3 469.3 267.1 520.7 331.3C572.2 395.3 611.1 411.2 640 423.1z" />
+    <glyph glyph-name="pinterest-p"
+      unicode="&#xF231;"
+      horiz-adv-x="384" d=" M204 441.5C101.4 441.5 0 373.1 0 262.4C0 192 39.6 152 63.6 152C73.5 152 79.2 179.6 79.2 187.4C79.2 196.7 55.5 216.5 55.5 255.2C55.5 335.6 116.7 392.6 195.9 392.6C264 392.6 314.4 353.9 314.4 282.8C314.4 229.7 293.1 130.1 224.1 130.1C199.2 130.1 177.9 148.1 177.9 173.9C177.9 211.7000000000001 204.3 248.3000000000001 204.3 287.3000000000001C204.3 353.5000000000001 110.4 341.5000000000001 110.4 261.5C110.4 244.7 112.5 226.1 120 210.8C106.2 151.4 78 62.9 78 1.7C78 -17.1999999999999 80.7 -35.8 82.5 -54.6999999999999C85.9 -58.4999999999999 84.2 -58.0999999999999 89.4 -56.1999999999999C139.8 12.8000000000001 138 26.3000000000001 160.8 116.6000000000001C173.1 93.2000000000001 204.9 80.6000000000001 230.1 80.6000000000001C336.3 80.6000000000001 384 184.1000000000001 384 277.4000000000001C384 376.7 298.2 441.5 204 441.5z" />
+    <glyph glyph-name="pinterest-square"
+      unicode="&#xF0D3;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H154.4C164.2 -15.6 176.8 8 181.8 27.3C184.8 38.8 197.1 85.7 197.1 85.7C205.1 70.4 228.5000000000001 57.5 253.4000000000001 57.5C327.5 57.5 380.8000000000001 125.6 380.8000000000001 210.2C380.8000000000001 291.3 314.6000000000001 352 229.4000000000001 352C123.4000000000001 352 67.2000000000001 280.9 67.2000000000001 203.4C67.2000000000001 167.4 86.4000000000001 122.6 117.0000000000001 108.3C121.7000000000001 106.1 124.1000000000001 107.1 125.2000000000001 111.6C126.0000000000001 115 130.2000000000001 131.7000000000001 132.0000000000001 139.4C132.6000000000001 141.9 132.3000000000001 144.0000000000001 130.3000000000001 146.4C120.2000000000001 158.7000000000001 112.0000000000001 181.3 112.0000000000001 202.4C112.0000000000001 256.6 153.0000000000001 309 222.9000000000001 309C283.2000000000001 309 325.5000000000001 267.9000000000001 325.5000000000001 209.1C325.5000000000001 142.7000000000001 292.0000000000001 96.7000000000001 248.3000000000002 96.7000000000001C224.2000000000001 96.7000000000001 206.2000000000001 116.6 211.9000000000001 141.1C218.8000000000001 170.3 232.2000000000002 201.8 232.2000000000002 222.9C232.2000000000002 275.9000000000001 156.7000000000001 268.6 156.7000000000001 197.9C156.7000000000001 176.2000000000001 164.0000000000002 161.4 164.0000000000002 161.4C132.6000000000001 28.6 127.9000000000002 26.9 134.4000000000002 -31.1999999999999L136.6000000000001 -31.9999999999999H48C21.5 -31.9999999999999 0 -10.4999999999999 0 16.0000000000001V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368z" />
+    <glyph glyph-name="pinterest"
+      unicode="&#xF0D2;"
+      horiz-adv-x="496" d=" M496 192C496 55 385 -56 248 -56C222.4 -56 197.8 -52.1 174.6 -44.9C184.7 -28.4 199.8 -1.4 205.4 20.1C208.4 31.7 220.8 79.1 220.8 79.1C228.9 63.7000000000001 252.5 50.6 277.6 50.6C352.4000000000001 50.6 406.3 119.4 406.3 204.9C406.3 286.8000000000001 339.4 348.1 253.4 348.1C146.4 348.1 89.5 276.3 89.5 198C89.5 161.6 108.9 116.3 139.8 101.9C144.5 99.7000000000001 147 100.7000000000001 148.1 105.2000000000001C148.9 108.6 153.1 125.5000000000001 155 133.3000000000001C155.6 135.8000000000001 155.3000000000001 138.0000000000001 153.3000000000001 140.4000000000001C143.2000000000001 152.9000000000001 135 175.7000000000001 135 197.0000000000001C135 251.7000000000001 176.4 304.6000000000001 247.0000000000001 304.6000000000001C307.9000000000001 304.6000000000001 350.6 263.1000000000001 350.6 203.7000000000001C350.6 136.6000000000001 316.7000000000001 90.1000000000001 272.6 90.1000000000001C248.3 90.1000000000001 230.0000000000001 110.2000000000001 235.9000000000001 134.9000000000001C242.9000000000001 164.4000000000001 256.4000000000001 196.2000000000001 256.4000000000001 217.5000000000001C256.4000000000001 236.5000000000001 246.2000000000001 252.4000000000001 225 252.4000000000001C200.1 252.4000000000001 180.1 226.7000000000001 180.1 192.2000000000001C180.1 170.2000000000001 187.5 155.4000000000001 187.5 155.4000000000001S163 51.6000000000001 158.5 32.2000000000001C153.5 10.8000000000001 155.5 -19.3999999999999 157.6 -38.9999999999999C65.4 -2.9 0 86.9 0 192C0 329 111 440 248 440S496 329 496 192z" />
+    <glyph glyph-name="playstation"
+      unicode="&#xF3DF;"
+      horiz-adv-x="576" d=" M570.9 75.7C559.6 61.5 532.1 51.4 532.1 51.4L327 -22.2V32.1L477.9 85.9C495 92.0000000000001 497.7 100.7000000000001 483.7 105.3C469.8 109.9 444.6 108.6 427.5 102.4L327 66.9V123.3C350.2 131.1 374.1 136.9 402.7 140.1C443.6 144.6 493.6 139.5 532.9 124.6C577.1 110.6 582.1 89.9 570.9 75.7zM346.5 168.2V307.2C346.5 323.5 343.5 338.5 328.2 342.8C316.5 346.6 309.2 335.7 309.2 319.4V-28.5L215.4 1.3V416C255.3 408.6 313.4 391.1 344.6 380.6C424.1 353.3 451 319.3 451 242.8C451 168.3 405 140 346.5 168.2000000000001zM43.2 37.8C-2.2 50.6 -9.8 77.3 10.9 92.6C30 106.8 62.6 117.5 62.6 117.5L197.1 165.3V110.8L100.3 76.2C83.2 70.1 80.6 61.4 94.5 56.8C108.4 52.2 133.6 53.5 150.7000000000001 59.7L197.1000000000001 76.6V27.8C145.5000000000001 18.4999999999999 95.7000000000001 20.4999999999999 43.2 37.8z" />
+    <glyph glyph-name="product-hunt"
+      unicode="&#xF288;"
+      horiz-adv-x="512" d=" M326.3 229.2C326.3 208.7 309.6 192 289.1 192H218.8V266.4H289.1C309.6 266.4 326.3 249.7 326.3 229.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM375.9 229.2C375.9 277.1 337 316 289.1 316H169.2V68H218.8V142.4H289.1C337 142.4 375.9 181.3 375.9 229.2z" />
+    <glyph glyph-name="pushed"
+      unicode="&#xF3E1;"
+      horiz-adv-x="432" d=" M407 336.1L308.5 345.1L322.5 378.5C332.9 402 311.7 418.9 293.8 415.5L22.5 371.1C7.4 368.4 -3.5 352.8 1.1 334.5L106.2 -13.8C112.7 -35.1 142.9 -38 153.9 -20.8L189.2 60L424.4 291.3C440.8 308.1 428.7 334.2000000000001 407 336.1zM297.6 394.4C302.7000000000001 395.1 305.1 391.9 302.8 387L286 347.1L108.6 363.4L297.6 394.4zM22.7 340.1C19.6 345.2 23.7 350.1 28.8 349.2L277.5 326.5L180.6 95.8L22.7 340.1zM136 -8.4C133.4 -12.4 128.1 -11.5 126.6 -7.2L43.5 268.3L171.2 70.7000000000001C164.2 55.7 136 -8.4 136 -8.4zM408.8 306.1L210.1 110.7L299.8 324.4L406.2000000000001 314.7C410.2000000000001 313.6 411.9000000000001 309.4 408.8000000000001 306.1z" />
+    <glyph glyph-name="python"
+      unicode="&#xF3E2;"
+      horiz-adv-x="448" d=" M167.8 411.6C122.6 403.6 114.4 386.9 114.4 356V315.3H221.3V301.7000000000001H74.3C43.2 301.7000000000001 16 283 7.5 247.5C-2.3 206.8 -2.7 181.4 7.5 138.9C15.1 107.3 33.2 84.7 64.3 84.7H101V133.5C101 168.8 131.5 199.9 167.8 199.9H274.6C304.3 199.9 328 224.4 328 254.2V356.1C328 385.1 303.6 406.8 274.6 411.7C238.8 417.6 199.9 417.3 167.8 411.6zM161.1 383.2C172.1 383.2 181.2 374 181.2 362.8S172.2 342.5 161.1 342.5C150 342.5 141 351.6 141 362.8C141.1 374.1 150 383.2000000000001 161.1 383.2000000000001zM346.3 301.8V254.3C346.3 217.5 315.1 186.5 279.5 186.5H172.7C143.5 186.5 119.3 161.5 119.3 132.2V30.4C119.3 1.4 144.5 -15.6 172.7 -23.9C206.5 -33.8 239 -35.6 279.5 -23.9C306.4 -16.1 332.9 -0.4 332.9 30.4V71.1H226.2V84.7H386.4C417.5 84.7 429 106.4 439.8 138.9C450.9999999999999 172.4 450.4999999999999 204.6 439.8 247.5C432.1 278.4 417.5 301.7 386.4 301.7H346.3zM286.2 44C297.3 44 306.3 34.9 306.3 23.7C306.3 12.4 297.3 3.3 286.2 3.3C275.2 3.3 266.1 12.5 266.1 23.7C266.2 35 275.2 44 286.2 44z" />
+    <glyph glyph-name="qq"
+      unicode="&#xF1D6;"
+      horiz-adv-x="448" d=" M433.754 27.555C422.228 26.162 388.894 80.296 388.894 80.296C388.894 48.951 372.758 8.049 337.843 -21.49C354.685 -26.682 392.6860000000001 -40.657 383.646 -55.911C376.3300000000001 -68.254 258.136 -63.792 224.014 -59.948C189.892 -63.792 71.698 -68.254 64.382 -55.911C55.337 -40.661 93.3 -26.697 110.165 -21.496C75.245 8.043 59.106 48.949 59.106 80.2960000000001C59.106 80.2960000000001 25.772 26.162 14.247 27.5550000000001C8.877 28.205 1.823 57.1990000000001 23.594 127.2590000000001C33.855 160.2830000000001 45.589 187.7370000000001 63.738 233.0380000000001C60.683 349.937 108.982 447.9940000000001 224 448C337.737 447.9940000000001 387.156 351.867 384.264 233.037C402.382 187.814 414.176 160.187 424.408 127.259C446.1760000000001 57.199 439.124 28.206 433.754 27.555z" />
+    <glyph glyph-name="quinscape"
+      unicode="&#xF459;"
+      horiz-adv-x="489.1" d=" M301.9 -26.6H300.6C213.3 -26.6 142.5 44.2 142.5 131.5S213.3 289.6 300.6 289.6C395.5 289.6 468.8 206.5 457.6 113C461.6 107.9 465.8 103.4 468.8 97.7C482.1999999999999 128 489.1 160.1 489.1 195.4C489.1 330.5 379.6 440 244.5 440C109.5 440 0 330.5 0 195.4S109.5 -49.2 244.5 -49.2C269.3 -49.2 292.3 -46 314.9 -39.1C309.7 -35.6 305.9 -30.9 301.5 -26.4999999999999L301.9 -26.6zM280.7 43.2C280.7 98 325.1 142.4 379.9 142.4C434.7 142.4 479.1 98 479.1 43.2C479.1 -11.6 434.7 -56 379.9 -56C325.1 -56 280.7 -11.6 280.7 43.2" />
+    <glyph glyph-name="quora"
+      unicode="&#xF2C4;"
+      horiz-adv-x="448" d=" M440.5 61.3H411.2C409.7 47.8 400.7 30.5 378.2 30.5C357.7 30.5 342.9 44.7 328.7 66.3C372.9 100.5 403.4 153.8 403.4 219.3C403.5 336.8 306.8 416 205 416C105.3 416 7.3 336.3 7.3 219.3C7.3 85.2000000000001 138.6 -2.3 256.3 30.3C276 -3.3 302 -32 351.5 -32C433.3 -32 442.3 43.3 440.5 61.3zM297 118.8C277.5 148 253.3 171 205.5 171C175 171 151.2 161 136.5 148.2L148.7 123.9C154.9 126.9 161.7 127.9 168.5 127.9C204 127.9 222.2 97.1 237.7 66.6C227.7 63.6 217 62.4 205 62.4C130 62.4 97.5 115.4 97.5 219.1C97.5 323.5 130 377 205 377C281.2 377 313.7 323.5 313.7 219.3C313.8 177.5 308.3 143.7000000000001 297 118.8z" />
+    <glyph glyph-name="ravelry"
+      unicode="&#xF2D9;"
+      horiz-adv-x="512" d=" M407.4 386.5C331.6 425.9 257.8 417 182.9 382C171.6 376.8 167.4 371.4 163 363C152.7 343.8 146.8 325.6 143.1 310.3C121.9 284.7000000000001 106.7 254.2 99.8 220.4C89.2 202.4 78.9 179 76.7 149C76.7 149 76 141.4 76.2 141.1C40.9 145.7000000000001 0 168.1 0 168.1C9.1 153.6 61.3 135.8 76.3 130.2000000000001C76.3 130.2000000000001 78 32.2 140.8 -0.9999999999999C129.5 16.2 127.5 19.2 127.5 19.2S94.8 79 100.4 123.3C101.1 123.3 101.9 123.1 102.6 123.1C126.5 35.7 205.8 -28.3 299.5 -28.3C305.7 -28.3 311.6 -28.1 317.5 -27.6C331.5 -29.1 345.1 -28.1 357.6 -23.7C364.5 -21.5 371.4000000000001 -17.3 377.8 -12.9C448 26.2 478.7 69.1 500.9 134.8C506.3 150.8 509 170.3 510.7 187C519.4 269.3 480.1 348.6 407.4 386.5zM138.8 284.8S137.6 272.5 138.1 265.1C134.7 262.6 128 257 119.9 248.4000000000001C125.1 261.2000000000001 131.2 273.5 138.8 284.8000000000001zM107.6 162.9C112 180.1 120.9 202 137.4 218C137.4 218 139.1 170 153.2 127.9L111.8 134.8C109.6 144 108.3 153.3 107.6 162.9zM115.5 120.1C130.3 116.9 149.5 112.4999999999999 158.6 110.9999999999999C185.9 34.1999999999999 266.9000000000001 -13.3000000000001 266.9000000000001 -13.3000000000001C267.9000000000001 -13.8000000000001 268.6 -14.0000000000001 269.6 -14.3000000000001C196.5 -2.7 136.9 50.3999999999999 115.5 120.0999999999999zM386 3.9C371.5 -0.8 349.8 -4.5 321.3 0.2C321.3 0.2 230.2 23.3 193.8 108C232 107.3 246.2 108.2 271.8 111.9C311.2 117.6 350.8 128.1 386.8 144.9C398.6 150.3 397.9000000000001 164.3 396.4000000000001 174.7C394.4000000000001 187.5 385.3 186.8 375.0000000000001 179.4C375.0000000000001 179.4 293.0000000000001 120.8 185.2000000000001 125.7C166.5000000000001 157.7 158.4 236.5 158.4 236.5C199.8000000000001 271.7 241.6 296.1 326.8000000000001 288.9C327.0000000000001 295.3 329.8000000000001 316 306.4000000000001 317C306.4000000000001 317 212.9000000000001 328.1 160.4000000000001 283.5C162.9000000000001 300 166.3000000000001 312.8 171.5000000000001 322.9C205.7000000000001 353.7 250.5000000000001 372.4 299.8000000000001 372.4C406.2000000000001 372.4 492.8000000000001 285.3 492.8000000000001 177.9C492.6000000000001 101.9 449.0000000000001 35.9 386.0000000000001 3.9z" />
+    <glyph glyph-name="react"
+      unicode="&#xF41B;"
+      horiz-adv-x="512" d=" M418.2 270.8C412.8 272.6 407.4 274.3 402 275.9C402.9 279.6 403.7 283.3 404.5 287C416.8 346.6 408.7 394.5 381.4 410.3C355.1 425.4 312.2 409.7 268.8 371.9C264.5 368.2 260.3 364.3 256.3 360.4C253.6 363 250.8 365.6 248 368.1C202.5 408.5 156.9 425.5 129.5999999999999 409.6C103.3999999999999 394.4 95.5999999999999 349.3 106.5999999999999 292.9C107.6999999999999 287.3 108.8999999999999 281.8 110.2999999999999 276.2000000000001C103.8999999999999 274.4 97.5999999999999 272.4 91.6999999999999 270.3C38.3 251.8 0 222.6 0 192.4C0 161.2 40.8 129.9 96.3 110.9C100.8 109.4 105.3 107.9 109.9 106.6C108.4 100.6 107.1 94.7 105.9 88.6C95.4 33.1 103.6 -10.9 129.8 -26C156.8 -41.6 202.2 -25.6 246.4 13.1C249.9 16.2 253.4 19.4 256.9 22.8C261.3 18.5 265.9 14.4 270.5 10.4C313.3 -26.4 355.6 -41.3 381.7 -26.2C408.7 -10.6 417.5 36.7 406.1 94.3C405.2 98.7 404.2 103.2 403.1 107.8C406.3 108.7 409.4 109.7 412.5 110.7C470.1999999999999 129.8 511.9999999999999 160.7 511.9999999999999 192.4C511.9999999999999 222.7 472.6 252.1 418.2 270.8zM282.9 355.7C320.1 388.1 354.8 400.8 370.6 391.7C387.5 382 394 342.8 383.4 291.3C382.7 287.9 382 284.6 381.1 281.3C358.9 286.3 336.4 289.9 313.8 291.9C300.8 310.5 286.6 328.3 271.2 345C275.0999999999999 348.7 278.8999999999999 352.2 282.8999999999999 355.7zM152.9 166.6C157.5 157.8 162.2 149.1 167.2 140.5C172.3 131.8 177.5 123.1 183 114.6C167.4 116.3 151.9 118.8 136.6 122.1C141 136.5 146.5 151.4 152.9 166.6zM152.9 217.2C146.6 232.1 141.3 246.7 136.9 260.8C151.3 264 166.6 266.6 182.5 268.6C177.2 260.3 172 251.8 167.1 243.2C162.2 234.7 157.4 226.0000000000001 152.9 217.2zM164.3 191.9C170.9 205.7000000000001 178.1 219.2000000000001 185.7 232.5000000000001C193.3 245.8000000000001 201.5 258.7000000000001 210.1 271.4000000000001C225.1 272.5 240.4 273.1 256 273.1C271.6 273.1 287 272.5 301.9 271.4000000000001C310.4 258.8000000000001 318.5 245.9000000000001 326.2 232.7000000000001C333.9 219.5000000000001 341.1 206.0000000000001 347.9 192.3000000000001C341.2 178.5000000000001 334 164.9 326.3 151.5000000000001C318.7 138.2000000000001 310.6 125.3000000000001 302.1 112.5000000000001C287.2 111.4 271.7 110.9 256 110.9C240.3 110.9 225.1 111.4 210.4 112.3C201.7 125 193.5 138 185.8 151.3C178.1 164.6 171 178.1 164.3 191.9zM344.9 140.7000000000001C350 149.5000000000001 354.8 158.4 359.5 167.4C365.9 152.9 371.5 138.2000000000001 376.4 123.1C360.9 119.6 345.2 116.9 329.4 115.1C334.8 123.5 339.9 132.1 344.9 140.7000000000001zM359.3 217.2000000000001C354.6 226.0000000000001 349.8 234.8000000000001 344.8 243.4000000000001C339.9 251.9000000000001 334.8 260.3000000000001 329.5 268.6C345.6 266.6 361 263.9000000000001 375.3999999999999 260.6C370.7999999999999 245.8 365.3999999999999 231.4000000000001 359.2999999999999 217.2zM256.2 329.7C266.7 318.3 276.6 306.3 285.8 293.9C266 294.8 246.1 294.8 226.3 293.9C236.1 306.8 246.2 318.8 256.2 329.7zM140.2 391C157 400.8 194.3 386.8 233.6 352C236.1 349.8 238.6 347.4 241.2 345C225.7 328.3 211.4 310.5 198.3 291.9C175.7 289.9 153.3 286.4 131.1 281.5C129.8 286.6 128.7 291.8 127.6 297C118.2 345.4 124.4 381.9 140.2 391zM115.7 127.4C111.5 128.6 107.4 129.9 103.3 131.3C82 138 57.8 148.6 40.3 162.5C30.2 169.5 23.4 180.3 21.5 192.4C21.5 210.7 53.1 234.1 98.7 250C104.4 252 110.2 253.8 116 255.5C122.8 233.8 131 212.5 140.5 191.8999999999999C130.9 171 122.6 149.3999999999999 115.7 127.3999999999999zM232.3 29.4C215.8 14.3 196.7 2.3 175.9 -5.9C164.8 -11.2 152 -11.7 140.6 -7.2C124.7 1.9999999999999 118.1 37.3 127.1 84.8C128.2 90.4 129.4 95.9999999999999 130.8 101.4999999999999C153.2 96.6999999999999 175.8 93.3999999999999 198.7 91.6999999999999C211.9 72.9999999999999 226.4 55.0999999999999 241.9 38.3C238.7 35.1999999999999 235.5 32.1999999999999 232.3 29.4zM256.8 53.7C246.6 64.7 236.4 76.9 226.5 90C236.1 89.6 246 89.4 256 89.4C266.3 89.4 276.3999999999999 89.6 286.3999999999999 90.1C277.2 77.4 267.2999999999999 65.3 256.7999999999999 53.7zM387.5 23.7C386.6 11.5 380.6 0.1 371 -7.6C355.1 -16.8 321.2 -4.8 284.5999999999999 26.6C280.3999999999999 30.2 276.2 34.1 271.8999999999999 38.1C287.2 54.9999999999999 301.2999999999999 72.9 314.0999999999999 91.7C336.9999999999999 93.6 359.7999999999999 97.1 382.2999999999999 102.2C383.2999999999999 98.1 384.1999999999999 94 384.9999999999999 90C389.8999999999999 68.4 390.6999999999999 45.9 387.4999999999999 23.7zM405.7 131.2C402.8999999999999 130.3 400.0999999999999 129.4 397.2 128.6C390.2 150.4 381.5999999999999 171.7 371.7 192.4C381.3 212.8 389.3999999999999 233.8 396.2 255.3C401.3999999999999 253.8 406.3999999999999 252.2 411.2 250.6C457.8 234.6 490.4999999999999 210.8 490.4999999999999 192.6C490.4999999999999 173 455.6 147.7 405.7 131.2zM256 237.8C281.3 237.8 301.8 217.3 301.8 192C301.8 166.7 281.3 146.2 256 146.2C230.7 146.2 210.2 166.7 210.2 192C210.2 217.3 230.7 237.8 256 237.8" />
+    <glyph glyph-name="readme"
+      unicode="&#xF4D5;"
+      horiz-adv-x="576" d=" M528.3 401.5H388.5C340.4 401.5 298.6 368.2 288.1 321.2C277.5 368.2 235.8 401.5 187.7 401.5H48C21.5 401.5 0 380 0 353.5V107.7C0 81.2 21.5 59.7 48 59.7H137.7C239.9 59.7 270.4 35.3 285 -15.3C285.7 -18.1 290.2 -18.1 291 -15.3C305.7 35.3 336.2 59.7 438.3 59.7H5H8C34.5 59.7 56 81.2 56 107.7V353.4C576 379.8 554.7 401.3 528.3 401.5zM242 136.1C242 134.2000000000001 240.5 132.6 238.5 132.6H78.2C76.3 132.6 74.7 134.1 74.7 136.1V159C74.7 160.9 76.2 162.5 78.2 162.5H238.6C240.5000000000001 162.5 242.1 161 242.1 159V136.1zM242 197C242 195.1 240.5 193.5 238.5 193.5H78.2C76.3 193.5 74.7 195 74.7 197V219.9C74.7 221.8000000000001 76.2 223.4 78.2 223.4H238.6C240.5000000000001 223.4 242.1 221.9 242.1 219.9V197zM242 257.9000000000001C242 256 240.5 254.4000000000001 238.5 254.4000000000001H78.2C76.3 254.4000000000001 74.7 255.9000000000001 74.7 257.9000000000001V280.8000000000001C74.7 282.7000000000001 76.2 284.3000000000001 78.2 284.3000000000001H238.6C240.5000000000001 284.3000000000001 242.1 282.8000000000001 242.1 280.8000000000001V257.9000000000001zM501.3 136.2000000000001C501.3 134.3000000000001 499.8 132.7000000000001 497.8 132.7000000000001H337.5C335.6 132.7000000000001 334 134.2000000000001 334 136.2000000000001V159.1C334 161 335.5 162.6 337.5 162.6H497.9C499.8 162.6 501.4 161.1 501.4 159.1V136.2000000000001zM501.3 197.1000000000001C501.3 195.2000000000001 499.8 193.6000000000001 497.8 193.6000000000001H337.5C335.6 193.6000000000001 334 195.1000000000001 334 197.1000000000001V220C334 221.9 335.5 223.5 337.5 223.5H497.9C499.8 223.5 501.4 222 501.4 220V197.1zM501.3 258.0000000000001C501.3 256.1 499.8 254.5000000000001 497.8 254.5000000000001H337.5C335.6 254.5000000000001 334 256.0000000000001 334 258.0000000000001V280.8000000000001C334 282.7000000000001 335.5 284.3000000000001 337.5 284.3000000000001H497.9C499.8 284.3000000000001 501.4 282.8000000000001 501.4 280.8000000000001V258H501.3z" />
+    <glyph glyph-name="rebel"
+      unicode="&#xF1D0;"
+      horiz-adv-x="512" d=" M256.5 -56C117.2 -56 9 60.2 13.2 198.1C16 277.3 56.4 350.3 129.7 398.5C130 398.5 131.6 399.1 130.8 397.7C125 392.2 19.5 267.9 116.7 171.3C166.5 121.8 206.7 168.8 206.7 168.8C245.2 218.9 206.1 294.7000000000001 206.1 294.7000000000001C196.1 319.6 160.4 334.8 160.4 334.8L189.2 366.6C213.6 356.1 232.4 327.9 232.4 327.9C233.2 357.5 210.5 389.3 210.5 389.3L255.1 440L299.4 389.9C278.9 361.1 277.5 327.3 277.5 327.3C291.3 350.3 321 366.6 321 366.6L349.5 334.8C322.1 325.9 304.1 294.9 304.1 294.9C288.3 266.4 277 205.5 304.7000000000001 167.6C337.1 123 392.4000000000001 170.4 392.4000000000001 170.4C495.1 262.3000000000001 381.9000000000001 395.4000000000001 381.9000000000001 395.4000000000001C375.8 400.9000000000001 382.7000000000001 398.2000000000001 382.7000000000001 398.2000000000001C432.8000000000001 361.7000000000001 497.3000000000001 313.8 498.9 193.4C500.9 47.8 399 -56 256.5 -56z" />
+    <glyph glyph-name="red-river"
+      unicode="&#xF3E3;"
+      horiz-adv-x="448" d=" M353.2 416H94.8C42.4 416 0 373.6 0 321.2V62.8C0 10.4 42.4 -32 94.8 -32H353.2C405.6 -32 448 10.4 448 62.8V321.2C448 373.6 405.6 416 353.2 416zM144.9 247.1V190.8C144.9 163.8 123 141.9 96 141.9V296.1C96 309.3 106.7 320 119.9 320H274.1C274.1 293 252.2 271.1 225.2 271.1H168.9C156.6 271.7 144.3000000000001 259.5 144.9 247.1zM321.2000000000001 175.1H264.9000000000001C252.6 175.7000000000001 240.3000000000001 163.5 240.9000000000001 151.1V94.8C240.9000000000001 67.8 219 45.9 192 45.9V200.1C192 213.3 202.7 224 215.9 224H370.1C370.1 197 348.2000000000001 175.1 321.2000000000001 175.1z" />
+    <glyph glyph-name="reddit-alien"
+      unicode="&#xF281;"
+      horiz-adv-x="512" d=" M440.3 244.5C425.3 244.5 412.1 238.3 402.4000000000001 228.6C366.7000000000001 253.3 318.6 269.2 265.3000000000001 270.9L293 395.7L381.2 375.9C381.2 354.3 398.8 336.7 420.4 336.7C442.4 336.7 460.1 354.8 460.1 376.4S442.5 416.1 420.4 416.1C405 416.1 391.7 406.8 385.1 394.1L287.7 415.7C282.8 417 278 413.5 276.7 408.6L246.3 271C193.4 268.8 145.8 252.9 110 228.2C100.3 238.3 86.6 244.5 71.6 244.5C16 244.5 -2.2 169.9 48.7 144.4C46.9 136.5 46.1 128.1 46.1 119.7C46.1 35.9 140.5 -32 256.4 -32C372.8 -32 467.2 35.9 467.2 119.7C467.2 128.1 466.3 136.9 464.1 144.8C514 170.4 495.6 244.5 440.3 244.5zM129.4 139.1C129.4 161.1 147 178.8 169.1 178.8C190.7 178.8 208.3 161.2 208.3 139.1C208.3 117.5 190.7 99.9 169.1 99.9C147.1 99.8 129.4 117.5000000000001 129.4 139.1zM343.7000000000001 45.6C307.3000000000001 9.2 204.6000000000001 9.2 168.2000000000001 45.6C164.2000000000001 49.1 164.2000000000001 55.3 168.2000000000001 59.3C171.7000000000001 62.8 177.9 62.8 181.4 59.3C209.2000000000001 30.8 301.4000000000001 30.3 330.4000000000001 59.3C333.9000000000001 62.8 340.1 62.8 343.6 59.3C347.7000000000001 55.3 347.7000000000001 49.1 343.7000000000001 45.6zM342.9000000000001 99.8C321.3 99.8 303.7000000000001 117.4 303.7000000000001 139C303.7000000000001 161 321.3000000000001 178.7 342.9000000000001 178.7C364.9000000000001 178.7 382.6 161.1 382.6 139C382.5 117.5 364.9000000000001 99.8 342.9000000000001 99.8z" />
+    <glyph glyph-name="reddit-square"
+      unicode="&#xF1A2;"
+      horiz-adv-x="448" d=" M283.2 102.5C285.9 99.8 285.9 95.7 283.2 93.3C258.7 68.8 189.4 68.7 164.8 93.3C162.1 95.7 162.1 99.8 164.8 102.5C167.2 104.9 171.3 104.9 173.7 102.5C192.4 83.3 254.7 82.9 274.2 102.5C276.6 104.8 280.8 104.8 283.2 102.5zM191.9 156.3C191.9 171.2 180 183.1 165.4 183.1C150.5 183.1 138.6 171.2000000000001 138.6 156.3C138.6 141.7 150.5 129.8 165.4 129.8C180 129.8 191.9 141.7 191.9 156.3zM282.6 183.1C268 183.1 256.1 171.2000000000001 256.1 156.3C256.1 141.7 268 129.8 282.6 129.8C297.5 129.8 309.4 141.7 309.4 156.3C309.4 171.2 297.5 183.1 282.6 183.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM348.3 227.4C338.2 227.4 329.3 223.2 322.7 216.7C298.6 233.4 266.2 244.1 230.2 245.3L248.9 329.5L308.4 316.1C308.4 301.5 320.3 289.6 334.9 289.6C349.8 289.6 361.7 301.8 361.7 316.4000000000001C361.7 331 349.8 343.2000000000001 334.9 343.2000000000001C324.5 343.2000000000001 315.6 337 311.1 328.3L245.4 342.9000000000001C242.1 343.8 238.9 341.4000000000001 238 338.1L217.5 245.3C181.8 243.8 149.7 233.1 125.6 216.4C119.1 223.2 109.8 227.4 99.7 227.4C62.2 227.4 49.9 177 84.2 159.9C83 154.5 82.4 148.9 82.4 143.2C82.4 86.7 146.1 40.9 224.3 40.9C302.8 40.9 366.5 86.7 366.5 143.2C366.5 148.9 365.8999999999999 154.8 364.3999999999999 160.2C398 177.4 385.5999999999999 227.4 348.2999999999999 227.4z" />
+    <glyph glyph-name="reddit"
+      unicode="&#xF1A1;"
+      horiz-adv-x="512" d=" M201.5 142.5C187.7 142.5 176.6 153.6 176.6 167.1C176.6 180.9 187.7 192 201.5 192C215.1 192 226.1 180.9 226.1 167.1C226.1 153.5 215 142.5 201.5 142.5zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM371.7 233.2C362.3 233.2 354 229.3 347.9 223.2C325.5 238.7 295.3 248.7 261.8 249.8L279.2 328.1L334.5999999999999 315.6C334.5999999999999 302 345.7 291 359.2 291C373 291 384.0999999999999 302.3 384.0999999999999 315.9S372.9999999999999 340.8 359.2 340.8C349.5 340.8 341.2 335 337.0999999999999 327L275.8999999999999 340.6C272.8999999999999 341.4 269.7999999999999 339.2 269 336.2L249.9 249.8C216.6999999999999 248.4 186.8 238.5 164.4 223C158.3 229.4 149.7 233.2 140.3 233.2C105.4 233.2 94 186.3 125.9 170.3999999999999C124.8 165.3999999999999 124.2 160.1999999999999 124.2 154.8999999999999C124.2 102.2999999999999 183.4 59.6999999999999 256.2 59.6999999999999C329.3 59.6999999999999 388.5 102.3 388.5 154.8999999999999C388.5 160.1999999999999 387.8999999999999 165.6999999999999 386.6 170.6999999999999C417.9 186.6999999999999 406.4 233.2 371.7 233.2zM302.8 117C284.6 98.8 226.7 99.1 209.2 117C207 119.2 203.1 119.2 200.9 117C198.4 114.5 198.4 110.6 200.9 108.4C223.7 85.6 288.2 85.6 311.1 108.4C313.6 110.6 313.6 114.5 311.1 117C308.9000000000001 119.2 305 119.2 302.8 117zM310.5 192C296.9 192 285.9 180.9 285.9 167.1C285.9 153.5 297 142.5 310.5 142.5C324.3 142.5 335.4 153.6 335.4 167.1C335.4 180.9 324.4 192 310.5 192z" />
+    <glyph glyph-name="rendact"
+      unicode="&#xF3E4;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56C266.6 -56 284.7 -53.9 302.1 -50.1C296.5 -42.7 291.3 -35.7 286.2000000000001 -28.8C273.8000000000001 -30.9 261.0000000000001 -32.1 247.9000000000001 -32.1C124.3 -32 24 68.3 24 192S124.3 416 248 416S472 315.7 472 192C472 121 439 57.8 387.5 16.7C361.6 -2.1 348.4 -4.7 304 60.9C225.3 173.8 256 132 230.3 169.2C303.1 160.3 458.8 241.2 398.9 337.8C314 474.8 15 354.2 59.7 221.6C62.9 211.8 74.1 183 105.3 183C107.3 183 107.9 183.6 107.3 184.7C102.9 193.4 87.2 194.5 87.2 222.1C87.2 262.6 127.7 311.7 187.5 342.1C253.6 374.4 319.4 372.3 345.7 336.7C372.9 298.4 324.8 217.5 225.3 199.8C232.8 209.2 282.3 275 288.1 283.8C310.8 318.4 311.7 332.8 302.1 343C286.6 359.9 272.6 353.3 251.4 354.7C240.6 355.6 137.7 173.5 115 137.8C109.1 128.8 93.8 103.6999999999999 93.8 86.9C93.8 65.6 96.6 35.5 114.4 35.5C125 35.5 122.4 54.2 122.4 62.1C122.4 75 149.8 111.5 197.2 166.7000000000001C217.6 130.6 254.9 52.4 327.4 -42.9999999999999C425.4 -9.8999999999999 495.9 82.8000000000001 495.9 192.0000000000001C496 329 385 440 248 440z" />
+    <glyph glyph-name="renren"
+      unicode="&#xF18B;"
+      horiz-adv-x="512" d=" M214 278.9C214 168.5 153 73.5 66.4 31.5C30 74.8 8 130.3 8 191.4C8 314.1 97.1 415.8 214 435.5V278.9zM255 -56C212.1 -56 171.7 -45 136.5 -25.6C193.7 10.5 239.9 65.1 255 129C270.5 65.1 316.7 10.5 373.8 -25.7C338.7 -45 298.3 -56 255 -56zM445.6 31.5C359 73.5 298 168.4 298 278.9V435.5C414.9 415.8 504 314.1 504 191.4C504 130.3 482 74.8 445.6 31.5z" />
+    <glyph glyph-name="replyd"
+      unicode="&#xF3E6;"
+      horiz-adv-x="448" d=" M320 -32H128C57.6 -32 0 25.6 0 96V288C0 358.4 57.6 416 128 416H320C390.4 416 448 358.4 448 288V96C448 25.6 390.4 -32 320 -32zM193.4 174.8C187.3 176.8 181.8 177.9 177 177.9C169.8 177.9 163.5 176.0000000000001 158.1 172.3C152.7 168.6 148.5 163.3 145.3 156.5H144.2L140 174.8H112V35.9H148.1V125.6C149.6 131 152.5 135.4 156.8 138.8C161.1 142.1999999999999 166.6 143.9 173 143.9C177.6 143.9 182.8 142.9 188.6 140.8L193.4 174.8zM308.6 71.4C305.4000000000001 69 300.9000000000001 66.6 294.9000000000001 64.3C288.9000000000001 61.9999999999999 282.1 60.8 274.5000000000001 60.8C262.3000000000001 60.8 253.4000000000001 63.8 248.0000000000001 69.6999999999999C242.5000000000001 75.5999999999999 239.5000000000001 84.3999999999999 239.0000000000001 96.0999999999999H322.3000000000001C323.2000000000001 100.8999999999999 323.9000000000001 105.4999999999999 324.4000000000001 109.9999999999999C324.9000000000001 114.3999999999999 325.1000000000001 118.5999999999999 325.1000000000001 122.4999999999999C325.1000000000001 133.1999999999999 323.5000000000001 142.1999999999999 320.4000000000001 149.3999999999999C317.2000000000001 156.5999999999999 313.1000000000001 162.3999999999999 307.9000000000001 166.5999999999999C302.7000000000001 170.8999999999999 296.8000000000001 173.8999999999999 290.1000000000001 175.7999999999999C283.4000000000001 177.5999999999999 276.6000000000001 178.5999999999999 269.5000000000001 178.5999999999999C248.4000000000001 178.5999999999999 232.0000000000001 172.4999999999998 220.3000000000001 160.2999999999999S202.8000000000001 129.7999999999999 202.8000000000001 105.2999999999998C202.8000000000001 82.4999999999998 208.0000000000001 64.5999999999999 218.4000000000001 51.5999999999999C228.8000000000001 38.4999999999998 245.2000000000001 31.9999999999998 267.6000000000001 31.9999999999998C278.3000000000001 31.9999999999998 288.5000000000001 33.4999999999998 298.0000000000001 36.5999999999999C307.5000000000001 39.6999999999999 315.1000000000001 43.3999999999999 320.6000000000001 47.7999999999998L308.6000000000001 71.3999999999999zM286.8 141.7C290.6 136.3 292.1 128.6 291.4000000000001 118.6H239.7000000000001C240.6000000000001 128 243.4000000000001 135.6 247.9000000000001 141.2C252.4000000000001 146.8 259.4000000000001 149.7 268.9000000000001 149.7C277.1 149.8 283.0000000000001 147.1 286.8 141.7zM366.7000000000001 139.2C370.8000000000001 135.3 376.1 133.4 382.8000000000001 133.4C389.8000000000001 133.4 395.4000000000001 135.3 399.5000000000001 139.2S405.6000000000001 148.3 405.6000000000001 154.8S403.6000000000001 166.4 399.5000000000001 170.2C395.4000000000001 174 389.9000000000001 175.9 382.8000000000001 175.9C376.1000000000001 175.9 370.8000000000001 174 366.7000000000001 170.2C362.6 166.4 360.6 161.3 360.6 154.8S362.6 143.1 366.7000000000001 139.2zM366.7000000000001 38.7C370.8000000000001 34.8 376.1 32.9 382.8000000000001 32.9C389.8000000000001 32.9 395.4000000000001 34.8 399.5000000000001 38.7S405.6000000000001 47.8 405.6000000000001 54.3S403.6000000000001 65.9 399.5000000000001 69.7C395.4000000000001 73.5 389.9000000000001 75.4 382.8000000000001 75.4C376.1000000000001 75.4 370.8000000000001 73.5 366.7000000000001 69.7C362.6 65.9 360.6 60.8 360.6 54.3C360.6 47.7 362.6 42.6 366.7000000000001 38.7z" />
+    <glyph glyph-name="resolving"
+      unicode="&#xF3E7;"
+      horiz-adv-x="496" d=" M281.2 169.8C327.2 183.1 330.8 193.3 325.2 213.2L314 252.5C307.9 273.4 295.6 280.6 242.9 265.3L54.7 211.2L83.3 112.6L281.2000000000001 169.8zM248.5 440C131.4 440 33.2 359.3 7.2 250.5L229.1 314.4C263.9 324.6 283.3 326.1 308.4 322.6C344.7 316.5 361.1 297.6 369.8 267.4L380.5 229.6C388.7 201.5 381.5 179 357 156C337.6 138.6 325.8 131.5 295.6 122.8L203 96.2L423.4 69.1L433.1 34.9L385 21.6L98.1999999999999 58.9L121.1999999999999 -21.3C158 -43.3 201.5 -56 247.5 -56C384.5 -56 495.9999999999999 55.4 495.9999999999999 192.3C497 328.6 385.5 440 248.5 440zM38.3 59.4L0 191.2C0 142.7 14.3 97.8 38.3 59.4z" />
+    <glyph glyph-name="rocketchat"
+      unicode="&#xF3E8;"
+      horiz-adv-x="448" d=" M448 191.8C448 279 348.4 345.1 228.2 345.1C209.4 345.1 190.9 343.5 172.9 340.3C161.8 350.8 148.7 360.3 134.9 367.7000000000001C61.2 403.8 0 368.6 0 368.6S56.9 321.5 47.6 280.3C-4.7 228 -4.9 156.2000000000001 47.6 103.7000000000001C56.9 62.4 0 15.4 0 15.4S61.2 -19.8 134.9 16.2C148.7 23.7 161.8 33.1 172.9 43.6C190.9 40.4 209.4 38.8 228.2 38.8C348.5 38.9 448 104.6 448 191.8zM228.3 67.8C204.6 67.8 182 70.6 161 75.6C139.7 49.8 92.9 13.9 47.4 25.5C62.2 41.5 84.1 68.6 79.4 113.1C52.1 134.5 35.8 161.8 35.8 191.6C35.8 260 122 315.5 228.3 315.5S420.8 260 420.8 191.6C420.8 123.3 334.6 67.8 228.3 67.8zM253.9 191.7000000000001C253.9 177.5000000000001 242.4 165.9 228.3 165.9C214.2 165.9 202.7 177.4 202.7 191.7000000000001C202.7 205.9 214.2 217.5000000000001 228.3 217.5000000000001C242.4 217.5000000000001 253.9 205.9000000000001 253.9 191.7000000000001zM342.8 191.7000000000001C342.8 177.5000000000001 331.4000000000001 165.9 317.2 165.9C303.1 165.9 291.6 177.4 291.6 191.7000000000001C291.6 205.9 303 217.5000000000001 317.2 217.5000000000001C331.3 217.5000000000001 342.8 205.9000000000001 342.8 191.7000000000001zM164.9 191.7000000000001C164.9 177.5000000000001 153.5 165.9 139.3 165.9C125.2 165.9 113.7 177.4 113.7 191.7000000000001C113.7 205.9 125.1 217.5000000000001 139.3 217.5000000000001C153.5 217.5000000000001 164.9 205.9000000000001 164.9 191.7000000000001z" />
+    <glyph glyph-name="rockrms"
+      unicode="&#xF3E9;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM405.4 20.5H315.4L203.4 151.8C185.5 172.2 199.5 207.9 230 207.9H305.3L220.7 307.2L136.4 208.3H46.4L193.5 380.8C207.9 399.2 234.8 398.1 248 380.8L405.7 195.7C424.7 172.9 407.7 138.5 378.1 139.6C377.5 139.6 303.9 139.4 303.9 139.4L405.4 20.5z" />
+    <glyph glyph-name="safari"
+      unicode="&#xF267;"
+      horiz-adv-x="512" d=" M236.9 191.2C236.9 200.3 243.5 208.9 253.2 208.9C262.1 208.9 270.6 202.5 270.6 192.8C270.6 183.7 264.2000000000001 175.1 254.5000000000001 175.1C245.5000000000001 175.1 236.9000000000001 181.8 236.9000000000001 191.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM477.4 192C477.4 314.3 378.3 413.4 256 413.4S34.6 314.3 34.6 192S133.7 -29.4 256 -29.4S477.4 69.7 477.4 192zM404.9 95.4C404.9 91.8 417.9 85.2 421.2 83.2C393.8 41.7 351.4 11.8 303.3 -0.1L298.9 18.4C298.6 20.9 297 21.2 294.7 21.2C292.8 21.2 291.7 18.4 291.9 17L296.3 -1.8C283 -4.6 269.5 -6 255.9 -6C219.6 -6 183.9 4.2 152.9 23.1C154.5999999999999 25.9 165.0999999999999 41.1 165.0999999999999 43.3C165.0999999999999 45.2 163.4 46.9 161.5 46.9C157.5999999999999 46.9 149.3 30.3 146.8 27.0000000000001C105 54.7 74.8 97.6 63.2 146.6L82.3 150.8C84.5 151.4 85.1 153 85.1 155C85.1 156.9 82.3 158 80.7 157.8L62 153.5C59.5 166.2 58.1 179 58.1 192C58.1 229.1 68.6 265.6 88.3 296.9C91.1 295.2000000000001 104.4 286.1 106.6 286.1C108.5 286.1 110.2 287.5 110.2 289.4C110.2 293.3 95.5 300.7000000000001 92.2 303C120.4 344.2 163.3 373.9 212 384.9L216.2 366.4C216.8 364.2 218.4 363.6 220.4 363.6S223.4 366.4 223.2 368L219 386.3C231.2 388.5 243.6 389.9 256.1 389.9C293.2000000000001 389.9 329.4000000000001 379.4 361 359.7C359.1 356.9 350.2 343.9 350.2 341.7C350.2 339.8 351.6 338.1 353.5 338.1C357.4 338.1 364.8 352.5 366.8 355.8C407.8 328.1 437.1 285.8 448.5 237.6L433 234.3C430.5 233.7 430.2 232.1 430.2 229.9C430.2 228 433 226.9 434.4 227.1L450.2 230.7C452.7 218 454.1 205 454.1 192C454.1 155.7 444.1 120 425.3 89.3C422.5 90.7 410.9 99 408.7 99C406.5999999999999 99 404.8999999999999 97.3 404.8999999999999 95.4zM371.7 337.6C358.7 325.4 237.5 213.9 234.1 208.1L137.5 47.6C150.2 59.4999999999999 271.7 171.6 274.8 176.9L371.7000000000001 337.6z" />
+    <glyph glyph-name="sass"
+      unicode="&#xF41E;"
+      horiz-adv-x="640.4" d=" M551.1 156.1C528.7 156 509.3 150.6 493.1 142.6C487.2 154.5 481.1 164.9 480.1 172.7000000000001C478.9 181.8000000000001 477.6 187.2000000000001 479 198.0000000000001S486.7 224.1000000000001 486.6 225.2000000000001C486.5 226.3000000000001 485.2 231.8000000000001 472.3 231.9000000000001C459.4 232.0000000000001 448.3 229.4000000000001 447 226.0000000000001C445.7 222.6 443.2 214.9 441.7 206.9C439.4 195.2000000000001 415.9 153.4 402.6 131.6C398.2 140.1 394.5 147.6 393.7 153.6C392.5 162.7000000000001 391.2 168.1 392.6 178.9S400.3 205 400.2 206.1C400.1 207.2 398.8 212.7 385.9 212.8C373 212.9 361.9 210.3 360.6 206.9C359.3 203.5 357.9 195.5 355.3 187.8C352.7 180.1 321.4 110.5 313.2 92.4C309 83.2 305.3999999999999 75.8 302.8 70.8S302.6 70.4999999999999 302.4 69.9C300.2 65.6 298.9 63.2 298.9 63.2V63.1C297.2 59.9 295.3 56.9999999999999 294.4 56.9999999999999C293.8 56.9999999999999 292.5 65.3999999999999 294.7 76.8999999999999C299.4 101.0999999999999 310.5 138.6999999999999 310.4 140C310.3 140.6999999999999 312.5 147.1999999999999 303.1 150.6999999999999C294 154 290.7 148.5 289.9 148.5C289.1 148.5 288.5 146.5 288.5 146.5S298.6 188.8999999999999 269.1 188.8999999999999C250.7 188.8999999999999 225.1 168.6999999999999 212.5 150.3999999999999C204.6 146.0999999999999 187.5 136.7999999999999 169.5 126.8999999999999C162.6 123.0999999999999 155.5 119.1999999999999 148.8000000000001 115.5C148.3000000000001 116 147.9 116.5 147.4 117C111.6 155.1999999999999 45.5 182.1999999999999 48.3 233.5C49.3 252.2 55.8 301.3 175.4 360.9C273.4000000000001 409.7 351.8000000000001 396.3 365.3000000000001 366.5C384.7000000000001 324 323.4000000000001 244.9 221.6000000000001 233.5C182.8000000000001 229.2 162.4000000000001 244.2 157.3000000000001 249.8C152.0000000000001 255.7 151.2000000000001 256 149.2000000000001 254.9C145.9000000000001 253.1 148.0000000000001 247.9 149.2000000000001 244.8C152.2000000000001 236.9 164.7000000000001 222.9 186.0000000000001 215.9C204.7000000000001 209.8 250.2000000000001 206.4 305.2000000000001 227.7C367 251.5 415.1 317.8 401 373.3C386.6 429.7 293.1 448.2 204.6 416.8C151.9 398.1 94.9 368.7 53.9 330.4C5.2 284.8 -2.6 245.1 0.6 228.5C12 169.6 93.2 131.2 125.7 102.8C124.1 101.9 122.6 101.1 121.2 100.3C104.9 92.2 43 59.8 27.5 25.6C10 -13.2 30.4 -41 43.8 -44.8C85.6 -56.4 128.4 -35.4999999999999 151.4 -1.1999999999999S171.6 77.9000000000001 161 98.3000000000001C160.9 98.6000000000001 160.7 98.8000000000001 160.6 99.1000000000001C164.8 101.6000000000001 169.1 104.1000000000001 173.4 106.6000000000001C181.7 111.5000000000001 189.8 116.0000000000001 196.9 119.9000000000001C192.9 109.1000000000001 190 96.1000000000001 188.5 77.3000000000001C186.7 55.3000000000001 195.8 26.8000000000001 207.6 15.6000000000001C212.8 10.7000000000001 219.1 10.6000000000001 223 10.6000000000001C236.8 10.6000000000001 243 22.0000000000001 249.9 35.6000000000001C258.4 52.2000000000001 265.9 71.5000000000001 265.9 71.5000000000001S256.5 19.3000000000001 282.2 19.3000000000001C291.6 19.3000000000001 301 31.4000000000001 305.2 37.6000000000001V37.5000000000001S305.4 37.9 305.9 38.7C306.9 40.2 307.4 41.1 307.4 41.1V41.4C311.2 47.9 319.5 62.8 332 87.4C348.2 119.2000000000001 363.7 158.9 363.7 158.9S365.1 149.2000000000001 369.9 133.1C372.7 123.6 378.6 113.2000000000001 383.3 103.1C379.5 97.9 377.2 94.9 377.2 94.9S377.2 94.8 377.3 94.7000000000001C374.3 90.7000000000001 370.9 86.4 367.4 82.2000000000001C354.6 67.0000000000001 339.4 49.6 337.4 44.6C335 38.7 335.6 34.3 340.2 30.9C343.6 28.3 349.6 27.9 355.9 28.4C367.4 29.2 375.5 32.0000000000001 379.4 33.8C385.6 36 392.8 39.5 399.6 44.4C412.1 53.6 419.7 66.8 419 84.2000000000001C418.6 93.8000000000001 415.5 103.4 411.7 112.4C412.8 114.0000000000001 414 115.7000000000001 415.0999999999999 117.4C434.8999999999999 146.3 450.2 178.0000000000001 450.2 178.0000000000001S451.5999999999999 168.3000000000001 456.3999999999999 152.2000000000001C458.7999999999999 144.1 463.4999999999999 135.2000000000001 467.7999999999999 126.5000000000001C449.1999999999999 111.4 437.6999999999999 93.9 433.6999999999999 82.4C426.2999999999999 61.1 432.0999999999999 51.5000000000001 442.9999999999999 49.3C447.8999999999999 48.3 454.8999999999999 50.6 460.0999999999999 52.8C466.5999999999999 55 474.3999999999999 58.5 481.6999999999999 63.9C494.1999999999999 73.1 506.3 86.0000000000001 505.4999999999999 103.5000000000001C505.1999999999999 111.4 502.9999999999999 119.3000000000001 500.1 126.9C515.8 133.5000000000001 536.1999999999999 137.1 562.1999999999999 134.1C617.9 127.6 628.8 92.8 626.6999999999999 78.3C624.5999999999999 63.7 612.9 55.7 608.9999999999999 53.3C605.0999999999999 50.9 603.8999999999999 50 604.1999999999999 48.2C604.6999999999999 45.6 606.4999999999999 45.7 609.8 46.3C614.4 47.1 639 58.1 640.0999999999999 85C641.6999999999999 119 608.9999999999999 156.4 551.0999999999999 156.1zM121.8 11.4C103.4 -8.7 77.6 -16.3 66.5 -9.9C54.6 -3 59.3 26.6 82 48C95.8 61 113.6 73 125.4 80.4C128.1 82 132 84.4 136.8 87.3C137.6 87.8 138 87.9999999999999 138 87.9999999999999C138.9 88.6 139.9 89.1 140.9 89.6999999999999C149.2 59.3 141.2 32.4999999999999 121.8 11.3999999999999zM256.2 102.8C249.8 87.1 236.3 47.1 228.1 49.1999999999999C221.1 50.9999999999999 216.8 81.4999999999999 226.7 111.4999999999999C231.7 126.6 242.3 144.6 248.6 151.6C258.7 162.9 269.8 166.5 272.4 162C275.9 156.1 260.2 112.6 256.2 102.8zM367.2 49.8C364.5 48.4 362 47.4999999999999 360.8 48.1999999999999C359.9000000000001 48.6999999999999 361.9000000000001 50.5999999999999 361.9000000000001 50.5999999999999S375.8 65.4999999999999 381.3 72.2999999999999C384.5 76.2999999999999 388.2 80.9999999999999 392.2 86.1999999999999C392.2 85.6999999999999 392.3 85.1999999999999 392.3 84.5999999999999C392.2 66.6999999999999 375 54.5999999999999 367.2 49.7999999999998zM452.8 69.3C450.8 70.6999999999999 451.1 75.4 457.8 89.9999999999999C460.4 95.6999999999999 466.4 105.3 476.8 114.5C477.9999999999999 110.6999999999999 478.6999999999999 107.1 478.6999999999999 103.6999999999999C478.5999999999999 81.1999999999999 462.4999999999999 72.8 452.8 69.3z" />
+    <glyph glyph-name="schlix"
+      unicode="&#xF3EA;"
+      horiz-adv-x="448" d=" M350.5 290.3L296.3 336.4L369.7000000000001 375.4L448.0000000000001 331.2L350.5000000000001 290.3zM192 325.9L237.7 354.1L272.4 319.5L217 290.5L192 325.9zM126.9 319.3L158.8 341.4L176 313L139.3 290.5L126.9 319.3zM103.6 231.1L94.8 265.9000000000001L124.4 284.2000000000001L137.5 248.9000000000001L103.6 231.1zM82.4 314.8L106.3 332.9L115.2 308.9L88.5 290.6L82.4 314.8zM59 241.5L55.4 269.9L77.7 285.4L83.8 256.7000000000001L59 241.5zM28.4 224.9L49.2 237.7L52.5 204.3L29.6 192.3L28.4 224.9zM1.4 180L20.6 190.2L21 152L0 143.2L1.4 180zM60.5 120.7L32.2 112.4L30.6 159.2L55.7 169.9L60.5 120.7zM99 184.8L67.9 171.8L62.7 212.6L90.1 227L99 184.8zM123.2 71L81.6 65.1L73.5 128.6L108.7 139.4L123.2 71zM151.7 210.9L172.9 153.8L126.7 140.2L113 194.3L151.7 210.9zM237.4 -19.6L166.5 -16.3L142.2 79.5L197.4 88.1L237.4 -19.6zM152.5 260.1L194.7 282.5L222.7 236.6L171.9 215.3L152.5 260.1zM193.5 165.1999999999999L254.8 183.8999999999999L307.6 97.3L227.8 85.9999999999999L193.5 165.1999999999999zM244.9 250.8L312.2 279.5999999999999L377.7 214.1999999999999L289.1 188L244.9000000000001 250.8z" />
+    <glyph glyph-name="scribd"
+      unicode="&#xF28A;"
+      horiz-adv-x="384" d=" M42.3 195.3C26.2 214.3 17.6 241.2 17.5 275.2000000000001C17.5 375.6 92.7 428.3 184.7 428.3C283.3 429.9000000000001 341.5 379.3 369 357.7000000000001L318.5 285.6L281.2 310.2000000000001L308.1 348.8C271.6 372.8 228.7 385.3 185.1 384.6C134.4 385.4 73.4 357.4 73.4 308.4C73.4 289.7000000000001 84.6 287.7000000000001 102 292.8C125.3 298.1 143.9 292.2000000000001 157.8 278.8C184.2 254.5 181 211.2 157.1 186.9C127.9 157.4 71.9 159.6 42.3 195.3zM360 189.4C344.5 208.2000000000001 321.1 218.8000000000001 296.8 218C258.7 220 225.7 190 226.3 150.8C225.6 134 232.3 117.8 244.7 106.5C258.8 92.6 277.7000000000001 86.8 301 92.1C318.4 97.2000000000001 329.6 95.2000000000001 329.6 76.5C329.6 72.2 329.1 68 328.2000000000001 63.8C311.5000000000001 22.9 268.7000000000001 -0.6 206.8000000000001 -0.6C154.9 -0.8 104.4 15.8 62.7000000000001 46.7L96.4000000000001 86.1L60.8000000000001 113.5L0 41.7L15.4 27.9C67.9 -18.9 135.8 -44.6 206.1 -44.3C257.5 -44.3 300.5 -33.8 339.7 -0.2C396.8 51.2 393.9 149 360 189.4z" />
+    <glyph glyph-name="searchengin"
+      unicode="&#xF3EB;"
+      horiz-adv-x="460" d=" M220.6 317.7L153.4 289.5V404.8L98.7 214.5L153.4 238.7V108.4L220.6 317.7zM137.4 414.4L136.1 409.7L120.9 356.8C80.6 341.3 52 302.2 52 256.5C52 204.2 86.3 160.6 135.4 151V97.4C57.5 107.9 0 175.6 0 256.4C0 336.9 59.8 403.6 137.4 414.4zM448.8 -32.8C437.6 -44 425.7 -45.1 420.2 -43.3C414.8 -41.5 393.0999999999999 -23.4 359.8 1.1C326.5 25.7 326.2 36.8 316.8 57.8C307.4 78.6999999999999 286.4 100.4 259.3 110.1999999999999L249.6 124.8999999999999C224.9 107.9999999999999 196.6 97.9999999999999 168.3 96.1999999999999L170.4 102.8L186.3 152.3C232.8 164.1999999999999 267.2 206.3 267.2 256.5C267.2 311 228.8 358.5999999999999 171.1999999999999 363.5999999999999V415.7C254.4 410.6 320 341.2 320 256.4C320 222.8 308.8 191.7 291 166L305.6 156.4C315.4000000000001 129.3 337.1 108.4 358 99S390.2 89.3 414.8 56C439.4000000000001 22.8 457.5 1.1 459.3 -4.3S460 -21.6 448.8 -32.8zM438.9 -14.9C438.9 -10.5000000000001 435.3 -6.9 430.9 -6.9S422.9 -10.5000000000001 422.9 -14.9S426.5 -22.9 430.9 -22.9S438.9 -19.3 438.9 -14.9z" />
+    <glyph glyph-name="sellcast"
+      unicode="&#xF2DA;"
+      horiz-adv-x="448" d=" M353.4 416H94.7C42.6 416 0 373.4 0 321.4V62.7000000000001C0 10.6 42.6 -32 94.7 -32H353.4C405.5 -32 448.1 10.6 448.1 62.6V321.4C448.1 373.4 405.5 416 353.4 416zM303.4 99.6C275.5 51.4 213.5 34.7 165.2 62.4C142.3 22.6 110.3 53.8 122.9 75.6L138.6 102.8C144.5 113.1 157.8 116.7 168.1 110.7C186.7 99.9 168 110.8 186.6 100C214.2 84.1 250 93.7 266 121.3C281.9 148.9 272.3 184.7 244.7 200.7C226.9 210.9 244.1 201.1 226.1 211.3C201.5 225.5 222.7 263.2000000000001 247.7 248.8C266.3 238 247.6 248.9 266.2 238.1C314.6 210.1 331.3 147.8 303.4 99.6zM325.2 308.4000000000001C308.2 278.9000000000001 308.9 279.6 306.2 276.9000000000001C299.7 270.4000000000001 289.9 268.2000000000001 279.7 273.3000000000001C261.1 284.1 279.8 273.2000000000001 261.2 284C233.6 299.9000000000001 197.8 290.3000000000001 181.8 262.7000000000001S175.5 199.3 203.1 183.3C203.1 183.3 221.6 172.7 221.7 172.7C246.3 158.5 225.1 120.8 200.1 135.2C181.5 146 200.2 135.1 181.6 145.9C133.4 173.7 116.7 236 144.5 284.3C172.4 332.5 234.4 349.2 282.7 321.5L287.5 329.9C301.8 354.8 339.5 333.2 325.2 308.4z" />
+    <glyph glyph-name="sellsy"
+      unicode="&#xF213;"
+      horiz-adv-x="640" d=" M539.71 210.692C542.774 222.949 544 235.513 544 248.076C544 340.618 468.618 416 376.076 416C298.856 416 231.4420000000001 362.988 213.056 288.219C197.734 301.395 178.122 308.749 157.899 308.749C111.628 308.749 73.937 271.059 73.937 224.788C73.937 217.434 74.857 209.773 77.002 202.419C34.102 182.194 6.217 138.6810000000001 6.217 91.185C6.216 23.157 61.68 -32 129.401 -32H510.599C578.319 -32 633.783 23.157 633.783 91.184C633.784 147.568 594.867 197.209 539.71 210.692zM199.88 46.446C199.88 38.172 192.832 31.125 184.559 31.125H153.61C145.336 31.125 138.289 38.173 138.289 46.446V157.374C138.289 165.6470000000001 145.337 172.6950000000001 153.61 172.6950000000001H184.559C192.833 172.6950000000001 199.88 165.6470000000001 199.88 157.374V46.446zM289.357 46.446C289.357 38.172 282.309 31.125 274.035 31.125H243.086C234.812 31.125 227.765 38.173 227.765 46.446V177.904C227.765 186.178 234.813 193.225 243.086 193.225H274.035C282.309 193.225 289.357 186.177 289.357 177.904V46.446zM378.834 46.446C378.834 38.172 371.7869999999999 31.125 363.5129999999999 31.125H332.5639999999999C324.2899999999999 31.125 317.2419999999999 38.173 317.2419999999999 46.446V209.16C317.2419999999999 217.434 324.2899999999999 224.481 332.5639999999999 224.481H363.5129999999999C371.7869999999999 224.481 378.834 217.433 378.834 209.16V46.446zM465.8609999999999 46.446C465.8609999999999 38.172 458.8129999999999 31.125 450.5389999999999 31.125H422.0419999999999C413.7679999999999 31.125 406.7209999999999 38.173 406.7209999999999 46.446V271.059C406.7209999999999 279.6380000000001 413.7679999999999 286.687 422.0419999999999 286.687H450.5389999999999C458.8129999999999 286.687 465.8609999999999 279.639 465.8609999999999 271.0590000000001V46.446z" />
+    <glyph glyph-name="servicestack"
+      unicode="&#xF3EC;"
+      horiz-adv-x="496" d=" M88 232C169.7 221.8 361.7 129.7 392 0H0C99.5 8.1 184.5 137 88 232zM120 384C152.3 348.4 167.7 300.1 166.4 250.4C249.3 216.7 373.7 126.7 400 0H496C455.3 216.1 222.8 368.5 120 384z" />
+    <glyph glyph-name="shirtsinbulk"
+      unicode="&#xF214;"
+      horiz-adv-x="448" d=" M395.2080000000001 226.417H406V192.875H395.2080000000001V226.417zM395.2080000000001 236.042H406V269.584H395.2080000000001V236.042zM395.2080000000001 149.709H406V183.25H395.2080000000001V149.709zM358.75 312.75H325.208V302.25H358.75V312.75zM395.208 106.542H406V140.0840000000001H395.2080000000001V106.542zM311.5 312.75H277.958V302.25H311.5V312.75zM264.25 312.75H231V302.25H264.25V312.75zM217 312.75H183.75V302.25H217V312.75zM395.208 279.208H406V312.75H372.458V302.25H395.208V279.208zM139.416 20.208L170.041 6.791L174.416 16.708L143.791 30.1249999999999L139.416 20.208zM179.083 3L209.417 -10.708L213.791 -0.792L183.458 12.6249999999999L179.083 2.9999999999999zM395.208 63.375H406V96.917H395.2080000000001V63.375zM60.3749999999999 55.208L91 41.792L95.375 51.416L64.75 65.125L60.375 55.208zM100.0409999999999 37.709L130.666 24.292L135.041 34.209L104.4159999999999 47.625L100.0409999999999 37.709zM232.458 -0.792L236.833 -10.708L267.459 3L263.084 12.625L232.458 -0.792zM350.875 51.4160000000001L355.25 41.792L385.874 55.208L381.5 65.125L350.875 51.416zM311.5 34.209L315.875 24.292L346.5 37.709L342.126 47.625L311.5 34.209zM271.833 16.708L276.208 6.7910000000001L306.833 20.208L302.458 30.125L271.833 16.708zM311.5 401.4170000000001H277.958V390.9170000000001H311.5V401.4170000000001zM405.709 401.4170000000001H372.4580000000001V390.9170000000001H405.709V401.4170000000001zM217 401.4170000000001H183.75V390.9170000000001H217V401.4170000000001zM358.75 401.4170000000001H325.208V390.9170000000001H358.75V401.4170000000001zM264.25 401.4170000000001H231V390.9170000000001H264.25V401.4170000000001zM448 444.292V38.292L221.666 -60.292L0 38.292V444.292H448zM418.834 327.334H29.166V57.25L221.958 -28.5L418.833 57.25V327.334zM418.834 415.125H29.166V356.5H418.833V415.125zM75.542 401.4170000000001H42.291V390.9170000000001H75.542V401.4170000000001zM170.042 401.4170000000001H136.5V390.9170000000001H170.042V401.4170000000001zM122.791 401.4170000000001H89.25V390.9170000000001H122.792V401.4170000000001zM130.375 164.875C130.375 215.042 171.5 256.1670000000001 221.667 256.1670000000001C272.125 256.1670000000001 312.959 215.042 312.959 164.875C312.959 114.417 272.126 73.583 221.667 73.583C171.5 73.584 130.375 114.417 130.375 164.875zM251.125 146.791C251.125 133.666 227.208 132.5 218.459 132.5C206.209 132.5 188.709 135.125 182.584 147.375H181.709L172.666 129C187.542 119.667 201.833 116.75 219.916 116.75C239.458 116.75 270.958 122.583 270.958 147.959C270.958 196.084 192.5 164.292 192.5 185.875C192.5 199 213.208 200.75 222.25 200.75C233.041 200.75 251.416 197.542 257.833 187.626H258.708L267.459 204.542C252.292 210.667 240.042 216.501 223.125 216.501C203 216.501 173.542 210.084 173.542 184.709C173.542 140.375 251.125 172.75 251.125 146.791zM122.791 312.75H89.25V302.25H122.792V312.75zM52.792 302.25H75.542V312.75H42V279.208H52.792V302.25zM52.792 269.584H42V236.042H52.792V269.584zM170.042 312.75H136.5V302.25H170.042V312.75zM52.792 226.417H42V192.875H52.792V226.417zM52.792 140.083H42V106.5409999999999H52.792V140.083zM52.792 183.25H42V149.708H52.792V183.25zM52.792 96.917H42V63.375H52.792V96.917z" />
+    <glyph glyph-name="simplybuilt"
+      unicode="&#xF215;"
+      horiz-adv-x="512" d=" M481.2 384H375.2C360.7 384 348.6 372.2 348.6 357.7V318.1H163.3V357.7C163.3 372.2 151.3 384 136.7 384H30.7C16.1 384 4.3 372.2 4.3 357.7V26.3C4.3 11.8 16.1 0 30.9 0H481.3C496.1 0 507.9 11.8 507.9 26.3V357.7C507.7 372.2 495.9 384 481.2 384zM149.8 92.2C113.2 92.2 83.4 121.9 83.4 158.6C83.4 195.5 113.1 225.2 149.8 225.2C186.7 225.2 216.4 195.5 216.4 158.6C216.4 121.9 186.7 92.2000000000001 149.8 92.2000000000001zM362.2000000000001 92.2C325.3000000000001 92.2 295.6 121.9 295.6 158.8C295.6 195.4 325.3 225.2 362.2000000000001 225.2C398.8000000000001 225.2 428.6 195.5 428.6 158.8C428.6 121.9 398.8 92.1999999999999 362.2000000000001 92.1999999999999z" />
+    <glyph glyph-name="sistrix"
+      unicode="&#xF3EE;"
+      horiz-adv-x="448" d=" M448 -1L301.2 147.8C321.2 175.7 333.1 210 333.1 247C333.1 340.1 258.4 415.9 166.6 415.9C74.7 416 0 340.2 0 247.1S74.7 78.2 166.5 78.2C206.3 78.2 242.8 92.4 271.5 116.1L417.5 -32L448 -1zM166.5 117.2C95.9 117.2 38.4 175.5 38.4 247.1S95.9 377 166.5 377S294.6 318.7 294.6 247.1S237.2 117.2 166.5 117.2z" />
+    <glyph glyph-name="skyatlas"
+      unicode="&#xF216;"
+      horiz-adv-x="640" d=" M640 118.7C640 52.8 587.5 4.3 522.5 4.3C356.6 4.3 325.9 254 162.8 254C15.9 254 15.7 41.8 168.4 41.8C210.9 41.8 259.3 59.6 293.7 84.3C299.3 88.4 310.6 100.6 316.5 100.6S327.4 95.6 327.4 89.7C327.4 81.9 314.3 70.6 308.7 65.6C267.8 29.9999999999999 208.4 4.4 154 4.4C70.6 4.3 0 63.4 0 149.3S67.5 298.4 152.8 298.4C338.1 298.4 375.3 52.4999999999999 514.7 52.4999999999999C614.6 52.4999999999999 609.5 192.1999999999999 518.1 192.1999999999999C500.6 192.1999999999999 483.1 180.5999999999999 471.2 180.5999999999999C462.8000000000001 180.5999999999999 455.3000000000001 187.7999999999999 455.3000000000001 196.1999999999999C455.3000000000001 207.7999999999999 460.6000000000001 219.8999999999999 460.6000000000001 232.4999999999999C460.6000000000001 299.0999999999999 409.7000000000001 347.1999999999999 343.7000000000001 347.1999999999999C290.6 347.1999999999999 263.7000000000001 310.2999999999999 254.9000000000001 310.2999999999999C248.7000000000001 310.2999999999999 243.7000000000001 315.2999999999999 243.7000000000001 321.4999999999999C243.7000000000001 327.0999999999999 247.8000000000001 331.7999999999999 251.5000000000001 335.8999999999999C276.8000000000001 364.7 316.2000000000001 379.5999999999999 354.3000000000001 379.5999999999999C433.7000000000001 379.5999999999999 493.4000000000001 321.2 493.4000000000001 241.7999999999999C493.4000000000001 234.8999999999999 493.1000000000001 228.0999999999999 492.2000000000001 221.1999999999999C504.1000000000001 224.2999999999999 516.3000000000001 225.8999999999999 528.1000000000001 225.8999999999999C588.8000000000002 225.8999999999999 640.0000000000001 180.5999999999999 640.0000000000001 118.6999999999999z" />
+    <glyph glyph-name="skype"
+      unicode="&#xF17E;"
+      horiz-adv-x="448" d=" M424.7 148.2C427.6 162.2 429.4 177.1 429.4 192C429.4 305.5 337.5 397.3 224.1 397.3C209.2 397.3 194.4 395.6 180.3 392.6C161.3 407.3 137.7 416 112 416C50.2 416 0 365.8 0 304C0 278.3 8.7 254.7 23.3 235.8C20.4 221.8 18.6 206.9 18.6 192C18.6 78.5 110.5 -13.3 223.9 -13.3C238.8 -13.3 253.6 -11.6 267.7 -8.6C286.7 -23.2 310.3 -31.9 335.9 -31.9C397.7 -31.9 447.9 18.3 447.9 80.1C448 105.7 439.3 129.3 424.7 148.1999999999999zM230.1 56.7C164.5 56.7 109.6 85.9 109.6 121.7C109.6 137.7 118.6 152.3 139.1 152.3C170.3 152.3 173.2 107.4 227.2 107.4C252.9 107.4 269.5 118.8 269.5 133.7000000000001C269.5 152.4 253.5 155.3000000000001 227.5 161.7000000000001C165 177.1 109.7 183.7000000000001 109.7 248.9000000000001C109.7 308.1 168.3 330 218.8 330C273.9000000000001 330 329.6 308.1 329.6 274.6C329.6 257.7000000000001 318.2000000000001 242.8 299.3 242.8C271 242.8 270.1 276.3 224.3 276.3C198.6 276.3 182.3 269.3 182.3 253.8C182.3 234 203.1 232 251.4 220.8C292.8 211.5 342.1 194 342.1 143.2000000000001C342.1 84.1 285 56.7000000000001 230.1 56.7000000000001z" />
+    <glyph glyph-name="slack-hash"
+      unicode="&#xF3EF;"
+      horiz-adv-x="448" d=" M446.2 177.6C440 196.6 419.3 206.7 400.2 200.5L354.8 185.4L324.5 275.4000000000001L369.9 290.5C389 296.7000000000001 399 317.3000000000001 392.9 336.4000000000001C386.7 355.4000000000001 366 365.5 346.9 359.3000000000001L301.5 344.2000000000001L285.8 391.2000000000001C279.6 410.2000000000001 258.9000000000001 420.3000000000001 239.8 414.1C220.7 407.9000000000001 210.7 387.3000000000001 216.8 368.2000000000001L232.5 321.2000000000001L139.1 290.0000000000001L123.4 337.0000000000001C117.2 356.0000000000001 96.5 366.1 77.4 359.9000000000001C58.3 353.7000000000001 48.3 333.1000000000001 54.4 314.0000000000001L70.1 267.0000000000001L24.8 252.0000000000001C5.7 245.8000000000001 -4.3 225.2000000000001 1.8 206.1000000000001C6.8 191.6 20.9 182.1 35.4 181.5000000000001C42.2 180.5000000000001 47.4 183.1000000000001 93.1 198.3000000000001L123.4 108.3000000000001L78 93.2C59 87 48.9 66.3 55 47.3C60 32.8 74.1 23.3 88.6 22.7C95.4 21.7 100.6 24.3 146.3 39.5L162 -7.5C167.9 -24.4 186.7 -36.5 208 -30.4C227.1 -24.2 237.1 -3.6 231 15.5L215.3 62.5L308.9 93.8L324.6 46.8C330.5 29.9 349.3 17.8 370.6 23.9C389.7 30.1 399.7 50.7 393.6 69.8L377.9 116.8L423.3 131.9C442.3 137.9 452.4 158.6 446.2 177.6zM192.1 130.4L161.8 220.6L255.3 251.9000000000001L285.6 161.7000000000001L192.1 130.4z" />
+    <glyph glyph-name="slack"
+      unicode="&#xF198;"
+      horiz-adv-x="448" d=" M244.2 230.5L263.5 172.8L203.7 152.8L184.4 210.5L244.2 230.5zM285.6 -13.2C131.6 -59.4 65 -23.6 18.8 130.4S8.4 351 162.4 397.2C316.4 443.4 383 407.6 429.2 253.6C475.4 99.6 439.6 33 285.6 -13.2zM366.2 183C362.3 195.2 349 201.6 336.8 197.7L307.8 188L288.5 245.7L317.5 255.4C329.7 259.3 336.1 272.6 332.2 284.8C328.3 297 315 303.4 302.8 299.5L273.8 289.8L263.8 319.9C259.9000000000001 332.1 246.6 338.5 234.4 334.6C222.2 330.7 215.8 317.4 219.7 305.2L229.7 275.1L169.9 255L159.9 285.1C156 297.3 142.7000000000001 303.7 130.5 299.8C118.3 295.9 111.9 282.6 115.8 270.4L125.8 240.3L96.8 230.6C84.6 226.7 78.2 213.4 82.1 201.2C85.3 191.9 94.3 185.8 103.6 185.4C107.9 184.8 111.3 186.4 140.5 196.1L159.8000000000001 138.4L130.8000000000001 128.7C118.6 124.8 112.2000000000001 111.5 116.1 99.3C119.3000000000001 90 128.3000000000001 83.9 137.6 83.5C141.9 82.9 145.3 84.5 174.5 94.2L184.5 64.1C188.2 53.3 200.3000000000001 45.4999999999999 213.9 49.4C226.1 53.3 232.5000000000001 66.6 228.6 78.8L218.6 108.9L278.4000000000001 129L288.4000000000001 98.9C292.1 88.1 304.2000000000001 80.3 317.8 84.2C330 88.1 336.4000000000001 101.4 332.5 113.6L322.5 143.7L351.5 153.4C363.7 157.6 370.1 170.9 366.2 183z" />
+    <glyph glyph-name="slideshare"
+      unicode="&#xF1E7;"
+      horiz-adv-x="512" d=" M249.429 236.564C249.429 204.848 221.714 178.847 187.712 178.847C153.711 178.847 125.996 204.848 125.996 236.564C125.996 268.565 153.711 294.28 187.712 294.28C221.713 294.28 249.429 268.565 249.429 236.564zM503.723 186.562C485.437 163.989 450.579 136.274 397.4340000000001 114.559C453.722 -77.163 260 -107.735 263.143 -9.446C263.143 -11.16 262.857 43.413 262.857 83.986C258.572 84.844 254.286 85.986 249.143 87.129C249.143 46.271 248.857 -11.16 248.857 -9.446C252 -107.735 58.278 -77.163 114.566 114.559C61.421 136.274 26.563 163.989 8.276 186.562C-0.867 200.276 9.134 214.849 24.277 204.277C26.277 202.849 28.562 201.42 30.562 199.992V398.284C30.563 425.713 51.135 448 76.565 448H435.722C461.151 448 481.724 425.713 481.724 398.284V199.991L487.724 204.276C502.867 214.849 512.867 200.276 503.723 186.562zM457.151 375.712C457.151 408.57 446.579 421.428 416.2920000000001 421.428H98.566C66.85 421.428 57.993 410.5700000000001 57.993 375.712V183.419C125.71 147.989 183.713 154.275 215.428 155.418C228.857 155.704 237.429 153.132 242.572 147.703C244.261 146.016 252.595 138.257 262.859 130.5600000000001C264.002 146.275 272.86 156.275 296.575 155.4180000000001C328.862 153.9900000000001 388.293 147.7030000000001 457.152 185.1340000000001V375.712zM331.146 294.28C297.144 294.28 269.43 268.565 269.43 236.564C269.43 204.848 297.145 178.847 331.146 178.847C365.433 178.847 392.862 204.848 392.862 236.564C392.862 268.565 365.4330000000001 294.28 331.146 294.28z" />
+    <glyph glyph-name="snapchat-ghost"
+      unicode="&#xF2AC;"
+      horiz-adv-x="512" d=" M510.846 55.327C505.635 43.17 483.607 34.238 443.486 28.009C441.422 25.223 439.711 13.323 436.979 4.053C435.354 -1.513 431.356 -4.816 424.851 -4.816L424.554 -4.811C415.159 -4.811 405.351 -0.4880000000001 385.702 -0.4880000000001C359.181 -0.4880000000001 350.04 -6.5310000000001 329.448 -21.0760000000001C307.616 -36.5140000000001 286.677 -49.8400000000001 255.421 -48.4750000000001C223.775 -50.8090000000001 197.396 -31.5670000000001 182.55 -21.0710000000001C161.836 -6.4280000000001 152.722 -0.4890000000001 126.309 -0.4890000000001C107.445 -0.4890000000001 95.573 -5.2090000000001 87.457 -5.2090000000001C79.384 -5.2090000000001 76.244 -0.2870000000001 75.035 3.8309999999999C72.332 13.0199999999999 70.631 25.0939999999999 68.512 27.9609999999999C47.833 31.1699999999999 1.202 39.3049999999999 0.014 60.1109999999999A10.627 10.627 0 0 0 8.891 71.1799999999999C78.474 82.6349999999999 109.815 154.0809999999999 111.118 157.1139999999999C111.192 157.2899999999999 111.273 157.4579999999999 111.355 157.6289999999999C115.068 165.1659999999999 115.899 171.4779999999999 113.818 176.3819999999999C108.768 188.2779999999999 86.946 192.5459999999999 77.765 196.1779999999999C54.05 205.5439999999999 50.75 216.3059999999999 52.153 223.6819999999999C54.59 236.5179999999999 73.878 244.4169999999999 85.155 239.1349999999999C94.074 234.9539999999999 101.998 232.8379999999999 108.702 232.8379999999999C113.724 232.8379999999999 116.914 234.0419999999999 118.662 235.0089999999999C116.619 270.9449999999999 111.561 322.2989999999999 124.349 350.9779999999999C158.122 426.6960000000001 229.705 432.58 250.826 432.58C251.77 432.58 259.967 432.669 260.936 432.669C313.084 432.669 363.19 405.889 387.659 351.026C400.436 322.376 395.408 271.234 393.354 235.017C394.936 234.145 397.711 233.075 401.953 232.878C408.35 233.164 415.768 235.267 424.022 239.135C430.107 241.981 438.428 241.596 444.502 239.077L444.531 239.067C454.007 235.682 459.97 228.852 460.12 221.197C460.304 211.45 451.598 203.032 434.242 196.179C432.124 195.344 429.548 194.524 426.808 193.654C417.011 190.548 402.208 185.849 398.192 176.383C396.113 171.479 396.9360000000001 165.172 400.652 157.635C400.739 157.467 400.818 157.293 400.891 157.12C402.192 154.09 433.506 82.66 503.121 71.186C509.548 70.128 514.284 63.309 510.846 55.3270000000001z" />
+    <glyph glyph-name="snapchat-square"
+      unicode="&#xF2AD;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM393.5 101.1C390 93 375.4 87.1 348.7 82.9C347.3 81.0000000000001 346.2 73.1 344.4 67.0000000000001C343.3 63.3000000000001 340.7 61.1000000000001 336.3 61.1000000000001H336.1C329.9 61.1000000000001 323.3 64.0000000000001 310.3 64.0000000000001C292.7 64.0000000000001 286.6 60.0000000000001 272.9 50.3000000000001C258.4 40.0000000000001 244.5 31.2 223.7 32.1000000000001C202.7 30.5000000000001 185.1 43.3000000000001 175.2 50.3000000000001C161.4 60.0000000000001 155.4 64.0000000000001 137.8 64.0000000000001C125.3 64.0000000000001 117.4 60.9 112 60.9C106.6 60.9 104.5 64.2000000000001 103.7 66.9C101.9 73.0000000000001 100.8 81.0000000000001 99.4 82.9C85.6 85.0000000000001 54.6 90.4 53.9 104.3C53.7 107.9 56.2 111.1 59.8 111.7C106.1 119.3 126.9 166.8 127.8 168.8C127.8 168.9 127.9 169 128 169.1C130.5 174.1 131 178.3 129.6 181.6C126.2 189.5 111.7 192.3 105.6 194.8C89.8 201 87.6 208.2 88.6 213.1C90.2 221.6 103 226.9000000000001 110.5 223.4C116.4 220.6 121.7 219.2000000000001 126.2 219.2000000000001C129.5 219.2000000000001 131.7 220.0000000000001 132.8 220.6000000000001C131.4 244.5000000000001 128.1 278.6 136.6 297.7000000000001C159.1 348 206.7 352 220.7 352C221.3 352 226.8 352.1 227.4 352.1C262.1 352.1 295.4 334.3 311.7 297.8C320.2 278.7000000000001 316.9 244.7 315.5 220.7C316.6 220.1 318.4 219.4 321.2 219.3C325.5 219.5 330.4 220.9 335.9 223.5C339.9 225.4 345.5 225.1 349.5 223.5C355.8 221.2 359.8 216.7 359.9 211.6C360 205.1 354.2 199.5 342.7 195C341.3 194.4 339.6 193.9 337.8 193.3C331.3 191.2 321.4000000000001 188.1 318.8 181.8C317.4000000000001 178.5 318 174.3 320.4000000000001 169.3C320.5000000000001 169.2 320.5000000000001 169.1 320.6 169C321.5 167 342.3 119.5 388.6 111.9C392.6 110.9 395.7000000000001 106.4 393.5 101.1z" />
+    <glyph glyph-name="snapchat"
+      unicode="&#xF2AB;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM417.5 101.1C414 93 399.4 87.1 372.7 82.9C371.3 81.0000000000001 370.2 73.1 368.4 67.0000000000001C367.3 63.3000000000001 364.7 61.1000000000001 360.3 61.1000000000001H360.1C353.9 61.1000000000001 347.3 64.0000000000001 334.3 64.0000000000001C316.7 64.0000000000001 310.6 60.0000000000001 296.9 50.3000000000001C282.4 40.0000000000001 268.5 31.2 247.7 32.1000000000001C226.7 30.5000000000001 209.1 43.3000000000001 199.2 50.3000000000001C185.4 60.0000000000001 179.4 64.0000000000001 161.8 64.0000000000001C149.3 64.0000000000001 141.4 60.9 136 60.9C130.6 60.9 128.5 64.2000000000001 127.7 66.9C125.9 73.0000000000001 124.8 81.0000000000001 123.4 82.9C109.6 85.0000000000001 78.6 90.4 77.9 104.3C77.7 107.9 80.2 111.1 83.8 111.7C130.1 119.3 150.9 166.8 151.8 168.8C151.8 168.9 151.9 169 152 169.1C154.5 174.1 155 178.3 153.6 181.6C150.2 189.5 135.7 192.3 129.6 194.8C113.8 201 111.6 208.2 112.6 213.1C114.2 221.6 127 226.9000000000001 134.5 223.4C140.4 220.6 145.7 219.2000000000001 150.2 219.2000000000001C153.5 219.2000000000001 155.7 220.0000000000001 156.8 220.6000000000001C155.4 244.5000000000001 152.1 278.6 160.6 297.7000000000001C183.1 348 230.7 352 244.7 352C245.3 352 250.8 352.1 251.4 352.1C286.1 352.1 319.4 334.3 335.7 297.8C344.2 278.7000000000001 340.9 244.7 339.5 220.7C340.6 220.1 342.4 219.4 345.2 219.3C349.5 219.5 354.4 220.9 359.9 223.5C363.9 225.4 369.5 225.1 373.5 223.5C379.8 221.2 383.8 216.7 383.9 211.6C384 205.1 378.2 199.5 366.7 195C365.3 194.4 363.6 193.9 361.8 193.3C355.3 191.2 345.4000000000001 188.1 342.8 181.8C341.4000000000001 178.5 342 174.3 344.4000000000001 169.3C344.5000000000001 169.2 344.5000000000001 169.1 344.6 169C345.5 167 366.3 119.5 412.6 111.9C416.6 110.9 419.7000000000001 106.4 417.5 101.1z" />
+    <glyph glyph-name="soundcloud"
+      unicode="&#xF1BE;"
+      horiz-adv-x="640" d=" M111.4 191.7L117.2 126.7L111.4 58.4C111.1 55.9 109.2 54 107 54S102.8 55.9 102.8 58.4L97.2 126.7L102.8 191.7C102.8 193.9 104.7 195.9 107 195.9C109.2 195.9 111.1 193.9 111.4 191.7zM132.8 237.3C130 237.3 128.1 235.1 127.8 232.3L122.8 126.7L127.8 58.4C128.1 55.6 130 53.4 132.8 53.4C135.3 53.4 137.5 55.6 137.5 58.4L143.3 126.7L137.5 232.3C137.5 235.1 135.3 237.3 132.8 237.3zM158.3 261.4C155.2 261.4 153 259.2 152.7 256.1L148.3 126.1L152.7 58.3C153 55.1999999999999 155.2 52.9999999999999 158.3 52.9999999999999C161.1 52.9999999999999 163.6 55.1999999999999 163.6 58.3L168.9 126.1L163.6 256.1C163.6 259.2 161.1 261.4 158.3 261.4zM7.2 164.8C5.8 164.8 5 163.7 4.7 162.3L0 126.7L4.7 91.7C5 90.3 5.8 89.2 7.2 89.2S9.4 90.3 9.7 91.7L15.3 126.7L9.7 162.3C9.4 163.7 8.6 164.8 7.2 164.8zM30.8 186.7C29.4 186.7 28.3 185.6 28.3 184.2L21.9 126.7L28.3 70.6C28.3 68.9 29.4 67.8 30.8 67.8S33.3 68.9 33.6 70.3L40.8 126.6999999999999L33.6 184.1999999999999C33.3 185.5999999999999 32.2 186.6999999999999 30.8 186.6999999999999zM56.1 198.1C54.4 198.1 53 196.7 52.8 194.8L47 126.7L52.8 60.9C53.1 59.2 54.5 57.8 56.1 57.8C57.8 57.8 59.2 59.1999999999999 59.2 60.9L66.1 126.7L59.2 194.8C59.2 196.7 57.8 198.1 56.1 198.1zM81.4 200.3C79.5 200.3 77.8 198.9 77.8 196.7L72 126.7L77.8 58.9C77.8 56.7 79.5 55.3 81.4 55.3S85 56.6999999999999 85.3 58.9L91.7 126.7L85.3 196.7C85 198.9 83.3 200.3 81.4 200.3zM322.8 311.2C321.7 312 320 312.6 318.6 312.6C316.4000000000001 312.6 314.4000000000001 311.8 313 310.7C311.1 309 309.9 306.5 309.7 304V303.2L306.4 126.5L308.1 94L309.8 62.3C310.1 57.6 314 53.7 318.7 53.7S327.3 57.6 327.3 62.3L331.2 126.5L327.3 304C326.9 307 325.3 309.8 322.8 311.2zM296.1 295.9C294.7000000000001 296.7 293.3 297.3 291.7000000000001 297.3S288.6 296.7 287.3000000000001 295.9C285.1000000000001 294.5 283.7000000000001 292 283.7000000000001 289.2L283.4000000000001 287.5L280.6 126.7S280.6 126.4 283.7000000000001 61.1V60.8C283.7000000000001 59.1 284.3000000000001 57.5 285.4000000000001 56.1C287.1 54.2 289.3 53 291.8 53C294 53 296 54.1 297.4000000000001 55.5C299.1 56.9 299.9000000000001 58.8 299.9000000000001 61.1L300.2000000000001 67.8L303.3000000000001 126.4L300.0000000000001 289.2000000000001C299.7000000000001 292.0000000000001 298.3000000000001 294.5000000000001 296.1000000000001 295.9000000000001zM184.7 273.4C181.6 273.4 178.9 270.6 178.9 267.3L174.5 126.7L178.9 59.5C179.2 56.2 181.7 53.7 184.7 53.7C188 53.7 190.5 56.2 190.8 59.5L195.8 126.7L190.8 267.3C190.6 270.6 188.1 273.4 184.7 273.4zM561.4 210.6C550.6 210.6 540.3 208.4 530.8 204.5C524.4 275.3 464.9999999999999 330.9 392.5 330.9C374.7 330.9 357.5 327.6 342.2 321.5C336.0999999999999 319.3 334.3999999999999 317.1 334.3999999999999 312.3V62.6C334.3999999999999 57.6 338.2999999999999 54 343 53.4H561.3C604.5999999999999 53.4 639.9 88.4 639.9 131.7000000000001C640 175.3000000000001 604.6999999999999 210.6000000000001 561.4 210.6000000000001zM264.7 270.9C260.5 270.9 257.2 267.6 256.9 263.1L253.6 126.4L256.9 60.8C257.2 56.6 260.5 53.3 264.7 53.3C268.9 53.3 272.2 56.6 272.2 60.8L276.1 126.4L272.2 263.1C271.9 267.6 268.9 270.9 264.7 270.9zM211.1 278.7C207.8 278.7 204.7 275.6 204.7 272L200.8 126.7L204.7 59.8C205 56.1999999999999 207.8 53.4 211.1 53.4C214.7 53.4 217.5 56.2 217.8 59.8L222.2 126.6999999999999L217.8 272C217.5 275.5999999999999 214.7 278.7 211.1 278.7zM237.8 275.3C233.9 275.3 230.9 272.2 230.9 268.4L227 126.7L230.9 60.3C231.2 56.4 234 53.4 237.8 53.4S244.7 56.5 244.7 60.3L248.9 126.6999999999999L244.7 268.3999999999999C244.7 272.3 241.7 275.3 237.8 275.3z" />
+    <glyph glyph-name="speakap"
+      unicode="&#xF3F3;"
+      horiz-adv-x="448" d=" M352 416H96C43.2 416 0 372.8 0 320V64C0 11.2 43.2 -32 96 -32H352C404.8 -32 448 11.2 448 64V320C448 372.8 404.8 416 352 416zM221 65.1C181.4 65.1 139.1 82.9 139.1 118.8V146H179V128.2C179 113.1 198.5 103.7 220.9 103.7C245.1 103.7 262.2 114.1 262.2 133.2C262.2 157 235 165.1 207.5 175.8C175.6 188.2 144.4 202 144.4 244.9C144.4 292.9 183 311.3 224.3 311.3C261.9000000000001 311.3 299.8 297.2000000000001 299.8 269.4V238.2H259.9000000000001V254.3C259.9000000000001 266.4 242.1 272.8 224.3000000000001 272.8C204.8000000000001 272.8 188.7000000000001 264.7000000000001 188.7000000000001 246.6C188.7000000000001 224.5 211.2000000000001 217.4 235.7000000000001 207.7C271.6 195.3 306.8000000000001 180.5 306.8000000000001 136.2000000000001C306.9000000000001 87.6 266.0000000000001 65.1 221.0000000000001 65.1z" />
+    <glyph glyph-name="spotify"
+      unicode="&#xF1BC;"
+      horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM348.7 75.1C344.5 75.1 341.9 76.4 338 78.7000000000001C275.6 116.3000000000001 203 117.9 131.3 103.2000000000001C127.4 102.2000000000001 122.3 100.6 119.4 100.6C109.7 100.6 103.6 108.3 103.6 116.4C103.6 126.7000000000001 109.7 131.6 117.2 133.2000000000001C199.1 151.3000000000001 282.8 149.7000000000001 354.2 107.0000000000001C360.3 103.1000000000001 363.9 99.6000000000001 363.9 90.5000000000001S356.8 75.1000000000001 348.7 75.1000000000001zM375.6 140.7000000000001C370.4 140.7000000000001 366.9 143.0000000000001 363.3 144.9C300.8 181.9 207.6 196.8000000000001 124.7 174.3C119.9 173 117.3 171.7 112.8 171.7C102.1 171.7 93.4 180.4 93.4 191.1S98.6 208.9 108.9 211.8C136.7 219.6 165.1 225.4 206.6999999999999 225.4C271.5999999999999 225.4 334.3 209.3 383.7 179.9C391.8 175.1 395 168.9 395 160.2C394.8999999999999 149.4 386.5 140.7 375.6 140.7zM406.6 216.9C401.4 216.9 398.2 218.2000000000001 393.7 220.8000000000001C322.5 263.3000000000001 195.2 273.5000000000001 112.8 250.5000000000001C109.2 249.5000000000001 104.7 247.9000000000001 99.9 247.9000000000001C86.7 247.9000000000001 76.6 258.2000000000001 76.6 271.5C76.6 285.1 85 292.8000000000001 94 295.4000000000001C129.2 305.7000000000001 168.6 310.6 211.5 310.6C284.5 310.6 361 295.4000000000001 416.9 262.8C424.7 258.3 429.8 252.1 429.8 240.2C429.8 226.6 418.8 216.9 406.6 216.9z" />
+    <glyph glyph-name="stack-exchange"
+      unicode="&#xF18D;"
+      horiz-adv-x="448" d=" M17.7 115.7H430.4V93.7C430.4 56 401.1 25.7 365.1 25.7H346.1L259.3 -64V25.7H83C47 25.7 17.7 56 17.7 93.7V115.7zM17.7 139.3H430.4V224.3H17.7V139.3zM17.7 248.7H430.4V333.7000000000001H17.7V248.7zM365 448H83C47 448 17.7 417.7 17.7 380.3V358H430.4V380.3C430.3 417.7 401 448 365 448z" />
+    <glyph glyph-name="stack-overflow"
+      unicode="&#xF16C;"
+      horiz-adv-x="384" d=" M293.7 148L112.5 232.5L129.2 269L310.5 184.3L293.7 148zM341.7 224L188.2 352.3L162.7 321.5L316.2 193.2L341.7 224zM381.3 255.7L262 416L230 392L349.3 231.7L381.3 255.7zM290.7 137L95 178.3L86.8 139L282.5 98L290.7 137zM322.3 8H42.7V128H2.7V-32H362.2V128H322.2V8zM282.5 88H82.5V48.3H282.5V88z" />
+    <glyph glyph-name="staylinked"
+      unicode="&#xF3F5;"
+      horiz-adv-x="440" d=" M201.6 320.6C205.7 323.8 211.9 323.6 215.4 320.1L385.4 152.8L382.7 155.5L427 114.1999999999999C430.7 110.6999999999999 430.3 105.1999999999999 426.3 101.9999999999999L228.3 -61.9000000000001C218.4 -69.5000000000001 211 -62.7000000000001 211 -62.7000000000001L2.3 133.4C-1.2 136.9 -0.7 142.4 3.5 145.6L49.3 180.5C53.5 183.6999999999999 59.7 183.5 63.2 180L215.1 32.4999999999999C218.8 28.9999999999999 225.1 28.8 229.3 32.1L322.5 106.1C326.6 109.3 327 114.8 323.4 118.3L239.4 199.6C235.8 203.1 229.5 203.3 225.4 200.1L225.3 200C221.2 196.8 214.9 197 211.3 200.5L143.2 264.8C139.7 268.3 140.1 273.8 144.3 277L201.6 320.5999999999999M216.4 63.3C220.1 59.8 226.5 59.6 230.7 62.9L280.9 101.7L280.6 102L288.3 108C292.5 111.2 292.9 116.7 289.2 120.2L232.1 174.6C228.5 178.1 222.0999999999999 178.3 217.9 175.1L217.8 175C213.6 171.8 207.3 171.8999999999999 203.6 175.3999999999999L109 267.2C105.4 270.7 105.9 276.1 110.1 279.4L202.3 350.9C206.4 354.1 212.6 353.9 216.2 350.4L376.6 191.4C380.3 187.9 386.6 187.7 390.7000000000001 190.9L436.5000000000001 226.7C440.6000000000001 229.9 440.9000000000001 235.4 437.2000000000001 238.9L226.7 445.5C225.2 446.7 218.7 451 210.4 444.4L3.6 282.3C-0.6 279.1 -1.2 273.6 2.4 270.1L44.7 228.4000000000001" />
+    <glyph glyph-name="steam-square"
+      unicode="&#xF1B7;"
+      horiz-adv-x="448" d=" M185.2 91.5C192.9 110 184.2 131.2 165.6 138.9L136.1 151.1C147.5 155.4 160.4 155.6 172.5 150.6C184.7 145.5 194.1 136 199.2 123.9C204.2 111.7 204.2 98.3 199.1 86.2C188.6 61.1 159.7 49.2 134.5 59.7C122.9 64.5 114.1 73.3 109.1 83.9L137.6 72.1C156.2 64.3 177.5 72.9999999999999 185.2 91.4999999999999zM400 416H48C21.5 416 0 394.5 0 368V207.3L116.6 159.2C128.6 167.4 142.8 171.3 157.3 170.5L212.7 250.7V251.8C212.7 300 252 339.3 300.3 339.3S387.9 300 387.9 251.8C387.9 202.6 347 163.1 298.3 164.3L219.3 107.9999999999999C220.9 69.4999999999999 190.2 39.1999999999999 153.6 39.1999999999999C121.8 39.1999999999999 95.1 61.8999999999999 89.1 91.8999999999999L0 128.8V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM300.3 193.5C268.1 193.5 241.9 219.6 241.9 251.8S268.1 310.1 300.3 310.1S358.7 283.9000000000001 358.7 251.8S332.5 193.5 300.3 193.5zM300.4000000000001 208.1C324.6 208.1 344.3 227.7 344.3 251.9C344.3 276.1 324.7 295.7 300.4000000000001 295.7C276.2000000000001 295.7 256.5000000000001 276.1 256.5000000000001 251.9C256.5000000000001 227.7 276.2000000000001 208.1 300.4000000000001 208.1z" />
+    <glyph glyph-name="steam-symbol"
+      unicode="&#xF3F6;"
+      horiz-adv-x="448" d=" M395.5 270.5C395.5 236.7 368 209.5 334.5 209.5C300.7 209.5 273.5 236.8 273.5 270.5S300.8 331.5 334.5 331.5C368 331.5 395.5 304.3 395.5 270.5zM448 270.3C448 207.3 397 156.5 334.3 156.5L225 76.7C221 33.7 184.5 -0.1 140.5 -0.1C100 -0.1 65.8 28.7 57.5 66.9L0 90V197.3L97.2 158C112.3 167.2 129.4 171.3 149.2 169.5L220.2 271.2C220.7 333.5 271.7 384 334.2 384C397 384 448 333 448 270.3zM203 85C203 119.7 175.2 147.5 140.5 147.5C136 147.5 131.5 147 127 146L153 135.5C178.5 125.3 191 96.5 180.7 71C170.5 45.5 141.5 33 116 43.5C105.8 47.5 95.5 51.8 85.3 55.7C95.8 36 116.5 22.5 140.5 22.5C175.2 22.5 203 50.3 203 85zM410.5 270.3C410.5 312.3 376.2 346.5 334.3 346.5C292 346.5 257.8 312.3 257.8 270.3C257.8 228.1 292.1 194.1 334.3 194.1C376.2 194 410.5 228.0000000000001 410.5 270.3z" />
+    <glyph glyph-name="steam"
+      unicode="&#xF1B6;"
+      horiz-adv-x="496" d=" M496 192C496 55 384.8 -56 247.6 -56C133.8 -56 38 20.3 8.6 124.4L103.8 85.1C110.2 52.9999999999999 138.7 28.7 172.7 28.7C211.9 28.7 244.6 61.1 242.9 102.2L327.4 162.4C379.5 161.1 423.2 203.3 423.2 255.9C423.2 307.5 381.2 349.4 329.5 349.4S235.8 307.4 235.8 255.9V254.7L176.6 169C161.1 169.9 145.9 165.6 133.1 156.9L0 211.9C10.2 339.6 117.1 440 247.6 440C384.8 440 496 329 496 192zM155.7 63.7L125.2 76.3A52.79 52.79 0 0 1 152.4 50.5C179.3 39.3 210.2 52.1 221.4 78.9C226.8 91.9 226.9 106.2 221.5 119.2C216.1 132.2 206 142.4 193 147.8C180.1 153.2 166.3 153 154.1 148.4L185.6 135.4C205.4 127.2000000000001 214.8 104.5000000000001 206.5 84.7000000000001C198.2 64.8000000000001 175.5 55.5000000000001 155.7 63.7000000000001zM329.5 193.6C295.1 193.6 267.1 221.6 267.1 255.9S295.1 318.2 329.5 318.2S391.9 290.2 391.9 255.9S364 193.6 329.5 193.6zM329.6 209.2C355.5 209.2 376.5 230.2 376.5 256C376.5 281.9 355.5 302.8 329.6 302.8S282.7000000000001 281.8 282.7000000000001 256C282.8000000000001 230.2 303.8000000000001 209.2 329.6 209.2z" />
+    <glyph glyph-name="sticker-mule"
+      unicode="&#xF3F7;"
+      horiz-adv-x="576" d=" M353.1 -61.8C347.2000000000001 -64.7 321 -65 316.6 -61.3C312.5 -58.3 314.4000000000001 -49.4 315.1 -46.3C317.3 -31.3 312.6 -38.4 305.3 -34.8C302.2 -33.3 301.2 -29.3 300.7 -24.8C300.2 -23.3 299.7 -22.3 299.2 -21.3C297.5 -10.6 306 12.3 307.4 22.1C312.3 45.8 306.7 59.3 308.9 68.9999999999999C312.6 85.1999999999999 313 72.4999999999999 313 98.8999999999999C311.6 124.7999999999999 316.3 135.7999999999999 313.5 137.7999999999999C298.7 137.7999999999999 249.2 127.0999999999999 201.3 135.7999999999999C155.2 144.6999999999999 141.9 164.7999999999999 135.9 166.6999999999999C125.6 171.1999999999999 112.7 166.1999999999999 108.6 159.6999999999999C108.5 159.5999999999999 73.6 89.0999999999999 69 71.8999999999999C62.8 51.3999999999999 68.5 24.4999999999999 73.1 5.0999999999999C73.1 4.9999999999998 77.6 -9.5000000000002 83.4 -14.4000000000001C85.5 -15.9000000000001 88.5 -16.9000000000001 90.6 -18.9000000000001C93.4 -21.6000000000001 100 -34.1000000000001 100.4 -34.9000000000001C103 -39.4000000000001 104 -42.9000000000001 98.9 -45.4000000000001C95.3 -47.4000000000001 89.6 -47.9000000000001 84.5 -47.9000000000001C81.9 -48.4000000000001 83 -51.4000000000001 81.4 -52.9000000000001C78.5 -55.7000000000002 60.7 -59.0000000000002 51.5 -55.4000000000001C48.9 -54.4000000000001 45.8 -52.4000000000001 45.3 -50.4000000000001C43.8 -46.4000000000001 47.4 -41.4000000000001 44.3 -37.9000000000001C39.8 -35.0000000000002 31.2 -35.9000000000001 27.3 -25.9000000000001C25.1 -20.5000000000002 24.7 -18.3000000000001 24.7 23.4999999999998C24.7 33.1999999999998 18.8 62.1999999999998 16.5 70.3999999999998C15 75.8999999999998 15 81.8999999999998 16.5 86.3999999999998C16.8 87.2999999999998 20.6 90.9999999999998 20.6 99.3999999999998C19.6 100.8999999999998 16 99.8999999999998 15.5 100.8999999999998C5.1 181.4999999999998 9.6 179.8999999999998 7.8 199.1999999999998C6.3 215.1999999999998 -3.1 243.0999999999998 1.1 263.4999999999999C1.6 265.8999999999999 4.5 284.4999999999999 25.3 302.3999999999999C56.3 329.0999999999999 73.7 340.6999999999998 184.3 313.8999999999999C185.4 313.4999999999999 250.6 292.7999999999999 295 322.8999999999999C310.5 334.1999999999998 323.8 334.1999999999998 330.5 338.8999999999999C330.6 338.9999999999999 392.2 390.9999999999999 417.5 404.1999999999998C464.7 433.5999999999999 487.4 420.8999999999998 492.6 422.1999999999998C497.3 423.1999999999998 506 447.9999999999999 509.6 447.9999999999999C515.1 447.9999999999999 511.2 427.7999999999999 513.2 422.0999999999999C513.7 420.0999999999999 516.8000000000001 417.0999999999999 519.4000000000001 417.0999999999999C521.7 417.0999999999999 521.1000000000001 417.8999999999999 529.7 422.0999999999999C538.1 427.4999999999999 544.6 439.6999999999998 550.3000000000001 439.0999999999999C562.0000000000001 437.4999999999999 531.3000000000001 397.4999999999999 531.3000000000001 392.1999999999998C531.3000000000001 390.1999999999998 531.5000000000001 391.3999999999999 535.9000000000001 382.6999999999998C538.5000000000001 377.1999999999998 540.5000000000001 369.1999999999998 542.1000000000001 362.6999999999998C550.4000000000001 332.9999999999999 547.8000000000002 348.0999999999999 555.5000000000001 325.7999999999999C575.7000000000002 275.6999999999998 576.1000000000001 280.5999999999999 576.1000000000001 272.8999999999999C576.1000000000001 265.3999999999999 572.0000000000001 261.8999999999999 568.9000000000001 256.3999999999999C567.4000000000001 253.3999999999999 564.3000000000001 248.8999999999999 561.7 248.3999999999999C559 247.6999999999999 568.7 249.8999999999999 548.3000000000001 245.8999999999999C541.1 244.8999999999999 534.9000000000001 250.3999999999999 533.4000000000001 255.3999999999999C531.8000000000001 260.0999999999998 536.2 265.4999999999999 521.6000000000001 278.2999999999999C511.3000000000001 288.2999999999999 500.5000000000001 289.5999999999999 489.7000000000002 295.2999999999999C479.9000000000001 300.9999999999999 477.8000000000002 294.2999999999999 471.7000000000002 287.2999999999999C453.7000000000002 264.3999999999999 437.7000000000002 240.3999999999999 419.7000000000002 217.4999999999998C407.9000000000002 202.4999999999998 395.5000000000002 187.0999999999999 386.2000000000002 170.0999999999999C382.3000000000002 163.2999999999999 376.7000000000002 141.9999999999998 375.9000000000002 140.1999999999999C369.7000000000002 122.4999999999999 370.4000000000002 114.3999999999999 359.4000000000002 71.8999999999999C356.3000000000002 61.8999999999999 353.7000000000002 50.4999999999999 350.7000000000002 39.4999999999999C348.5000000000002 32.6999999999999 343.3000000000002 -9.8000000000001 350.2000000000002 -19.9000000000001C352.3000000000002 -23.4000000000001 358.9000000000002 -24.4000000000001 361.5000000000002 -27.9000000000001C361.6000000000002 -28.0000000000001 371.1000000000002 -46.1000000000001 370.8000000000002 -47.9000000000001C370.8000000000002 -54.0000000000001 361.4000000000002 -53.5000000000001 359.5000000000002 -54.4000000000001C354.7000000000002 -57.3000000000001 355.7000000000002 -60.3000000000001 353.1000000000002 -61.8000000000001" />
+    <glyph glyph-name="strava"
+      unicode="&#xF428;"
+      horiz-adv-x="369.2" d=" M301.6 156L257.7000000000001 67.8L213.1000000000001 156H145.5000000000001L257.7000000000001 -64L369.2000000000001 156H301.6zM151.4 448L0 156H89.2L151.4 272.1L213.1 156H301.6L151.4 448z" />
+    <glyph glyph-name="stripe-s"
+      unicode="&#xF42A;"
+      horiz-adv-x="362.3" d=" M144.3 293.4C144.3 315.7000000000001 162.9 324.3 192.7 324.3C236.1 324.3 291.2000000000001 311 334.6 287.6V421.9C287.3 440.8 240.1 448 192.8 448C77.1 448 0 387.6 0 286.6C0 128.7 216.8 154.3 216.8 86.2C216.8 59.8 193.9 51.3 162.1 51.3C114.9 51.3 53.9 70.8 6 96.8V-31.7C59 -54.5 112.8 -64.1 162 -64.1C280.6 -64.1 362.3000000000001 -13.1 362.3000000000001 89.5C362.3000000000001 259.7 144.3000000000001 229.2 144.3000000000001 293.4" />
+    <glyph glyph-name="stripe"
+      unicode="&#xF429;"
+      horiz-adv-x="640" d=" M640 186.4C640 231.9 618 267.8 575.8 267.8S507.9 231.9 507.9 186.7C507.9 133.2 538.1999999999999 108.5 581.4 108.5C602.6 108.5 618.5 113.3 630.6 120V153.4C618.5 147.3 604.6 143.6 587 143.6C569.7 143.6 554.5 149.7 552.5 170.5H639.4C639.6 172.8 640 182.1 640 186.3999999999999M552.1 203.1999999999999C552.1 223.1999999999999 564.4 231.6 575.5 231.6C586.4 231.6 598 223.1999999999999 598 203.1999999999999H552.1zM439.2000000000001 267.8C421.8000000000001 267.8 410.6 259.5999999999999 404.4000000000001 253.8999999999999L402.1 264.8999999999999H363V60.0999999999999L407.4 69.4999999999999L407.5 119.6999999999999C413.9 114.9999999999999 423.4 108.4999999999999 438.9 108.4999999999999C470.7 108.4999999999999 499.7 131.6999999999999 499.7 188.0999999999999C499.8 239.6999999999999 470.4 267.7999999999999 439.2 267.7999999999999M428.6 145.2999999999999C418.2 145.2999999999999 412 149.0999999999999 407.7 153.6999999999999L407.4 219.6999999999999C412 224.7999999999999 418.4 228.4999999999999 428.6 228.4999999999999C444.8 228.4999999999999 455.9999999999999 210.2999999999999 455.9999999999999 187.0999999999999C456.1 163.1999999999999 445.1 145.2999999999999 428.6 145.2999999999999M346.4 324V287.8L301.8 278.3V314.5L346.4 324M301.9 264.8H346.5V111.6H301.9V264.8zM254.1 251.7C264.5 270.8 285.2 266.9 291.2 264.8V224C285.5 225.8 267.8 228.5 257.3 214.7V111.6H213V264.8H251.4L254.1 251.7M165.1 264.8H198.8V227H165.1V163.8C165.1 137.6 193.1 145.8 198.8 148.1V114.3C192.9 111.1 182.2 108.4 167.6 108.4C141.3 108.4 121.5 125.4 121.5 151.7000000000001L121.7 294.1L165 303.3000000000001L165.1 264.8000000000001zM44.9 219.7C44.9 199.7 112.8 209.2 112.8 156.3C112.8 124.3 87.4 108.5 50.5 108.5C35.2 108.5 18.5 111.5 2 118.6V158.6C16.9 150.5 35.9 144.4 50.6 144.4C60.5 144.4 67.6 147.1 67.6 155.3C67.6 176.5 0.1 168.5 0.1 217.7C0.1 249.1 24.1 267.9000000000001 60.1 267.9000000000001C74.8 267.9000000000001 89.5 265.6 104.2 259.8000000000001V218C90.7 225.3 73.5 229.4 60 229.4C50.7 229.3 44.9 226.6 44.9 219.7" />
+    <glyph glyph-name="studiovinari"
+      unicode="&#xF3F8;"
+      horiz-adv-x="512" d=" M480.3 260.3L484.5 232.3V204.3L459.4 160.2L419.6 81.8L363.5 14.3L284.4 -23.5000000000001L266.7 -48.0000000000001L259 -60.0000000000001L249.4 -64S266.7 -0.4 268.8 -0.4C270.9000000000001 -0.4 289.1 -1.1 289.1 -1.1L355.8 37.5000000000001L263.3 11.4L207.4 -25.4L184.6 -53.4L178 -54.8L198.8 18.8000000000001L205.7 24.3000000000001L226.4 11.4000000000001L314.7 56.6000000000001L371.5 108.1000000000001L386.3 176.5000000000001L260.9 153.2000000000001L276.1 171.4000000000001L102.7 224.7000000000001L184.6 235.2000000000001L18.6 358.1000000000002L133.5 340L32.2 448L285.1 321.4L253.6 359.4L378 285L234.7 384L253.4 345.6L203.8 363.7L158.3 448L352.9 326L310 381.8L418 285.4L430 294.3L409 310.7L413.2 348.5L451 358.9L480.2 334.2L491.7 330L484.7 323.8L493.2 311.8L480.1 304.4L469.8 284.2000000000001L480.3 260.3z" />
+    <glyph glyph-name="stumbleupon-circle"
+      unicode="&#xF1A3;"
+      horiz-adv-x="496" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 262.5C246.2 262.5 238.2 254.5 238.2 244.7V137.8C238.2 96.9 204.3 63.9 163.3 63.9C121.9 63.9 88.4 97.4 88.4 138.8V185.3H145.7V139.5C145.7 129.5 153.7 121.6999999999999 163.5 121.6999999999999S181.3 129.5999999999999 181.3 139.5V247.9C181.3 287.9 215.5 320 256 320C296.7 320 330.7 287.7 330.7 247.4V223.7L296.6 213.6L273.7 224.3V244.9C273.8 254.5 265.8 262.5 256 262.5zM423.6 138.9C423.6 97.5 390.1 64 348.7000000000001 64C307.5000000000001 64 273.8000000000001 97.2 273.8000000000001 138.2V185L296.7000000000001 174.3L330.8000000000001 184.4V137.3C330.8000000000001 127.5 338.8000000000001 119.7 348.6000000000001 119.7S366.4000000000001 127.6 366.4000000000001 137.3V185.3H423.7000000000001C423.6000000000001 139.4 423.6000000000001 138.9 423.6000000000001 138.9z" />
+    <glyph glyph-name="stumbleupon"
+      unicode="&#xF1A4;"
+      horiz-adv-x="512" d=" M502.9 182V112.3C502.9 50.2 452.6 -0.1 390.5 -0.1C328.7 -0.1 278.1 49.7 278.1 111.2V181.4L312.4000000000001 165.4L363.5000000000001 180.6V110C363.5000000000001 95.3 375.5000000000001 83.5 390.2000000000001 83.5S417 95.3 417 110V182H502.9zM278.2 240.2L312.5 224.2L363.6 239.4V275C363.6 335.5 312.5 384 251.5000000000001 384C190.7000000000001 384 139.4 335.8 139.4 275.8V113.4C139.4 98.5 127.4 86.7 112.7 86.7S86 98.5 86 113.4V182H0V112.3C0 50.3 50.3 0 112.4 0C174 0 224.8 49.5 224.8 110.8V271.1C224.8 285.8 236.8 297.8 251.5 297.8S278.2 285.8 278.2 271.1V240.2z" />
+    <glyph glyph-name="superpowers"
+      unicode="&#xF2DD;"
+      horiz-adv-x="448" d=" M448 416C364.7 405 281.2 394 198 383C106 370.5 34.7 296.3 29 203C25.7 147.5 47 93.5 86.8 54.8L0 -32C83.3 -21 166.5 -10 249.8 1C341.6 13.5 413.1 87.8 418.5 180.8C422 236.3 400.5 290.3 360.8 329L448 416zM368.3 183.7C364.1 104.2 294.3 44.5 215.5 49.2C136 53.9 74.8 120.2 79.2 200.2C83.7 279.4 153.5 339.5 232.2 334.7C311.5 330 372.7 263.7 368.3 183.7z" />
+    <glyph glyph-name="supple"
+      unicode="&#xF3F9;"
+      horiz-adv-x="640" d=" M640 185.5C640 121.4 531 69.4 396.5 69.4C371.7 69.4 347.9 71.2 325.4 74.4C333.1 74 340.9 73.8 348.8 73.8C483.3 73.8 592.3 130.6999999999999 592.3 200.9C592.3 230.3 573.1999999999999 257.3 541.0999999999999 278.9C601.0999999999999 257.8 639.9999999999999 223.8 639.9999999999999 185.5zM47.7 220.1C47.6 290.3 156.5 347.4 291 347.7C298.9 347.7 306.6 347.5 314.3 347.2C291.8 350.4 268 352.1 243.3 352.1C108.8 351.7 -0.1 299.5 0 235.4C0.1 197.1 39.1 163.1 99.3 142.1C67 163.6 47.8 190.7000000000001 47.7 220.1zM107.9 180.2S118.4 167 137.2 167C155.1 167 165.6 178.5 165.6 192.1C165.6 220.1 125.4 217.2 125.4 231.8C125.4 237.2 130.7 240.9 137.9 240.9C143.6 240.9 149.2000000000001 238.3 149.2000000000001 234.3V230.4H163.4V238.3C163.4 250.4 148 255.1 138 255.1C121.5 255.1 109.5 244.9000000000001 109.5 231.0000000000001C109.5 204.4 149.7000000000001 205.6 149.7000000000001 191.1C149.7000000000001 184.5 143.9 181 137.4 181C125.5 181 116.7 191.1 116.7 191.1L107.9 180.2000000000001zM228.7 253.8V199.4C228.7 188.1 221.6 181.6 210.9 181.6C200.2 181.6 193.1 188.1 193.1 199.3V253.8H177.3V198.8C177.3 179.9 190.7 166.9 211 166.9C231.1 166.9 244.4 179.9 244.4 198.8V253.8H228.7zM263.1 168.4H278.9V197.9H294.4C310.4 197.9 321.6 209.4 321.6 226S310.4 253.8 294.4 253.8H255.3V240.4H263.1V168.4zM278.9 211.4V240.5H291.8C300.5 240.5 305.5 234.8 305.5 226.1C305.5 217.2 300.3999999999999 211.4 291.5 211.4H278.8999999999999zM335.9 168.4H351.7V197.9H367.2C383.2 197.9 394.4 209.4 394.4 226S383.2 253.8 367.2 253.8H328.1V240.4H335.9V168.4zM351.6 211.4V240.5H364.5C373.2 240.5 378.2 234.8 378.2 226.1C378.2 217.2 373.2 211.4 364.2 211.4H351.5999999999999zM408.7 176.6C408.7 170.8 411.1 168.4 416.9 168.4H454.5C460.3 168.4 462.7 170.8 462.7 176.6V189.6H448.4V184.4C448.4 182.7 447.4 181.8 445.8 181.8H427.2C425.5 181.8 424.5999999999999 182.8 424.5999999999999 184.4V245.6C424.5999999999999 251.3 422.2 253.8 416.3999999999999 253.8H401V240.4H406.2C407.9 240.4 408.8 239.4 408.8 237.8V176.6zM472.1 176.6C472.1 170.8 474.4999999999999 168.4 480.3 168.4H519C524.7 168.4 527.2 170.8 527.2 176.6V189.6H512.9000000000001V184.4C512.9000000000001 182.7 511.9000000000001 181.8 510.3000000000001 181.8H490.6000000000001C488.9000000000001 181.8 488.0000000000001 182.8 488.0000000000001 184.4V204.7H515.7V218.1H488V240.5H507.2C508.9 240.5 509.8 239.5 509.8 237.9V232.7H524V245.7C524 251.4 521.5 253.9 515.8 253.9H464.1999999999999V240.5H471.9999999999999V176.6zM531 252.6V246.7H532.6V252.6H535.3000000000001V253.8H528.3000000000001V252.6H531.0000000000001zM536.7 253.8V246.7H538.2V252.4L540.5 246.7H541.8L544.0999999999999 252.4V246.7H545.5999999999999V253.8H543.3L541.1999999999999 248.7L539.0999999999999 253.8H536.6999999999999z" />
+    <glyph glyph-name="telegram-plane"
+      unicode="&#xF3FE;"
+      horiz-adv-x="448" d=" M446.7 349.4L379.1 30.6C374 8.1 360.7000000000001 2.5 341.8 13.1L238.8 89L189.1 41.2C183.6 35.7 179 31.1 168.4 31.1L175.8000000000001 136L366.7000000000001 308.5C375.0000000000001 315.9 364.9000000000001 320 353.8000000000001 312.6L117.8 164L16.2 195.8C-5.9 202.7 -6.3 217.9 20.8 228.5L418.2 381.6C436.6 388.5 452.7 377.5 446.7 349.4z" />
+    <glyph glyph-name="telegram"
+      unicode="&#xF2C6;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM369.8 270.1L329.1 78.3C326.1 64.6999999999999 318 61.4 306.7000000000001 67.8L244.7000000000001 113.5L214.8000000000001 84.6999999999999C211.5 81.3999999999999 208.7000000000001 78.5999999999999 202.3000000000001 78.5999999999999L206.7000000000001 141.6999999999999L321.6 245.5C326.6 249.9 320.5 252.4 313.9000000000001 248L171.9 158.5999999999999L110.7 177.6999999999999C97.4 181.8999999999999 97.1 191 113.5 197.3999999999999L352.6 289.5999999999999C363.7000000000001 293.5999999999999 373.4000000000001 286.8999999999999 369.8 270.0999999999999z" />
+    <glyph glyph-name="tencent-weibo"
+      unicode="&#xF1D5;"
+      horiz-adv-x="384" d=" M72.3 -47.8C73.7 -67.7 44.7 -70 42.6 -50.7C31 79.2 73.7 188.8 144 262.5C128.4 296.5 153.2 339.6 194.6 339.6C224.9 339.6 249.7 315 249.7 284.5C249.7 240.5 200.2 213.7 162.8 239.4C97.1 168.1 61.4 69.6 72.3 -47.8zM192 447.9C66.1 447.9 -12.3 313.7 43.7 205.6C52.4 188.2 79 201.1 70 219C23.7 311.6 91 418.2 192 418.2C267.4 418.2 328.9 356.8 328.9 281.3C328.9 190.5 242 127.4 161.2 148.2C142.1 152.3 135.6 123.8 154.6 119.1C265.3 95.9 358.6 179.1 358.6 281.4C358.6 373.3 284 447.9 192 447.9z" />
+    <glyph glyph-name="themeisle"
+      unicode="&#xF2B2;"
+      horiz-adv-x="512" d=" M208 359.714C208 369.714 214.286 381.428 225.715 381.428C236.857 381.428 243.429 369.714 243.429 359.714C243.429 349.429 236.857 338 225.715 338C214.286 338 208 349.429 208 359.714zM512 199.714C512 163.713 500.571 97.428 475.714 70C452.856 45.142 388.286 8.857 354.857 -0.572L353.714 -0.858V-33.429C353.714 -49.715 341.142 -64 324.5710000000001 -64C314.5710000000001 -64 305.1420000000001 -58.286 299.999 -49.714C294.572 -58.286 285.1430000000001 -64 275.1430000000001 -64C265.1430000000001 -64 255.7140000000001 -58.286 250.2850000000001 -49.714C245.1430000000001 -58.286 235.7140000000001 -64 225.7150000000001 -64C215.429 -64 206.286 -58.286 200.857 -49.714C195.714 -58.286 186.286 -64 176.286 -64C157.429 -64 146.857 -48.286 146.857 -31.143C130.571 -43.4280000000001 111.142 -50.571 90.286 -50.571C68.286 -50.571 46.857 -42.286 30 -27.7140000000001C40.285 -27.4280000000001 50.571 -25.4280000000001 60.285 -22.0000000000001C39.428 -16.2860000000001 20.857 -3.143 8.285 14.2859999999999C29.655 9.641 54.494 12.6129999999999 75.428 25.429C53.428 47.429 18.857 84.286 6.856 112.857C1.143 126.286 0 144.286 0 158.571C0 208.285 20.286 318.5710000000001 86.286 318.5710000000001C96.857 318.5710000000001 105.143 313.713 109.429 303.7140000000001A158.792 158.792 0 0 0 121.429 319.1420000000001C123.429 321.7140000000001 127.143 324.5710000000001 128.572 327.428C136.571 339.999 140.286 348.5700000000001 150.286 361.428C182.571 402.572 232 430.857 285.143 430.857C291.143 430.857 297.143 430.572 302.857 429.714C313.714 441.429 328.8570000000001 448 344.572 448C359.1430000000001 448 374.286 442 384.572 431.714C385.4290000000001 430.856 386 429.428 386 428.286C386 424.572 375.715 414.857 373.1430000000001 412C377.4290000000001 410.5710000000001 388.8570000000001 405.142 388.8570000000001 400C388.8570000000001 397.1430000000001 386 394.857 384.286 392.857C415.715 365.1430000000001 433.7150000000001 325.714 440.572 284.857C444.858 290 450.857 293.429 457.715 293.429C468.2860000000001 293.429 478.572 286.285 486.2860000000001 279.428C507.143 260.857 512 226.286 512 199.714zM188 358.572C188 340.286 200.571 321.429 220.286 321.429C240 321.429 252.571 340.286 252.571 358.572C252.571 376.572 240 395.429 220.286 395.429C200.571 395.429 188 376.5710000000001 188 358.572zM237.714 254C237.714 273.714 241.428 293.1430000000001 246.285 312.286C194.246 232.752 232.754 127.715 315.1430000000001 127.715C336.5710000000001 127.715 357.7140000000001 135.429 375.1430000000001 147.715C377.1430000000001 155.144 378.8570000000001 162.572 378.8570000000001 170.287C378.8570000000001 184.573 372.5710000000001 191.715 358.2850000000001 191.715C353.714 191.715 349.1420000000001 190.858 344.8560000000001 190.001C281.5130000000001 177.333 237.7140000000001 186.3320000000001 237.7140000000001 254.0000000000001zM196.572 -0.858C196.572 10.285 187.714 19.999 176.286 19.999C164.857 19.999 156.286 10.284 156.286 -0.8579999999999V-33.429C156.286 -44.572 164.857 -54.571 176.286 -54.571C187.714 -54.571 196.572 -44.856 196.572 -33.429V-0.8579999999999zM245.715 -0.858C245.715 10.285 237.143 19.999 225.715 19.999C214.286 19.999 205.429 10.284 205.429 -0.8579999999999V-33.429C205.429 -44.572 214.286 -54.571 225.715 -54.571C237.143 -54.571 245.715 -44.571 245.715 -33.429V-0.8579999999999zM295.428 -0.858C295.428 10.285 286.5710000000001 19.999 275.143 19.999C263.714 19.999 254.857 10.284 254.857 -0.8579999999999V-33.429C254.857 -44.572 263.714 -54.571 275.143 -54.571C286.571 -54.571 295.428 -44.856 295.428 -33.429V-0.8579999999999zM345.1430000000001 -0.858C345.1430000000001 10.285 336.2860000000001 19.999 324.8570000000001 19.999C313.4290000000001 19.999 304.5710000000001 10.284 304.5710000000001 -0.8579999999999V-33.429C304.5710000000001 -44.572 313.4290000000001 -54.571 324.8570000000001 -54.571C336.286 -54.571 345.1430000000001 -44.571 345.1430000000001 -33.429V-0.8579999999999zM421.714 162C390.857 102.858 331.429 59.428 263.1430000000001 59.428C166.572 59.428 102.572 144 102.572 236C102.572 252.857 104.572 269.429 108.572 285.714C88.572 251.999 78.858 213.142 78.858 174.285C78.858 113.999 103.715 52.5699999999999 150.287 13.428C155.43 23.142 165.144 29.714 176.287 29.714C186.287 29.714 195.715 24 200.858 15.428C206.287 23.999 215.429 29.714 225.7160000000001 29.714C235.7160000000001 29.714 245.1440000000001 24 250.2870000000001 15.428C255.7160000000001 23.999 265.144 29.714 275.1450000000001 29.714C285.1450000000001 29.714 294.5730000000001 24 300.0020000000001 15.428C305.1450000000001 23.999 314.5730000000001 29.714 324.5740000000001 29.714C335.4310000000001 29.714 345.4310000000001 23.142 350.2880000000001 13.714C393.7150000000001 50 418.8570000000001 105.714 421.7140000000001 162zM432.286 261.714C432.286 315.428 397.7150000000001 367.428 339.714 367.428C309.429 367.428 281.1430000000001 352.285 260.857 330.5710000000001C240.862 264.188 233.41 194 302.286 194C331.091 194 399.6430000000001 222.538 386.572 157.143C415.429 183.143 432.286 222.857 432.286 261.7140000000001z" />
+    <glyph glyph-name="trello"
+      unicode="&#xF181;"
+      horiz-adv-x="448" d=" M392 416H56C25.1 416 0 390.9 0 360V24C0 -6.9 25.1 -32 56 -32H392C422.9 -32 448 -6.9 448 24V360C448 390.9 422.9 416 392 416zM194.9 76.6C194.9 61.8 182.9 49.7 168 49.7H85.1C70.3 49.7 58.2 61.7000000000001 58.2 76.6V330.9C58.2 345.7 70.2 357.8 85.1 357.8H168C182.8 357.8 194.9 345.8 194.9 330.9V76.6zM389.8 188.6C389.8 173.8 377.8 161.7000000000001 362.9000000000001 161.7000000000001H280C265.2 161.7000000000001 253.1 173.7000000000001 253.1 188.6V330.9C253.1 345.7 265.1 357.8 280 357.8H362.9C377.7 357.8 389.8 345.8 389.8 330.9V188.6z" />
+    <glyph glyph-name="tripadvisor"
+      unicode="&#xF262;"
+      horiz-adv-x="576" d=" M166.4 167.479C166.4 154.243 155.67 143.513 142.434 143.513S118.468 154.243 118.468 167.479S129.198 191.445 142.434 191.445S166.4 180.716 166.4 167.479zM431.362 191.435C418.132 191.435 407.406 180.71 407.406 167.479C407.406 154.249 418.131 143.523 431.362 143.523C444.592 143.523 455.318 154.248 455.318 167.479C455.317 180.71 444.592 191.435 431.362 191.435zM520.75 51.945C458.083 2.841 367.474 13.836 318.371 76.504L287.392 30.179L256.709 76.1180000000001C208.432 15.7280000000001 121.087 4.227 58.824 50.063C-5.234 97.2210000000001 -18.935 187.379 28.223 251.4370000000001A186.76199999999997 186.76199999999997 0 0 1 0 308.584L90.286 308.634A358.48 358.48 0 0 0 287.351 362.664A350.382 350.382 0 0 0 479.532 309.3150000000001L575.75 309.241A185.71300000000002 185.71300000000002 0 0 1 547.398 251.592C594.191 188.845 582.3620000000001 100.222 520.75 51.9450000000001zM259.366 166.239C259.359 229.796 207.831 281.314 144.274 281.307C80.717 281.3 29.2 229.772 29.206 166.215C29.213 102.658 80.741 51.14 144.298 51.147C207.811 51.222 259.282 102.686 259.366 166.199V166.239zM287.957 176.694C293.39 250.134 353.467 307.578 427.077 309.716A339.146 339.146 0 0 1 287.35 337.528A356.31 356.31 0 0 1 147.186 310.275C221.53 308.693 282.485 250.851 287.957 176.694zM539.663 205.461C517.671 265.095 451.501 295.6089999999999 391.8680000000001 273.618C332.2340000000001 251.626 301.7200000000001 185.4559999999999 323.7110000000001 125.823V125.791C345.7490000000001 66.184 411.9090000000001 35.7 471.5380000000001 57.678C531.153 79.682 561.6510000000001 145.84 539.663 205.461zM213.624 167.4859999999999V167.3709999999999C213.567 128.0429999999999 181.638 96.2079999999999 142.31 96.2649999999999C102.982 96.322 71.147 128.2509999999999 71.204 167.579C71.261 206.907 103.19 238.742 142.518 238.685C181.7770000000001 238.569 213.56 206.745 213.624 167.4859999999999zM189.112 167.4859999999999V167.5699999999999C189.061 193.3539999999999 168.118 214.215 142.334 214.1639999999999C116.5500000000001 214.113 95.689 193.1699999999999 95.74 167.387C95.791 141.603 116.734 120.742 142.5170000000001 120.793C168.2430000000001 120.906 189.0540000000001 141.761 189.1120000000001 167.4859999999999zM502.535 167.4859999999999V167.4379999999999C502.515 128.1099999999999 470.617 96.2439999999999 431.288 96.2649999999999S360.094 128.1829999999999 360.115 167.512C360.135 206.84 392.033 238.706 431.362 238.685C470.652 238.619 502.483 206.776 502.535 167.4859999999999zM478.031 167.4939999999999C478.022 193.2779999999999 457.113 214.1729999999999 431.329 214.1639999999999C405.545 214.155 384.65 193.2459999999999 384.659 167.4619999999999C384.668 141.678 405.577 120.7839999999999 431.361 120.7919999999999C457.126 120.8379999999999 477.997 141.7199999999999 478.031 167.4849999999999V167.4939999999999z" />
+    <glyph glyph-name="tumblr-square"
+      unicode="&#xF174;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM317.7 51.8C309.2 42.7 286.5 32 256.8 32C181.3 32 164.9 87.5 164.9 119.9V209.9H135.2C131.8 209.9 129 212.7 129 216.1V258.6C129 263.1 131.8000000000001 267.1 136.1 268.6C174.9 282.3 187 316.1 188.8 341.8C189.3 348.7 192.9 352 198.8 352H243.1C246.5000000000001 352 249.3 349.2 249.3 345.8V273.8H301.2C304.6 273.8 307.4 271 307.4 267.6V216.5C307.4 213.1 304.6 210.3 301.2 210.3H249.1V127C249.1 105.6 263.9 93.5 291.6 104.6C294.6 105.8 297.2000000000001 106.6 299.6 106C301.8 105.5 303.2000000000001 103.9 304.2000000000001 101.1L318.0000000000001 60.9C319.0000000000001 57.7000000000001 320.0000000000001 54.2 317.7000000000001 51.8z" />
+    <glyph glyph-name="tumblr"
+      unicode="&#xF173;"
+      horiz-adv-x="320" d=" M309.8 -32.3C296.2 -46.8 259.8 -64 212.4 -64C91.6 -64 65.4 24.8 65.4 76.6V220.6H17.9C12.4 220.6 7.9 225.1 7.9 230.6V298.6C7.9 305.8 12.4 312.2000000000001 19.2 314.6C81.2 336.4000000000001 100.7 390.6 103.5 431.7000000000001C104.3 442.7000000000001 110 448 119.6 448H190.5C196 448 200.5 443.5 200.5 438V322.8H283.5C289 322.8 293.5 318.4 293.5 312.9V231.2C293.5 225.7 289 221.2 283.5 221.2H200.1V88C200.1 53.8 223.8 34.4 268.1 52.2C272.9000000000001 54.1 277.1 55.4 280.8 54.4C284.3 53.5 286.6 51 288.2 46.5L310.2 -17.8C312 -22.8 313.5 -28.4 309.8 -32.3z" />
+    <glyph glyph-name="twitch"
+      unicode="&#xF1E8;"
+      horiz-adv-x="448" d=" M40.1 416L10 339.1V24.8H117V-32H177.2L234 24.8H321L438 141.8V416H40.1zM397.9000000000001 161.9L331 95H224L167.2 38.2V95H76.9V375.9H397.9V161.9zM331 299V182.1H290.9V299H331zM224 299V182.1H183.9V299H224z" />
+    <glyph glyph-name="twitter-square"
+      unicode="&#xF081;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM351.1 257.2C351.3 254.4 351.3 251.5 351.3 248.7C351.3 162 285.3 62.1 164.7 62.1C127.5 62.1 93 72.9 64 91.5C69.3 90.9 74.4 90.7 79.8 90.7C110.5 90.7 138.7 101.1 161.2 118.7C132.4 119.3 108.2 138.2 99.9 164.2C110 162.7 119.1 162.7 129.5 165.4C99.5 171.5 77 197.9 77 229.8V230.6C85.7 225.7 95.9 222.7 106.6 222.3A65.447 65.447 0 0 0 77.4 276.9C77.4 289.1 80.6 300.3 86.3 310C118.6 270.2 167.1 244.2 221.5 241.4C212.2 285.9 245.5 322 285.5 322C304.4 322 321.4 314.1 333.4 301.3C348.2 304.1 362.4 309.6 375 317.1C370.1 301.9 359.8 289.1 346.2 281C359.4 282.4 372.2 286.1 384 291.2C375.1 278.1 363.9 266.5 351.1 257.2z" />
+    <glyph glyph-name="twitter"
+      unicode="&#xF099;"
+      horiz-adv-x="512" d=" M459.37 296.284C459.695 291.736 459.695 287.187 459.695 282.639C459.695 143.919 354.112 -15.919 161.137 -15.919C101.685 -15.919 46.457 1.3 0 31.187C8.447 30.213 16.568 29.888 25.34 29.888C74.395 29.888 119.553 46.456 155.614 74.72C109.482 75.6950000000001 70.822 105.908 57.502 147.492C64 146.518 70.497 145.868 77.32 145.868C86.741 145.868 96.163 147.168 104.934 149.441C56.853 159.188 20.791 201.421 20.791 252.426V253.725C34.76 245.928 51.005 241.055 68.222 240.406C39.958 259.249 21.441 291.411 21.441 327.7970000000001C21.441 347.289 26.638 365.1570000000001 35.735 380.751C87.39 317.076 165.035 275.493 252.1 270.944C250.4760000000001 278.741 249.5010000000001 286.862 249.5010000000001 294.9840000000001C249.5010000000001 352.812 296.283 399.918 354.4350000000001 399.918C384.6480000000001 399.918 411.9370000000001 387.248 431.1050000000001 366.781C454.8200000000001 371.329 477.5610000000001 380.101 497.7040000000001 392.121C489.9060000000001 367.755 473.3380000000001 347.288 451.5720000000001 334.294C472.6890000000001 336.567 493.1560000000001 342.416 511.998 350.5370000000001C497.7060000000001 329.746 479.837 311.2290000000001 459.3700000000001 296.284z" />
+    <glyph glyph-name="typo3"
+      unicode="&#xF42B;"
+      horiz-adv-x="433.3" d=" M330.8 107C323.8 104.7 319.2 104.7 312.3 104.7C255.1 104.7 171.7 303.2 171.7 369.6C171.7 394.3 177.1 402 185.6 409C116.1 400.5 36.3 375 9.3 342.6C3.9 334.9 0 321.8 0 305.5C0 202 106.8 -32 184.1 -32C220.4 -32 281.4 27.5 330.8 107M294.5 416C366.3 416 433.3 404.4 433.3 363.5C433.3 280.9 380.8 181.2 354.5 181.2C306.6 181.2 252.8 313.3 252.8 379.7C252.8 410.6 264.4000000000001 416 294.5 416" />
+    <glyph glyph-name="uber"
+      unicode="&#xF402;"
+      horiz-adv-x="448" d=" M414.1 416H33.9C15.2 416 0 400.8 0 382.1V2C0 -16.8 15.2 -32 33.9 -32H414C432.7 -32 447.9 -16.8 447.9 1.9V382.1C448 400.8 432.8 416 414.1 416zM237.6 56.9C163 49.4 96.4 103.8 88.9 178.4H183.3V158C183.3 154.3 186.3 151.2 190.1 151.2H258C261.7 151.2 264.8 154.2 264.8 158V225.9C264.8 229.6 261.8 232.7 258 232.7H190.1C186.4 232.7 183.3 229.7 183.3 225.9V205.5H88.9C95.9 274.9 154.3 327.7 224 327.7C293.7 327.7 352.1 274.9 359.1 205.5C366.6 131 312.2000000000001 64.4 237.6 56.9z" />
+    <glyph glyph-name="uikit"
+      unicode="&#xF403;"
+      horiz-adv-x="448" d=" M443.9 320V64L218 -64L0 64V278.3L87.6 233.2V116.2000000000001L221.1 40.7L356.9 116.2000000000001V267.2000000000001L255.8 324.8000000000001L343.4 377.9000000000001L443.9 320zM308.6 398.9L223.8 448L135.2 393.2L221.2 345.9L308.6 398.9z" />
+    <glyph glyph-name="uniregistry"
+      unicode="&#xF404;"
+      horiz-adv-x="384" d=" M281.1 227.9H384V242.7H281.1V227.9zM281.1 265H384V277.4H281.1V265zM281.1 190.8H384V208.1H281.1V190.8zM123.4 104.1H8.5C11.1 95.6 14.3 87.3 18.1 79.3H156.4C143.5 85 132.3 93.5 123.4 104.1M269.1 116.5H378.8C380.6 123.8 381.9000000000001 131.2 382.7 138.8H278.3C276.2 130.9 273.1 123.4 269.1 116.5M227.6 79.4H367C370.7 87.4 372.8 95.6 375.5 104.2H260.5C251.7 93.5 240.4 85 227.6 79.4M384 416H281.1V413.5H384V416zM192 -32C231.5 -32 268.2 -20.2 298.8 0.2H85.3C115.8 -20.2 152.5 -32 192 -32M281.1 302.2H384V312H281.1V302.2zM281.1 339.3H384V346.7H281.1V339.3zM281.1 376.4H384V381.3H281.1V376.4zM102.9 277.4H0V265H102.9V277.4zM38.8 42.3H344.1C350.8 50.8 356.7000000000001 59.9 361.9000000000001 69.5H23C28.2 59.9 32.2 50.8 38.8 42.3M102.9 161.1V173.5H0V161.1C0 158.6 0 156.1 0.1 153.7000000000001H103.2C103 156.1 102.9 158.6 102.9 161.1M281.1 161.1C281.1 158.6 281 156.1 280.7 153.7000000000001H383.8C383.9 156.2000000000001 384 158.6 384 161.1V173.5H281.1V161.1zM78.1 5.1H305.8C317.6 13.8 328.5 23.7 338 34.8H44.9C54.5 23.8 66.3 13.8 78.1 5.1M102.9 381.3H0V376.4H102.9V381.3zM102.9 416H0V413.5H102.9V416zM102.9 242.7H0V227.9H102.9V242.7zM102.9 208.1H0V190.8H102.9V208.1zM102.9 312H0V302.1H102.9V312zM102.9 346.7H0V339.3H102.9V346.7zM105.7 138.8H1.3C2.2 131.2 3.5 123.8 5.2 116.5H114.9C110.9 123.4 107.7 130.9 105.7 138.8" />
+    <glyph glyph-name="untappd"
+      unicode="&#xF405;"
+      horiz-adv-x="640" d=" M401.3 398.1C321.5 238 316.7000000000001 245.6 313.4 224.9L308.2 192.1C306.3 180.1 301.6 168.6 294.5 158.7000000000001L145.6 -49.1C138 -59.7 125.2 -65.3000000000001 112.2 -63.7C71.9 -58.7 34.4 -31.5000000000001 16.9 4.8C11.2 16.6 12.4 30.6 20 41.1999999999999L168.9 249.1C176 259 185.3 267.0999999999999 196.1 272.8L225.4 288.3C243.9 298.0999999999999 235.1 300.2 361 427.2C362 432 362 434.5 364.6 435.2C367.6 435.8999999999999 371.2000000000001 436.2 370.9000000000001 439.8L370.5000000000001 444.3999999999999C370.3000000000001 446.3 371.8000000000001 448 373.7000000000001 448C378.2000000000001 448.0999999999999 386.9000000000001 446.8 399.3000000000001 438C411.6000000000001 429.0999999999999 415.7000000000001 421.2 417.0000000000001 416.8999999999999C417.6000000000001 415.0999999999999 416.4000000000001 413.2 414.6000000000001 412.7L410.1000000000001 411.5999999999999C406.7000000000001 410.7 407.6000000000001 407.2 407.8000000000001 404.2C407.9000000000001 401.3999999999999 405.5000000000001 400.5999999999999 401.3000000000001 398.0999999999999zM230.1 411.6C233.5 410.7 232.6 407.2 232.4 404.2C232.2 401.5 234.5 400.7 238.8 398.2C246.7 382.3 254.1 367.7 261 354.2C261.7 352.9 263.3 352.7 264.3 353.7C275.5 365.7 288.9000000000001 379.9 304.8 396.3C306.1 397.7 306.2 399.8 304.9000000000001 401.2C296.9000000000001 409.4 288.4000000000001 418.1 279.3 427.3C278.3 432 278.3 434.6 275.7 435.3C272.7 436.1 269.1 436.3 269.4 439.9C269.7 443.2 270.8 448 266.6 448.1C262.1 448.2 253.4 447 241 438.1C228.7 429.2 224.6 421.3 223.3 417C221.9 412.8 226.9 412.4 230.1 411.6zM620 41.3L471.2 249.2C458 267.7 444.6 272.6 414.8 288.3C403.6 294.2 400.6 299.2 384.3 317.2C383.3 318.3 381.4000000000001 318.1 380.7 316.7C334.4 227.9 333.6 233.9 331.7 221.9C330 211.2 330.4 201.9 332 192.1C333.9 180.1 338.6 168.6 345.7 158.7L494.6 -49.2C502.2 -59.8000000000001 514.8000000000001 -65.4000000000001 527.7 -63.9C568 -59.0000000000001 605.7 -31.9 623.4000000000001 4.6999999999999C628.8000000000001 16.5999999999999 627.7 30.5999999999999 620.0000000000001 41.3z" />
+    <glyph glyph-name="usb"
+      unicode="&#xF287;"
+      horiz-adv-x="640" d=" M641.5 192C641.5 188.9 639.8 185.9 637 184.5L547.9 131C546.5 130.2 545.1 129.6 543.4 129.6C542 129.6 540.3 129.9 538.9 130.7000000000001C536.1 132.4 534.4 135.2000000000001 534.4 138.5000000000001V174.1000000000001H295.7C321 134.5000000000001 336.2 67.2000000000001 365.3 67.2000000000001H392V94C392 99 395.9 102.9 400.9 102.9H490C495 102.9 498.9 99 498.9 94V4.9C498.9 -0.1 495 -4 490 -4H400.9C395.9 -4 392 -0.1 392 4.9V31.6H365.3C289.9 31.6 284.2000000000001 174.1 240.6 174.1H140.3C132.2 143.5 104.4 120.6 71.3 120.6C32 120.7 0 152.7 0 192S32 263.3 71.3 263.3C104.4 263.3 132.3 240.5 140.3 209.8C179.4 209.8 184.2 200.3 214.9 270.2000000000001C255 359.3 273 352.3 323.8 352.3C331.3 373.2 350.8 387.9 374.2 387.9C403.7 387.9 427.7 364 427.7 334.4S403.8 280.9 374.2 280.9C350.8 280.9 331.3 295.7000000000001 323.8 316.5H294C264.9 316.5 249.7 249.1 224.4 209.6H534.5V245.2C534.5 248.5 536.2 251.3 539 253C541.8 254.7 545.4 254.4 547.9 252.7L637 199.2C639.8 198.1 641.5 195.1 641.5 192z" />
+    <glyph glyph-name="ussunnah"
+      unicode="&#xF407;"
+      horiz-adv-x="512" d=" M156.8 162.9L162.5 148.5H154.3C153 151.7 151.2 156.2 150.5 158C148 164.3 149.4 166.4 150.5 168C152.4 170.7 153.7 172.4 154.1 173.2C154.1 171 154.9 167.5 156.8 162.9zM454.1 144.1C452 130.3 448.4000000000001 117 443.6 104.4L486.6 81L441.8 99.8C436.5 86.6 429.8 74.2 421.9000000000001 62.6L456.1 32.4L419.3 58.8C410.9000000000001 47 401.3 36.2 390.6 26.5L415.5 -8.2L387.4 23.6C376.4 14 364.3 5.6 351.3 -1.5L367 -38.7L347.7 -3.4C334.5999999999999 -10.2 320.7 -15.5 306.0999999999999 -19.3L312.7999999999999 -57.6999999999999L302.2999999999999 -20.3C287.9999999999999 -23.6999999999999 273.0999999999999 -25.6 257.7999999999999 -25.6999999999999L256 -64L254.1 -25.6C238.8 -25.5 223.9 -23.6 209.6 -20.3L199 -57.6L205.7 -19.4C191.1 -15.7 177.1 -10.3 164 -3.6L144.8 -38.7L160.4 -1.7C147.4 5.3 135.2 13.6999999999999 124.2 23.4L96.3 -8.2L121 26.1999999999999C110.3 35.8999999999999 100.6 46.6999999999999 92.2 58.4999999999999L55.7 32.3L89.6 62.1999999999999C81.7 73.8 75 86.3 69.6 99.4999999999999L25.2 80.8L67.8 104C63 116.7 59.4 130.1 57.3 143.9L6.3 134.9L56.6 149.1C55.5 157.6 54.9 166.2 54.9 175C54.9 179.6999999999999 55.1 184.3999999999999 55.4 189.1L0 192L56 194.8C57.3 207.9 59.8 220.6 63.5 232.9L6.4 249L65.3 238.6C69.3 250.6 74.4 262.1 80.5 273L25.4 303L83.7 278.4C90 289 97.2 298.8 105.3 308L55.8 351.6L109.7 312.9C117.8 321.5 126.7 329.4 136.3 336.5L96.3 392.1L141.9 340.5C151.4 347.1 161.6 352.8 172.2 357.7L144.9 422.6L178.7 360.5C189.2 364.9 200.1 368.4 211.4 370.9L199 441.6L218.5 372.4C229.5 374.5 240.8 375.6 252.3 375.8L256 448L259.6 375.8C271.1 375.6 282.4000000000001 374.4 293.4000000000001 372.3L313 441.6L300.6 370.9C311.9000000000001 368.3 322.8 364.8 333.2000000000001 360.4L367.1 422.6L339.7000000000001 357.5C350.3000000000001 352.6 360.4000000000001 346.8 369.9000000000001 340.3L415.7000000000001 392.1L375.6 336.2C385.1 329.1 394 321.2 402.1 312.6L456.3 351.5L406.6 307.6C414.6 298.5 421.8 288.7 428.1 278.2L486.8 302.9L431.3 272.7C437.4000000000001 261.8 442.4000000000001 250.4 446.4000000000001 238.4L505.7 248.8L448.2000000000001 232.6C451.9 220.4 454.4 207.7 455.7 194.7L512 192L456 189.2C456.3 184.6 456.5 179.9 456.5 175.1C456.5 166.4 455.9 157.8 454.9 149.3L505.6 135L454.1 144.1zM432.3 175.1C432.3 272.6 353.3 351.6 255.8 351.6S79.3 272.6 79.3 175.1S158.3 -1.4 255.8 -1.4S432.3 77.6 432.3 175.1zM408.3 175.1C408.3 90.8 340 22.5 255.7 22.5S103.1 90.8 103.1 175.1S171.4 327.7000000000001 255.7 327.7000000000001S408.3 259.4000000000001 408.3 175.1zM195 207C195 204.9 196.3 203.2 198.6 201.9C201.9 200 204.8 197.3 206.8 193.7C209.6 199.4 211.1 203.2 211.1 204.9C211.1 207.1 210 209.3 207.9 211.9C205.8 214.4 204.7 217.1 204.6 219.6C198.1 212.8 195 208.7 195 207zM154.3 226C154.3 223.9 155.6 222.2 157.9 220.9C161.4 219 164.1 216.3 166.1 212.7C168.9 218.4 170.4 222.2 170.4 223.9C170.4 226.1 169.3 228.3 167.2 230.9C165.1 233.4 164 236.1 163.9 238.6C157.4 231.8 154.3 227.7 154.3 226zM135.3 226C135.3 223.9 136.6 222.2 138.9 220.9C142.2 219 145.1 216.3 147.1 212.7C149.9 218.4 151.4 222.2 151.4 223.9C151.4 226.1 150.3 228.3 148.2 230.9C146.1 233.4 145 236.1 144.9 238.6C138.5 231.8 135.3 227.7 135.3 226zM340.2000000000001 138.1C331.8000000000001 141.1 331.5000000000001 144.9 331.5000000000001 153.7000000000001V266C323.3000000000001 253.5 317.3000000000001 247.4 313.5000000000001 247.4C319.8000000000001 233 323.0000000000001 223.5 323.0000000000001 219.1V154.8C323.0000000000001 152.6 320.8000000000001 148.3 318.3000000000001 148.3H300.3000000000001C297.5000000000001 155.8 290.1000000000001 175.2 285.0000000000001 188.6C283.0000000000001 186.1 277.8000000000001 179.4 274.3000000000001 174.9C276.7000000000001 173.3 278.4000000000001 171.3 279.5000000000001 168.6C282.1000000000001 161.9 285.9000000000001 152.1 287.4000000000001 148.4H278.2000000000001C274.3000000000001 158.8 268.6 173.8 266.4000000000001 179.5000000000001C264.4000000000001 177.0000000000001 259.2000000000001 170.3000000000001 255.7000000000001 165.8000000000001C258.1 164.2000000000001 259.8000000000001 162.2000000000001 260.9000000000001 159.5000000000001C261.7000000000001 157.5000000000001 263.7000000000001 152.2000000000001 265.2000000000001 148.6000000000001H256C254.5 152.7000000000001 250.4 163.2000000000001 247.6 170.6000000000001C245.6 168.1000000000001 240.4 161.4000000000001 236.9 156.9000000000001C239.4 155.3000000000001 241.2 153.3000000000001 242.1 150.6000000000001C242.3 150.0000000000001 242.6 149.2000000000001 242.7 148.9000000000001H225C220.4 162.8000000000001 213.6 176.6000000000001 213.6 183.0000000000001C213.6 185.2000000000001 213.9 188.1000000000001 214.7 191.2000000000001C205.9 180.4000000000001 200.7 175.3000000000001 200.7 166.2000000000001C200.7 158.7000000000001 211.1 137.9000000000001 211.1 132.9000000000001C211.1 131.2000000000001 210.6 129.6000000000001 209.7 128.0000000000001C200.1 140.7000000000001 194.2 148.7000000000001 190.9 148.7000000000001H178.9L167.7 176.7000000000001C163.9 186.3000000000001 162 192.7000000000001 162 195.5000000000001C162 199.3000000000001 162.5 203.2000000000001 163.7 207.7000000000001C162.7 206.4000000000001 160 203.0000000000001 158.2 200.6000000000001C157.4 202.7000000000001 155.1 208.3000000000001 153.6 212.1000000000001C151.5 209.6000000000001 146.1 203.0000000000001 142.4 198.5000000000001C143.3 196.2000000000001 145.7 190.4000000000001 147.3 186.3000000000001C144.8 183.0000000000001 138.2 174.5000000000001 133.7 168.6000000000001C129.7 163.3000000000001 127.9 155.3000000000001 131 146.8000000000001C133.5 140.1000000000001 133 138.9000000000002 129.3000000000001 132.7000000000001H191C196.5 132.7000000000001 205.3 118.7000000000001 206.5 110.7000000000001C219.7 126.7000000000001 221.9 130.3000000000001 223.3 132.3000000000001H330.3C334.2 132.3000000000001 337.5 134.2000000000001 340.2 138.1000000000001zM360.3000000000001 164.7000000000001V266.3C351.3000000000001 253.8 344.4000000000001 247.7 339.6000000000001 247.7C346.7000000000001 233.3 350.3000000000001 223.8 350.3000000000001 219.4V153.1C350.3000000000001 135.6 358.9000000000001 132.7000000000001 374.3000000000001 132.7000000000001C382.4000000000001 132.7000000000001 386.8000000000001 133.5000000000001 388.0000000000001 135.4C383.7000000000001 137.0000000000001 380.4000000000001 137.9 378.1000000000001 138.7000000000001C370.0000000000001 141.9 360.3000000000001 146.1 360.3000000000001 164.7000000000001z" />
+    <glyph glyph-name="vaadin"
+      unicode="&#xF408;"
+      horiz-adv-x="448" d=" M224.5 307.3C226 324.9 229.4 360 274.3 360H372.9C393.6 360 405 367.8 405 381.6V393.9C405 406.1 414.3 416 426.5 416S448 406.1 448 393.9V357.4C448 314.5 426.5 295.4 381.2 295.4H280.7C250.6 295.4 247.7 280.7000000000001 247.7 268.3C247.7 267 247.6 265.8 247.5 264.6C246.8 252.3 236.6 242.4000000000001 224.1 242.4000000000001S201.4 252.2000000000001 200.7 264.6C200.6 265.8 200.5 267 200.5 268.3C200.5 280.6 197.5 295.4 167.5 295.4H66.8C21.5 295.4 0 314.5 0 357.4V393.9C0 406.1 9.4 416 21.6 416S43.1 406.1 43.1 393.9V381.6C43.1 367.8 54.5 360 75.2 360H173.8C218.6 360 222.1 324.9 223.6 307.3H224.5zM224 -8C235.5 -8 245.4 -1 249.7 8.3C250.8 10.1 346.8 177.9 347.9 179.7000000000001C359.8 199.3000000000001 344.7 224.0000000000001 320.7 224.0000000000001C306.8 224.0000000000001 297.4 217.6000000000001 290.9 203.7000000000001L224 86L157.1 203.7C150.7 217.6 141.2 224 127.3 224C103.3 224 88.2 199.4 100.1 179.7C101.2 177.8 197.2 10.1 198.3 8.3C202.6 -1.0000000000001 212.5 -8.0000000000001 224 -8.0000000000001z" />
+    <glyph glyph-name="viacoin"
+      unicode="&#xF237;"
+      horiz-adv-x="384" d=" M384 416H320L239.3 224H144.8L64 416H0L48 304H0V256H68.5L82.3 224H0V176H102.8L192 -32L281.2 176H384V224H301.7L315.5 256H384V304H336L384 416zM192 112L165 176H219L192 112z" />
+    <glyph glyph-name="viadeo-square"
+      unicode="&#xF2AA;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM280.7 66.8C238.3 20.6 160.7 20.2 118.3 66.8C50.3 140.4 98.5 262.9 199.5 262.9C212.8 262.9 226.1 260.8 238.6 256.2000000000001C234.3 247.8 231.3 238.6 230.2 229.1C220.5 233.2 210 235.1 199.5 235.1C150.7 235.1 114.9 193.4 114.9 146.2000000000001C114.9 103.2000000000001 143.4 67.5000000000001 184.4 60.3000000000001C245.9 84.3000000000001 257.3 177.9000000000001 257.3 235.3000000000001C257.3 242.6000000000001 257.3 250.1000000000001 256.7 257.4000000000001C245.5 290.3000000000001 230.1 322.0000000000001 212.5 351.9000000000001C239.6 333.6000000000001 254.4 289.4000000000001 256.7 257.8000000000001V257.4000000000001C264.4 234.9000000000001 268.5 211.2000000000001 268.5 187.4000000000001C268.5 133.3000000000001 246.6 88.4000000000001 200.2 59.2000000000001L197.8 59.0000000000001C247.8 58.0000000000001 284 97.6000000000001 284 146.2000000000001C284 158.4000000000001 281.9 170.5000000000001 277.1 181.9000000000001C286.6 183.8000000000001 295.6 187.5000000000001 303.5 192.4000000000001C318.8 155.8000000000001 316.1 105.1000000000001 280.7 66.8000000000001zM309 214.3C295.7 214.3 283.9 221.4 274.6 230.4C296.5 242.4 324.2000000000001 261.1 336.9000000000001 283.4C338.4000000000001 286.4 341.0000000000001 292 341.4000000000001 295.4C328.9000000000001 267.5 297.2000000000001 245.6 267.5 238.7C262.8 246 260 254.2 260 263C260 273.3 265.2 287.1 272.9 294.6C294.5 315.1 325.9 303.1 345.3 344.6C377.8 298.4 358.4 214.3 309 214.3z" />
+    <glyph glyph-name="viadeo"
+      unicode="&#xF2A9;"
+      horiz-adv-x="448" d=" M276.2 297.5V296.8C258.3 349.4 233.6 400.2 205.4 448C248.7 418.8 272.4 348 276.2 297.5zM308.9 175.8C316.5 157.6 319.9 138.3 319.9 118.8C319.9 41.1 262.1 -22.2 182.1 -20.6L185.9 -20.3C260.1 26.4 295.2 98.3 295.2 184.8C295.2 222.9 288.7 260.7 276.3 296.8C277.3 285.1 277.3 273.1 277.3 261.4C277.3 169.6 259.2 19.8 160.7 -18.6C95 -7.2 49.4 50 49.4 118.8C49.4 194.4 106.8 261.1 184.8 261.1C201.6 261.1 218.5 258 233.9 251.5000000000001C235.6 266.6 240.4 281.4000000000001 247.3 294.8C227.4 302 206.1 305.5 184.8 305.5C23.3 305.5 -53.9 109.6 54.9 -8.2C122.8 -82.7999999999999 246.9 -82.1 314.7000000000001 -8.2C371.3000000000001 53.1 375.6 134.2000000000001 351.1 192.8C338.4000000000001 184.8 324 178.9 308.9000000000001 175.8zM418.1 436.3C387.1 369.8 336.8 389.1 302.3 356.2C289.9000000000001 344.2 281.7 322.2 281.7 305.7C281.7 291.6 286.2 278.6 293.7 266.9C341.1 277.9 392 312.9 411.9 357.6C411.2 352.1 407.1 343.2 404.7 338.4C384.4 302.7 340.1 272.8 305 253.5C319.8 239.1 338.7 227.7 360 227.7C439 227.7 470.1 362.3 418.1 436.3z" />
+    <glyph glyph-name="viber"
+      unicode="&#xF409;"
+      horiz-adv-x="512" d=" M444 398.1C431.3 409.8 379.9 447.1 265.3 447.6C265.3 447.6 130.2 455.7 64.4 395.3C27.8 358.7 14.9 305 13.5 238.5C12.1 172 10.4 47.4 130.5 13.6H130.6L130.5 -38S129.7 -58.9 143.5 -63.1C160.1 -68.3000000000001 169.9 -52.4 185.8 -35.3C194.5 -25.9 206.5 -12.1 215.6 -1.6C297.8 -8.5 360.9000000000001 7.3 368.1 9.6C384.7000000000001 14.9999999999999 478.6 26.9999999999999 493.8 151.6C509.6 280.2 486.2 361.4 444 398.1zM457.9 161C445 57 368.9 50.4 354.9 45.9C348.9 44 293.4 30.2 223.7 34.7C223.7 34.7 171.7 -28 155.5 -44.3C150.2 -49.6 144.4 -49.1 144.5 -38.6C144.5 -31.7 144.9 47.1 144.9 47.1C144.8 47.1 144.8 47.1 144.9 47.1C43.1 75.3 49.1 181.4 50.2 236.9C51.3 292.4 61.8 337.9 92.8 368.5C148.5 419 263.2000000000001 411.5 263.2000000000001 411.5C360.1 411.1 406.5000000000001 381.9 417.3000000000001 372.1C453.0000000000001 341.5 471.2 268.3 457.9000000000001 161zM318.9 241.8C319.3 233.2 306.4 232.6 306 241.2C304.9 263.2000000000001 294.6 273.9000000000001 273.4 275.1C264.8 275.6 265.6 288.5 274.1 288C302 286.5 317.5 270.5 318.9 241.8zM339.2 230.5C340.2 272.9 313.7 306.1 263.4 309.8C254.9 310.4 255.8 323.3 264.3 322.7000000000001C322.3 318.5 353.2 278.6 352.1 230.2C352 221.6 339 222 339.2 230.5000000000001zM386.2 217.1C386.3 208.5 373.3 208.4 373.3 217C372.7 298.5 318.4000000000001 342.9 252.5 343.4C244 343.5 244 356.3 252.5 356.3C326.2 355.8 385.5 304.9 386.2 217.1zM374.9 119V118.8C364.1 99.8 343.9 78.8 323.1 85.5L322.9 85.8C301.8 91.7 252.1 117.3 220.7 142.3C204.5 155.1 189.7 170.2 178.3 184.7C168 197.6 157.6 212.9 147.5 231.3C126.2 269.8 121.5 287 121.5 287C114.8 307.8 135.7 328 154.8 338.8H155C164.1999999999999 343.6 173 342 178.9 334.9C178.9 334.9 191.3 320.1 196.5999999999999 312.8C201.5999999999999 306 208.2999999999999 295.1 211.7999999999999 289C217.8999999999999 278.1 214.0999999999999 267 208.0999999999999 262.4L196.0999999999999 252.8C190 247.9 190.7999999999999 238.8 190.7999999999999 238.8S208.5999999999999 171.5 275.0999999999999 154.5C275.0999999999999 154.5 284.2 153.7 289.0999999999999 159.8L298.7 171.8C303.3 177.8 314.3999999999999 181.6 325.3 175.5C340 167.2 358.7 154.3 371.1 142.6C378.1 136.9 379.7 128.2000000000001 374.9 119z" />
+    <glyph glyph-name="vimeo-square"
+      unicode="&#xF194;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM383.8 266.4C382.4000000000001 235.3 360.6 192.6 318.5 138.5C275 82 238.2 53.7 208.1 53.7C189.4 53.7 173.7 70.9 160.8 105.3C135.6 197.6 124.9 251.7 104.1 251.7C101.7 251.7 93.3 246.7 79 236.6L64 256C100.9 288.4 136.1 324.4 158.1 326.4C183 328.8 198.3 311.8 204.1 275.3C224.6 145.7000000000001 233.7 126.1 270.9 184.8C284.3 206 291.5 222 292.4 233.1C295.8 265.9000000000001 266.8 263.7000000000001 247.2 255.3C262.9 306.8 293 331.8 337.3 330.4C370.2 329.4 385.7 308 383.8 266.4z" />
+    <glyph glyph-name="vimeo-v"
+      unicode="&#xF27D;"
+      horiz-adv-x="448" d=" M447.8 294.4C445.8 250.8 415.4000000000001 191.1 356.4 115.3C295.5 36.1 244 -3.5 201.8 -3.5C175.7 -3.5 153.6 20.6 135.5 68.8C100.3 198 85.3 273.7 56.2 273.7C52.8 273.7 41.1 266.6 21 252.6L0 279.8C51.6 325.1 100.9 375.5 131.8 378.3C166.7 381.7000000000001 188.1 357.8 196.2 306.8C224.9 125.3 237.6 97.9 289.8 180.1C308.5 209.7 318.6 232.2 320 247.7C324.8 293.6 284.2 290.5 256.7 278.7000000000001C278.7 350.8 320.8 385.8 382.9 383.8C428.7 382.6 450.4 352.7000000000001 447.8 294.4z" />
+    <glyph glyph-name="vimeo"
+      unicode="&#xF40A;"
+      horiz-adv-x="448" d=" M403.2 416H44.8C20.1 416 0 395.9 0 371.2V12.8C0 -11.9 20.1 -32 44.8 -32H403.2C427.9 -32 448 -11.9 448 12.8V371.2C448 395.9 427.9 416 403.2 416zM377 267.2C375.6 235.7 353.6 192.5 311 137.8C267 80.6 229.7 51.9999999999999 199.3 51.9999999999999C180.4 51.9999999999999 164.5 69.3999999999999 151.4 104.3C125.9 197.6 115 252.3 94 252.3C91.6 252.3 83.1 247.2 68.6 237.1L53.4 256.7C90.7 289.5 126.3 325.9 148.6 327.9C173.8 330.3 189.3 313.1 195.1 276.2C215.8 145 225 125.1999999999999 262.7 184.6C276.2 206 283.5 222.3 284.5 233.5C288 266.7 258.6 264.4 238.7 255.9C254.6 308 285 333.3 329.9 331.9C363.2 331 378.9 309.4 377 267.2z" />
+    <glyph glyph-name="vine"
+      unicode="&#xF1CA;"
+      horiz-adv-x="384" d=" M384 193.3V141.2C365.6 137 347.1 135.1 331.9 135.1C295 57.6999999999999 228.9 -8.7 206.8 -21.1C192.8 -29 179.7 -29.5 164.1 -20.3C137 -4 34.2 80.3 0 345.3H74.5C93.2 186.2 139 104.6 189.3 43.5C217.2 71.4 244.1 108.6 264.9 150.4C215.1 175.7 184.8 231.3 184.8 296C184.8 361.6 222.5 411.1 287 411.1C401.9 411.1 393.2 283.2 368.6 229.6C368.6 229.6 322.2000000000001 220.4 305.1 250.1C308.5 261.4 313.3 280.9 313.3 298.6C313.3 329.9 302 345.2 284.9000000000001 345.2C266.7000000000001 345.2 254.1 328.1 254.1 295.2C254.2 216 313.5 176.5 384 193.3z" />
+    <glyph glyph-name="vk"
+      unicode="&#xF189;"
+      horiz-adv-x="576" d=" M545 330.3C548.7 342.8 545 352 527.2 352H468.3000000000001C453.3000000000001 352 446.4000000000001 344.1 442.7000000000001 335.3C442.7000000000001 335.3 412.7000000000001 262.2 370.3000000000001 214.8C356.6000000000001 201.1 350.3000000000001 196.7 342.8000000000001 196.7C339.1000000000001 196.7 333.4000000000001 201.1 333.4000000000001 213.6V330.3C333.4000000000001 345.3 329.2000000000001 352 316.8000000000001 352H224.2000000000001C214.8000000000001 352 209.2000000000001 345 209.2000000000001 338.5C209.2000000000001 324.3 230.4000000000001 321 232.6000000000001 281V194.2C232.6000000000001 175.2 229.2000000000001 171.7 221.7000000000001 171.7C201.7000000000001 171.7 153.1000000000001 245.1 124.3000000000001 329.1C118.5000000000001 345.4 112.8000000000001 352 97.7000000000001 352H38.8C22 352 18.6 344.1 18.6 335.3C18.6 319.7 38.6 242.2 111.7 139.8C160.4 69.9 229 32 291.4 32C328.9 32 333.5 40.4 333.5 54.9C333.5 121.7 330.1 128 348.9 128C357.6 128 372.6 123.6 407.6 89.9C447.6 49.9 454.2 32 476.6 32H535.5C552.3 32 560.8 40.4 555.9 57C544.6999999999999 91.9 469 163.7 465.6 168.5C456.9 179.7 459.4 184.7 465.6 194.7C465.7 194.8 537.5999999999999 296 545 330.3z" />
+    <glyph glyph-name="vnv"
+      unicode="&#xF40B;"
+      horiz-adv-x="640" d=" M104.9 96C70.8 96 58.5 126.4 58.5 126.4L2.6 237.9S-7.8 256 13 256H45.8C56.2 256 59 247.3 64.6 237.9L101.3 163.4S106.5 150.3 122.4 150.3S143.5 163.4 143.5 163.4L180.2 237.9C185.8 247.4 188.6 256 199 256H231.8C252.6 256 242.2 237.9 242.2 237.9L186.4 126.4S174.2 96 140 96H104.9zM499.9 96C465.8 96 453.5 126.4 453.5 126.4L397.6 237.9S387.2 256 408 256H440.8C451.2 256 454 247.3 459.6 237.9L496.3 163.4S501.5 150.3 517.4 150.3S538.5 163.4 538.5 163.4L575.3 237.9C580.9 247.4 583.6999999999999 256 594.0999999999999 256H627C647.8 256 637.4 237.9 637.4 237.9L581.5 126.4S569.3 96 535.1 96H499.9zM337.6 256C371.7000000000001 256 384 225.6 384 225.6L439.9 114.1S450.3 96 429.5 96H396.7C386.3 96 383.5 104.7 377.9 114.1L341.2 188.6S336 201.7 320.1 201.7C304.2 201.7 299 188.6 299 188.6L262.3 114.1C256.7 104.7000000000001 253.9 96 243.5 96H210.5999999999999C189.7999999999999 96 200.1999999999999 114.1 200.1999999999999 114.1L256.0999999999999 225.6S268.2999999999999 256 302.4999999999999 256H337.5999999999999z" />
+    <glyph glyph-name="vuejs"
+      unicode="&#xF41F;"
+      horiz-adv-x="448" d=" M356.9 383.7H280L224 295.1L176 383.7000000000001H0L224 0L448 383.7H356.9zM55.7 351.7H109.5L224 153.5L338.4 351.7H392.2L224 63.5L55.7 351.7z" />
+    <glyph glyph-name="weibo"
+      unicode="&#xF18A;"
+      horiz-adv-x="512" d=" M407 270.4C414.6 294.4 393.6 317.2 369.6 312.1C347.6 307.3 340.8 340.2000000000001 362.5 344.9000000000001C412.6 355.8 454.8 307.8 439 260.1C432.2 238.9000000000001 400.2 249.3 407 270.4000000000001zM214.8 1.3C108.5 1.3 0 52.7 0 137.6C0 181.9 28 233.0000000000001 76.3 281.3C176 381 279.5 382.2 249.9 287C245.9 273.9 262.2 281.3 262.2 281C341.7 314.6 402.7 297.8 376.2 229.6C372.5 220.2 377.3 218.7 384.5 216.5C520.2 174.2 419.3 1.3 214.8 1.3zM358.5 147.6C353.1 203.3 280 241.6 195.1 233.3C110.3 224.7 46.3 173 51.7 117.3S130.2 23.3 215.1 31.6C299.9 40.2 363.9 91.9 358.5 147.6zM347.9 412.9C322 407.3 331.1 369.2 356.2 374.6C428.5 389.8 491 321.8 467.9 250.6C460.5 226.4 497 213.6 505.3 238.6C537.1999999999999 338.4 450.2 434.5 347.9 412.9zM269.4 101.9C252.3 63.1 202.6 41.9 160.3 55.6C119.5 68.7 102.3 108.9999999999999 120 145.3C137.7 180.6999999999999 183.1 200.7 223.4 190.4C265.4 179.6 286.5 140.2 269.4 101.9zM183.1 131.9C170.2 137.3 153.1 131.6 145.1 119C136.8 106.1 140.8 91 153.7 85C166.8 79 184.5 84.7 192.8 97.9C200.8 111 196.5 126.2 183.1 131.9zM215.7 145.3C210.6 147 204.3 144.6999999999999 201.4 139.9C198.5 134.8 200 129.3 205.0999999999999 127C210.1999999999999 125 216.7999999999999 127.3 219.6999999999999 132.4C222.5 137.6 220.7999999999999 143.3 215.6999999999999 145.3z" />
+    <glyph glyph-name="weixin"
+      unicode="&#xF1D7;"
+      horiz-adv-x="576" d=" M385.2 280.4C391.6 280.4 397.8 280.1 404 279.3C387.4 357.7 303.3 416 207.7 416C100.5 416 13 343.2 13 250.6C13 197.2 42.3 153.1 90.9 119L71.6 60.4L139.6 94.5C164 89.7 183.4 84.8 207.8 84.8C214 84.8 219.9 85.1 226.1 85.6C222.1 98.5 219.9 112.2000000000001 219.9 126.4C219.8000000000001 211.3000000000001 292.8000000000001 280.4000000000001 385.2000000000001 280.4000000000001zM280.7 333.3C295.2 333.3 304.9 323.6 304.9 308.9C304.9 294.4 295.2 284.7000000000001 280.7 284.7000000000001C265.9 284.7000000000001 251.4 294.4 251.4 308.9C251.5 323.6 266 333.3 280.7 333.3zM144.3 284.7000000000001C129.8 284.7000000000001 115 294.4 115 308.9C115 323.7 129.8 333.3 144.3 333.3C159.1 333.3 168.7 323.6 168.7 308.9C168.7 294.3 159.1 284.7000000000001 144.3 284.7000000000001zM563 128.6C563 206.5 485.1 269.9000000000001 397.6 269.9000000000001C304.9000000000001 269.9000000000001 232.2 206.5 232.2 128.6S305 -12.7 397.6 -12.7C416.9000000000001 -12.7 436.5 -7.6 456.2 -2.8L509.6 -32.1L494.8 16.5C534 45.9 563 84.8 563 128.6zM343.9 153.1C334.2 153.1 324.6 162.8 324.6 172.7000000000001C324.6 182.4 334.3 192.0000000000001 343.9 192.0000000000001C358.7 192.0000000000001 368.3 182.3000000000001 368.3 172.7000000000001C368.3 162.7000000000001 358.6 153.1 343.9 153.1zM451 153.1C441.3 153.1 431.7 162.8 431.7 172.7000000000001C431.7 182.4 441.4 192.0000000000001 451 192.0000000000001C465.5 192.0000000000001 475.4 182.3000000000001 475.4 172.7000000000001C475.5 162.7000000000001 465.5 153.1 451 153.1z" />
+    <glyph glyph-name="whatsapp-square"
+      unicode="&#xF40C;"
+      horiz-adv-x="448" d=" M224 325.2C151.3 325.2 92.2 266.1 92.1 193.4C92.1 168.5 99.1 144.2 112.3 123.3L115.4 118.3L102.1 69.6999999999999L152 82.8L156.8 79.9C177 67.9 200.2 61.5 223.9 61.5H224C296.6 61.5 357.3 120.6 357.3 193.3C357.3 228.5 342.1 261.6 317.2 286.5C292.2 311.5 259.2 325.2 224 325.2zM301.5 136.8C298.2 127.5 282.4 119.1 274.8 118C262.2 116.1 252.4 117.1 227.3 127.9C187.6 145.1 161.6 185.1 159.6 187.7C157.6 190.3 143.4 209.2 143.4 228.7S153.6 257.8 157.3000000000001 261.8C160.9 265.8 165.2000000000001 266.8 167.9 266.8C170.5 266.8 173.2000000000001 266.8 175.5 266.7C177.9 266.6 181.2 267.6 184.4 259.9C187.7000000000001 252 195.6 232.5 196.6 230.5S198.3 226.2 196.9 223.6C189.3000000000001 208.4 181.2000000000001 209 185.3000000000001 202C200.6000000000001 175.7 215.9 166.6 239.2000000000001 154.9C243.2000000000001 152.9 245.5000000000001 153.2 247.8000000000001 155.9C250.1000000000001 158.5 257.7000000000001 167.5 260.3000000000001 171.4C262.9000000000001 175.4 265.6000000000001 174.7 269.2000000000001 173.4C272.8000000000001 172.1 292.3000000000001 162.5 296.3000000000001 160.5S302.9000000000001 157.5 303.9000000000001 155.9C304.8000000000001 154 304.8000000000001 146 301.5000000000001 136.8zM400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM223.9 34.8C197.3 34.8 171.2 41.5 148.1 54.1L64 32L86.5 114.2C72.6 138.2 65.3 165.5 65.3 193.5C65.4 280.9 136.5 352 223.9 352C266.3 352 306.1 335.5 336.1 305.5C366 275.5 384 235.7 384 193.3C384 105.9 311.3 34.8 223.9 34.8z" />
+    <glyph glyph-name="whatsapp"
+      unicode="&#xF232;"
+      horiz-adv-x="448" d=" M380.9 350.9C339 392.9 283.2 416 223.9 416C101.5 416 1.9 316.4 1.9 194C1.9 154.9 12.1 116.7 31.5 83L0 -32L117.7 -1.1C150.1 -18.8 186.6 -28.1 223.8 -28.1H223.9C346.2 -28.1 448 71.5 448 193.9C448 253.2 422.8 308.9 380.9 350.9zM223.9 9.3C190.7 9.3 158.2 18.1999999999999 129.9 34.9999999999999L123.2 38.9999999999999L53.4 20.6999999999999L72 88.8L67.6 95.8C49.1 125.2 39.4 159.1 39.4 194C39.4 295.7 122.2 378.5 224 378.5C273.3 378.5 319.6 359.3 354.4 324.4C389.2 289.5 410.6 243.2 410.5 193.9C410.5 92.1 325.6 9.3 223.9 9.3zM325.1 147.5C319.6 150.3 292.3 163.6999999999999 287.2 165.5C282.1 167.3999999999999 278.4 168.3 274.7 162.6999999999999C271 157.0999999999999 260.4 144.6999999999999 257.1 140.8999999999999C253.9 137.1999999999999 250.6 136.6999999999999 245.1 139.5C212.5 155.8 191.1 168.6 169.6 205.5C163.9 215.3 175.3 214.5999999999999 185.9 235.8C187.7 239.5 186.8 242.7 185.4 245.5C184 248.3 172.9 275.5999999999999 168.3 286.7C163.8 297.5 159.2 296 155.8 296.2C152.6 296.3999999999999 148.9 296.3999999999999 145.2 296.3999999999999C141.5 296.3999999999999 135.5 294.9999999999999 130.4 289.4999999999999C125.3 283.8999999999999 111 270.4999999999999 111 243.2C111 215.8999999999999 130.9 189.5 133.6 185.8C136.4 182.1 172.7 126.1 228.4 101.9999999999999C263.6 86.8 277.4 85.4999999999999 295 88.1C305.7 89.7 327.8 101.4999999999999 332.4 114.5C337 127.5 337 138.6 335.6 140.8999999999999C334.3 143.3999999999999 330.6 144.7999999999999 325.1 147.5z" />
+    <glyph glyph-name="whmcs"
+      unicode="&#xF40D;"
+      horiz-adv-x="448" d=" M448 287V308.3L419.5 317.1L417.3 327.5L437.4000000000001 348.2000000000001L427 367.6L398 360.1L390.8 367.6L398.3 395.8L379.2 407.4L357.9 386.4L347.2 389.6L340.2 416H317.6L311.4 389.6L299.3 386.4L279.6 407.4L260.2 396.4L268.3 368.7L260.2 360.3L231.7 367.8L220.7 348.7L241.4 327.7L238.5 317.3L210 309.5L209.7 287.8L238.5 280.3L240.9 268.2L220.8 248.3L231.2 229.8L260.8 237.3L268 228.7L259.9 201.8L279.8 190.2L299.2 210.6L310.8 207.7L317.5 179.2L340.1 178.9L346.8 207.7L358.4 211.2L379.1 189.6L399.5 201.7L390.7 229.7L398.5 237.8L427.3 229L437.6 249.1L416.7 267.9L418.9 280L448 287zM328.8 241.8C297.5 241.8 272 267.2000000000001 272 298.6S297.4 355.4000000000001 328.8 355.4000000000001S385.6 330 385.6 298.6C385.6 267.1 360.2000000000001 241.8 328.8 241.8zM401.1 225.4L448 210.9V171L392.9 157.6L388.8 134.9L427.7 99.6L408.5 61.7000000000001L354.5 78.4L339.8999999999999 63.2000000000001L356.5999999999999 10.7L318.2999999999999 -11.9999999999999L279.3999999999999 28.5000000000001L257.7 21.9L245.1 -32.1L202.6999999999999 -31.6L190.0999999999999 22.0000000000001L168.4 27.6000000000001L132 -10.7999999999999L94.5999999999999 10.9000000000001L109.7999999999999 61.4000000000001L96.0999999999999 77.5000000000001L40.5999999999999 63.4000000000001L20.8999999999999 98.2000000000001L58.7999999999999 135.6000000000001L53.9999999999999 158.4000000000001L-1e-13 172.5000000000001L0.4999999999999 213.4000000000001L54 228.1L59.7 247.8L20.8 287.2L41.5 323L95.1 308.9L110.3 324.6L95.1 376.6L131.5 397.3L168.3 357.9L191 364L202.6 416H245L256.6 370.1L234 376L227.7 377.7L224.4 372L213.4 352.9L210.1 347.3L214.7 342.7000000000001L231.9 325.3L231.6 324.3L207.7999999999999 317.8L201.5999999999999 316.1L201.5 309.7000000000001L201.3 296.8C153.8 286.4 118 244 118 193.3C118 135 165.3 87.6 223.7 87.6C274.2 87.6 316.4 123 326.9 170.4L340.1 170.2000000000001L347 170.1L348.6 176.8L354.2 200.8L356.1 201.4L373.2 183.6L377.9 178.7000000000001L383.7 182.1L404.1 194.2L409.9 197.7L407.9 204.2L401.1 225.4z" />
+    <glyph glyph-name="wikipedia-w"
+      unicode="&#xF266;"
+      horiz-adv-x="640" d=" M640 396.8L639.7 384.6C611.6 383.8 594.7 368.8 583.9000000000001 344.3C558.9000000000001 286.5 480.6000000000001 104.3 428.6000000000001 -14.3H415L333.1 178.8C300.6 115.1999999999999 264.8 48.8 233.9000000000001 -14.3000000000001C233.6 -14.6000000000001 218.9 -14.3000000000001 218.9 -14.0000000000001C172 95.7 122.8 204.6 75.8 314.6C64.4 341.3 26.4 384.6 0.2 384.3C0.2 387.4 -0.1 394.3 -0.1 398.5H161.8V384.6C142.6 383.5 109 371.3 118.5 350.4C140.4 300.7 222.1 110.1 244.1 61.8C259.1 91.4999999999999 301.9000000000001 171 319.4000000000001 204.6C305.5000000000001 232.9 260.8 338.5 246.6 364.6C236.9000000000001 382.4 210.5 384 190.8 384.3V398.2L333.3 397.9V384.8C313.9000000000001 384.2 295.2 377 303.9000000000001 358.7C322.8 318.7 334.5000000000001 290.6 352.0000000000001 254C357.6000000000001 264.8 386.7000000000001 323.4 400.1000000000001 354.8C409.0000000000001 375.4 396.2000000000001 383.4 361.5000000000001 384.2C361.8000000000001 387.8 361.5000000000001 394.5 361.8000000000001 397.8C406.2000000000001 398.1 472.9000000000001 398.1 484.9000000000001 398.4V384.8C462.4000000000001 384 439.1000000000001 372 426.8000000000001 353.1L367.6000000000001 230.3C374.0000000000001 214.2 430.9000000000001 87.5 436.8000000000001 73.6L559.2 356.2C550.6 379.3 522.8000000000001 384.3 512 384.5V398.4L639.8 397.3L640 396.8z" />
+    <glyph glyph-name="windows"
+      unicode="&#xF17A;"
+      horiz-adv-x="448" d=" M0 354.3L183.6 379.6V202.2H0V354.3zM0 29.7L183.6 4.4V179.6H0V29.7zM203.8 1.7L448 -32V179.6H203.8V1.7zM203.8 382.3V202.2H448V416L203.8 382.3z" />
+    <glyph glyph-name="wordpress-simple"
+      unicode="&#xF411;"
+      horiz-adv-x="512" d=" M256 440C119.3 440 8 328.8 8 192C8 55.3 119.3 -56 256 -56S504 55.3 504 192C504 328.8 392.7 440 256 440zM33 192C33 224.3 39.9 255 52.3 282.7L158.7 -8.7C84.3 27.5 33 103.8 33 192zM256 -31C234.1 -31 213 -27.8 193 -21.9L259.9 172.5L328.4 -15.3C328.9 -16.4 329.4 -17.4 330 -18.4C306.9 -26.5000000000001 282 -31.0000000000001 256 -31.0000000000001zM286.7 296.5C300.1 297.2 312.2 298.6 312.2 298.6C324.2 300 322.8 317.7 310.8 317C310.8 317 274.7 314.2 251.4 314.2C229.5 314.2 192.7 317 192.7 317C180.7 317.7 179.3 299.3 191.3 298.6C191.3 298.6 202.7 297.2 214.7 296.5L249.4 201.3L200.6 55L119.4 296.5C132.8 297.2 144.9 298.6 144.9 298.6C156.9 300 155.5 317.7 143.5 317C143.5 317 107.4 314.2 84.1 314.2C79.9 314.2 75 314.3 69.7 314.5C109.6 375 178.1 415 256 415C314 415 366.9 392.8 406.6 356.5C405.6 356.6 404.7000000000001 356.7 403.7000000000001 356.7C381.8000000000001 356.7 366.3000000000001 337.6 366.3000000000001 317.1C366.3000000000001 298.7 376.9000000000001 283.2 388.2000000000001 264.8C396.7000000000001 250 406.6 230.9 406.6 203.3C406.6 184.2 399.3 162.1 389.6 131.2000000000001L367.4000000000001 56.9L286.7000000000001 296.5zM368.1 -0.7L436.2000000000001 196.2C448.9000000000001 228.0000000000001 453.2 253.4000000000001 453.2 276.1C453.2 284.3 452.7 291.9000000000001 451.7 299C469.1 267.2000000000001 479.0000000000001 230.8 479.0000000000001 192C479.0000000000001 109.7000000000001 434.4000000000001 37.9 368.1 -0.6999999999999z" />
+    <glyph glyph-name="wordpress"
+      unicode="&#xF19A;"
+      horiz-adv-x="512" d=" M61.7 278.6L163.2 0.6C92.2 35 43.3 107.8 43.3 192C43.3 222.9 49.9 252.1 61.7 278.6zM399.6 202.7C399.6 229 390.2 247.2 382.1 261.4C371.3 278.9 361.2 293.8 361.2 311.3C361.2 330.9 376 349.1 396.9 349.1C397.8 349.1 398.7 349 399.7 348.9C361.8 383.6 311.4 404.8 256 404.8C181.7 404.8 116.3 366.7 78.2 308.9C83.2 308.7 87.9 308.6 91.9 308.6C114.1 308.6 148.6 311.3 148.6 311.3C160.1 312 161.4 295.1 150 293.8C150 293.8 138.5 292.5 125.7 291.8L203.2 61.4L249.8 201L216.7 291.8C205.2 292.5 194.4 293.8 194.4 293.8C182.9 294.5 184.3 312 195.7 311.3C195.7 311.3 230.8 308.6 251.7 308.6C273.9000000000001 308.6 308.4000000000001 311.3 308.4000000000001 311.3C319.9000000000001 312 321.2000000000001 295.1 309.8 293.8C309.8 293.8 298.3 292.5 285.5 291.8L362.4 63.1L383.6 134C392.6 163.4 399.6 184.5 399.6 202.7zM259.7 173.4L195.8999999999999 -12.1C214.9999999999999 -17.7 235.0999999999999 -20.8 255.9999999999999 -20.8C280.7999999999999 -20.8 304.4999999999999 -16.5 326.5999999999999 -8.7C325.9999999999999 -7.8 325.4999999999999 -6.8 325.0999999999999 -5.8L259.7 173.4zM442.7 294.1C443.5999999999999 287.3 444.0999999999999 280.1 444.0999999999999 272.2C444.0999999999999 250.6 440.0999999999999 226.4 427.8999999999999 196L362.8999999999999 8.0999999999999C426.2 45 468.7 113.5 468.7 192C468.7 229 459.3 263.8 442.7 294.1zM504 192C504 55.2 392.7 -56 256 -56C119.2 -56 8 55.3 8 192C8 328.8 119.2 440 256 440C392.7 440 504 328.8 504 192zM492.6 192C492.6 322.5 386.4000000000001 428.6 256 428.6C125.5 428.6 19.4 322.5 19.4 192S125.6 -44.6 256 -44.6C386.5 -44.6 492.6 61.5 492.6 192z" />
+    <glyph glyph-name="wpbeginner"
+      unicode="&#xF297;"
+      horiz-adv-x="512" d=" M462.799 125.626C519.01 61.318 466.961 -32 370.944 -32C331.3420000000001 -32 292.12 -14.313 270.802 18.04C263.915 17.684 248.1 17.684 241.212 18.04C219.848 -14.381 180.588 -32 141.069 -32C45.579 -32 -7.279 60.996 49.214 125.626C-29.925 257.477 80.479 416 256.006 416C431.638 416 541.876 257.374 462.799 125.626zM123.152 208.598H164.681V266.673H123.152V208.598zM340.332 122.526V146.365C279.826 125.4499999999999 207.977 137.167 152.743 180.336L152.989 155.439C204.09 109.072 284.735 97.564 340.332 122.526zM189.579 208.598H355.637V266.673H189.579V208.598z" />
+    <glyph glyph-name="wpexplorer"
+      unicode="&#xF2DE;"
+      horiz-adv-x="512" d=" M512 192C512 50.8 397.3 -64 256 -64C114.8 -64 0 50.7 0 192S114.7 448 256 448S512 333.3 512 192zM480 192C480 315.2 379.7 416 256 416C132.5 416 32 315.5 32 192S132.5 -32 256 -32S480 68.5 480 192zM160.9 323.4L247.8 286.3L210.7 199.4L123.8 236.5L160.9 323.4zM270.9 154.3L317.5 60.3H302.9L252.9 160.3L204 60.3H190L241.1 167.2000000000001L218.8 176.6L224.8 190.6L293.4 161.5L287.4 147.2L270.9 154.3zM259.1 270.6L327.7 241.2L298.3 172.9L230 202L259.1 270.6zM339.4 227.7L394 204.6L370.6 150.3L316.3 173.4L339.4000000000001 227.7000000000001z" />
+    <glyph glyph-name="wpforms"
+      unicode="&#xF298;"
+      horiz-adv-x="448" d=" M448 372.8V11.1C448 -13.2 429 -32.1 404.8 -32.1H43.2C19.3 -32 0 -13.4 0 11.2V372.8C0 396.9 18.8 416 43.2 416H404.9C428.9 416 448 397.2 448 372.8zM410.7 11.2V372.8C410.7 375.8 408.1 378.6 404.9 378.6H395.6L285.3 304L224 353.9L162.8 304L52.5 378.7H43.2C40 378.7 37.4 375.9 37.4 372.9V11.2C37.4 8.2 40 5.4 43.2 5.4H404.9C408.1 5.3 410.7 8.1 410.7 11.2zM150.2 262V225H76.7V262H150.2zM150.2 187.6V150.3H76.7V187.6H150.2zM161.3 334.9000000000001L215.3 378.6H96.8L161.3 334.9000000000001zM371.3 262V225H175.3V262H371.3zM371.3 187.6V150.3H175.3V187.6H371.3zM286.7 334.9000000000001L351.2 378.6H232.8L286.7 334.9000000000001zM371.3 113V75.7H271.9V113H371.3z" />
+    <glyph glyph-name="xbox"
+      unicode="&#xF412;"
+      horiz-adv-x="512" d=" M369.9 129.8C414.2 75.5 434.6 31 424.3 11.1C416.4 -4 367.6 -33.5 331.7 -44.8C302.0999999999999 -54.1 263.3 -58.1 231.3 -54.9999999999999C193.0999999999999 -51.3 154.3999999999999 -37.6 121.1999999999999 -15.9999999999999C93.3 2.2 87 9.7 87 24.6C87 54.5 119.9 106.9 176.2 166.7000000000001C208.2 200.6000000000001 252.7 240.4000000000001 257.6 239.3000000000001C267 237.2000000000001 341.9000000000001 164.2000000000001 369.9000000000001 129.8000000000001zM188.6 304.2C158.9 331.1 130.5 358.1 102.2 367.6C87 372.7 85.9 372.4 73.5 359.5C44.3 329.1 20 279.8 13.2 237.1C7.8 202.9 7.1 193.3 9 176.6C14.6 126.1 26.3 91.2000000000001 49.5 55.7C59 41.1 61.6 38.4 58.8 45.8000000000001C54.6 56.8000000000001 58.5 83.3000000000001 68.3 109.8000000000001C82.6 148.8000000000001 122.2 222.7000000000001 188.6 304.2000000000001zM500.2 240.7C483.3 320.7 432.7 371 425.6 371C418.3 371 401.4000000000001 364.5 389.6 357.1C366.3 342.6 348.6 325.7 325.3 304.3C367.7 251 427.5 164.9 448.2 102C455 81.3 457.9 60.9 455.6 49.7C453.9 41.2 453.9 41.2 456.9999999999999 45.1C463.1 52.8 476.8999999999999 76.4 482.3999999999999 88.6C489.7999999999999 104.8 497.3999999999999 128.8 500.9999999999999 147.3C505.3 169.8 504.8999999999999 218.1 500.1999999999999 240.7zM141.3 405C189 407.5 251 370.5 255.6 369.6C256.3 369.5 266 373.8 277.2 379.3C341.1 410.4 371.2 405.1 384.6 404.5C320.7000000000001 443.8 231.9000000000001 454.5 150.7 416.2C127.3 405.1 126.7 404.3 141.3 405z" />
+    <glyph glyph-name="xing-square"
+      unicode="&#xF169;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM140.4 127.8H93.8C88.3 127.8 85.1 133.1 87.8 138.1L137.1 224.8C137.2 224.8 137.2 224.9 137.1 225L105.7 279C102.7 284.6 105.9 289.1 111.7 289.1H158.3C163.5 289.1 167.8 286.2 171.2 280.4L203.1 225.1C201.8 222.8 185.1 193.4 153 136.9C149.5 130.7000000000001 145.3 127.8 140.4 127.8zM360.1 341.9L257.3 161.2V161L322.8 42C325.6 36.9 322.9000000000001 31.9 316.8 31.9H270.2C264.7 31.9 260.5 34.8 257.3 40.6L191.3 160.9C193.6 165 228.1 225.8 294.7000000000001 343.2C298.0000000000001 349 302.1 351.9 307.2000000000001 351.9H354.1C359.8 352 362.9000000000001 347.2 360.1 341.9z" />
+    <glyph glyph-name="xing"
+      unicode="&#xF168;"
+      horiz-adv-x="384" d=" M162.7 238C160.9 234.7 137.5 193.6 92.6 114.5C87.7 106.2 81.8 102 74.9 102H9.8C2.1 102 -2.3 109.5 1.3 116.4L70.3 237.7C70.5 237.7 70.5 237.8 70.3 238L26.4 313.6C22.1 321.4 26.7 327.7 34.9 327.7H100C107.3 327.7 113.3 323.6 118 315.5L162.7 238zM382.6 401.9L238.6 148.9V148.6L330.2 -18C334.1 -25.1 330.4 -32.1 321.7 -32.1H256.5C248.9 -32.1 242.9 -28.1 238.5 -19.9L146.1 148.6C149.4 154.4 197.6 239.4 290.9 403.8C295.5 411.9 301.3 416 308.4 416H374.1C382.1 416 386.4 409.3 382.6 401.9z" />
+    <glyph glyph-name="y-combinator"
+      unicode="&#xF23B;"
+      horiz-adv-x="448" d=" M448 416V-32H0V416H448zM236 160.5L313.5 306H280.8L235 215C230.3 205.7 226 196.7 222.2 188.2L210 215L164.8 306H129.8L206.5 162.2V67.7H236V160.5z" />
+    <glyph glyph-name="yahoo"
+      unicode="&#xF19E;"
+      horiz-adv-x="448" d=" M252 156L256 -64C243.3 -61.8 232.5 -60.1 223.7 -60.1C215.3 -60.1 204.5 -61.8 191.4 -64L195.4 156C140.4 250.8 85 352.8 21.4 448C33.3 444.9 44.4 444.1 54.6 444.1C63.6 444.1 75 444.9 88.7 448C129.6 375.8 170.8 309.3 223.7 222.5C261 284.1 314.8 366.6 358.6 448C369.7000000000001 445.1 380.6 444.1 391.5 444.1C403 444.1 414.7 445.1 426.5 448C392.1 400.1 294.9 231.1 252 156z" />
+    <glyph glyph-name="yandex-international"
+      unicode="&#xF414;"
+      horiz-adv-x="320" d=" M129.5 -64V102.1L18.5 400H74.3L156.1 170.3L250.2 448H301.5L180.8 100.2V-64H129.5z" />
+    <glyph glyph-name="yandex"
+      unicode="&#xF413;"
+      horiz-adv-x="256" d=" M153.1 132.2L65.7 -64H2L98 145.8C52.9 168.7 22.8 210.2 22.8 286.9C22.7 394.3 90.8 448 171.7 448H254V-64H198.9V132.2H153.1zM198.9 401.5H169.5C125.1 401.5 82.1 372.1 82.1 286.9C82.1 204.6 121.5 178.1 169.5 178.1H198.9V401.5z" />
+    <glyph glyph-name="yelp"
+      unicode="&#xF1E9;"
+      horiz-adv-x="384" d=" M136.9 120C135.9 119.7 27.7 84.3 21.1 84.3C5.9 85.2 2.6 100.5 1.2 115.5C-0.3 129.7 -0.2 145.3 1.5 162.3C3.4 181.1 7 207.4 25.7 206.3C30.5 206.3 92.8 180.4 138.4 161.9C155.5 155.1 157 126.1 136.9 120.0000000000001zM194.8 233.9C196.6 195.7 169.3 185.4 147.6 219.6L41.3 387.6C39.8 394.2 41.6 400 46.6 405C62.2 421.5 146 444.8 168.1 439.1C175.6 437.2 180.2 433 181.9 426.5C183.2 418.2 193.4 259.1 194.8 233.9zM193.4 69.1C193.4 64.5 193.6 -47.3 191.7 -52.4C189.4 -58.4 184.7 -62.1 177.4 -63.6C167.3 -65.2999999999999 150.3 -61.7 126.4 -52.9C104.4 -44.8 69.7 -31.4 77.1 -10.4C79.9 -3.5 128.5 52.4 154.4 83.2000000000001C166.4 98.4 194.2 88.7000000000001 193.4 69.1zM373.6 186.9C368 183.2000000000001 262.8 158.7000000000001 255.5000000000001 156.3L255.8000000000001 156.9C237.7000000000001 152.2000000000001 220.4 175.4 232.5000000000001 191.5000000000001C236.2 195.2000000000001 298.4000000000001 283.9000000000001 305.3 288.5000000000001C310.5 292.1 316.6 292.3000000000001 323.6 289.1C342 280.3000000000001 378.7000000000001 226.0000000000001 381 204.5000000000001C380.9 201.6000000000001 382.2 192.8000000000001 373.6 186.9zM383.7000000000001 56.2C381.0000000000001 35.6 339.2000000000001 -17.1999999999999 319.9000000000001 -24.8C313.0000000000001 -27.4 307.0000000000001 -26.8 302.2000000000001 -22.8C297.2000000000001 -19.3 240.4000000000001 74.3000000000001 237.3000000000001 79.5000000000001C226.4000000000001 95.7000000000001 244.1000000000001 119.3000000000001 262.9000000000001 112.7000000000001C262.9000000000001 112.7000000000001 373.4000000000001 77.0000000000001 377.6 73.3000000000001C382.8 69.2000000000001 384.8 63.5000000000001 383.7000000000001 56.2z" />
+    <glyph glyph-name="yoast"
+      unicode="&#xF2B1;"
+      horiz-adv-x="448" d=" M91.3 372H277.3L270.3 353.1H91.3C51.6 353.1 19.4 321.5 19.4 282.8V77.4C19.4 42 44.3 7.1 103.4 7.1V-12H91.3C41.2 -12 0 28.2 0 77.5V282.8C0 332.1 40.7 372 91.3 372zM320.4 428H386.9C243.1 49.9 241.2 29.1 202.2 -11.3C181.4 -32.9 152.9 -43 123.9 -44V7.1C173.1 14.8 188.5 57 188.5 82.4C188.5 102.5000000000001 189.1 95.0000000000001 106.4 305.6H167.8L218.2 149L320.4 428zM448 286.5V-12H234C240.6 -2.4 244.7 4.3 246.1 7.4H428.6V286.5C428.6 319 411.5 338.4 380.4000000000001 349.4L387.1 367C428.8 353.4 448 323.9 448 286.5z" />
+    <glyph glyph-name="youtube-square"
+      unicode="&#xF431;"
+      horiz-adv-x="448" d=" M186.8 245.9L282 191.8L186.8 137.7V245.9zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM406 191.7S406 251.3 398.4 279.9C394.2 295.7 381.9 308.1 366.2 312.3C337.9 320 224 320 224 320S110.1 320 81.8 312.3C66.1 308.1 53.8 295.7000000000001 49.6 279.9C42 251.4 42 191.7 42 191.7S42 132.1 49.6 103.5C53.8 87.7 66.1 75.8 81.8 71.6C110.1 64 224 64 224 64S337.9 64 366.2 71.7C381.9 75.9 394.2 87.8 398.4 103.6C406 132.1 406 191.6999999999999 406 191.6999999999999z" />
+    <glyph glyph-name="youtube"
+      unicode="&#xF167;"
+      horiz-adv-x="576" d=" M549.655 323.9170000000001C543.374 347.567 524.8679999999999 366.193 501.371 372.514C458.781 384 288 384 288 384S117.22 384 74.629 372.514C51.132 366.192 32.626 347.567 26.345 323.9170000000001C14.933 281.05 14.933 191.612 14.933 191.612S14.933 102.174 26.345 59.307C32.626 35.657 51.132 17.807 74.629 11.486C117.22 0 288 0 288 0S458.78 0 501.371 11.486C524.8679999999999 17.807 543.374 35.657 549.655 59.307C561.067 102.174 561.067 191.612 561.067 191.612S561.067 281.05 549.655 323.9170000000001zM232.145 110.409V272.815L374.884 191.61L232.145 110.409z" />
+  </font>
+</defs>
+</svg>
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.ttf b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..e66c3dd8300883b9ad4643f99335c37467ca7e94
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.ttf differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff
new file mode 100644
index 0000000000000000000000000000000000000000..39cac5e17875f7a3dd56913d77446acad90590d9
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff2 b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..7ea5865a771a1c1411043d341cd760f0cb67b8c3
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-brands-400.woff2 differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.eot b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.eot
new file mode 100644
index 0000000000000000000000000000000000000000..5da01f06a24ccfe9f63ee9b40c85e21d93f382d0
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.eot differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.svg b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.svg
new file mode 100644
index 0000000000000000000000000000000000000000..688c5ac634f69785898ce0df72a9ec1222a60a5b
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.svg
@@ -0,0 +1,366 @@
+<?xml version="1.0" standalone="no"?> 
+<!--
+Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs>
+  <font id="fontawesome-free" horiz-adv-x="640">
+    <font-face font-family="Font Awesome 5 Free"
+      units-per-em="512" ascent="448"
+      descent="64"
+      font-weight="400"
+      font-style="Regular" />
+    <missing-glyph horiz-adv-x="0" />
+    <glyph glyph-name="address-book"
+      unicode="&#xF2B9;"
+      horiz-adv-x="448" d=" M436 288C442.627 288 448 293.373 448 300V340C448 346.627 442.627 352 436 352H416V400C416 426.51 394.51 448 368 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H436C442.627 32 448 37.373 448 44V84C448 90.627 442.627 96 436 96H416V160H436C442.627 160 448 165.373 448 172V212C448 218.627 442.627 224 436 224H416V288H436zM362 -16H54A6 6 0 0 0 48 -10V394A6 6 0 0 0 54 400H362A6 6 0 0 0 368 394V-10A6 6 0 0 0 362 -16zM128 240C128 284.183 163.817 320 208 320S288 284.183 288 240S252.183 160 208 160S128 195.817 128 240zM336 106.523V88C336 74.745 325.255 64 312 64H104C90.745 64 80 74.745 80 88V106.523C80 128.549 94.99 147.7480000000001 116.358 153.09L152.015 162.004C181.116 141.072 226.524 135.059 263.985 162.004L299.642 153.09C321.01 147.748 336 128.548 336 106.523z" />
+    <glyph glyph-name="address-card"
+      unicode="&#xF2BB;"
+      horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM458 48H54A6 6 0 0 0 48 54V330A6 6 0 0 0 54 336H458A6 6 0 0 0 464 330V54A6 6 0 0 0 458 48zM404 224H300C293.373 224 288 229.373 288 236V252C288 258.627 293.373 264 300 264H404C410.627 264 416 258.627 416 252V236C416 229.373 410.627 224 404 224zM404 152H300C293.373 152 288 157.373 288 164V180C288 186.627 293.373 192 300 192H404C410.627 192 416 186.627 416 180V164C416 157.373 410.627 152 404 152zM176 288C209.137 288 236 261.137 236 228S209.137 168 176 168S116 194.863 116 228S142.863 288 176 288zM244.731 162.817L217.989 169.503C189.893 149.294 155.837 153.804 134.011 169.503L107.269 162.817C91.243 158.811 80 144.411 80 127.892V114C80 104.059 88.059 96 98 96H254C263.941 96 272 104.059 272 114V127.892C272 144.411 260.757 158.811 244.731 162.817z" />
+    <glyph glyph-name="arrow-alt-circle-down"
+      unicode="&#xF358;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM224 308V192H157C146.3 192 141 179.1 148.5 171.5L247.5 72.5C252.2 67.8 259.8 67.8 264.5 72.5L363.5 171.5C371.1 179.1 365.7 192 355 192H288V308C288 314.6 282.6 320 276 320H236C229.4 320 224 314.6 224 308z" />
+    <glyph glyph-name="arrow-alt-circle-left"
+      unicode="&#xF359;"
+      horiz-adv-x="512" d=" M8 192C8 55 119 -56 256 -56S504 55 504 192S393 440 256 440S8 329 8 192zM456 192C456 81.5 366.5 -8 256 -8S56 81.5 56 192S145.5 392 256 392S456 302.5 456 192zM384 212V172C384 165.4 378.6 160 372 160H256V93C256 82.3 243.1 77 235.5 84.5L136.5 183.5C131.8 188.2 131.8 195.8 136.5 200.5L235.5 299.5C243.1 307.1 256 301.7 256 291V224H372C378.6 224 384 218.6 384 212z" />
+    <glyph glyph-name="arrow-alt-circle-right"
+      unicode="&#xF35A;"
+      horiz-adv-x="512" d=" M504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192zM128 172V212C128 218.6 133.4 224 140 224H256V291C256 301.7 268.9 307 276.5 299.5L375.5 200.5C380.2 195.8 380.2 188.2 375.5 183.5L276.5 84.5C268.9 76.9 256 82.3 256 93V160H140C133.4 160 128 165.4 128 172z" />
+    <glyph glyph-name="arrow-alt-circle-up"
+      unicode="&#xF35B;"
+      horiz-adv-x="512" d=" M256 -56C393 -56 504 55 504 192S393 440 256 440S8 329 8 192S119 -56 256 -56zM256 392C366.5 392 456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192S145.5 392 256 392zM276 64H236C229.4 64 224 69.4 224 76V192H157C146.3 192 141 204.9 148.5 212.5L247.5 311.5C252.2 316.2 259.8 316.2 264.5 311.5L363.5 212.5C371.1 204.9 365.7 192 355 192H288V76C288 69.4 282.6 64 276 64z" />
+    <glyph glyph-name="bell-slash"
+      unicode="&#xF1F6;"
+      horiz-adv-x="576" d=" M130.9 48C114.138 48 105.765 68.39 117.566 80.191C142.792 105.417 163.66 129.5290000000001 168.215 201.6710000000001L121.438 242.9450000000001A168.48 168.48 0 0 1 121.142 233.1430000000001C121.142 151.21 103.591 133.8510000000001 86.599 117.0650000000001C38.504 69.559 73.726 0 130.919 0H224C224 -35.346 252.654 -64 288 -64S352 -35.346 352 0H396.777L342.377 48H130.9zM288 -24C274.766 -24 264 -13.234 264 0H312C312 -13.234 301.234 -24 288 -24zM571.867 -24.553L503.936 35.018C517.04 59.136 515.4599999999999 91.336 489.404 117.0600000000001C472.415 133.8450000000001 454.858 151.2030000000001 454.858 233.1430000000001C454.858 316.1690000000001 393.9 385.2170000000001 314.391 397.9050000000001A31.848 31.848 0 0 1 320 416C320 433.673 305.673 448 288 448S256 433.673 256 416A31.848 31.848 0 0 1 261.609 397.905C220.138 391.287 183.718 369.334 158.36 338.064L36.459 444.963C31.401 449.399 23.682 448.919 19.219 443.892L3.056 425.687C-1.407 420.6600000000001 -0.925 412.988 4.134 408.553L539.542 -60.963C544.6 -65.399 552.3190000000001 -64.919 556.782 -59.892L572.945 -41.687C577.407 -36.66 576.9250000000001 -28.988 571.8670000000001 -24.553zM288 352C353.538 352 406.857 298.681 406.857 233.143C406.857 135.493 430.078 108.569 458.425 80.191C461.333 77.283 462.9979999999999 73.8630000000001 463.634 70.359L194.482 306.3880000000001C216.258 334.133 250.075 352 288 352z" />
+    <glyph glyph-name="bell"
+      unicode="&#xF0F3;"
+      horiz-adv-x="448" d=" M425.403 117.061C408.4140000000001 133.846 390.8570000000001 151.204 390.8570000000001 233.144C390.8570000000001 316.17 329.899 385.218 250.39 397.906A31.842999999999996 31.842999999999996 0 0 1 256 416C256 433.673 241.673 448 224 448S192 433.673 192 416A31.848 31.848 0 0 1 197.609 397.905C118.101 385.217 57.143 316.169 57.143 233.143C57.143 151.21 39.592 133.851 22.6 117.065C-25.496 69.559 9.726 0 66.919 0H160C160 -35.346 188.654 -64 224 -64C259.346 -64 288 -35.346 288 0H381.08C438.27 0 473.495 69.583 425.403 117.061zM224 -24C210.766 -24 200 -13.234 200 0H248C248 -13.234 237.234 -24 224 -24zM381.092 48H66.9C50.138 48 41.765 68.39 53.566 80.191C82.151 108.776 105.143 135.915 105.143 233.1430000000001C105.143 298.6810000000001 158.462 352 224 352S342.857 298.681 342.857 233.143C342.857 135.493 366.078 108.569 394.425 80.191C406.278 68.339 397.783 48 381.092 48z" />
+    <glyph glyph-name="bookmark"
+      unicode="&#xF02E;"
+      horiz-adv-x="384" d=" M336 448H48C21.49 448 0 426.51 0 400V-64L192 48L384 -64V400C384 426.51 362.51 448 336 448zM336 19.57L192 103.57L48 19.57V394A6 6 0 0 0 54 400H330C333.314 400 336 397.317 336 394.004V19.57z" />
+    <glyph glyph-name="building"
+      unicode="&#xF1AD;"
+      horiz-adv-x="448" d=" M128 300V340C128 346.6 133.4 352 140 352H180C186.6 352 192 346.6 192 340V300C192 293.4 186.6 288 180 288H140C133.4 288 128 293.4 128 300zM268 288H308C314.6 288 320 293.4 320 300V340C320 346.6 314.6 352 308 352H268C261.4 352 256 346.6 256 340V300C256 293.4 261.4 288 268 288zM140 192H180C186.6 192 192 197.4 192 204V244C192 250.6 186.6 256 180 256H140C133.4 256 128 250.6 128 244V204C128 197.4 133.4 192 140 192zM268 192H308C314.6 192 320 197.4 320 204V244C320 250.6 314.6 256 308 256H268C261.4 256 256 250.6 256 244V204C256 197.4 261.4 192 268 192zM192 108V148C192 154.6 186.6 160 180 160H140C133.4 160 128 154.6 128 148V108C128 101.4 133.4 96 140 96H180C186.6 96 192 101.4 192 108zM268 96H308C314.6 96 320 101.4 320 108V148C320 154.6 314.6 160 308 160H268C261.4 160 256 154.6 256 148V108C256 101.4 261.4 96 268 96zM448 -28V-64H0V-28C0 -21.4 5.4 -16 12 -16H31.5V424C31.5 437.3 42.2 448 55.5 448H392.5C405.8 448 416.5 437.3 416.5 424V-16H436C442.6 -16 448 -21.4 448 -28zM79.5 -15H192V52C192 58.6 197.4 64 204 64H244C250.6 64 256 58.6 256 52V-15H368.5V399L80 400L79.5 -15z" />
+    <glyph glyph-name="calendar-alt"
+      unicode="&#xF073;"
+      horiz-adv-x="448" d=" M148 160H108C101.4 160 96 165.4 96 172V212C96 218.6 101.4 224 108 224H148C154.6 224 160 218.6 160 212V172C160 165.4 154.6 160 148 160zM256 172V212C256 218.6 250.6 224 244 224H204C197.4 224 192 218.6 192 212V172C192 165.4 197.4 160 204 160H244C250.6 160 256 165.4 256 172zM352 172V212C352 218.6 346.6 224 340 224H300C293.4 224 288 218.6 288 212V172C288 165.4 293.4 160 300 160H340C346.6 160 352 165.4 352 172zM256 76V116C256 122.6 250.6 128 244 128H204C197.4 128 192 122.6 192 116V76C192 69.4 197.4 64 204 64H244C250.6 64 256 69.4 256 76zM160 76V116C160 122.6 154.6 128 148 128H108C101.4 128 96 122.6 96 116V76C96 69.4 101.4 64 108 64H148C154.6 64 160 69.4 160 76zM352 76V116C352 122.6 346.6 128 340 128H300C293.4 128 288 122.6 288 116V76C288 69.4 293.4 64 300 64H340C346.6 64 352 69.4 352 76zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" />
+    <glyph glyph-name="calendar-check"
+      unicode="&#xF274;"
+      horiz-adv-x="448" d=" M400 384H352V436C352 442.627 346.627 448 340 448H300C293.373 448 288 442.627 288 436V384H160V436C160 442.627 154.627 448 148 448H108C101.373 448 96 442.627 96 436V384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V336C448 362.51 426.51 384 400 384zM394 -16H54A6 6 0 0 0 48 -10V288H400V-10A6 6 0 0 0 394 -16zM341.151 184.65L198.842 43.481C194.137 38.814 186.539 38.844 181.871 43.549L106.78 119.248C102.113 123.953 102.143 131.551 106.848 136.219L129.567 158.755C134.272 163.422 141.87 163.392 146.537 158.686L190.641 114.225L301.713 224.406C306.418 229.073 314.016 229.043 318.6840000000001 224.3379999999999L341.2200000000001 201.62C345.887 196.9149999999999 345.8560000000001 189.317 341.151 184.65z" />
+    <glyph glyph-name="calendar-minus"
+      unicode="&#xF272;"
+      horiz-adv-x="448" d=" M124 120C117.4 120 112 125.4 112 132V156C112 162.6 117.4 168 124 168H324C330.6 168 336 162.6 336 156V132C336 125.4 330.6 120 324 120H124zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" />
+    <glyph glyph-name="calendar-plus"
+      unicode="&#xF271;"
+      horiz-adv-x="448" d=" M336 156V132C336 125.4 330.6 120 324 120H248V44C248 37.4 242.6 32 236 32H212C205.4 32 200 37.4 200 44V120H124C117.4 120 112 125.4 112 132V156C112 162.6 117.4 168 124 168H200V244C200 250.6 205.4 256 212 256H236C242.6 256 248 250.6 248 244V168H324C330.6 168 336 162.6 336 156zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" />
+    <glyph glyph-name="calendar-times"
+      unicode="&#xF273;"
+      horiz-adv-x="448" d=" M311.7 73.3L294.7 56.3C290 51.6 282.4 51.6 277.7 56.3L224 110.1L170.3 56.4C165.6 51.7 158 51.7 153.3 56.4L136.3 73.4C131.6 78.1 131.6 85.7000000000001 136.3 90.4L190 144.1L136.3 197.8C131.6 202.5 131.6 210.1 136.3 214.8L153.3 231.8C158 236.5 165.6 236.5 170.3 231.8L224 178.1L277.7 231.8C282.4 236.5 290 236.5 294.7 231.8L311.7 214.8C316.4 210.1 316.4 202.5 311.7 197.8L257.9 144L311.6 90.3C316.4 85.6 316.4 78 311.7 73.3zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" />
+    <glyph glyph-name="calendar"
+      unicode="&#xF133;"
+      horiz-adv-x="448" d=" M400 384H352V436C352 442.6 346.6 448 340 448H300C293.4 448 288 442.6 288 436V384H160V436C160 442.6 154.6 448 148 448H108C101.4 448 96 442.6 96 436V384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V336C448 362.5 426.5 384 400 384zM394 -16H54C50.7 -16 48 -13.3 48 -10V288H400V-10C400 -13.3 397.3 -16 394 -16z" />
+    <glyph glyph-name="caret-square-down"
+      unicode="&#xF150;"
+      horiz-adv-x="448" d=" M125.1 240H322.9C333.6 240 339 227 331.4 219.5L232.5 121.2C227.8 116.5 220.3 116.5 215.6 121.2L116.7 219.5C109 227 114.4 240 125.1 240zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="caret-square-left"
+      unicode="&#xF191;"
+      horiz-adv-x="448" d=" M272 290.9V93.1C272 82.4 259 77 251.5 84.6L153.2 183.5C148.5 188.2 148.5 195.7 153.2 200.4L251.5 299.3C259 307 272 301.6 272 290.9zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="caret-square-right"
+      unicode="&#xF152;"
+      horiz-adv-x="448" d=" M176 93.1V290.9C176 301.6 189 307 196.5 299.4L294.8 200.5C299.5 195.8 299.5 188.3 294.8 183.6L196.5 84.7000000000001C189 77.0000000000001 176 82.4 176 93.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="caret-square-up"
+      unicode="&#xF151;"
+      horiz-adv-x="448" d=" M322.9 144H125.1C114.4 144 109 157 116.6 164.5L215.5 262.8C220.2 267.5 227.7 267.5 232.4 262.8L331.3 164.5C339 157 333.6 144 322.9000000000001 144zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="chart-bar"
+      unicode="&#xF080;"
+      horiz-adv-x="512" d=" M500 48C506.6 48 512 42.6 512 36V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H36C42.6 384 48 378.6 48 372V48H500zM144 108V180C144 186.6 138.6 192 132 192H108C101.4 192 96 186.6 96 180V108C96 101.4 101.4 96 108 96H132C138.6 96 144 101.4 144 108zM240 108V308C240 314.6 234.6 320 228 320H204C197.4 320 192 314.6 192 308V108C192 101.4 197.4 96 204 96H228C234.6 96 240 101.4 240 108zM336 108V244C336 250.6 330.6 256 324 256H300C293.4 256 288 250.6 288 244V108C288 101.4 293.4 96 300 96H324C330.6 96 336 101.4 336 108zM432 108V340C432 346.6 426.6 352 420 352H396C389.4 352 384 346.6 384 340V108C384 101.4 389.4 96 396 96H420C426.6 96 432 101.4 432 108z" />
+    <glyph glyph-name="check-circle"
+      unicode="&#xF058;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M396.204 261.733L373.668 284.451C369.0010000000001 289.156 361.403 289.187 356.698 284.519L215.346 144.303L155.554 204.58C150.887 209.285 143.289 209.316 138.584 204.649L115.865 182.113C111.16 177.446 111.129 169.848 115.797 165.142L206.578 73.6259999999999C211.245 68.9209999999999 218.843 68.8899999999999 223.548 73.5579999999999L396.1370000000001 244.762C400.8410000000001 249.43 400.8710000000001 257.0279999999999 396.2040000000001 261.733z" />
+    <glyph glyph-name="check-square"
+      unicode="&#xF14A;"
+      horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM400 16H48V368H400V16zM364.136 257.724L191.547 86.52C186.842 81.853 179.244 81.883 174.577 86.588L83.796 178.104C79.129 182.809 79.159 190.407 83.865 195.075L106.584 217.611C111.289 222.278 118.887 222.248 123.554 217.542L183.346 157.265L324.698 297.481C329.403 302.148 337.001 302.118 341.668 297.413L364.204 274.695C368.871 269.9890000000001 368.841 262.391 364.136 257.724z" />
+    <glyph glyph-name="circle"
+      unicode="&#xF111;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8z" />
+    <glyph glyph-name="clipboard"
+      unicode="&#xF328;"
+      horiz-adv-x="384" d=" M336 384H256C256 419.29 227.29 448 192 448S128 419.29 128 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V336C384 362.51 362.51 384 336 384zM330 -16H54A6 6 0 0 0 48 -10V330A6 6 0 0 0 54 336H96V300C96 293.373 101.373 288 108 288H276C282.627 288 288 293.373 288 300V336H330A6 6 0 0 0 336 330V-10A6 6 0 0 0 330 -16zM192 408C205.255 408 216 397.255 216 384S205.255 360 192 360S168 370.745 168 384S178.745 408 192 408" />
+    <glyph glyph-name="clock"
+      unicode="&#xF017;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM317.8 96.4L232.9 158.1C229.8 160.4 228 164 228 167.8V332C228 338.6 233.4 344 240 344H272C278.6 344 284 338.6 284 332V190.3L350.8 141.7C356.2 137.8 357.3 130.3 353.4000000000001 124.9L334.6 99C330.7000000000001 93.7 323.2000000000001 92.5 317.8 96.4z" />
+    <glyph glyph-name="clone"
+      unicode="&#xF24D;"
+      horiz-adv-x="512" d=" M464 448H144C117.49 448 96 426.51 96 400V352H48C21.49 352 0 330.51 0 304V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H464C490.51 32 512 53.49 512 80V400C512 426.51 490.51 448 464 448zM362 -16H54A6 6 0 0 0 48 -10V298A6 6 0 0 0 54 304H96V80C96 53.49 117.49 32 144 32H368V-10A6 6 0 0 0 362 -16zM458 80H150A6 6 0 0 0 144 86V394A6 6 0 0 0 150 400H458A6 6 0 0 0 464 394V86A6 6 0 0 0 458 80z" />
+    <glyph glyph-name="closed-captioning"
+      unicode="&#xF20A;"
+      horiz-adv-x="512" d=" M464 384H48C21.5 384 0 362.5 0 336V48C0 21.5 21.5 0 48 0H464C490.5 0 512 21.5 512 48V336C512 362.5 490.5 384 464 384zM458 48H54C50.7 48 48 50.7 48 54V330C48 333.3 50.7 336 54 336H458C461.3 336 464 333.3 464 330V54C464 50.7 461.3 48 458 48zM246.9 133.7C248.6 131.3 248.4 128.1 246.4 126C192.8 69.2 73.6 93.9 73.6 193.9C73.6 291.2 195.3 313.4 246.1 264C248.2 262 248.6 260.8 247.1 258.3L229.6 227.8C227.7 224.7 223.4 223.8 220.5 226.1C179.7 258.1 125.9 241.0000000000001 125.9 194.9C125.9 146.9 176.9 124.4 218.1 162.3C220.9 164.8 225.2 164.4 227.3 161.4L246.9 133.7000000000001zM437.3 133.7C439 131.3 438.8 128.1 436.8 126C383.2 69.1 264 93.9 264 193.9C264 291.2 385.7 313.4 436.5 264C438.6 262 439 260.8 437.5 258.3L420 227.8C418.1 224.7 413.8 223.8 410.9 226.1C370.1 258.1 316.3 241.0000000000001 316.3 194.9C316.3 146.9 367.3 124.4 408.5 162.3C411.3 164.8 415.6 164.4 417.7 161.4L437.3 133.7000000000001z" />
+    <glyph glyph-name="comment-alt"
+      unicode="&#xF27A;"
+      horiz-adv-x="512" d=" M448 448H64C28.7 448 0 419.3 0 384V96C0 60.7 28.7 32 64 32H160V-52C160 -59.1 165.8 -64 172 -64C174.4 -64 176.9 -63.3 179.1 -61.6L304 32H448C483.3 32 512 60.7 512 96V384C512 419.3 483.3 448 448 448zM464 96C464 87.2 456.8 80 448 80H288L275.2 70.4L208 20V80H64C55.2 80 48 87.2 48 96V384C48 392.8 55.2 400 64 400H448C456.8 400 464 392.8 464 384V96z" />
+    <glyph glyph-name="comment"
+      unicode="&#xF075;"
+      horiz-adv-x="512" d=" M256 416C114.6 416 0 322.9 0 208C0 160.4 19.9 116.8 52.9 81.7C38 42.3 7 8.9 6.5 8.5C-0.1 1.5 -1.9 -8.7 1.9 -17.5S14.4 -32 24 -32C85.5 -32 134 -6.3 163.1 14.3C192 5.2 223.2 0 256 0C397.4 0 512 93.1 512 208S397.4 416 256 416zM256 48C229.3 48 202.9 52.1 177.6 60.1L154.9 67.3L135.4 53.5C121.1 43.4 101.5 32.1 77.9 24.5C85.2 36.6 92.3 50.2 97.8 64.7L108.4 92.8L87.8 114.6C69.7 133.9 48 165.8 48 208C48 296.2 141.3 368 256 368S464 296.2 464 208S370.7 48 256 48z" />
+    <glyph glyph-name="comments"
+      unicode="&#xF086;"
+      horiz-adv-x="576" d=" M532 61.8C559.5 88.9 576 122.9 576 160C576 240 499.5 306.1 399.8 317.9C368.3 375.5 294.3 416 208 416C93.1 416 0 344.4 0 256C0 219 16.5 185 44 157.8C28.7 127.1 6.7 103.3 6.3 102.9C0 96.2000000000001 -1.8 86.4 1.9 77.9C5.5 69.4 13.9 63.9 23.1 63.9C76.6 63.9 119.8 84.1 148.3 102.7000000000001C157.5 100.6 167 99.0000000000001 176.7 97.8000000000001C208.1 40.4 281.8 0 368 0C388.8 0 408.8 2.4 427.8 6.8C456.3 -11.7 499.4 -32 553 -32C562.2 -32 570.5 -26.5 574.2 -18C577.8000000000001 -9.5 576.1 0.3 569.8000000000001 7C569.4000000000001 7.3 547.3000000000001 31.1 532.0000000000001 61.8zM139.2 154.1L122.1 143C108 133.9 93.6 126.7 79 121.6C81.7 126.3 84.4 131.3 87 136.4L102.5 167.5000000000001L77.7 192C64.2 205.4 48 227.3 48 256C48 316.7 121.3 368 208 368S368 316.7 368 256S294.7 144 208 144C191.5 144 175 145.9 159 149.6L139.2 154.1zM498.3 96L473.6 71.6L489.1 40.5C491.7 35.4 494.4 30.4 497.1 25.7C482.5 30.8 468.1 38 454 47.1L436.9 58.2L417 53.6C401 49.9 384.5 47.9999999999999 368 47.9999999999999C314 47.9999999999999 265.8 68.1 236.7 97.6999999999999C338 108.5 416 175.1 416 256C416 259.4 415.6 262.7 415.3 266C479.7 251.5 528 209.2 528 160C528 131.3 511.8 109.4 498.3 96z" />
+    <glyph glyph-name="compass"
+      unicode="&#xF14E;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM347.326 304.131L313.9670000000001 166.352A24.005 24.005 0 0 0 307.1950000000001 154.623L204.5550000000001 56.844C187.4510000000001 40.551 158.9950000000001 56.41 164.6750000000001 79.868L198.0340000000001 217.647A23.997 23.997 0 0 0 204.8060000000001 229.376L307.4480000000001 327.155C324.7330000000001 343.625 352.9420000000001 327.33 347.3260000000001 304.131zM256 224C238.327 224 224 209.673 224 192S238.327 160 256 160S288 174.327 288 192S273.673 224 256 224z" />
+    <glyph glyph-name="copy"
+      unicode="&#xF0C5;"
+      horiz-adv-x="448" d=" M433.941 382.059L382.059 433.941A48 48 0 0 1 348.118 448H176C149.49 448 128 426.51 128 400V352H48C21.49 352 0 330.51 0 304V-16C0 -42.51 21.49 -64 48 -64H272C298.51 -64 320 -42.51 320 -16V32H400C426.51 32 448 53.49 448 80V348.118A48 48 0 0 1 433.941 382.059zM266 -16H54A6 6 0 0 0 48 -10V298A6 6 0 0 0 54 304H128V80C128 53.49 149.49 32 176 32H272V-10A6 6 0 0 0 266 -16zM394 80H182A6 6 0 0 0 176 86V394A6 6 0 0 0 182 400H288V312C288 298.745 298.745 288 312 288H400V86A6 6 0 0 0 394 80zM400 336H336V400H345.632C347.223 400 348.749 399.368 349.875 398.243L398.243 349.875A6 6 0 0 0 400 345.632V336z" />
+    <glyph glyph-name="copyright"
+      unicode="&#xF1F9;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM363.351 93.064C353.737 83.352 317.8210000000001 51.668 259.286 51.668C176.856 51.668 118.802 113.093 118.802 193.235C118.802 272.387 179.077 332.636 258.564 332.636C314.095 332.636 347.302 306.016 356.157 297.857A11.965 11.965 0 0 0 358.093 282.535L339.938 254.422C336.097 248.472 327.972 247.14 322.439 251.501C313.844 258.277 290.625 274.039 260.731 274.039C212.428 274.039 182.815 238.709 182.815 193.957C182.815 152.368 209.703 110.265 261.092 110.265C293.749 110.265 317.935 129.304 326.818 137.49C332.088 142.347 340.414 141.529 344.638 135.752L364.503 108.582A11.947000000000001 11.947000000000001 0 0 0 363.351 93.064z" />
+    <glyph glyph-name="credit-card"
+      unicode="&#xF09D;"
+      horiz-adv-x="576" d=" M527.9 416H48.1C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48.1 -32H527.9C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 527.9 416zM54.1 368H521.9C525.1999999999999 368 527.9 365.3 527.9 362V320H48.1V362C48.1 365.3 50.8 368 54.1 368zM521.9 16H54.1C50.8 16 48.1 18.7 48.1 22V192H527.9V22C527.9 18.7 525.1999999999999 16 521.9 16zM192 116V76C192 69.4 186.6 64 180 64H108C101.4 64 96 69.4 96 76V116C96 122.6 101.4 128 108 128H180C186.6 128 192 122.6 192 116zM384 116V76C384 69.4 378.6 64 372 64H236C229.4 64 224 69.4 224 76V116C224 122.6 229.4 128 236 128H372C378.6 128 384 122.6 384 116z" />
+    <glyph glyph-name="dot-circle"
+      unicode="&#xF192;"
+      horiz-adv-x="512" d=" M256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 272C211.817 272 176 236.183 176 192S211.817 112 256 112S336 147.817 336 192S300.183 272 256 272z" />
+    <glyph glyph-name="edit"
+      unicode="&#xF044;"
+      horiz-adv-x="576" d=" M402.3 103.1L434.3 135.1C439.3 140.1 448 136.6 448 129.4V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H321.5C328.6 384 332.2 375.4 327.2 370.3L295.2 338.3C293.7 336.8 291.7 336 289.5 336H48V-16H400V97.5C400 99.6 400.8 101.6 402.3 103.1zM558.9 304.9000000000001L296.3 42.3L205.9 32.3C179.7 29.4 157.4 51.5 160.3 77.9L170.3 168.3000000000001L432.9 430.9C455.8 453.8 492.8 453.8 515.6 430.9L558.8000000000001 387.7C581.7 364.8 581.7 327.7 558.9000000000001 304.9zM460.1 274L402 332.1L216.2 146.2L208.9 80.9L274.2 88.2L460.1 274zM524.9 353.7L481.7 396.9C477.6 401 470.9 401 466.9 396.9L436 366L494.1 307.9L525 338.8C529 343 529 349.6 524.9 353.7000000000001z" />
+    <glyph glyph-name="envelope-open"
+      unicode="&#xF2B6;"
+      horiz-adv-x="512" d=" M494.586 283.4840000000001C489.889 287.367 382.863 373.4340000000001 359.3350000000001 392.141C337.231 409.809 299.437 448 256 448C212.795 448 175.364 410.283 152.665 392.141C128.202 372.6910000000001 21.595 286.9460000000001 17.515 283.592A48.004000000000005 48.004000000000005 0 0 1 0 246.515V-16C0 -42.51 21.49 -64 48 -64H464C490.51 -64 512 -42.51 512 -16V246.491A48 48 0 0 1 494.586 283.4840000000001zM464 -10A6 6 0 0 0 458 -16H54A6 6 0 0 0 48 -10V243.653C48 245.466 48.816 247.179 50.226 248.318C66.096 261.132 159.019 335.872 182.59 354.611C200.755 369.12 232.398 400 256 400C279.693 400 311.857 368.631 329.41 354.611C352.983 335.87 445.913 261.118 461.776 248.295A5.99 5.99 0 0 0 463.9999999999999 243.632V-10zM432.009 177.704C436.2580000000001 172.545 435.474 164.909 430.264 160.723C401.289 137.44 370.99 113.126 359.3350000000001 103.86C336.636 85.717 299.205 48 256 48C212.548 48 174.713 86.237 152.665 103.86C141.386 112.827 110.921 137.273 81.738 160.725C76.528 164.912 75.745 172.547 79.993 177.706L95.251 196.234C99.429 201.307 106.908 202.077 112.03 197.96C140.648 174.959 170.596 150.925 182.59 141.389C200.143 127.369 232.307 96 256 96C279.602 96 311.246 126.88 329.41 141.389C341.404 150.924 371.354 174.959 399.973 197.957C405.095 202.073 412.574 201.303 416.751 196.23L432.009 177.704z" />
+    <glyph glyph-name="envelope"
+      unicode="&#xF0E0;"
+      horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM464 336V295.195C441.578 276.936 405.832 248.544 329.413 188.705C312.572 175.458 279.212 143.633 256 144.004C232.792 143.629 199.421 175.463 182.587 188.705C106.18 248.535 70.425 276.933 48 295.195V336H464zM48 48V233.602C70.914 215.351 103.409 189.74 152.938 150.956C174.795 133.751 213.072 95.77 256 96.001C298.717 95.77 336.509 133.2000000000001 359.053 150.948C408.581 189.7310000000001 441.085 215.3490000000001 464 233.6010000000001V48H48z" />
+    <glyph glyph-name="eye-slash"
+      unicode="&#xF070;"
+      horiz-adv-x="576" d=" M272.702 88.861C192.219 97.872 136.49 175.747 155.772 255.903L272.702 88.861zM288 56C185.444 56 95.908 110.701 48 192C69.755 228.917 100.1 260.342 136.344 283.658L108.803 323.0010000000001C67.001 295.766 31.921 259.259 6.646 216.369A47.999 47.999 0 0 1 6.646 167.63C63.004 71.994 168.14 8 288 8A332.89 332.89 0 0 1 327.648 10.367L295.627 56.111A284.16 284.16 0 0 0 288 56zM569.354 167.631C536.1220000000001 111.237 485.933 65.889 425.8000000000001 38.139L473.9160000000001 -30.601C477.717 -36.03 476.3960000000001 -43.513 470.967 -47.313L450.23 -61.83C444.8010000000001 -65.631 437.3180000000001 -64.3099999999999 433.5180000000001 -58.881L102.084 414.601C98.283 420.03 99.604 427.513 105.033 431.313L125.77 445.83C131.199 449.631 138.682 448.31 142.482 442.881L198.008 363.556C226.612 371.657 256.808 376 288 376C407.86 376 512.996 312.006 569.354 216.369A48.00200000000001 48.00200000000001 0 0 0 569.354 167.631zM528 192C483.843 266.933 404.323 319.27 311.838 327.007C302.042 316.9220000000001 296 303.17 296 288C296 257.072 321.072 232 352 232S408 257.072 408 288L407.999 288.0420000000001C438.6310000000001 230.765 424.738 157.7820000000001 371.0710000000001 116.323L397.766 78.188C452.626 101.449 498.308 141.614 528 192z" />
+    <glyph glyph-name="file-alt"
+      unicode="&#xF15C;"
+      horiz-adv-x="384" d=" M288 200V172C288 165.4 282.6 160 276 160H108C101.4 160 96 165.4 96 172V200C96 206.6 101.4 212 108 212H276C282.6 212 288 206.6 288 200zM276 128H108C101.4 128 96 122.6 96 116V88C96 81.4 101.4 76 108 76H276C282.6 76 288 81.4 288 88V116C288 122.6 282.6 128 276 128zM384 316.1V-16C384 -42.5 362.5 -64 336 -64H48C21.5 -64 0 -42.5 0 -16V400C0 426.5 21.5 448 48 448H252.1C264.8 448 277 442.9 286 433.9L369.9 350C378.9 341.1 384 328.8 384 316.1zM256 396.1V320H332.1L256 396.1zM336 -16V272H232C218.7 272 208 282.7 208 296V400H48V-16H336z" />
+    <glyph glyph-name="file-archive"
+      unicode="&#xF1C6;"
+      horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM256 396.118L332.118 320H256V396.118zM336 -16H48V400H127.714V384H159.714V400H208V296C208 282.745 218.745 272 232 272H336V-16zM192.27 352H160.27V384H192.27V352zM160.27 352V320H128.27V352H160.27zM160.27 288V256H128.27V288H160.27zM192.27 288H160.27V320H192.27V288zM194.179 182.322A12 12 0 0 1 182.406 192H160.27V224H128.27V192L108.58 94.894C101.989 62.389 126.834 32 160 32C193.052 32 217.871 62.192 211.476 94.62L194.179 182.322zM160.27 57.927C142.352 57.927 127.826 70.032 127.826 84.963C127.826 99.895 142.351 111.999 160.27 111.999S192.714 99.894 192.714 84.963C192.714 70.032 178.188 57.927 160.27 57.927zM192.27 224H160.27V256H192.27V224z" />
+    <glyph glyph-name="file-audio"
+      unicode="&#xF1C7;"
+      horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM192 60.024C192 49.333 179.074 43.979 171.515 51.539L136 87.514H108C101.373 87.514 96 92.887 96 99.514V155.514C96 162.141 101.373 167.514 108 167.514H136L171.515 204.461C179.075 212.021 192 206.667 192 195.976V60.024zM233.201 107.154C242.252 116.451 242.261 131.287 233.202 140.593C211.053 163.345 245.437 196.839 267.597 174.074C294.795 146.134 294.809 101.63 267.598 73.673C245.805 51.287 210.651 83.988 233.201 107.154z" />
+    <glyph glyph-name="file-code"
+      unicode="&#xF1C9;"
+      horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM149.677 99.115L116.854 128L149.676 156.885A8.793 8.793 0 0 1 150.281 169.509L132.878 188.073C129.494 191.686 123.914 191.735 120.44 188.4740000000001L62.78 134.42C59.077 130.946 59.076 125.053 62.781 121.5800000000001L120.44 67.525A8.738 8.738 0 0 1 126.452 65.1440000000001A8.746 8.746 0 0 1 132.879 67.9260000000001L150.282 86.489A8.795 8.795 0 0 1 149.677 99.115zM233.961 226.965L209.56 234.049A8.796 8.796 0 0 1 198.655 228.051L144.04 39.939C142.687 35.279 145.378 30.387 150.038 29.0340000000001L174.441 21.95C179.121 20.595 183.998 23.304 185.346 27.948L239.958 216.06C241.312 220.72 238.621 225.612 233.961 226.9650000000001zM321.219 134.42L263.561 188.475C260.035 191.7820000000001 254.462 191.6400000000001 251.122 188.074L233.719 169.511A8.795 8.795 0 0 1 234.324 156.886L267.146 128L234.324 99.115A8.793 8.793 0 0 1 233.719 86.491L251.122 67.927A8.797 8.797 0 0 1 263.5610000000001 67.526H263.5600000000001L321.2200000000001 121.581C324.923 125.054 324.923 130.947 321.2190000000001 134.42z" />
+    <glyph glyph-name="file-excel"
+      unicode="&#xF1C3;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM260 224H231.2C226.8 224 222.8 221.6 220.7 217.7C202.7 184.6 198.5 175.3 192.1 160C178.2 189.1 185.2 177.3 163.5 217.7C161.4 221.6 157.3 224 152.9 224H124C114.7 224 109 214 113.6 206L159.9 128L113.6 50C108.9 42 114.7 32 124 32H152.9C157.3 32 161.3 34.4 163.4 38.3C185.1 78.3 186.4 83.3 192 96C206.9 65.8 197.9 80.1 220.6 38.3C222.7 34.4 226.8 32 231.2 32H260C269.3 32 275 42 270.4 50L224 128C224.7 129.1 254.3 178.5 270.3 206C275 214 269.2 224 260 224z" />
+    <glyph glyph-name="file-image"
+      unicode="&#xF1C5;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM80 32H304V160L280.5 183.5C275.8 188.2 268.2 188.2 263.5 183.5L176 96L136.5 135.5C131.8 140.2 124.2 140.2 119.5 135.5L80 96V32zM128 272C101.5 272 80 250.5 80 224S101.5 176 128 176S176 197.5 176 224S154.5 272 128 272z" />
+    <glyph glyph-name="file-pdf"
+      unicode="&#xF1C1;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM298.2 127.7C286 139.7 251.2 136.4 233.8 134.2C216.6 144.7 205.1 159.2 197 180.5C200.9 196.6 207.1 221.1 202.4 236.5C198.2 262.7 164.6 260.1 159.8 242.4C155.4 226.3 159.4 203.9 166.8 175.3C156.8 151.4 141.9 119.3 131.4 100.9C111.4 90.6 84.4 74.7 80.4 54.7C77.1 38.9 106.4 -0.5 156.5 85.9C178.9 93.3 203.3 102.4 224.9 106C243.8 95.8 265.9 89 280.7 89C306.2 89 308.7 117.2 298.2 127.7zM100.1 49.9C105.2 63.6 124.6 79.4 130.5 84.9C111.5 54.6 100.1 49.2 100.1 49.9zM181.7 240.5C189.1 240.5 188.4 208.4 183.5 199.7C179.1 213.6 179.2 240.5 181.7 240.5zM157.3 103.9C167 120.8 175.3 140.9 182 158.6C190.3 143.5 200.9 131.4 212.1 123.1C191.3 118.8 173.2 109.9999999999999 157.3 103.9zM288.9 108.9S283.9 102.9 251.6 116.7C286.7 119.3 292.5 111.3 288.9 108.9z" />
+    <glyph glyph-name="file-powerpoint"
+      unicode="&#xF1C4;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM120 44V212C120 218.6 125.4 224 132 224H201.2C237.9 224 264 197 264 157.7C264 83.4 195.3 91.2 168.5 91.2V44C168.5 37.4 163.1 32 156.5 32H132C125.4 32 120 37.4 120 44zM168.5 131.4H191.5C199.4 131.4 205.4 133.8 209.6 138.6C218.1 148.4 218 167.1 209.7 176.4C205.6 181 199.8 183.4 192.3 183.4H168.4V131.4z" />
+    <glyph glyph-name="file-video"
+      unicode="&#xF1C8;"
+      horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM276.687 195.303L224 142.626V180C224 191.046 215.046 200 204 200H100C88.954 200 80 191.046 80 180V76C80 64.954 88.954 56 100 56H204C215.046 56 224 64.954 224 76V113.374L276.687 60.7000000000001C286.704 50.682 304 57.72 304 72.014V183.989C304 198.3 286.691 205.308 276.687 195.303z" />
+    <glyph glyph-name="file-word"
+      unicode="&#xF1C2;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM268.1 192C262.4000000000001 192 257.5 188 256.4000000000001 182.5C235.8000000000001 84.8 236.0000000000001 87.1 235.4000000000001 79C235.2000000000001 80.2 235.0000000000001 81.6 234.7000000000001 83.3C233.9000000000001 88.4 235.0000000000001 83.1 211.1000000000001 182.8C209.8000000000001 188.2 205.0000000000001 192 199.4000000000001 192H186.1000000000001C180.6000000000001 192 175.8000000000001 188.2 174.4000000000001 182.9C150.0000000000001 83.9 150.4000000000001 86.7 149.6000000000001 79.2C149.5000000000001 80.3 149.4000000000001 81.7 149.1000000000001 83.4C148.4000000000001 88.6 135.0000000000001 156.7 130.0000000000001 182.4C128.9000000000001 188 124.0000000000001 192.1 118.2000000000001 192.1H101.4000000000001C93.6000000000001 192.1 87.9000000000001 184.8 89.7000000000001 177.3C97.7000000000001 144.6999999999999 116.4000000000001 67.8 122.9000000000001 41.3C124.2000000000001 35.9 129.0000000000001 32.1999999999999 134.6000000000001 32.1999999999999H159.8000000000001C165.3000000000001 32.1999999999999 170.1000000000001 35.8999999999999 171.4 41.3L189.3000000000001 112.6999999999999C190.8000000000001 118.8999999999999 191.8000000000001 124.6999999999999 192.3000000000001 130L195.2000000000001 112.6999999999999C195.3000000000001 112.3 207.8000000000001 62.1999999999999 213.1000000000001 41.3C214.4000000000001 35.9999999999999 219.2000000000001 32.1999999999999 224.7000000000001 32.1999999999999H249.4000000000001C254.9000000000001 32.1999999999999 259.7000000000001 35.8999999999999 261.0000000000001 41.3C281.8000000000001 123.1999999999999 291.2000000000001 160.3 295.5000000000001 177.3C297.4000000000001 184.9 291.7000000000001 192.2 283.9000000000001 192.2H268.1z" />
+    <glyph glyph-name="file"
+      unicode="&#xF15B;"
+      horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48z" />
+    <glyph glyph-name="flag"
+      unicode="&#xF024;"
+      horiz-adv-x="512" d=" M336.174 368C287.042 368 242.869 400 174.261 400C142.96 400 115.958 393.5180000000001 93.54 384.832A48.04 48.04 0 0 1 95.682 405.559C93.067 428.425 74.167 446.406 51.201 447.896C23.242 449.71 0 427.569 0 400C0 382.236 9.657 366.738 24 358.438V-48C24 -56.837 31.163 -64 40 -64H56C64.837 -64 72 -56.837 72 -48V35.443C109.869 52.72 143.259 64 199.826 64C248.958 64 293.131 32 361.7390000000001 32C420.218 32 463.711 54.617 490.287 71.981C503.846 80.839 512 95.949 512 112.145V352.063C512 386.522 476.736 409.831 445.096 396.18C409.193 380.6910000000001 371.641 368 336.174 368zM464 112C442.217 96.588 403.176 80 361.7390000000001 80C301.7940000000001 80 259.737 112 199.826 112C156.465 112 103.447 102.597 72 88V320C93.784 335.4120000000001 132.824 352 174.261 352C234.206 352 276.2630000000001 320 336.1740000000001 320C379.4450000000001 320 432.4940000000001 337.366 464 352V112z" />
+    <glyph glyph-name="folder-open"
+      unicode="&#xF07C;"
+      horiz-adv-x="576" d=" M527.943 224H480V272C480 298.51 458.51 320 432 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H448A48.001 48.001 0 0 1 488.704 22.56L568.646 150.56C588.5939999999999 182.477 565.608 224 527.943 224zM54 336H188.118L252.118 272H426A6 6 0 0 0 432 266V224H152A48 48 0 0 1 110.902 200.798L48 96.551V330.007A5.993 5.993 0 0 0 54 336zM448 48H72L149.234 176H528L448 48z" />
+    <glyph glyph-name="folder"
+      unicode="&#xF07B;"
+      horiz-adv-x="512" d=" M464 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V272C512 298.51 490.51 320 464 320zM458 48H54C50.686 48 48 50.678 48 53.992V330.008A5.993 5.993 0 0 0 54 336H188.118L252.118 272H458A6 6 0 0 0 464 266V54A6 6 0 0 0 458 48z" />
+    <glyph glyph-name="frown"
+      unicode="&#xF119;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM248 -8C137.7 -8 48 81.7 48 192S137.7 392 248 392S448 302.3 448 192S358.3 -8 248 -8zM168 208C185.7 208 200 222.3 200 240S185.7 272 168 272S136 257.7 136 240S150.3 208 168 208zM328 272C310.3 272 296 257.7 296 240S310.3 208 328 208S360 222.3 360 240S345.7 272 328 272zM248 144C207.8 144 170 126.3 144.2 95.4C135.7 85.2 137.1 70.1 147.3 61.6C157.5 53.1 172.6 54.4999999999999 181.1 64.7C197.7 84.6 222.1 96.1 248 96.1S298.3 84.7 314.9 64.7C319.7 59 326.5 56.1 333.4 56.1C338.8 56.1 344.3 57.9 348.8 61.7C359 70.2 360.3 85.3 351.9 95.5C326 126.3 288.2 144 248 144z" />
+    <glyph glyph-name="futbol"
+      unicode="&#xF1E3;"
+      horiz-adv-x="496" d=" M483.8 268.6C449.8 373.4 352.6 440 248.1 440C222.7 440 196.9 436.1 171.4 427.8C41.2 385.5 -30.1 245.6 12.2 115.4C46.2 10.6 143.4 -56 247.9 -56C273.3 -56 299.1 -52.1 324.6 -43.8C454.8 -1.5 526.1 138.4 483.8 268.6zM409.3 74.9L357.1 68.5L313.4000000000001 129.4L337.8 204.6L408.9 226.7L447.8 190.3C447.6 159.6 440.4 129.1999999999999 426.1 101.1C421.4 91.8 415.4 83.3 409.3 74.9zM409.3 310.3L398.9000000000001 257.2L328.2000000000001 235.2L264.0000000000001 281.7V355.5L311.4000000000001 381.7C350.6 368.7 384.8000000000001 343.7 409.3000000000001 310.3zM184.9 381.6L232 355.5V281.7L167.8 235.2L97.2 257.2L87.1 309.7C111.4 343.1 145 368.3 184.9 381.6zM139 68.5L85.9 75C71.5 95.1 48.6 134.6 48.1 190.3L87.1 226.7L158.2 204.5L182.5 130.2000000000001L139 68.5000000000001zM187.2 1.5L164.8 49.6L208.4 111.3H287L331.3 49.6L308.9000000000001 1.5C302.7000000000001 -0.3 251.3000000000001 -18.9 187.2000000000001 1.5z" />
+    <glyph glyph-name="gem"
+      unicode="&#xF3A5;"
+      horiz-adv-x="576" d=" M464 448H112C108 448 104.2 446 102 442.6L2 295.4C-0.9 291 -0.6 285.2000000000001 2.7 281.2000000000001L278.7 -59.6C283.5 -65.5 292.5 -65.5 297.3 -59.6L573.3 281.2C576.5999999999999 285.3 576.9 291 574 295.4L474.1 442.6C471.8 446 468.1 448 464 448zM444.7 400L508 304H439.6L387.9000000000001 400H444.7000000000001zM242.6 400H333.3L385 304H191L242.6 400zM131.3 400H188.1L136.4 304H68L131.3 400zM88.3 256H139.7L208 96L88.3 256zM191.2 256H384.8L288 12.7L191.2 256zM368 96L436.2 256H487.6L368 96z" />
+    <glyph glyph-name="hand-lizard"
+      unicode="&#xF258;"
+      horiz-adv-x="576" d=" M556.686 157.458L410.328 383.171C397.001 403.728 374.417 416 349.917 416H56C25.121 416 0 390.878 0 360V352C0 307.8880000000001 35.888 272 80 272H276.0420000000001L257.7090000000001 224H144C95.477 224 56 184.523 56 136C56 105.121 81.121 80 112 80H243.552C246.539 80 249.466 79.451 252.249 78.369L352 39.582V-32H576V92.171C576 115.396 569.321 137.972 556.686 157.458zM528 16H400V39.582C400 59.53 387.986 77.09 369.396 84.318L269.645 123.106A71.733 71.733 0 0 1 243.552 128H112C107.589 128 104 131.589 104 136C104 158.056 121.944 176 144 176H257.709C277.476 176 295.495 188.407 302.549 206.873L327.101 271.154C336.097 294.707 318.673 320 293.471 320H80C62.355 320 48 334.355 48 352V360C48 364.411 51.589 368 56 368H349.917C358.083 368 365.61 363.91 370.054 357.058L516.412 131.343A71.84 71.84 0 0 0 528 92.171V16z" />
+    <glyph glyph-name="hand-paper"
+      unicode="&#xF256;"
+      horiz-adv-x="448" d=" M372.57 335.359V346.184C372.57 389.796 332.05 422.875 289.531 411.73C263.902 461.23 195.441 459.18 171.549 410.983C130.269 421.544 89.144 390.055 89.144 346V219.87C69.191 227.297 45.836 224.938 27.061 210.999C-2.294 189.203 -8.733 147.666 12.511 117.846L132.48 -50.569A32 32 0 0 1 158.542 -64.001H381.439C396.343 -64.001 409.274 -53.712 412.621 -39.188L442.805 91.77A203.637 203.637 0 0 1 448 137.436V269C448 309.62 412.477 340.992 372.57 335.359zM399.997 137.437C399.997 125.706 398.663 113.968 396.0320000000001 102.551L368.707 -16H166.787L51.591 145.697C37.152 165.967 66.614 188.473 80.985 168.302L108.113 130.223C117.108 117.597 137.144 123.936 137.144 139.506V346C137.144 371.645 173.715 370.81 173.715 345.309V192C173.715 183.163 180.878 176 189.715 176H196.571C205.408 176 212.571 183.163 212.571 192V381C212.571 406.663 249.142 405.81 249.142 380.309V192C249.142 183.163 256.305 176 265.142 176H271.998C280.835 176 287.998 183.163 287.998 192V346.875C287.998 372.5470000000001 324.568 371.685 324.568 346.184V192C324.568 183.163 331.731 176 340.568 176H347.425C356.262 176 363.425 183.163 363.425 192V268.309C363.425 294.551 399.995 293.949 399.995 269V137.437z" />
+    <glyph glyph-name="hand-peace"
+      unicode="&#xF25B;"
+      horiz-adv-x="448" d=" M362.146 256.024C348.4360000000001 277.673 323.385 290.04 297.14 286.365V374C297.14 414.804 264.329 448 223.999 448C183.669 448 150.859 414.804 150.859 374L160 280L141.321 358.85C126.578 397.157 83.85 415.89 46.209 400.7920000000001C8.735 385.762 -9.571 343.0370000000001 5.008 305.15L60.765 160.223C30.208 135.267 16.771 102.414 36.032 68.005L90.885 -29.994C102.625 -50.97 124.73 -64 148.575 -64H354.277C385.021 -64 411.835 -42.56 418.832 -12.203L446.259 106.7960000000001A67.801 67.801 0 0 1 447.988 121.999L448 192C448 236.956 404.737 269.343 362.146 256.024zM399.987 122C399.987 120.512 399.8180000000001 119.023 399.485 117.577L372.058 -1.424C370.08 -10.006 362.768 -16 354.276 -16H148.575C142.089 -16 136.033 -12.379 132.77 -6.551L77.916 91.449C73.359 99.59 75.297 110.117 82.424 115.937L109.071 137.701A16 16 0 0 1 113.883 155.84L49.793 322.389C37.226 355.044 84.37 373.163 96.51 341.611L156.294 186.254A16 16 0 0 1 171.227 176H182.859C191.696 176 198.859 183.163 198.859 192V374C198.859 408.375 249.14 408.43 249.14 374V192C249.14 183.163 256.303 176 265.14 176H271.996C280.833 176 287.996 183.163 287.996 192V220C287.996 245.122 324.563 245.159 324.563 220V192C324.563 183.163 331.726 176 340.563 176H347.419C356.256 176 363.419 183.163 363.419 192C363.419 217.12 399.986 217.16 399.986 192V122z" />
+    <glyph glyph-name="hand-point-down"
+      unicode="&#xF0A7;"
+      horiz-adv-x="448" d=" M188.8 -64C234.416 -64 272 -26.235 272 19.2V54.847A93.148 93.148 0 0 1 294.064 62.776C316.0700000000001 60.269 339.0420000000001 66.2789999999999 356.855 78.761C409.342 79.9 448 116.159 448 178.701V200C448 260.063 408 298.512 408 327.2V329.879C412.952 335.626 416 343.415 416 351.999V416C416 433.673 403.106 448 387.2 448H156.8C140.894 448 128 433.673 128 416V352C128 343.416 131.048 335.627 136 329.88V327.201C136 320.237 129.807 312.339 112.332 297.0180000000001L112.184 296.889L112.038 296.7580000000001C102.101 287.9020000000001 91.197 278.642 78.785 270.9070000000001C48.537 252.202 0 240.514 0 195.2C0 138.272 35.286 103.2 83.2 103.2C91.226 103.2 98.689 104.014 105.6 105.376V19.2C105.6 -25.899 143.701 -64 188.8 -64zM188.8 -16C170.1 -16 153.6 0.775 153.6 19.2V177.6C136.275 177.6 118.4 151.2000000000001 83.2 151.2000000000001C56.8 151.2000000000001 48 171.8250000000001 48 195.2000000000001C48 203.9940000000001 80.712 215.6450000000001 104.1 230.1260000000001C118.675 239.2000000000001 131.325 249.6500000000001 143.975 260.9250000000001C162.349 277.0340000000001 180.608 294.761 183.571 320.0000000000001H360.3230000000001C364.087 277.2100000000001 400 245.491 400 200V178.701C400 138.177 377.803 121.577 338.675 128.1C330.6740000000001 113.488 304.6960000000001 103.949 285.05 115.175C266.825 95.81 238.669 97.388 224 110.225V19.2C224 0.225 207.775 -16 188.8 -16zM328 384C328 397.255 338.745 408 352 408S376 397.255 376 384S365.255 360 352 360S328 370.745 328 384z" />
+    <glyph glyph-name="hand-point-left"
+      unicode="&#xF0A5;"
+      horiz-adv-x="512" d=" M0 227.2C0 181.584 37.765 144 83.2 144H118.847A93.148 93.148 0 0 1 126.776 121.936C124.269 99.93 130.279 76.958 142.761 59.145C143.9 6.658 180.159 -32 242.701 -32H264C324.063 -32 362.512 8 391.2 8H393.879C399.626 3.048 407.415 0 415.999 0H479.999C497.672 0 511.999 12.894 511.999 28.8V259.2C511.999 275.106 497.672 288 479.999 288H415.999C407.415 288 399.626 284.952 393.879 280H391.2C384.236 280 376.338 286.193 361.017 303.668L360.888 303.8160000000001L360.757 303.962C351.901 313.899 342.641 324.803 334.906 337.215C316.202 367.463 304.514 416 259.2 416C202.272 416 167.2 380.714 167.2 332.8C167.2 324.774 168.014 317.3110000000001 169.376 310.4H83.2C38.101 310.4 0 272.299 0 227.2zM48 227.2C48 245.9 64.775 262.4 83.2 262.4H241.6C241.6 279.725 215.2 297.6 215.2 332.8C215.2 359.2 235.825 368 259.2000000000001 368C267.9940000000001 368 279.6450000000001 335.288 294.1260000000001 311.9C303.2000000000001 297.325 313.6500000000001 284.675 324.925 272.025C341.034 253.651 358.761 235.392 384 232.429V55.677C341.21 51.913 309.491 16 264 16H242.701C202.177 16 185.577 38.197 192.1 77.325C177.488 85.326 167.949 111.304 179.175 130.95C159.81 149.175 161.388 177.331 174.225 192H83.2C64.225 192 48 208.225 48 227.2zM448 88C461.255 88 472 77.255 472 64S461.255 40 448 40S424 50.745 424 64S434.745 88 448 88z" />
+    <glyph glyph-name="hand-point-right"
+      unicode="&#xF0A4;"
+      horiz-adv-x="512" d=" M428.8 310.4H342.623A115.52 115.52 0 0 1 344.799 332.8C344.799 380.714 309.727 416 252.799 416C207.485 416 195.797 367.463 177.092 337.216C169.357 324.803 160.098 313.899 151.241 303.963L151.11 303.817L150.981 303.6690000000001C135.662 286.193 127.764 280 120.8 280H118.121C112.374 284.952 104.585 288 96.001 288H32C14.327 288 0 275.106 0 259.2V28.8C0 12.894 14.327 0 32 0H96C104.584 0 112.373 3.048 118.12 8H120.799C149.487 8 187.936 -32 247.999 -32H269.298C331.8400000000001 -32 368.098 6.658 369.238 59.145C381.7200000000001 76.958 387.729 99.93 385.223 121.936A93.148 93.148 0 0 1 393.152 144H428.8C474.235 144 512 181.584 512 227.2C512 272.299 473.899 310.4 428.8 310.4zM428.8 192H337.774C350.611 177.331 352.189 149.175 332.824 130.95C344.051 111.304 334.511 85.326 319.899 77.325C326.423 38.197 309.823 16 269.299 16H248C202.509 16 170.79 51.913 128 55.676V232.429C153.239 235.393 170.966 253.651 187.075 272.025C198.35 284.675 208.8 297.3250000000001 217.874 311.9C232.355 335.288 244.006 368 252.8 368C276.175 368 296.8 359.2 296.8 332.8C296.8 297.6 270.4000000000001 279.725 270.4000000000001 262.4H428.8000000000001C447.2250000000001 262.4 464.0000000000001 245.9 464.0000000000001 227.2C464.0000000000001 208.225 447.7750000000001 192 428.8000000000001 192zM88 64C88 50.745 77.255 40 64 40S40 50.745 40 64S50.745 88 64 88S88 77.255 88 64z" />
+    <glyph glyph-name="hand-point-up"
+      unicode="&#xF0A6;"
+      horiz-adv-x="448" d=" M105.6 364.8V278.623A115.52 115.52 0 0 1 83.2 280.799C35.286 280.799 0 245.727 0 188.799C0 143.485 48.537 131.797 78.784 113.092C91.197 105.357 102.101 96.098 112.037 87.241L112.183 87.11L112.331 86.981C129.807 71.662 136 63.764 136 56.8V54.121C131.048 48.374 128 40.585 128 32.001V-31.999C128 -49.672 140.894 -63.999 156.8 -63.999H387.2000000000001C403.1060000000001 -63.999 416.0000000000001 -49.672 416.0000000000001 -31.999V32.001C416.0000000000001 40.585 412.9520000000001 48.374 408.0000000000001 54.121V56.8C408.0000000000001 85.488 448.0000000000001 123.937 448.0000000000001 184V205.299C448.0000000000001 267.841 409.3420000000001 304.099 356.8550000000001 305.2390000000001C339.0420000000001 317.721 316.0700000000001 323.73 294.0640000000001 321.224A93.148 93.148 0 0 1 272 329.153V364.8C272 410.235 234.416 448 188.8 448C143.701 448 105.6 409.899 105.6 364.8zM224 364.8V273.774C238.669 286.611 266.825 288.189 285.05 268.824C304.6960000000001 280.0510000000001 330.6740000000001 270.511 338.675 255.899C377.803 262.423 400 245.823 400 205.299V184C400 138.509 364.087 106.79 360.324 64H183.571C180.607 89.239 162.349 106.966 143.975 123.075C131.325 134.35 118.675 144.8 104.1 153.874C80.712 168.355 48 180.006 48 188.8C48 212.175 56.8 232.8 83.2 232.8C118.4 232.8 136.275 206.4 153.6 206.4V364.8C153.6 383.225 170.1 400 188.8 400C207.775 400 224 383.775 224 364.8zM352 24C365.255 24 376 13.255 376 0S365.255 -24 352 -24S328 -13.255 328 0S338.745 24 352 24z" />
+    <glyph glyph-name="hand-pointer"
+      unicode="&#xF25A;"
+      horiz-adv-x="448" d=" M358.182 268.639C338.689 293.4070000000001 305.5030000000001 300.584 278.31 287.737C263.183 303.4240000000001 242.128 310.2240000000001 221.715 307.366V381C221.715 417.944 191.979 448 155.429 448S89.143 417.944 89.143 381V219.871C69.234 227.281 45.871 224.965 27.06 210.999C-2.295 189.204 -8.733 147.6660000000001 12.51 117.847L122.209 -36.154C134.632 -53.59 154.741 -64 176 -64H354.286C385.088 -64 411.86 -42.5 418.843 -12.203L446.272 106.7960000000001A67.873 67.873 0 0 1 448 122V206C448 252.844 401.375 285.273 358.182 268.639zM80.985 168.303L108.111 130.224C117.106 117.598 137.142 123.937 137.142 139.507V381C137.142 406.12 173.713 406.16 173.713 381V206C173.713 197.164 180.876 190 189.713 190H196.57C205.407 190 212.57 197.164 212.57 206V241C212.57 266.12 249.141 266.16 249.141 241V206C249.141 197.164 256.304 190 265.141 190H272C280.837 190 288 197.164 288 206V227C288 252.12 324.5710000000001 252.16 324.5710000000001 227V206C324.5710000000001 197.164 331.7340000000001 190 340.5710000000001 190H347.4280000000001C356.2650000000001 190 363.4280000000001 197.164 363.4280000000001 206C363.4280000000001 231.121 399.999 231.16 399.999 206V122C399.999 120.512 399.8300000000001 119.023 399.497 117.577L372.067 -1.424C370.089 -10.006 362.777 -16 354.2850000000001 -16H176C170.231 -16 164.737 -13.122 161.303 -8.303L51.591 145.697C37.185 165.92 66.585 188.515 80.985 168.303zM176.143 48V144C176.143 152.837 182.411 160 190.143 160H196.143C203.875 160 210.143 152.837 210.143 144V48C210.143 39.163 203.875 32 196.143 32H190.143C182.41 32 176.143 39.163 176.143 48zM251.571 48V144C251.571 152.837 257.839 160 265.5710000000001 160H271.5710000000001C279.3030000000001 160 285.5710000000001 152.837 285.5710000000001 144V48C285.5710000000001 39.163 279.3030000000001 32 271.5710000000001 32H265.5710000000001C257.839 32 251.5710000000001 39.163 251.5710000000001 48zM327 48V144C327 152.837 333.268 160 341 160H347C354.7320000000001 160 361 152.837 361 144V48C361 39.163 354.7320000000001 32 347 32H341C333.268 32 327 39.163 327 48z" />
+    <glyph glyph-name="hand-rock"
+      unicode="&#xF255;"
+      horiz-adv-x="512" d=" M408.864 368.948C386.463 402.846 342.756 411.221 310.051 392.536C280.577 424.005 230.906 423.629 201.717 392.558C154.557 419.578 93.007 387.503 91.046 331.752C44.846 342.593 0 307.999 0 260.5710000000001V203.618C0 170.877 14.28 139.664 39.18 117.984L136.89 32.903C141.142 29.201 140 27.33 140 -1e-13C140 -17.6730000000001 154.327 -32.0000000000001 172 -32.0000000000001H424C441.673 -32.0000000000001 456 -17.6730000000001 456 -1e-13C456 23.5129999999999 454.985 30.745 459.982 42.37L502.817 142.026C508.911 156.203 512 171.198 512 186.5939999999999V301.0370000000001C512 353.876 457.686 389.699 408.8640000000001 368.948zM464 186.594A64.505 64.505 0 0 0 458.718 160.981L415.8830000000001 61.326C410.653 49.155 408.0000000000001 36.286 408.0000000000001 23.076V16H188V26.286C188 42.656 180.86 58.263 168.41 69.103L70.7 154.183C56.274 166.745 48 184.764 48 203.619V260.572C48 293.78 100 294.1090000000001 100 259.895V218.667A16 16 0 0 1 105.493 206.6L112.493 200.505A16 16 0 0 1 139 212.571V329.1430000000001C139 362.24 191 362.868 191 328.466V301.7150000000001C191 292.879 198.164 285.7150000000001 207 285.7150000000001H214C222.836 285.7150000000001 230 292.879 230 301.7150000000001V342.858C230 375.992 282 376.533 282 342.181V301.7150000000001C282 292.879 289.163 285.7150000000001 298 285.7150000000001H305C313.837 285.7150000000001 321 292.879 321 301.7150000000001V329.144C321 362.174 373 362.924 373 328.467V301.716C373 292.88 380.163 285.716 389 285.716H396C404.837 285.716 412 292.88 412 301.716C412 334.862 464 335.329 464 301.039V186.5940000000001z" />
+    <glyph glyph-name="hand-scissors"
+      unicode="&#xF257;"
+      horiz-adv-x="512" d=" M256 -32L326 -31.987C331.114 -31.987 336.231 -31.404 341.203 -30.258L460.202 -2.831C490.56 4.165 512 30.98 512 61.723V267.425C512 291.27 498.97 313.376 477.995 325.115L379.996 379.968C345.587 399.2290000000001 312.733 385.7920000000001 287.778 355.235L142.85 410.992C104.963 425.5710000000001 62.238 407.265 47.208 369.791C32.11 332.149 50.843 289.421 89.15 274.679L168 256L74 265.141C33.196 265.141 0 232.33 0 192.001C0 151.671 33.196 118.86 74 118.86H161.635C157.96 92.615 170.327 67.563 191.976 53.8539999999999C178.657 11.263 211.044 -32 256 -32zM256 16.013C230.84 16.013 230.88 52.58 256 52.58C264.837 52.58 272 59.743 272 68.58V75.436C272 84.273 264.837 91.436 256 91.436H228C202.841 91.436 202.878 128.003 228 128.003H256C264.837 128.003 272 135.166 272 144.003V150.859C272 159.696 264.837 166.859 256 166.859H74C39.57 166.859 39.625 217.14 74 217.14H256C264.837 217.14 272 224.303 272 233.14V244.772A16 16 0 0 1 261.746 259.705L106.389 319.49C74.837 331.63 92.957 378.773 125.611 366.207L292.16 302.116A16.001 16.001 0 0 1 310.299 306.928L332.063 333.5750000000001C337.883 340.702 348.411 342.639 356.551 338.0830000000001L454.551 283.2290000000001C460.379 279.966 464 273.911 464 267.424V61.723C464 53.232 458.006 45.919 449.424 43.941L330.423 16.514A19.743 19.743 0 0 0 326 16.012H256z" />
+    <glyph glyph-name="hand-spock"
+      unicode="&#xF259;"
+      horiz-adv-x="512" d=" M21.096 66.21L150.188 -55.303A32 32 0 0 1 172.12 -64.001H409.7200000000001C423.8900000000001 -64.001 436.3730000000001 -54.682 440.4000000000001 -41.097L472.215 66.216A115.955 115.955 0 0 1 477 99.189V136.028C477 140.079 477.476 144.132 478.414 148.073L510.144 281.4830000000001C520.243 323.8950000000001 487.828 364.221 444.6 364.0080000000001C440.456 388.8640000000001 422.057 411.1730000000001 394.75 418.0000000000001C358.947 426.9520000000001 322.523 405.3450000000001 313.5 369.25L296.599 264L274.924 395.99C266.638 432.06 230.621 454.562 194.62 446.286C165.004 439.4820000000001 144.482 413.897 142.738 384.991C100.101 384.16 69.283 344.428 78.667 303.147L109.707 166.639C82.513 189.154 42.423 186.631 18.225 160.917C-7.151 133.956 -5.873 91.592 21.096 66.21zM53.164 128.021L53.166 128.0219999999999C60.385 135.694 72.407 136.002 80.022 128.8349999999999L133.034 78.9409999999999C143.225 69.351 160 76.6 160 90.594V160.073C160 161.266 159.866 162.456 159.603 163.619L125.473 313.791C119.877 338.408 156.975 346.651 162.527 322.212L192.926 188.4549999999999A16 16 0 0 1 208.529 176.0009999999999H217.1330000000001C227.4090000000001 176.0009999999999 235.0270000000001 185.5679999999999 232.7270000000001 195.5839999999999L191.107 376.7369999999999C185.484 401.2059999999999 222.497 409.813 228.142 385.2449999999999L273.362 188.4169999999999A16 16 0 0 1 288.956 176H302.173A16 16 0 0 1 317.695 188.119L360.067 357.6090000000001C366.171 382.0310000000001 403.029 372.7680000000001 396.932 348.3920000000001L358.805 195.88C356.284 185.792 363.92 176 374.327 176H384.021A16 16 0 0 1 399.586 188.295L426.509 301.4C432.3300000000001 325.848 469.306 317.087 463.475 292.598L431.7200000000001 159.19A100.094 100.094 0 0 1 429 136.028V99.189C429 92.641 428.057 86.138 426.195 79.8610000000001L397.775 -16H178.465L53.978 101.164C46.349 108.344 45.984 120.393 53.164 128.021z" />
+    <glyph glyph-name="handshake"
+      unicode="&#xF2B5;"
+      horiz-adv-x="640" d=" M519.2 320.1L471.6 367.7A56.252 56.252 0 0 1 432 384H205.2C190.4 384 176.1 378.1 165.6 367.7L118 320.1H0V64.4H64C81.6 64.4 95.8 78.6 95.9 96.1H105L189.6 19.6999999999999C220.5 -5.4000000000001 263.4 -6.0000000000001 295.2 15.8999999999999C307.7 5.0999999999999 321.2 -1e-13 336.3 -1e-13C354.5 -1e-13 371.6 7.3999999999999 385.1 23.9999999999999C407.2000000000001 15.3 433.3 21.3999999999999 449.1 40.8L475.3 73.1C480.9 79.9999999999999 484.4 87.9 486.2 96.1H544.1C544.2 78.6 558.5 64.4 576 64.4H640V320.1H519.2zM48 96.4C39.2 96.4 32 103.6 32 112.4S39.2 128.4 48 128.4S64 121.2 64 112.4C64 103.5 56.8 96.4 48 96.4zM438 103.3L411.9 71.1C409.1 67.7 404.1 67.1 400.6 69.9L376.7 89.3L346.7 52.8C340.7 45.4999999999999 331.7 47.9999999999999 328.7 50.4L291.9 81.9L276.3 62.7C262.4 45.6 237.1 43 221 56.1L123.7 144.1H96V272.2H137.9L199.6 333.8C201.6 334.6 203.3 335.3 205.3 336.1H262L223.3 300.6C193.9 273.7 192.2 228.3 218.9 199.3C233.7 183.1 280.1 158.1 320.4 194.9L328.6 202.4L436.8 114.6C440.2 111.8 440.7 106.7 438 103.3zM544 144.1H474.8C472.5 146.9 469.9 149.5 467.1 151.8L364.4000000000001 235.2L376.9000000000001 246.6C383.4000000000001 252.6 383.9000000000001 262.7 377.9000000000001 269.2L367 280.9C361 287.4 350.9 287.8 344.4 281.9L289.2 231.3C279.7 222.6 263.5 221.9 254.6 231.3C245.3 241.2 246.1 256.4 255.8 265.2000000000001L321.4 325.3C328.8 332.1 338.4 335.8 348.4 335.8L432.1 336C434.2 336 436.2 335.2000000000001 437.6 333.7000000000001L499.3 272.1H544V144.1zM592 96.4C583.2 96.4 576 103.6 576 112.4S583.2 128.4 592 128.4S608 121.2 608 112.4C608 103.5 600.8 96.4 592 96.4z" />
+    <glyph glyph-name="hdd"
+      unicode="&#xF0A0;"
+      horiz-adv-x="576" d=" M567.403 212.358L462.323 363.411A48 48 0 0 1 422.919 384H153.081A48 48 0 0 1 113.677 363.411L8.597 212.358A48.001 48.001 0 0 1 0 184.946V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V184.946C576 194.747 573 204.312 567.403 212.358zM153.081 336H422.919L500.832 224H75.168L153.081 336zM528 48H48V176H528V48zM496 112C496 94.327 481.673 80 464 80S432 94.327 432 112S446.327 144 464 144S496 129.673 496 112zM400 112C400 94.327 385.673 80 368 80S336 94.327 336 112S350.327 144 368 144S400 129.673 400 112z" />
+    <glyph glyph-name="heart"
+      unicode="&#xF004;"
+      horiz-adv-x="512" d=" M458.4 383.7C400.6 432.3 311.3 425 256 368.7C200.7 425 111.4 432.4 53.6 383.7C-21.6 320.4 -10.6 217.2 43 162.5L218.4 -16.2C228.4 -26.4 241.8 -32.1 256 -32.1C270.3 -32.1 283.6 -26.4999999999999 293.6 -16.3L469 162.4C522.5 217.1 533.7 320.3 458.4 383.7zM434.8 196.2L259.4 17.5C257 15.1 255 15.1 252.6 17.5L77.2 196.2C40.7 233.4 33.3 303.8 84.5 346.9C123.4 379.6 183.4 374.7 221 336.4L256 300.7L291 336.4C328.8 374.9 388.8 379.6 427.5 347C478.6 303.9 471 233.1 434.8 196.2z" />
+    <glyph glyph-name="hospital"
+      unicode="&#xF0F8;"
+      horiz-adv-x="448" d=" M128 204V244C128 250.627 133.373 256 140 256H180C186.627 256 192 250.627 192 244V204C192 197.373 186.627 192 180 192H140C133.373 192 128 197.373 128 204zM268 192H308C314.627 192 320 197.373 320 204V244C320 250.627 314.627 256 308 256H268C261.373 256 256 250.627 256 244V204C256 197.373 261.373 192 268 192zM192 108V148C192 154.627 186.627 160 180 160H140C133.373 160 128 154.627 128 148V108C128 101.373 133.373 96 140 96H180C186.627 96 192 101.373 192 108zM268 96H308C314.627 96 320 101.373 320 108V148C320 154.627 314.627 160 308 160H268C261.373 160 256 154.627 256 148V108C256 101.373 261.373 96 268 96zM448 -28V-64H0V-28C0 -21.373 5.373 -16 12 -16H31.5V362.9650000000001C31.5 374.582 42.245 384 55.5 384H144V424C144 437.255 154.745 448 168 448H280C293.255 448 304 437.255 304 424V384H392.5C405.755 384 416.5 374.582 416.5 362.9650000000001V-16H436C442.627 -16 448 -21.373 448 -28zM79.5 -15H192V52C192 58.627 197.373 64 204 64H244C250.627 64 256 58.627 256 52V-15H368.5V336H304V312C304 298.745 293.255 288 280 288H168C154.745 288 144 298.745 144 312V336H79.5V-15zM266 384H240V410A6 6 0 0 1 234 416H214A6 6 0 0 1 208 410V384H182A6 6 0 0 1 176 378V358A6 6 0 0 1 182 352H208V326A6 6 0 0 1 214 320H234A6 6 0 0 1 240 326V352H266A6 6 0 0 1 272 358V378A6 6 0 0 1 266 384z" />
+    <glyph glyph-name="hourglass"
+      unicode="&#xF254;"
+      horiz-adv-x="384" d=" M368 400H372C378.627 400 384 405.373 384 412V436C384 442.627 378.627 448 372 448H12C5.373 448 0 442.627 0 436V412C0 405.373 5.373 400 12 400H16C16 319.4360000000001 48.188 234.193 113.18 192C47.899 149.619 16 64.1 16 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H372C378.627 -64 384 -58.627 384 -52V-28C384 -21.373 378.627 -16 372 -16H368C368 64.564 335.812 149.807 270.82 192C336.102 234.381 368 319.9 368 400zM64 400H320C320 298.38 262.693 216 192 216S64 298.379 64 400zM320 -16H64C64 85.62 121.308 168 192 168S320 85.62 320 -16z" />
+    <glyph glyph-name="id-badge"
+      unicode="&#xF2C1;"
+      horiz-adv-x="384" d=" M0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V400C384 426.51 362.51 448 336 448H48C21.49 448 0 426.51 0 400zM336 368V-10A6 6 0 0 0 330 -16H54A6 6 0 0 0 48 -10V368H336zM192 288C230.66 288 262 256.66 262 218S230.66 148 192 148S122 179.34 122 218S153.34 288 192 288zM272.187 141.953L240.987 149.753C208.208 126.176 168.477 131.437 143.013 149.753L111.813 141.953C93.116 137.279 80 120.48 80 101.207V85C80 73.402 89.402 64 101 64H283C294.598 64 304 73.402 304 85V101.207C304 120.48 290.884 137.279 272.187 141.953z" />
+    <glyph glyph-name="id-card"
+      unicode="&#xF2C2;"
+      horiz-adv-x="512" d=" M404 192H300C293.373 192 288 197.373 288 204V220C288 226.627 293.373 232 300 232H404C410.627 232 416 226.627 416 220V204C416 197.373 410.627 192 404 192zM416 132V148C416 154.627 410.627 160 404 160H300C293.373 160 288 154.627 288 148V132C288 125.373 293.373 120 300 120H404C410.627 120 416 125.373 416 132zM512 336V48C512 21.49 490.51 0 464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336zM464 54V304H48V54A6 6 0 0 1 54 48H458A6 6 0 0 1 464 54zM176 256C203.614 256 226 233.614 226 206S203.614 156 176 156S126 178.386 126 206S148.386 256 176 256zM233.276 151.681L210.991 157.252C187.578 140.411 159.198 144.169 141.01 157.252L118.725 151.681C105.369 148.342 96 136.343 96 122.577V111C96 102.716 102.716 96 111 96H241C249.284 96 256 102.716 256 111V122.577C256 136.343 246.631 148.342 233.276 151.681z" />
+    <glyph glyph-name="image"
+      unicode="&#xF03E;"
+      horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM458 48H54A6 6 0 0 0 48 54V330A6 6 0 0 0 54 336H458A6 6 0 0 0 464 330V54A6 6 0 0 0 458 48zM128 296C105.909 296 88 278.091 88 256S105.909 216 128 216S168 233.909 168 256S150.091 296 128 296zM96 96H416V176L328.485 263.515C323.7990000000001 268.201 316.201 268.201 311.514 263.515L192 144L152.485 183.515C147.799 188.201 140.201 188.201 135.514 183.515L96 144V96z" />
+    <glyph glyph-name="images"
+      unicode="&#xF302;"
+      horiz-adv-x="576" d=" M480 32V16C480 -10.51 458.51 -32 432 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V272H54A6 6 0 0 1 48 266V22A6 6 0 0 1 54 16H426A6 6 0 0 1 432 22V32H480zM522 368H150A6 6 0 0 1 144 362V118A6 6 0 0 1 150 112H522A6 6 0 0 1 528 118V362A6 6 0 0 1 522 368zM528 416C554.51 416 576 394.51 576 368V112C576 85.49 554.51 64 528 64H144C117.49 64 96 85.49 96 112V368C96 394.51 117.49 416 144 416H528zM264 304C264 281.909 246.091 264 224 264S184 281.909 184 304S201.909 344 224 344S264 326.091 264 304zM192 208L231.515 247.515C236.201 252.201 243.799 252.201 248.486 247.515L288 208L391.515 311.515C396.201 316.201 403.799 316.201 408.486 311.515L480 240V160H192V208z" />
+    <glyph glyph-name="keyboard"
+      unicode="&#xF11C;"
+      horiz-adv-x="576" d=" M528 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V336C576 362.51 554.51 384 528 384zM536 48C536 43.589 532.411 40 528 40H48C43.589 40 40 43.589 40 48V336C40 340.411 43.589 344 48 344H528C532.411 344 536 340.411 536 336V48zM170 178V206C170 212.627 164.627 218 158 218H130C123.373 218 118 212.627 118 206V178C118 171.373 123.373 166 130 166H158C164.627 166 170 171.373 170 178zM266 178V206C266 212.627 260.627 218 254 218H226C219.373 218 214 212.627 214 206V178C214 171.373 219.373 166 226 166H254C260.627 166 266 171.373 266 178zM362 178V206C362 212.627 356.627 218 350 218H322C315.373 218 310 212.627 310 206V178C310 171.373 315.373 166 322 166H350C356.627 166 362 171.373 362 178zM458 178V206C458 212.627 452.627 218 446 218H418C411.373 218 406 212.627 406 206V178C406 171.373 411.373 166 418 166H446C452.627 166 458 171.373 458 178zM122 96V124C122 130.627 116.627 136 110 136H82C75.373 136 70 130.627 70 124V96C70 89.373 75.373 84 82 84H110C116.627 84 122 89.373 122 96zM506 96V124C506 130.627 500.627 136 494 136H466C459.373 136 454 130.627 454 124V96C454 89.373 459.373 84 466 84H494C500.627 84 506 89.373 506 96zM122 260V288C122 294.627 116.627 300 110 300H82C75.373 300 70 294.627 70 288V260C70 253.373 75.373 248 82 248H110C116.627 248 122 253.373 122 260zM218 260V288C218 294.627 212.627 300 206 300H178C171.373 300 166 294.627 166 288V260C166 253.373 171.373 248 178 248H206C212.627 248 218 253.373 218 260zM314 260V288C314 294.627 308.627 300 302 300H274C267.373 300 262 294.627 262 288V260C262 253.373 267.373 248 274 248H302C308.627 248 314 253.373 314 260zM410 260V288C410 294.627 404.627 300 398 300H370C363.373 300 358 294.627 358 288V260C358 253.373 363.373 248 370 248H398C404.627 248 410 253.373 410 260zM506 260V288C506 294.627 500.627 300 494 300H466C459.373 300 454 294.627 454 288V260C454 253.373 459.373 248 466 248H494C500.627 248 506 253.373 506 260zM408 102V118C408 124.627 402.627 130 396 130H180C173.373 130 168 124.627 168 118V102C168 95.373 173.373 90 180 90H396C402.627 90 408 95.373 408 102z" />
+    <glyph glyph-name="lemon"
+      unicode="&#xF094;"
+      horiz-adv-x="512" d=" M484.112 420.111C455.989 448.233 416.108 456.057 387.0590000000001 439.135C347.604 416.152 223.504 489.111 91.196 356.803C-41.277 224.328 31.923 100.528 8.866 60.942C-8.056 31.891 -0.234 -7.99 27.888 -36.112C56.023 -64.247 95.899 -72.0499999999999 124.945 -55.133C164.368 -32.163 288.502 -105.102 420.803 27.196C553.277 159.673 480.076 283.473 503.134 323.057C520.056 352.1070000000001 512.234 391.988 484.112 420.111zM461.707 347.217C422.907 280.608 507.307 181.582 386.862 61.137C266.422 -59.306 167.387 25.089 100.786 -13.706C78.1069999999999 -26.913 36.751 13.535 50.2929999999999 36.782C89.0929999999999 103.391 4.6929999999999 202.417 125.138 322.862C245.573 443.298 344.616 358.914 411.219 397.708C433.949 410.948 475.224 370.42 461.707 347.217zM291.846 338.481C293.216 327.521 285.442 317.524 274.481 316.154C219.635 309.299 138.702 228.367 131.846 173.519C130.473 162.53 120.447 154.785 109.52 156.154C98.559 157.524 90.785 167.52 92.155 178.48C101.317 251.766 196.322 346.6950000000001 269.5200000000001 355.8450000000001C280.473 357.213 290.4760000000001 349.442 291.8460000000001 338.481z" />
+    <glyph glyph-name="life-ring"
+      unicode="&#xF1CD;"
+      horiz-adv-x="512" d=" M256 -56C392.967 -56 504 55.033 504 192S392.967 440 256 440S8 328.967 8 192S119.033 -56 256 -56zM152.602 20.72L206.013 74.131C237.819 60.625 274.141 60.609 305.987 74.131L359.398 20.72C296.1810000000001 -17.599 215.819 -17.599 152.602 20.72zM336 192C336 147.888 300.112 112 256 112S176 147.888 176 192S211.888 272 256 272S336 236.112 336 192zM427.28 88.602L373.869 142.013C387.374 173.819 387.391 210.141 373.869 241.987L427.28 295.398C465.599 232.181 465.599 151.819 427.28 88.602zM359.397 363.28L305.986 309.8690000000001C274.18 323.374 237.858 323.391 206.013 309.8690000000001L152.602 363.28C215.819 401.599 296.1810000000001 401.599 359.397 363.28zM84.72 295.398L138.131 241.987C124.625 210.181 124.609 173.859 138.131 142.013L84.72 88.602C46.401 151.819 46.401 232.181 84.72 295.398z" />
+    <glyph glyph-name="lightbulb"
+      unicode="&#xF0EB;"
+      horiz-adv-x="384" d=" M272 20V-8C272 -18.449 265.32 -27.334 256 -30.629V-40C256 -53.255 245.255 -64 232 -64H152C138.745 -64 128 -53.255 128 -40V-30.629C118.68 -27.334 112 -18.449 112 -8V20C112 26.627 117.373 32 124 32H260C266.627 32 272 26.627 272 20zM128 272C128 307.29 156.71 336 192 336C200.837 336 208 343.164 208 352S200.837 368 192 368C139.065 368 96 324.935 96 272C96 263.164 103.164 256 112 256S128 263.164 128 272zM192 400C262.734 400 320 342.746 320 272C320 194.398 282.617 211.523 239.02 112H144.98C101.318 211.67 64 194.131 64 272C64 342.735 121.254 400 192 400M192 448C94.805 448 16 369.197 16 272C16 170.269 67.697 180.459 106.516 79.326C110.066 70.077 118.986 64 128.892 64H255.107C265.013 64 273.933 70.078 277.483 79.326C316.303 180.459 368 170.269 368 272C368 369.197 289.195 448 192 448z" />
+    <glyph glyph-name="list-alt"
+      unicode="&#xF022;"
+      horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM458 16H54A6 6 0 0 0 48 22V362A6 6 0 0 0 54 368H458A6 6 0 0 0 464 362V22A6 6 0 0 0 458 16zM416 108V84C416 77.373 410.627 72 404 72H204C197.373 72 192 77.373 192 84V108C192 114.627 197.373 120 204 120H404C410.627 120 416 114.627 416 108zM416 204V180C416 173.373 410.627 168 404 168H204C197.373 168 192 173.373 192 180V204C192 210.627 197.373 216 204 216H404C410.627 216 416 210.627 416 204zM416 300V276C416 269.373 410.627 264 404 264H204C197.373 264 192 269.373 192 276V300C192 306.627 197.373 312 204 312H404C410.627 312 416 306.627 416 300zM164 288C164 268.118 147.882 252 128 252S92 268.118 92 288S108.118 324 128 324S164 307.882 164 288zM164 192C164 172.118 147.882 156 128 156S92 172.118 92 192S108.118 228 128 228S164 211.882 164 192zM164 96C164 76.118 147.882 60 128 60S92 76.118 92 96S108.118 132 128 132S164 115.882 164 96z" />
+    <glyph glyph-name="map"
+      unicode="&#xF279;"
+      horiz-adv-x="576" d=" M508.505 411.83L381.517 355.424L207.179 413.537A47.992 47.992 0 0 1 172.505 411.863L28.505 347.863A48 48 0 0 1 0 304V16.033C0 -18.905 35.991 -41.831 67.495 -27.83L194.483 28.576L368.822 -29.537A47.992 47.992 0 0 1 403.496 -27.863L547.496 36.137A48 48 0 0 1 576 80V367.967C576 402.905 540.009 425.831 508.505 411.83zM360 24L216 72V360L360 312V24zM48 16V304L168 357.333V69.333L48 16zM528 80L408 26.667V314.6670000000001L528 368V80z" />
+    <glyph glyph-name="meh"
+      unicode="&#xF11A;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM248 -8C137.7 -8 48 81.7 48 192S137.7 392 248 392S448 302.3 448 192S358.3 -8 248 -8zM168 208C185.7 208 200 222.3 200 240S185.7 272 168 272S136 257.7 136 240S150.3 208 168 208zM328 272C310.3 272 296 257.7 296 240S310.3 208 328 208S360 222.3 360 240S345.7 272 328 272zM336 128H160C146.8 128 136 117.2 136 104S146.8 80 160 80H336C349.2 80 360 90.8 360 104S349.2 128 336 128z" />
+    <glyph glyph-name="minus-square"
+      unicode="&#xF146;"
+      horiz-adv-x="448" d=" M108 164C101.4 164 96 169.4 96 176V208C96 214.6 101.4 220 108 220H340C346.6 220 352 214.6 352 208V176C352 169.4 346.6 164 340 164H108zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="money-bill-alt"
+      unicode="&#xF3D1;"
+      horiz-adv-x="640" d=" M320 304C266.979 304 224 253.857 224 192C224 130.153 266.977 80 320 80C373 80 416 130.13 416 192C416 253.857 373.021 304 320 304zM368 139.572C368 132.095 364.0830000000001 128 356.428 128H289.135C281.479 128 277.562 132.095 277.562 139.572V148.473C277.562 155.95 281.479 160.045 289.135 160.045H304.266V199.923C304.266 205.086 304.8 210.426 304.8 210.426H304.444S302.665 207.756 301.596 206.688C297.1449999999999 202.415 291.092 202.237 285.93 207.756L280.412 213.987C275.07 219.328 275.428 225.203 280.946 230.366L302.666 250.305C307.115 254.4 311.032 256.002 317.086 256.002H329.191C336.847 256.002 340.941 252.086 340.941 244.43V160.046H356.429C364.084 160.046 368.001 155.952 368.001 148.474V139.572zM616 384H24C10.745 384 0 373.255 0 360V25C0 11.745 10.745 1 24 1H616C629.255 1 640 11.745 640 25V360C640 373.255 629.255 384 616 384zM512 48H128C128 92.183 92.183 128 48 128V256C92.183 256 128 291.817 128 336H512C512 291.817 547.817 256 592 256V128C547.817 128 512 92.183 512 48z" />
+    <glyph glyph-name="moon"
+      unicode="&#xF186;"
+      horiz-adv-x="512" d=" M279.135 -64C357.891 -64 430.117 -28.196 477.979 30.775C506.249 65.606 475.421 116.497 431.73 108.176C349.382 92.493 273.458 155.444 273.458 238.968C273.458 287.392 299.518 331.26 340.892 354.804C379.637 376.854 369.891 435.592 325.87 443.723A257.936 257.936 0 0 1 279.135 448C137.775 448 23.135 333.425 23.135 192C23.135 50.64 137.711 -64 279.135 -64zM279.135 400C292.12 400 304.824 398.799 317.151 396.522C262.391 365.359 225.4580000000001 306.48 225.4580000000001 238.968C225.4580000000001 125.12 329.0990000000001 39.768 440.7100000000001 61.024C402.574 14.036 344.366 -16 279.135 -16C164.26 -16 71.135 77.125 71.135 192S164.26 400 279.135 400z" />
+    <glyph glyph-name="newspaper"
+      unicode="&#xF1EA;"
+      horiz-adv-x="576" d=" M552 384H112C91.142 384 73.357 370.623 66.752 352H24C10.745 352 0 341.255 0 328V56C0 25.072 25.072 0 56 0H552C565.255 0 576 10.745 576 24V360C576 373.255 565.255 384 552 384zM48 56V304H64V56C64 51.589 60.411 48 56 48S48 51.589 48 56zM528 48H111.422C111.796 50.614 112 53.283 112 56V336H528V48zM172 168H308C314.627 168 320 173.373 320 180V276C320 282.627 314.627 288 308 288H172C165.373 288 160 282.627 160 276V180C160 173.373 165.373 168 172 168zM200 248H280V208H200V248zM160 108V132C160 138.627 165.373 144 172 144H308C314.627 144 320 138.627 320 132V108C320 101.373 314.627 96 308 96H172C165.373 96 160 101.373 160 108zM352 108V132C352 138.627 357.373 144 364 144H468C474.627 144 480 138.627 480 132V108C480 101.373 474.627 96 468 96H364C357.373 96 352 101.373 352 108zM352 252V276C352 282.627 357.373 288 364 288H468C474.627 288 480 282.627 480 276V252C480 245.373 474.627 240 468 240H364C357.373 240 352 245.373 352 252zM352 180V204C352 210.627 357.373 216 364 216H468C474.627 216 480 210.627 480 204V180C480 173.373 474.627 168 468 168H364C357.373 168 352 173.373 352 180z" />
+    <glyph glyph-name="object-group"
+      unicode="&#xF247;"
+      horiz-adv-x="512" d=" M500 320C506.627 320 512 325.373 512 332V404C512 410.627 506.627 416 500 416H428C421.373 416 416 410.627 416 404V392H96V404C96 410.627 90.627 416 84 416H12C5.373 416 0 410.627 0 404V332C0 325.373 5.373 320 12 320H24V64H12C5.373 64 0 58.627 0 52V-20C0 -26.627 5.373 -32 12 -32H84C90.627 -32 96 -26.627 96 -20V-8H416V-20C416 -26.627 421.373 -32 428 -32H500C506.627 -32 512 -26.627 512 -20V52C512 58.627 506.627 64 500 64H488V320H500zM448 384H480V352H448V384zM32 384H64V352H32V384zM64 0H32V32H64V0zM480 0H448V32H480V0zM440 64H428C421.373 64 416 58.627 416 52V40H96V52C96 58.627 90.627 64 84 64H72V320H84C90.627 320 96 325.373 96 332V344H416V332C416 325.373 421.373 320 428 320H440V64zM404 256H320V308C320 314.628 314.627 320 308 320H108C101.373 320 96 314.628 96 308V140C96 133.372 101.373 128 108 128H192V76C192 69.372 197.373 64 204 64H404C410.627 64 416 69.372 416 76V244C416 250.628 410.627 256 404 256zM136 280H280V168H136V280zM376 104H232V128H308C314.627 128 320 133.372 320 140V216H376V104z" />
+    <glyph glyph-name="object-ungroup"
+      unicode="&#xF248;"
+      horiz-adv-x="576" d=" M564 224C570.627 224 576 229.373 576 236V308C576 314.627 570.627 320 564 320H492C485.373 320 480 314.627 480 308V296H392V320H404C410.627 320 416 325.373 416 332V404C416 410.627 410.627 416 404 416H332C325.373 416 320 410.627 320 404V392H96V404C96 410.627 90.627 416 84 416H12C5.373 416 0 410.627 0 404V332C0 325.373 5.373 320 12 320H24V160H12C5.373 160 0 154.627 0 148V76C0 69.373 5.373 64 12 64H84C90.627 64 96 69.373 96 76V88H184V64H172C165.373 64 160 58.627 160 52V-20C160 -26.627 165.373 -32 172 -32H244C250.627 -32 256 -26.627 256 -20V-8H480V-20C480 -26.627 485.373 -32 492 -32H564C570.627 -32 576 -26.627 576 -20V52C576 58.627 570.627 64 564 64H552V224H564zM352 384H384V352H352V384zM352 128H384V96H352V128zM64 96H32V128H64V96zM64 352H32V384H64V352zM96 136V148C96 154.627 90.627 160 84 160H72V320H84C90.627 320 96 325.373 96 332V344H320V332C320 325.373 325.373 320 332 320H344V160H332C325.373 160 320 154.627 320 148V136H96zM224 0H192V32H224V0zM504 64H492C485.373 64 480 58.627 480 52V40H256V52C256 58.627 250.627 64 244 64H232V88H320V76C320 69.373 325.373 64 332 64H404C410.627 64 416 69.373 416 76V148C416 154.627 410.627 160 404 160H392V248H480V236C480 229.373 485.373 224 492 224H504V64zM544 0H512V32H544V0zM544 256H512V288H544V256z" />
+    <glyph glyph-name="paper-plane"
+      unicode="&#xF1D8;"
+      horiz-adv-x="512" d=" M440 441.5L24 201.6C-10.4 181.7 -7.1 130.8 29.7 115.7L144 68.4V-16C144 -62.4 203.2 -81.5 230.6 -44.6L274.4 14.5L386.3 -31.7C392.2 -34.1 398.4 -35.3 404.6 -35.3C412.8 -35.3 420.9 -33.2 428.2 -29.1C441 -21.9 449.8 -9.1 452.1 5.4L511.4999999999999 392.6C517.5999999999999 432.7 474.6 461.4 440 441.5zM192 -16V48.6L228.6 33.5L192 -16zM404.6 12.7L250.8 76.2L391 278.5C401.7 294 381.5 312 367.3 299.7L155.8 115.4L48 160L464 400L404.6 12.7z" />
+    <glyph glyph-name="pause-circle"
+      unicode="&#xF28B;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM352 272V112C352 103.2 344.8 96 336 96H288C279.2 96 272 103.2 272 112V272C272 280.8 279.2 288 288 288H336C344.8 288 352 280.8 352 272zM240 272V112C240 103.2 232.8 96 224 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H224C232.8 288 240 280.8 240 272z" />
+    <glyph glyph-name="play-circle"
+      unicode="&#xF144;"
+      horiz-adv-x="512" d=" M371.7 210L195.7 317C179.9 325.8 160 314.5 160 296V88C160 69.6 179.8 58.2 195.7 67L371.7 168C388.1 177.1 388.1 200.8 371.7 210zM504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192z" />
+    <glyph glyph-name="plus-square"
+      unicode="&#xF0FE;"
+      horiz-adv-x="448" d=" M352 208V176C352 169.4 346.6 164 340 164H252V76C252 69.4 246.6 64 240 64H208C201.4 64 196 69.4 196 76V164H108C101.4 164 96 169.4 96 176V208C96 214.6 101.4 220 108 220H196V308C196 314.6 201.4 320 208 320H240C246.6 320 252 314.6 252 308V220H340C346.6 220 352 214.6 352 208zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" />
+    <glyph glyph-name="question-circle"
+      unicode="&#xF059;"
+      horiz-adv-x="512" d=" M256 440C119.043 440 8 328.9170000000001 8 192C8 55.003 119.043 -56 256 -56S504 55.003 504 192C504 328.9170000000001 392.957 440 256 440zM256 -8C145.468 -8 56 81.431 56 192C56 302.495 145.472 392 256 392C366.491 392 456 302.529 456 192C456 81.47 366.569 -8 256 -8zM363.2440000000001 247.2C363.2440000000001 180.148 290.8230000000001 179.116 290.8230000000001 154.337V148C290.8230000000001 141.373 285.4500000000001 136 278.8230000000001 136H233.1760000000001C226.5490000000001 136 221.1760000000001 141.373 221.1760000000001 148V156.659C221.1760000000001 192.404 248.2760000000001 206.693 268.7550000000001 218.175C286.3160000000001 228.02 297.0790000000001 234.716 297.0790000000001 247.754C297.0790000000001 265 275.0800000000001 276.447 257.2950000000001 276.447C234.1060000000001 276.447 223.4010000000001 265.4700000000001 208.3530000000001 246.478C204.2960000000001 241.358 196.8930000000001 240.407 191.6870000000001 244.354L163.8630000000001 265.452C158.7560000000001 269.324 157.6120000000001 276.5180000000001 161.2190000000001 281.815C184.846 316.509 214.94 336 261.794 336C310.865 336 363.244 297.6960000000001 363.244 247.2zM298 80C298 56.841 279.159 38 256 38S214 56.841 214 80S232.841 122 256 122S298 103.159 298 80z" />
+    <glyph glyph-name="registered"
+      unicode="&#xF25D;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM366.442 73.791C313.396 170.075 316.192 165.259 313.171 169.876C337.438 183.755 352.653 211.439 352.653 243.052C352.653 295.555 322.406 328.304 251.1550000000001 328.304H172.488C165.8710000000001 328.304 160.488 322.921 160.488 316.304V68C160.488 61.383 165.8710000000001 56 172.488 56H211.0560000000001C217.673 56 223.0560000000001 61.383 223.0560000000001 68V151.663H255.0140000000001L302.5290000000001 62.36A11.98 11.98 0 0 1 313.1220000000001 56H355.9320000000001C365.0720000000001 56 370.8460000000001 65.799 366.4420000000001 73.791zM256.933 208.094H223.058V272.234H250.435C282.852 272.234 289.3640000000001 260.101 289.3640000000001 240.525C289.3630000000001 219.612 277.846 208.094 256.9330000000001 208.094z" />
+    <glyph glyph-name="save"
+      unicode="&#xF0C7;"
+      horiz-adv-x="448" d=" M433.941 318.059L350.059 401.9410000000001A48 48 0 0 1 316.118 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V284.118A48 48 0 0 1 433.941 318.059zM272 368V288H144V368H272zM394 16H54A6 6 0 0 0 48 22V362A6 6 0 0 0 54 368H96V264C96 250.745 106.745 240 120 240H296C309.255 240 320 250.745 320 264V364.118L398.243 285.875A6 6 0 0 0 400 281.632V22A6 6 0 0 0 394 16zM224 216C175.477 216 136 176.523 136 128S175.477 40 224 40S312 79.477 312 128S272.523 216 224 216zM224 88C201.944 88 184 105.944 184 128S201.944 168 224 168S264 150.056 264 128S246.056 88 224 88z" />
+    <glyph glyph-name="share-square"
+      unicode="&#xF14D;"
+      horiz-adv-x="576" d=" M561.938 289.94L417.94 433.908C387.926 463.922 336 442.903 336 399.968V342.77C293.55 340.89 251.97 336.2200000000001 215.24 324.7800000000001C180.07 313.8300000000001 152.17 297.2000000000001 132.33 275.36C108.22 248.8 96 215.4 96 176.06C96 114.363 129.178 63.605 180.87 31.3C218.416 7.792 266.118 43.951 251.89 87.04C236.375 134.159 234.734 157.963 336 165.8V112C336 69.007 387.968 48.087 417.94 78.06L561.938 222.06C580.688 240.8 580.688 271.2 561.938 289.94zM384 112V215.84C255.309 213.918 166.492 192.65 206.31 72C176.79 90.45 144 123.92 144 176.06C144 285.394 273.14 295.007 384 295.91V400L528 256L384 112zM408.74 27.507A82.658 82.658 0 0 1 429.714 36.81C437.69 41.762 448 35.984 448 26.596V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16V336C0 362.51 21.49 384 48 384H180C186.627 384 192 378.627 192 372V367.514C192 362.597 189.013 358.145 184.431 356.362C170.729 351.031 158.035 344.825 146.381 337.777A12.138 12.138 0 0 0 140.101 336H54A6 6 0 0 1 48 330V-10A6 6 0 0 1 54 -16H394A6 6 0 0 1 400 -10V15.966C400 21.336 403.579 26.025 408.74 27.507z" />
+    <glyph glyph-name="smile"
+      unicode="&#xF118;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM248 -8C137.7 -8 48 81.7 48 192S137.7 392 248 392S448 302.3 448 192S358.3 -8 248 -8zM332 135.4C311.2 110.4 280.5 96 248 96S184.8 110.3 164 135.4C155.5 145.6 140.4 146.9 130.2 138.5C120 130 118.7 114.9 127.1 104.7C157.1 68.7 201.2 48.1 248 48.1S338.9 68.7 368.9 104.7C377.4 114.9 376 130 365.8 138.5C355.6 146.9 340.5 145.6 332 135.4zM168 208C185.7 208 200 222.3 200 240S185.7 272 168 272S136 257.7 136 240S150.3 208 168 208zM328 208C345.7 208 360 222.3 360 240S345.7 272 328 272S296 257.7 296 240S310.3 208 328 208z" />
+    <glyph glyph-name="snowflake"
+      unicode="&#xF2DC;"
+      horiz-adv-x="448" d=" M438.237 92.073L371.663 130.613L431.111 140.94C436.957 142.315 441.72 146.123 444.569 151.07C447.0490000000001 155.377 448.075 160.548 447.093 165.721C444.983 176.836 434.4070000000001 183.76 423.4720000000001 181.188L338.0490000000001 150.073L255.914 192L338.05 233.926L423.473 202.811C434.409 200.239 444.985 207.163 447.094 218.278C449.205 229.393 442.048 240.487 431.113 243.059L371.665 253.386L438.238 291.926C447.778 297.449 450.853 310.018 445.105 320C439.357 329.982 426.965 333.596 417.425 328.074L350.851 289.534L371.656 346.3210000000001C374.902 357.103 368.898 368.863 358.243 372.589C347.589 376.314 336.3209999999999 370.592 333.075 359.81L317.2369999999999 270.075L244.8139999999999 228.149V312L314.3989999999999 370.621C322.0879999999999 378.831 321.3959999999999 391.4770000000001 312.8509999999999 398.866C304.3059999999999 406.257 291.1459999999999 405.589 283.4569999999999 397.38L244.8129999999999 350.92V428C244.8129999999999 439.046 235.4949999999999 448 223.9999999999999 448S203.1869999999999 439.046 203.1869999999999 428V350.92L164.5429999999999 397.38C156.8539999999999 405.5900000000001 143.6939999999999 406.256 135.1489999999999 398.866C126.6049999999999 391.477 125.9129999999999 378.831 133.6019999999999 370.621L203.187 312V228.147L130.764 270.073L114.926 359.809C111.679 370.591 100.411 376.313 89.757 372.588C79.101 368.863 73.098 357.102 76.344 346.32L97.149 289.533L30.576 328.073C21.036 333.596 8.643 329.981 2.896 319.999S0.223 297.448 9.763 291.925L76.337 253.385L16.888 243.057C5.953 240.485 -1.202 229.391 0.907 218.276C3.017 207.162 13.593 200.238 24.529 202.81L109.951 233.925L192.086 192L109.95 150.074L24.527 181.189C13.591 183.761 3.016 176.8370000000001 0.905 165.723C-1.204 154.61 5.951 143.514 16.886 140.942L76.335 130.614L9.761 92.074C0.223 86.551 -2.852 73.982 2.896 64S21.036 50.403 30.576 55.926L97.15 94.466L76.345 37.68C74.61 31.916 75.517 25.875 78.365 20.929C80.845 16.622 84.798 13.145 89.757 11.412C100.412 7.687 111.68 13.409 114.926 24.191L130.764 113.927L203.187 155.853V72L133.602 13.379C125.912 5.169 126.605 -7.476 135.149 -14.866C143.693 -22.254 156.854 -21.589 164.543 -13.379L203.187 33.081V-44C203.187 -55.046 212.505 -64 224 -64S244.813 -55.046 244.813 -44V33.081L283.457 -13.379C287.568 -17.768 293.2389999999999 -19.9999999999999 298.935 -19.9999999999999C303.8949999999999 -19.9999999999999 308.874 -18.3059999999999 312.851 -14.8659999999999C321.396 -7.4759999999999 322.088 5.1690000000001 314.399 13.3790000000001L244.813 72V155.853L317.236 113.927L333.074 24.191C336.32 13.409 347.588 7.687 358.242 11.412C368.8950000000001 15.138 374.901 26.8990000000001 371.654 37.6800000000001L350.849 94.467L417.423 55.927C426.963 50.404 439.356 54.019 445.103 64.001C450.852 73.982 447.778 86.5510000000001 438.237 92.073z" />
+    <glyph glyph-name="square"
+      unicode="&#xF0C8;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM394 16H54C50.7 16 48 18.7 48 22V362C48 365.3 50.7 368 54 368H394C397.3 368 400 365.3 400 362V22C400 18.7 397.3 16 394 16z" />
+    <glyph glyph-name="star-half"
+      unicode="&#xF089;"
+      horiz-adv-x="576" d=" M288 62.7L163.7 -2.7L187.4 135.6999999999999L86.8 233.7L225.8 253.8999999999999L288 379.8999999999999V448C276.6 448 265.2 442.1 259.3 430.2L194 297.8L47.9 276.6C21.7 272.8 11.2 240.5 30.2 222L135.9 119L110.9 -26.5C106.4 -52.6 133.9 -72.5 157.3 -60.2L288 8.4V62.7z" />
+    <glyph glyph-name="star"
+      unicode="&#xF005;"
+      horiz-adv-x="576" d=" M528.1 276.5L382 297.8L316.7 430.2C305 453.8 271.1 454.1 259.3 430.2L194 297.8L47.9 276.5C21.7 272.7 11.2 240.4 30.2 221.9L135.9 118.9L110.9 -26.6C106.4 -52.9 134.1 -72.6 157.3 -60.3L288 8.4L418.7 -60.3C441.9 -72.5 469.6 -52.9 465.1 -26.6L440.1 118.9L545.8 221.9C564.8 240.4 554.3 272.7 528.0999999999999 276.5zM388.6 135.7L412.3 -2.7L288 62.6L163.7 -2.7L187.4 135.7000000000001L86.8 233.7000000000001L225.8 253.9000000000001L288 379.9000000000001L350.2 253.9000000000001L489.2 233.7000000000001L388.6 135.7000000000001z" />
+    <glyph glyph-name="sticky-note"
+      unicode="&#xF249;"
+      horiz-adv-x="448" d=" M448 99.894V368C448 394.51 426.51 416 400 416H48C21.49 416 0 394.51 0 368V16.012C0 -10.498 21.49 -31.988 48 -31.988H316.118A48 48 0 0 1 350.059 -17.929L433.941 65.953A48 48 0 0 1 448 99.894zM320 19.894V96.012H396.118L320 19.894zM400 368V144.012H296C282.745 144.012 272 133.267 272 120.012V16.012H48V368H400z" />
+    <glyph glyph-name="stop-circle"
+      unicode="&#xF28D;"
+      horiz-adv-x="512" d=" M504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192zM352 272V112C352 103.2 344.8 96 336 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H336C344.8 288 352 280.8 352 272z" />
+    <glyph glyph-name="sun"
+      unicode="&#xF185;"
+      horiz-adv-x="512" d=" M220.116 -39.936L199.903 9.489A3.9920000000000004 3.9920000000000004 0 0 1 194.095 11.3750000000001L148.691 -16.7289999999999C119.225 -34.9689999999999 82.396 -8.2099999999999 90.637 25.45L103.336 77.3150000000001A3.9930000000000003 3.9930000000000003 0 0 1 99.746 82.256L46.495 86.2070000000001C11.941 88.7690000000001 -2.137 132.0620000000001 24.321 154.4540000000001L65.08 188.95A3.9920000000000004 3.9920000000000004 0 0 1 65.08 195.056L24.32 229.553C-2.13 251.937 11.93 295.235 46.494 297.799L99.745 301.75A3.9930000000000003 3.9930000000000003 0 0 1 103.335 306.691L90.637 358.557C82.398 392.213 119.218 418.977 148.691 400.736L194.094 372.632A3.9930000000000003 3.9930000000000003 0 0 1 199.902 374.519L220.115 423.944C233.231 456.015 278.753 456.025 291.873 423.944L312.085 374.52A3.9939999999999998 3.9939999999999998 0 0 1 317.894 372.6330000000001L363.2970000000001 400.737C392.761 418.973 429.5940000000001 392.224 421.351 358.558L408.652 306.693A3.9950000000000006 3.9950000000000006 0 0 1 412.242 301.752L465.4929999999999 297.8010000000001C500.0459999999999 295.2380000000001 514.126 251.947 487.6679999999999 229.555L446.908 195.058A3.9930000000000003 3.9930000000000003 0 0 1 446.908 188.951L487.6679999999999 154.455C514.179 132.014 499.99 88.766 465.4929999999999 86.208L412.242 82.257A3.9930000000000003 3.9930000000000003 0 0 1 408.653 77.3149999999999L421.351 25.451C429.592 -8.207 392.7679999999999 -34.97 363.2969999999999 -16.729L317.8939999999999 11.3749999999999A3.9939999999999998 3.9939999999999998 0 0 1 312.0849999999999 9.4879999999999L291.8729999999999 -39.936C278.7139999999999 -72.114 233.1979999999999 -71.9290000000001 220.1159999999999 -39.936zM236.93 24.632L255.994 -21.984L275.058 24.631C285.366 49.831 315.836 59.697 338.95 45.39L381.772 18.883L369.796 67.802C363.321 94.246 382.176 120.141 409.283 122.151L459.509 125.877L421.065 158.413C400.283 176.004 400.318 208.034 421.066 225.593L459.508 258.129L409.283 261.856C382.132 263.871 363.333 289.8040000000001 369.795 316.2050000000001L381.773 365.124L338.95 338.617C315.799 324.29 285.347 334.217 275.058 359.377L255.994 405.992L236.93 359.375C226.625 334.177 196.152 324.3090000000001 173.039 338.615L130.216 365.123L142.193 316.2050000000001C148.667 289.759 129.812 263.867 102.705 261.855L52.481 258.129L90.924 225.592C111.706 208.004 111.671 175.973 90.924 158.414L52.48 125.877L102.706 122.151C129.857 120.137 148.656 94.204 142.193 67.802L130.216 18.883L173.039 45.39C196.227 59.7450000000001 226.661 49.742 236.93 24.6320000000001zM256 64C185.42 64 128 121.421 128 192C128 262.58 185.42 320 256 320C326.579 320 384 262.58 384 192C384 121.421 326.579 64 256 64zM256 272C211.888 272 176 236.112 176 192S211.888 112 256 112S336 147.888 336 192S300.112 272 256 272z" />
+    <glyph glyph-name="thumbs-down"
+      unicode="&#xF165;"
+      horiz-adv-x="512" d=" M466.27 222.69C470.944 245.337 467.134 267.228 457.28 285.68C460.238 309.548 453.259 334.245 439.94 352.67C438.986 408.577 404.117 448 327 448C320 448 312 447.99 304.78 447.99C201.195 447.99 168.997 408 128 408H117.155C111.515 412.975 104.113 416 96 416H32C14.327 416 0 401.673 0 384V144C0 126.327 14.327 112 32 112H96C107.842 112 118.175 118.438 123.708 128H130.76C149.906 111.047 176.773 67.347 199.52 44.6C213.187 30.9330000000001 209.673 -64 271.28 -64C328.86 -64 366.55 -32.064 366.55 40.73C366.55 59.14 362.62 74.46 357.7 87.27H394.18C442.782 87.27 479.9999999999999 128.835 479.9999999999999 172.85C479.9999999999999 192 475.04 207.84 466.2699999999999 222.69zM64 152C50.745 152 40 162.745 40 176S50.745 200 64 200S88 189.255 88 176S77.255 152 64 152zM394.18 135.27H290.19C290.19 97.45 318.55 79.9 318.55 40.73C318.55 16.98 318.55 -16.0000000000001 271.2800000000001 -16.0000000000001C252.3700000000001 2.91 261.8200000000001 50.18 233.4600000000001 78.54C206.9 105.11 167.28 176 138.92 176H128V362.17C181.611 362.17 228.001 399.99 299.64 399.99H337.46C372.972 399.99 398.28 382.87 390.58 334.0900000000001C405.78 325.93 417.08 297.65 404.52 276.52C426.101 256.136 423.219 225.455 409.73 210.9C419.18 210.9 432.09 191.99 432 173.09C431.91 154.18 415.29 135.2700000000001 394.18 135.2700000000001z" />
+    <glyph glyph-name="thumbs-up"
+      unicode="&#xF164;"
+      horiz-adv-x="512" d=" M466.27 161.31C475.04 176.16 480 192 480 211.15C480 255.165 442.782 296.73 394.18 296.73H357.7C362.62 309.54 366.55 324.86 366.55 343.27C366.55 416.064 328.86 448 271.28 448C209.673 448 213.187 353.067 199.52 339.4C176.773 316.653 149.905 272.953 130.76 256H32C14.327 256 0 241.673 0 224V-16C0 -33.673 14.327 -48 32 -48H96C110.893 -48 123.408 -37.826 126.978 -24.05C171.487 -25.051 202.038 -63.99 304.78 -63.99C312 -63.99 320 -64 327 -64C404.117 -64 438.986 -24.577 439.94 31.33C453.259 49.755 460.239 74.452 457.28 98.32C467.134 116.772 470.944 138.663 466.27 161.31zM404.52 107.48C417.08 86.35 405.78 58.0700000000001 390.58 49.91C398.28 1.13 372.972 -15.99 337.46 -15.99H299.64C228.001 -15.99 181.611 21.83 128 21.83V208H138.92C167.28 208 206.9 278.89 233.46 305.46C261.82 333.82 252.37 381.09 271.28 400C318.55 400 318.55 367.02 318.55 343.27C318.55 304.1 290.19 286.55 290.19 248.73H394.18C415.29 248.73 431.91 229.82 432 210.91C432.0899999999999 192.01 419.18 173.1 409.73 173.1C423.219 158.545 426.101 127.864 404.52 107.48zM88 16C88 2.745 77.255 -8 64 -8S40 2.745 40 16S50.745 40 64 40S88 29.255 88 16z" />
+    <glyph glyph-name="times-circle"
+      unicode="&#xF057;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM357.8 254.2L295.6 192L357.8 129.8C362.5 125.1 362.5 117.5 357.8 112.8L335.2 90.2C330.5 85.5 322.9 85.5 318.2 90.2L256 152.4L193.8 90.2C189.1 85.5 181.5 85.5 176.8 90.2L154.2 112.8C149.5 117.5 149.5 125.1 154.2 129.8L216.4 192L154.2000000000001 254.2C149.5000000000001 258.9 149.5000000000001 266.5 154.2000000000001 271.2L176.8000000000001 293.8C181.5 298.5 189.1000000000001 298.5 193.8000000000001 293.8L256.0000000000001 231.6L318.2000000000001 293.8C322.9000000000001 298.5 330.5000000000001 298.5 335.2000000000001 293.8L357.8000000000001 271.2C362.5000000000001 266.5 362.5000000000001 258.9 357.8000000000001 254.2z" />
+    <glyph glyph-name="trash-alt"
+      unicode="&#xF2ED;"
+      horiz-adv-x="448" d=" M192 260V44C192 37.373 186.627 32 180 32H156C149.373 32 144 37.373 144 44V260C144 266.627 149.373 272 156 272H180C186.627 272 192 266.627 192 260zM292 272H268C261.373 272 256 266.627 256 260V44C256 37.373 261.373 32 268 32H292C298.627 32 304 37.373 304 44V260C304 266.627 298.627 272 292 272zM424 368C437.255 368 448 357.255 448 344V332C448 325.373 442.627 320 436 320H416V-16C416 -42.51 394.51 -64 368 -64H80C53.49 -64 32 -42.51 32 -16V320H12C5.373 320 0 325.373 0 332V344C0 357.255 10.745 368 24 368H98.411L132.429 424.6960000000001A48 48 0 0 0 173.589 448H274.412A48 48 0 0 0 315.572 424.6960000000001L349.589 368H424zM154.389 368H293.612L276.1600000000001 397.087A6 6 0 0 1 271.015 400H176.987A6 6 0 0 1 171.842 397.087L154.389 368zM368 320H80V-10A6 6 0 0 1 86 -16H362A6 6 0 0 1 368 -10V320z" />
+    <glyph glyph-name="user-circle"
+      unicode="&#xF2BD;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 392C366.457 392 456 302.457 456 192C456 155.018 445.951 120.389 428.452 90.672C421.38 116.1160000000001 402.789 144.88 364.522 156.0460000000001C377.207 176.218 384 199.586 384 224C384 294.689 326.811 352 256 352C185.311 352 128 294.81 128 224C128 199.586 134.793 176.217 147.478 156.046C109.179 144.871 90.602 116.133 83.54 90.684C66.046 120.399 56 155.024 56 192C56 302.457 145.543 392 256 392zM336 224C336 179.817 300.183 144 256 144S176 179.817 176 224S211.817 304 256 304S336 268.183 336 224zM128 38.331V66.089C128 86.499 141.53 104.437 161.156 110.044L185.632 117.037C206.342 103.352 230.605 96 256 96S305.658 103.352 326.3690000000001 117.038L350.8450000000001 110.045C370.4700000000001 104.437 384 86.5 384 66.089V38.331C349.315 9.408 304.693 -8 256 -8S162.685 9.408 128 38.331z" />
+    <glyph glyph-name="user"
+      unicode="&#xF007;"
+      horiz-adv-x="512" d=" M423.3090000000001 156.975L402.221 163C431.798 204.11 436 245.706 436 268C436 367.351 355.484 448 256 448C156.649 448 76 367.484 76 268C76 245.701 80.198 204.116 109.779 163L88.691 156.975C21.28 137.715 0 76.41 0 39.395V13.714C0 -29.138 34.862 -64 77.714 -64H434.2850000000001C477.138 -64 512 -29.138 512 13.714V39.395C512 75.642 491.275 137.556 423.309 156.975zM256 400C328.902 400 388 340.901 388 268S328.902 136 256 136S124 195.099 124 268S183.098 400 256 400zM464 13.714C464 -2.696 450.696 -16 434.286 -16H77.714C61.304 -16 48 -2.696 48 13.714V39.395C48 72.562 69.987 101.711 101.878 110.822L147.981 123.994C162.683 112.942 200.427 88 256 88S349.317 112.942 364.019 123.994L410.122 110.822C442.013 101.71 464 72.562 464 39.395V13.714z" />
+    <glyph glyph-name="window-close"
+      unicode="&#xF410;"
+      horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM464 22C464 18.7 461.3 16 458 16H54C50.7 16 48 18.7 48 22V362C48 365.3 50.7 368 54 368H458C461.3 368 464 365.3 464 362V22zM356.5 253.4L295.1 192L356.5 130.6C361.1 126 361.1 118.5 356.5 113.8L334.2 91.5C329.6 86.9 322.1 86.9 317.4 91.5L256 152.9L194.6 91.5C190 86.9 182.5 86.9 177.8 91.5L155.5 113.8C150.9 118.4 150.9 125.9 155.5 130.6L216.9 192L155.5 253.4000000000001C150.9 258 150.9 265.5 155.5 270.2000000000001L177.8 292.5000000000001C182.4 297.1 189.9 297.1 194.6 292.5000000000001L256 231.1000000000001L317.4 292.5000000000001C322 297.1 329.5 297.1 334.2 292.5000000000001L356.5 270.2000000000001C361.2 265.6 361.2 258.1 356.5 253.4000000000001z" />
+    <glyph glyph-name="window-maximize"
+      unicode="&#xF2D0;"
+      horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM464 22C464 18.7 461.3 16 458 16H54C50.7 16 48 18.7 48 22V256H464V22z" />
+    <glyph glyph-name="window-minimize"
+      unicode="&#xF2D1;"
+      horiz-adv-x="512" d=" M480 -32H32C14.3 -32 0 -17.7 0 0S14.3 32 32 32H480C497.7 32 512 17.7 512 0S497.7 -32 480 -32z" />
+    <glyph glyph-name="window-restore"
+      unicode="&#xF2D2;"
+      horiz-adv-x="512" d=" M464 448H144C117.5 448 96 426.5 96 400V352H48C21.5 352 0 330.5 0 304V-16C0 -42.5 21.5 -64 48 -64H368C394.5 -64 416 -42.5 416 -16V32H464C490.5 32 512 53.5 512 80V400C512 426.5 490.5 448 464 448zM368 -16H48V192H368V-16zM464 80H416V304C416 330.5 394.5 352 368 352H144V400H464V80z" />
+  </font>
+</defs>
+</svg>
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.ttf b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..bc3a94ecefdcb299883c652df6e58058208e3237
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.ttf differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff
new file mode 100644
index 0000000000000000000000000000000000000000..11e9d2eabb29d09cd58779ca80ed3a567566918c
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff2 b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..b7866ae0ccae9ce50ac6e105d17df01540b7d1c2
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-regular-400.woff2 differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.eot b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.eot
new file mode 100644
index 0000000000000000000000000000000000000000..94abcd6a0d0750bd3c95ef00ae26ec1e38174a78
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.eot differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.svg b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e8eee60c497889ed12e1497d9a75df1d2fa7d938
--- /dev/null
+++ b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.svg
@@ -0,0 +1,1644 @@
+<?xml version="1.0" standalone="no"?> 
+<!--
+Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
+License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs>
+  <font id="fontawesome-free" horiz-adv-x="640">
+    <font-face font-family="Font Awesome 5 Free"
+      units-per-em="512" ascent="448"
+      descent="64"
+      font-weight="900"
+      font-style="Solid" />
+    <missing-glyph horiz-adv-x="0" />
+    <glyph glyph-name="address-book"
+      unicode="&#xF2B9;"
+      horiz-adv-x="448" d=" M436 288C442.627 288 448 293.373 448 300V340C448 346.627 442.627 352 436 352H416V400C416 426.51 394.51 448 368 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H436C442.627 32 448 37.373 448 44V84C448 90.627 442.627 96 436 96H416V160H436C442.627 160 448 165.373 448 172V212C448 218.627 442.627 224 436 224H416V288H436zM208 320C252.183 320 288 284.183 288 240S252.183 160 208 160S128 195.817 128 240S163.817 320 208 320zM336 88C336 74.745 325.255 64 312 64H104C90.745 64 80 74.745 80 88V106.523C80 128.549 94.99 147.7480000000001 116.358 153.09L152.015 162.004C181.116 141.072 226.524 135.059 263.985 162.004L299.642 153.09C321.01 147.748 336 128.548 336 106.523V88z" />
+    <glyph glyph-name="address-card"
+      unicode="&#xF2BB;"
+      horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM176 304C214.66 304 246 272.66 246 234S214.66 164 176 164S106 195.34 106 234S137.34 304 176 304zM288 101C288 89.402 278.598 80 267 80H85C73.402 80 64 89.402 64 101V117.207C64 136.479 77.116 153.279 95.813 157.953L127.013 165.753C152.477 147.437 192.208 142.176 224.987 165.753L256.187 157.953C274.884 153.279 288 136.48 288 117.207V101zM448 140C448 133.373 442.627 128 436 128H332C325.373 128 320 133.373 320 140V148C320 154.627 325.373 160 332 160H436C442.627 160 448 154.627 448 148V140zM448 204C448 197.373 442.627 192 436 192H332C325.373 192 320 197.373 320 204V212C320 218.627 325.373 224 332 224H436C442.627 224 448 218.627 448 212V204zM448 268C448 261.373 442.627 256 436 256H332C325.373 256 320 261.373 320 268V276C320 282.627 325.373 288 332 288H436C442.627 288 448 282.627 448 276V268z" />
+    <glyph glyph-name="adjust"
+      unicode="&#xF042;"
+      horiz-adv-x="512" d=" M8 192C8 55.034 119.033 -56 256 -56S504 55.034 504 192S392.966 440 256 440S8 328.967 8 192zM256 8V376C357.705 376 440 293.689 440 192C440 90.295 357.689 8 256 8z" />
+    <glyph glyph-name="align-center"
+      unicode="&#xF037;"
+      horiz-adv-x="448" d=" M352 404V364C352 355.163 344.837 348 336 348H112C103.163 348 96 355.163 96 364V404C96 412.837 103.163 420 112 420H336C344.837 420 352 412.837 352 404zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM336 164H112C103.163 164 96 156.837 96 148V108C96 99.163 103.163 92 112 92H336C344.837 92 352 99.163 352 108V148C352 156.837 344.837 164 336 164z" />
+    <glyph glyph-name="align-justify"
+      unicode="&#xF039;"
+      horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM16 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H16C7.163 164 0 156.837 0 148V108C0 99.163 7.163 92 16 92z" />
+    <glyph glyph-name="align-left"
+      unicode="&#xF036;"
+      horiz-adv-x="448" d=" M288 404V364C288 355.163 280.837 348 272 348H16C7.163 348 0 355.163 0 364V404C0 412.837 7.163 420 16 420H272C280.837 420 288 412.837 288 404zM0 276V236C0 227.163 7.163 220 16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM272 164H16C7.163 164 0 156.837 0 148V108C0 99.163 7.163 92 16 92H272C280.837 92 288 99.163 288 108V148C288 156.837 280.837 164 272 164z" />
+    <glyph glyph-name="align-right"
+      unicode="&#xF038;"
+      horiz-adv-x="448" d=" M160 364V404C160 412.837 167.163 420 176 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H176C167.163 348 160 355.163 160 364zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM176 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H176C167.163 164 160 156.837 160 148V108C160 99.163 167.163 92 176 92z" />
+    <glyph glyph-name="allergies"
+      unicode="&#xF461;"
+      horiz-adv-x="448" d=" M416 336C398.4 336 384 321.6 384 304V232C384 227.6 380.4 224 376 224H360C355.6 224 352 227.6 352 232V384C352 401.6 337.6 416 320 416S288 401.6 288 384V232C288 227.6 284.4 224 280 224H264C259.6 224 256 227.6 256 232V416C256 433.6 241.6 448 224 448S192 433.6 192 416V232C192 227.6 188.4 224 184 224H168C163.6 224 160 227.6 160 232V384C160 401.6 145.6 416 128 416S96 401.6 96 384V143L72.4 175.5C59.4 193.4 34.4 197.3 16.5 184.3S-5.3 146.3 7.7 128.4L133.3 -44.3C142.3 -56.6999999999999 156.8 -64.0999999999999 172.1 -64.0999999999999H369.7000000000001C392.0000000000001 -64.0999999999999 411.3000000000001 -48.7999999999999 416.4000000000001 -27.0999999999999L442.9000000000001 85.6000000000001C446.1 99.3000000000001 447.8 113.9000000000001 448.0000000000001 127.9000000000001V304C448.0000000000001 321.6 433.6000000000001 336 416.0000000000001 336zM176 32C167.2 32 160 39.2 160 48S167.2 64 176 64S192 56.8 192 48S184.8 32 176 32zM176 128C167.2 128 160 135.2 160 144S167.2 160 176 160S192 152.8 192 144S184.8 128 176 128zM240 0C231.2 0 224 7.2 224 16S231.2 32 240 32S256 24.8 256 16S248.8 0 240 0zM240 96C231.2 96 224 103.2 224 112S231.2 128 240 128S256 120.8 256 112S248.8 96 240 96zM304 64C295.2 64 288 71.2 288 80S295.2 96 304 96S320 88.8 320 80S312.8 64 304 64zM336 0C327.2 0 320 7.2 320 16S327.2 32 336 32S352 24.8 352 16S344.8 0 336 0zM368 128C359.2 128 352 135.2 352 144S359.2 160 368 160S384 152.8 384 144S376.8 128 368 128z" />
+    <glyph glyph-name="ambulance"
+      unicode="&#xF0F9;"
+      horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H64C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM304 232C304 227.6 300.4 224 296 224H240V168C240 163.6 236.4 160 232 160H184C179.6 160 176 163.6 176 168V224H120C115.6 224 112 227.6 112 232V280C112 284.4 115.6 288 120 288H176V344C176 348.4 179.6 352 184 352H232C236.4 352 240 348.4 240 344V288H296C300.4 288 304 284.4 304 280V232zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" />
+    <glyph glyph-name="american-sign-language-interpreting"
+      unicode="&#xF2A3;"
+      horiz-adv-x="640" d=" M290.5470000000001 258.961C270.252 269.11 246.4000000000001 270.1600000000001 225.808 262.851C268.4140000000001 262.851 297.016 242.376 311.386 212.275C319.9620000000001 194.376 306.238 174.204 287.769 174.204C306.198 174.204 319.98 154.068 311.386 136.1330000000001C296.661 105.287 265.2630000000001 85.2790000000001 231.088 85.2790000000001C230.5310000000001 85.2790000000001 136.617 93.8940000000001 136.617 93.8940000000001L70.211 60.5470000000001C60.827 55.8540000000001 50.396 60.1680000000001 46.316 68.3280000000001L1.86 157.253C-2.307 165.868 0.749 176.15 8.806 180.874L66.878 213.943L108 288.139C114.39 345.384 142.731 397.906 187.743 434.865C199.134 444.313 216.084 442.646 225.253 431.252C234.699 419.858 233.033 403.185 221.641 393.736C209.138 383.177 198.023 371.227 189.132 358.166C210.804 372.895 235.811 382.898 263.318 386.233C278.043 388.178 291.381 377.897 293.048 363.168C294.993 348.44 284.712 335.101 269.986 333.434C253.87 331.4890000000001 238.866 325.931 225.808 318.15C251.922 323.863 284.52 321.288 313.887 307.035C327.223 300.366 332.78 284.526 326.111 271.187C319.722 258.127 303.607 252.57 290.547 258.961zM263.3180000000001 189.489C257.206 201.994 244.9800000000001 209.775 231.0870000000001 209.775A35.46 35.46 0 0 1 195.5220000000001 174.2050000000001C195.5220000000001 152.7770000000001 213.3300000000001 138.6350000000001 231.0870000000001 138.6350000000001C244.9800000000001 138.6350000000001 257.206 146.4160000000001 263.3180000000001 158.9210000000001C267.7640000000001 168.3700000000001 276.932 173.927 286.6570000000001 174.2050000000001C276.932 174.482 267.764 180.04 263.3180000000001 189.489zM638.1390000000001 226.7260000000001C642.3070000000001 218.111 639.2500000000001 207.829 631.1930000000001 203.105L573.1220000000001 170.036L532 95.84C525.61 38.595 497.269 -13.927 452.257 -50.886C441.325 -59.998 424.4580000000001 -59.03 414.747 -47.273C405.301 -35.879 406.9670000000001 -19.206 418.36 -9.757C430.863 0.802 441.9770000000001 12.752 450.868 25.813C429.196 11.084 404.189 1.081 376.682 -2.254C366.661 -4.76 349.13 3.389 346.952 20.811C345.007 35.539 355.288 48.878 370.014 50.545C386.13 52.491 401.134 58.048 414.192 65.829C388.0780000000001 60.1159999999999 355.48 62.691 326.113 76.944C312.777 83.6129999999999 307.2200000000001 99.453 313.889 112.792C320.278 125.853 336.394 131.411 349.454 125.019C369.749 114.87 393.601 113.8199999999999 414.193 121.129C371.587 121.129 342.985 141.604 328.615 171.705C320.039 189.604 333.7630000000001 209.776 352.2320000000001 209.776C333.8030000000001 209.776 320.021 229.912 328.615 247.847C342.648 277.243 372.654 298.734 410.581 298.701L503.384 290.086L569.79 323.433C579.198 328.137 589.6179999999999 323.787 593.684 315.652L638.139 226.726zM408.9120000000002 245.344C395.0190000000001 245.344 382.7930000000001 237.563 376.6810000000002 225.058C372.2350000000002 215.609 363.0670000000002 210.052 353.3420000000002 209.774C363.0670000000002 209.4960000000001 372.2350000000002 203.938 376.6810000000002 194.4900000000001C382.7930000000002 181.985 395.0190000000002 174.2040000000001 408.9120000000002 174.2040000000001A35.46 35.46 0 0 1 444.4770000000002 209.7740000000001C444.4770000000002 231.2030000000001 426.6690000000002 245.3440000000001 408.9120000000002 245.3440000000001z" />
+    <glyph glyph-name="anchor"
+      unicode="&#xF13D;"
+      horiz-adv-x="576" d=" M12.971 96H45.365C67.172 -6.735 181.944 -64 288 -64C394.229 -64 508.853 -6.62 530.635 96H563.029C573.72 96 579.074 108.926 571.514 116.485L504.485 183.514C499.799 188.2 492.201 188.2 487.514 183.514L420.485 116.485C412.925 108.925 418.279 96 428.9700000000001 96H464.116C443.826 41.683 379.153 9.412 319.999 1.985V192H371.999C378.6260000000001 192 383.999 197.373 383.999 204V244C383.999 250.627 378.6260000000001 256 371.999 256H319.999V261.4700000000001C357.2800000000001 274.648 383.9940000000001 310.195 383.999 351.988C384.005 404.228 341.605 447.262 289.37 447.99C235.723 448.739 192 405.475 192 352C192 310.202 218.716 274.65 256 261.4700000000001V256H204C197.373 256 192 250.627 192 244V204C192 197.373 197.373 192 204 192H256V1.985C197.064 9.384 132.18 41.664 111.883 96H147.029C157.72 96 163.074 108.926 155.514 116.485L88.485 183.514C83.799 188.2 76.201 188.2 71.514 183.514L4.485 116.485C-3.074 108.926 2.28 96 12.971 96zM288 384C305.645 384 320 369.645 320 352S305.645 320 288 320S256 334.355 256 352S270.355 384 288 384z" />
+    <glyph glyph-name="angle-double-down"
+      unicode="&#xF103;"
+      horiz-adv-x="320" d=" M143 191.7L7 327.7C-2.4 337.1 -2.4 352.3 7 361.6L29.6 384.2C39 393.6 54.2 393.6 63.5 384.2L159.9 287.8L256.3 384.2C265.7 393.6 280.9000000000001 393.6 290.2 384.2L313 361.7C322.4 352.3 322.4 337.1 313 327.8L177 191.8C167.6 182.3 152.4 182.3 143 191.7zM177 -0.3L313 135.7C322.4 145.1 322.4 160.3 313 169.6L290.4 192.2C281 201.6 265.8 201.6 256.5 192.2L160 95.9L63.6 192.3C54.2 201.7 39 201.7 29.7 192.3L7 169.7C-2.4 160.3 -2.4 145.1 7 135.8L143 -0.2C152.4 -9.7 167.6 -9.7 177 -0.3z" />
+    <glyph glyph-name="angle-double-left"
+      unicode="&#xF100;"
+      horiz-adv-x="448" d=" M223.7 209L359.7 345C369.1 354.4 384.3 354.4 393.6 345L416.2 322.4C425.6 313 425.6 297.8 416.2 288.5L319.9 192L416.3 95.6C425.7 86.2000000000001 425.7 71 416.3 61.7000000000001L393.7 39C384.3 29.6 369.1 29.6 359.8 39L223.8 175C214.3 184.4 214.3 199.6 223.7 209zM31.7 175L167.7 39C177.1 29.6 192.3 29.6 201.6 39L224.2 61.6C233.6 71 233.6 86.2000000000001 224.2 95.5L127.9 192L224.3 288.4C233.7 297.8 233.7 313 224.3 322.3L201.7 345C192.3 354.4 177.1 354.4 167.8 345L31.8 209C22.3 199.6 22.3 184.4 31.7 175z" />
+    <glyph glyph-name="angle-double-right"
+      unicode="&#xF101;"
+      horiz-adv-x="448" d=" M224.3 175L88.3 39C78.9 29.6 63.7 29.6 54.4 39L31.8 61.6C22.4 71 22.4 86.2000000000001 31.8 95.5L128.2 191.9L31.8 288.3C22.4 297.7 22.4 312.9 31.8 322.2L54.3 345C63.7 354.4 78.9 354.4 88.2 345L224.2 209C233.7 199.6 233.7 184.4 224.3 175zM416.3 209L280.3 345C270.9000000000001 354.4 255.7 354.4 246.4 345L223.8 322.4C214.4 313 214.4 297.8 223.8 288.5L320.2000000000001 192.1L223.8000000000001 95.7C214.4 86.3 214.4 71.1 223.8000000000001 61.8L246.4000000000001 39.2C255.8000000000001 29.8 271.0000000000001 29.8 280.3 39.2L416.3 175.2C425.7 184.4 425.7 199.6 416.3 209z" />
+    <glyph glyph-name="angle-double-up"
+      unicode="&#xF102;"
+      horiz-adv-x="320" d=" M177 192.3L313 56.3C322.4 46.9 322.4 31.7 313 22.4L290.4 -0.2C281 -9.6 265.8 -9.6 256.5 -0.2L160 96.1L63.6 -0.3C54.2 -9.6999999999999 39 -9.6999999999999 29.7 -0.3L7 22.3C-2.4 31.7 -2.4 46.9 7 56.2L143 192.2C152.4 201.7 167.6 201.7 177 192.3zM143 384.3L7 248.3C-2.4 238.9 -2.4 223.7 7 214.4L29.6 191.8C39 182.4 54.2 182.4 63.5 191.8L159.9 288.2000000000001L256.3 191.8C265.7 182.4 280.9000000000001 182.4 290.2 191.8L312.8 214.4C322.2 223.8 322.2 239 312.8 248.3L176.8 384.3C167.6 393.7 152.4 393.7 143 384.3z" />
+    <glyph glyph-name="angle-down"
+      unicode="&#xF107;"
+      horiz-adv-x="320" d=" M143 95.7L7 231.7C-2.4 241.1 -2.4 256.3 7 265.6L29.6 288.2C39 297.6 54.2 297.6 63.5 288.2L159.9 191.8L256.3 288.2C265.7 297.6 280.9000000000001 297.6 290.2 288.2L312.8 265.6C322.2 256.2 322.2 241 312.8 231.7L176.8 95.6999999999999C167.6 86.3 152.4 86.3 143 95.6999999999999z" />
+    <glyph glyph-name="angle-left"
+      unicode="&#xF104;"
+      horiz-adv-x="256" d=" M31.7 209L167.7 345C177.1 354.4 192.3 354.4 201.6 345L224.2 322.4C233.6 313 233.6 297.8 224.2 288.5L127.9 192L224.3 95.6C233.7 86.2000000000001 233.7 71 224.3 61.7000000000001L201.7 39C192.3 29.6 177.1 29.6 167.8 39L31.8 175C22.3 184.4 22.3 199.6 31.7 209z" />
+    <glyph glyph-name="angle-right"
+      unicode="&#xF105;"
+      horiz-adv-x="256" d=" M224.3 175L88.3 39C78.9 29.6 63.7 29.6 54.4 39L31.8 61.6C22.4 71 22.4 86.2000000000001 31.8 95.5L128.2 191.9L31.8 288.3C22.4 297.7 22.4 312.9 31.8 322.2L54.3 345C63.7 354.4 78.9 354.4 88.2 345L224.2 209C233.7 199.6 233.7 184.4 224.3 175z" />
+    <glyph glyph-name="angle-up"
+      unicode="&#xF106;"
+      horiz-adv-x="320" d=" M177 288.3L313 152.3C322.4 142.9 322.4 127.7 313 118.4L290.4 95.8C281 86.4 265.8 86.4 256.5 95.8L160 192.1L63.6 95.7C54.2 86.3 39 86.3 29.7 95.7L7 118.3C-2.4 127.7 -2.4 142.9 7 152.2L143 288.2C152.4 297.7 167.6 297.7 177 288.3z" />
+    <glyph glyph-name="archive"
+      unicode="&#xF187;"
+      horiz-adv-x="512" d=" M32 0C32 -17.7 46.3 -32 64 -32H448C465.7 -32 480 -17.7 480 0V288H32V0zM192 212C192 218.6 197.4 224 204 224H308C314.6 224 320 218.6 320 212V204C320 197.4 314.6 192 308 192H204C197.4 192 192 197.4 192 204V212zM480 416H32C14.3 416 0 401.7 0 384V336C0 327.2 7.2 320 16 320H496C504.8 320 512 327.2 512 336V384C512 401.7 497.7 416 480 416z" />
+    <glyph glyph-name="arrow-alt-circle-down"
+      unicode="&#xF358;"
+      horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM212 308V192H141.1C130.4 192 125 179 132.6 171.5L247.5 57.2C252.2 52.5 259.7 52.5 264.4 57.2L379.3 171.5C386.9 179.1 381.5 192 370.8 192H300V308C300 314.6 294.6 320 288 320H224C217.4 320 212 314.6 212 308z" />
+    <glyph glyph-name="arrow-alt-circle-left"
+      unicode="&#xF359;"
+      horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM372 236H256V306.9C256 317.6 243 323 235.5 315.4L121.2 200.5C116.5 195.8 116.5 188.3 121.2 183.6L235.5 68.7000000000001C243.1 61.1 256 66.5000000000001 256 77.2000000000001V148H372C378.6 148 384 153.4 384 160V224C384 230.6 378.6 236 372 236z" />
+    <glyph glyph-name="arrow-alt-circle-right"
+      unicode="&#xF35A;"
+      horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM140 148H256V77.1C256 66.4 269 61 276.5 68.6L390.8 183.5C395.5 188.2 395.5 195.7 390.8 200.4L276.5 315.4C268.9 323 256 317.6 256 306.9V236H140C133.4 236 128 230.6 128 224V160C128 153.4 133.4 148 140 148z" />
+    <glyph glyph-name="arrow-alt-circle-up"
+      unicode="&#xF35B;"
+      horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM300 76V192H370.9C381.6 192 387 205 379.4 212.5L264.5 326.8C259.8 331.5 252.3 331.5 247.6 326.8L132.6 212.5C125 204.9 130.4 192 141.1 192H212V76C212 69.4 217.4 64 224 64H288C294.6 64 300 69.4 300 76z" />
+    <glyph glyph-name="arrow-circle-down"
+      unicode="&#xF0AB;"
+      horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM360.4 220.9L288 145.4V328C288 341.3 277.3 352 264 352H248C234.7 352 224 341.3 224 328V145.4L151.6 220.9C142.3 230.6 126.8 230.8 117.3 221.3L106.4 210.3C97 200.9 97 185.7 106.4 176.4L239 43.7C248.4 34.3 263.6 34.3 272.9 43.7L405.6 176.4C415 185.8 415 201 405.6 210.3L394.7 221.3C385.2 230.8 369.7 230.6 360.4 220.9z" />
+    <glyph glyph-name="arrow-circle-left"
+      unicode="&#xF0A8;"
+      horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM284.9 87.6L209.4 160H392C405.3 160 416 170.7 416 184V200C416 213.3 405.3 224 392 224H209.4L284.9 296.4C294.6 305.7000000000001 294.8 321.2 285.3 330.7L274.3 341.6C264.9 351 249.7 351 240.4 341.6L107.7 209C98.3 199.6 98.3 184.4 107.7 175.1L240.4 42.4C249.8 33.0000000000001 265 33.0000000000001 274.3 42.4L285.3 53.3C294.8 62.8 294.6 78.3 284.9 87.6z" />
+    <glyph glyph-name="arrow-circle-right"
+      unicode="&#xF0A9;"
+      horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM227.1 296.4L302.6 224H120C106.7 224 96 213.3 96 200V184C96 170.7 106.7 160 120 160H302.6L227.1 87.6C217.4 78.3 217.2 62.8 226.7 53.3L237.7 42.4C247.1 33.0000000000001 262.3 33.0000000000001 271.6 42.4L404.3 175C413.7 184.4 413.7 199.6 404.3 208.9L271.6 341.7C262.2000000000001 351.1 247.0000000000001 351.1 237.7 341.7L226.7 330.8C217.2 321.2 217.4 305.7 227.1 296.4z" />
+    <glyph glyph-name="arrow-circle-up"
+      unicode="&#xF0AA;"
+      horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM151.6 163.1L224 238.6V56C224 42.7 234.7 32 248 32H264C277.3 32 288 42.7 288 56V238.6L360.4 163.1C369.7 153.4 385.2 153.2000000000001 394.7 162.7000000000001L405.6 173.7000000000001C415 183.1 415 198.3000000000001 405.6 207.6000000000001L273 340.3C263.6 349.7 248.4 349.7 239.1 340.3L106.3 207.6C96.9 198.2 96.9 183 106.3 173.7L117.2 162.7C126.8 153.2 142.3 153.4 151.6 163.1z" />
+    <glyph glyph-name="arrow-down"
+      unicode="&#xF063;"
+      horiz-adv-x="448" d=" M413.1 225.5L435.3 203.3C444.7 193.9 444.7 178.7 435.3 169.4L241 -25C231.6 -34.4 216.4 -34.4 207.1 -25L12.7 169.4C3.3 178.8 3.3 194 12.7 203.3L34.9 225.5C44.4 235 59.9 234.8 69.2 225.1L184 104.6V392C184 405.3 194.7 416 208 416H240C253.3 416 264 405.3 264 392V104.6L378.8 225.1C388.1 234.9000000000001 403.6 235.1 413.1 225.5000000000001z" />
+    <glyph glyph-name="arrow-left"
+      unicode="&#xF060;"
+      horiz-adv-x="448" d=" M257.5 2.9L235.3 -19.3C225.9 -28.7 210.7 -28.7 201.4 -19.3L7 175C-2.4 184.4 -2.4 199.6 7 208.9L201.4 403.3C210.8 412.7 226 412.7 235.3 403.3L257.5 381.1C267 371.6 266.8 356.1 257.1 346.8L136.6 232H424C437.3 232 448 221.3 448 208V176C448 162.7 437.3 152 424 152H136.6L257.1 37.2C266.9000000000001 27.9 267.1 12.4 257.5 2.9z" />
+    <glyph glyph-name="arrow-right"
+      unicode="&#xF061;"
+      horiz-adv-x="448" d=" M190.5 381.1L212.7 403.3C222.1 412.7 237.3 412.7 246.6 403.3L441 209C450.4 199.6 450.4 184.4 441 175.1L246.6 -19.3C237.2 -28.7 222 -28.7 212.7 -19.3L190.5 2.9C181 12.4 181.2 27.9 190.9 37.2L311.4 152H24C10.7 152 0 162.7 0 176V208C0 221.3 10.7 232 24 232H311.4L190.9 346.8C181.1 356.1 180.9 371.6 190.5 381.1z" />
+    <glyph glyph-name="arrow-up"
+      unicode="&#xF062;"
+      horiz-adv-x="448" d=" M34.9 158.5L12.7 180.7C3.3 190.1 3.3 205.3 12.7 214.6L207 409C216.4 418.4 231.6 418.4 240.9 409L435.2000000000001 214.7C444.6 205.3 444.6 190.1 435.2000000000001 180.8L413 158.6C403.5 149.1 388 149.3 378.7 159L264 279.4V-8C264 -21.3 253.3 -32 240 -32H208C194.7 -32 184 -21.3 184 -8V279.4L69.2 158.9C59.9 149.1 44.4 148.9 34.9 158.5z" />
+    <glyph glyph-name="arrows-alt-h"
+      unicode="&#xF337;"
+      horiz-adv-x="512" d=" M377.941 278.059V232H134.059V278.059C134.059 299.4410000000001 108.208 310.149 93.088 295.03L7.029 208.971C-2.344 199.598 -2.344 184.403 7.029 175.03L93.088 88.971C108.207 73.852 134.059 84.56 134.059 105.942V152H377.9410000000001V105.941C377.9410000000001 84.559 403.7920000000001 73.851 418.9120000000001 88.97L504.971 175.029C514.344 184.402 514.344 199.597 504.971 208.97L418.9120000000001 295.029C403.793 310.149 377.9410000000001 299.4410000000001 377.9410000000001 278.059z" />
+    <glyph glyph-name="arrows-alt-v"
+      unicode="&#xF338;"
+      horiz-adv-x="256" d=" M214.059 70.059H168V313.9410000000001H214.059C235.441 313.9410000000001 246.149 339.7920000000001 231.03 354.9120000000001L144.971 440.971C135.598 450.344 120.403 450.344 111.03 440.971L24.971 354.9120000000001C9.852 339.793 20.56 313.9410000000001 41.942 313.9410000000001H88V70.059H41.941C20.559 70.059 9.851 44.208 24.97 29.088L111.029 -56.971C120.402 -66.344 135.597 -66.344 144.97 -56.971L231.029 29.088C246.149 44.207 235.441 70.059 214.059 70.059z" />
+    <glyph glyph-name="arrows-alt"
+      unicode="&#xF0B2;"
+      horiz-adv-x="512" d=" M352.201 22.225L273.005 -56.971C263.632 -66.344 248.437 -66.344 239.064 -56.971L159.868 22.225C144.749 37.3440000000001 155.457 63.196 176.839 63.1950000000001H228.001L228 164H127.196V112.838C127.196 91.456 101.345 80.7480000000001 86.225 95.867L7.029 175.063C-2.344 184.436 -2.344 199.632 7.029 209.004L86.225 288.2C101.344 303.319 127.196 292.611 127.196 271.229V220H228V320.804H176.77C155.388 320.804 144.68 346.655 159.799 361.775L238.995 440.971C248.368 450.344 263.563 450.344 272.9360000000001 440.971L352.1320000000001 361.775C367.2510000000001 346.656 356.5430000000001 320.804 335.1610000000001 320.804H283.9990000000001V220H384.8030000000001V271.1620000000001C384.8030000000001 292.544 410.6540000000001 303.252 425.7730000000002 288.1330000000001L504.9690000000002 208.937C514.3420000000002 199.564 514.3420000000002 184.368 504.9690000000002 174.996L425.773 95.8C410.654 80.681 384.802 91.389 384.803 112.771V164H284V63.196H335.23C356.612 63.196 367.3200000000001 37.345 352.201 22.225z" />
+    <glyph glyph-name="assistive-listening-systems"
+      unicode="&#xF2A2;"
+      horiz-adv-x="512" d=" M216 188C216 172.536 203.464 160 188 160S160 172.536 160 188C160 232.112 195.888 268 240 268S320 232.112 320 188C320 172.536 307.464 160 292 160S264 172.536 264 188C264 201.234 253.233 212 240 212S216 201.234 216 188zM240 364C142.953 364 64 285.0470000000001 64 188C64 172.536 76.536 160 92 160S120 172.536 120 188C120 254.168 173.832 308 240 308S360 254.168 360 188C360 112.836 288.991 117.689 288.003 44.378L288 44C288 15.327 264.673 -8 236 -8C220.536 -8 208 -20.536 208 -36S220.536 -64 236 -64C295.475 -64 343.876 -15.672 344 43.774C344.5950000000001 78.202 416 92.014 416 188C416 285.0470000000001 337.0470000000001 364 240 364zM160 128C142.327 128 128 113.673 128 96S142.327 64 160 64S192 78.327 192 96S177.673 128 160 128zM32 0C14.327 0 0 -14.327 0 -32S14.327 -64 32 -64S64 -49.673 64 -32S49.673 0 32 0zM512 187.993C512 189.511 511.988 191.018 511.955 192.524C510.076 307.475 436.157 409.53 327.9940000000001 446.489C313.3610000000001 451.487 297.4450000000001 443.68 292.444 429.0470000000001C287.444 414.414 295.254 398.498 309.886 393.497C395.7920000000001 364.1430000000001 454.496 282.984 455.963 191.544L455.966 191.356C455.992 190.238 455.999 189.12 455.999 187.993C455.999 172.529 468.535 159.993 483.999 159.993S512 172.529 512 187.993zM152.971 8.971L72.971 88.971L39.03 55.03L119.03 -24.97L152.971 8.971z" />
+    <glyph glyph-name="asterisk"
+      unicode="&#xF069;"
+      horiz-adv-x="512" d=" M478.21 113.907L336 192L478.21 270.093C490.0050000000001 276.5700000000001 494.171 291.4770000000001 487.442 303.13L467.962 336.8710000000001C461.234 348.524 446.242 352.37 434.735 345.394L296 261.2820000000001L299.475 423.486C299.763 436.939 288.937 448 275.48 448H236.52C223.064 448 212.237 436.939 212.526 423.486L216 261.2820000000001L77.265 345.3930000000001C65.759 352.3690000000001 50.766 348.523 44.038 336.87L24.558 303.129C17.83 291.476 21.996 276.569 33.791 270.092L176 192L33.79 113.907C21.995 107.43 17.829 92.523 24.558 80.87L44.038 47.129C50.766 35.476 65.759 31.63 77.265 38.606L216 122.718L212.525 -39.486C212.237 -52.939 223.064 -64 236.52 -64H275.481C288.937 -64 299.764 -52.939 299.476 -39.486L296 122.718L434.735 38.607C446.241 31.631 461.234 35.477 467.962 47.1300000000001L487.442 80.871C494.17 92.5240000000001 490.005 107.4300000000001 478.21 113.9070000000001z" />
+    <glyph glyph-name="at"
+      unicode="&#xF1FA;"
+      horiz-adv-x="512" d=" M256 440C118.941 440 8 329.081 8 192C8 54.941 118.919 -56 256 -56C304.154 -56 351.342 -41.86 391.408 -15.777C403.413 -7.962 406.033 8.511 396.9600000000001 19.595L386.783 32.028C379.112 41.399 365.6040000000001 43.695 355.4100000000001 37.157C325.92 18.243 291.314 8 256 8C154.542 8 72 90.542 72 192S154.542 376 256 376C356.139 376 440 318.381 440 216C440 177.214 418.907 136.258 381.83 132.307C364.481 132.761 364.92 145.164 368.354 162.331L391.787 283.4410000000001C394.653 298.25 383.308 312 368.225 312H323.2440000000001A13.518 13.518 0 0 1 309.812 300.007L309.802 299.915C295.105 317.8160000000001 269.3540000000001 321.69 249.831 321.69C175.251 321.69 112 259.456 112 170.23C112 104.927 148.785 64.36 208 64.36C234.9840000000001 64.36 265.3690000000001 79.997 282.9910000000001 102.693C292.5130000000001 68.589 323.6040000000001 68.59 353.701 68.59C462.609 68.59 504 140.202 504 216C504 352.347 394.023 440 256 440zM234.32 135.57C212.071 135.57 198.25 151.193 198.25 176.341C198.25 221.334 229.029 249.07 256.88 249.07C279.1720000000001 249.07 292.481 233.829 292.481 208.3C292.481 163.239 258.606 135.57 234.32 135.57z" />
+    <glyph glyph-name="audio-description"
+      unicode="&#xF29E;"
+      horiz-adv-x="512" d=" M162.925 209.291L171.747 178.636H146.141L155.182 209.288C156.459 213.709 157.833 219.282 159.054 224.533C160.274 219.282 161.648 213.71 162.9250000000001 209.291zM329.399 241.39H314.876V142.609H329.399C359.175 142.609 375.574 160.287 375.574 192.385C375.574 224.624 358.084 241.39 329.399 241.39zM512 336V48C512 21.49 490.51 0 464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336zM245.459 111.861L188.362 279.861A12.001000000000001 12.001000000000001 0 0 1 177 288H141.106A12.001000000000001 12.001000000000001 0 0 1 129.744 279.861L72.647 111.861C70.003 104.078 75.789 96 84.009 96H113.142A12 12 0 0 1 124.677 104.693L133.251 134.599H184.618L193.411 104.622A12 12 0 0 1 204.926 96H234.098C242.318 96 248.104 104.078 245.459 111.861zM430.16 192.386C430.16 251.363 392.241 288 331.2 288H273.834C267.207 288 261.834 282.627 261.834 276V108C261.834 101.373 267.207 96 273.834 96H331.2C392.241 96 430.16 132.933 430.16 192.386z" />
+    <glyph glyph-name="backward"
+      unicode="&#xF04A;"
+      horiz-adv-x="512" d=" M11.5 167.4L203.5 7.4C224.1 -9.8 256 4.6 256 32V352C256 379.4 224.1 393.8 203.5 376.6L11.5 216.6C-3.8 203.8 -3.8 180.2 11.5 167.4zM267.5 167.4L459.5 7.4C480.1 -9.8 512 4.6 512 32V352C512 379.4 480.1 393.8 459.5 376.6L267.5 216.6C252.2 203.8 252.2 180.2 267.5 167.4z" />
+    <glyph glyph-name="balance-scale"
+      unicode="&#xF24E;"
+      horiz-adv-x="640" d=" M352 0H520C533.255 0 544 -10.745 544 -24V-40C544 -53.255 533.255 -64 520 -64H120C106.745 -64 96 -53.255 96 -40V-24C96 -10.745 106.745 0 120 0H288V294.676C264.469 304.9600000000001 246.836 326.222 241.603 352H120C106.745 352 96 362.745 96 376V392C96 405.255 106.745 416 120 416H255.999C270.594 435.43 293.828 448 320 448S369.406 435.43 384.001 416H520C533.255 416 544 405.255 544 392V376C544 362.745 533.255 352 520 352H398.397C393.164 326.222 375.531 304.9600000000001 352 294.676V0zM639.981 112C639.982 128.182 641.323 120.726 554.933 293.506C537.286 328.8 486.747 328.8640000000001 469.068 293.506C381.94 119.25 384.019 127.669 384.019 112H384C384 67.817 441.308 32 512 32S640 67.817 640 112H639.981zM512 272L584 128H440L512 272zM255.981 112C255.982 128.182 257.323 120.726 170.933 293.506C153.286 328.8 102.747 328.8640000000001 85.068 293.506C-2.06 119.25 0.019 127.669 0.019 112H0C0 67.817 57.308 32 128 32S256 67.817 256 112H255.981zM128 272L200 128H56L128 272z" />
+    <glyph glyph-name="ban"
+      unicode="&#xF05E;"
+      horiz-adv-x="512" d=" M256 440C119.034 440 8 328.967 8 192S119.034 -56 256 -56S504 55.034 504 192S392.967 440 256 440zM386.108 322.108C451.556 256.6600000000001 456.108 156.627 406.7850000000001 86.471L150.47 342.784C220.674 392.14 320.6960000000001 387.519 386.108 322.108zM125.892 61.892C60.444 127.34 55.892 227.373 105.215 297.529L361.53 41.216C291.327 -8.14 191.304 -3.52 125.892 61.892z" />
+    <glyph glyph-name="band-aid"
+      unicode="&#xF462;"
+      horiz-adv-x="640" d=" M0 288V96C0 60.7 28.7 32 64 32H160V352H64C28.7 352 0 323.3 0 288zM576 352H480V32H576C611.3 32 640 60.7 640 96V288C640 323.3 611.3 352 576 352zM192 32H448V352H192V32zM368 264C381.3 264 392 253.3 392 240S381.3 216 368 216S344 226.7 344 240S354.7 264 368 264zM368 168C381.3 168 392 157.3 392 144S381.3 120 368 120S344 130.7 344 144S354.7 168 368 168zM272 264C285.3 264 296 253.3 296 240S285.3 216 272 216S248 226.7 248 240S258.7 264 272 264zM272 168C285.3 168 296 157.3 296 144S285.3 120 272 120S248 130.7 248 144S258.7 168 272 168z" />
+    <glyph glyph-name="barcode"
+      unicode="&#xF02A;"
+      horiz-adv-x="512" d=" M0 0V384H18V0H0zM26.857 0.273V384H36V0.273H26.857zM54 0.273V384H62.857V0.273H54zM98.857 0.273V384H107.714V0.273H98.857zM134.857 0.273V384H152.571V0.273H134.857zM179.714 0.273V384H188.571V0.273H179.714zM197.714 0.273V384H206.571V0.273H197.714zM215.714 0.273V384H224.571V0.273H215.714zM251.429 0.273V384H269.429V0.273H251.429zM296.286 0.273V384H314.286V0.273H296.286zM332.2850000000001 0.273V384H350.286V0.273H332.2850000000001zM368.286 0.273V384H386.287V0.273H368.286zM395.1430000000001 0.273V384H413.1430000000001V0.273H395.1430000000001zM440.2860000000001 0.273V384H467.143V0.273H440.2860000000001zM476.0000000000001 0.273V384H485.143V0.273H476zM494.0000000000001 0V384H512V0H494z" />
+    <glyph glyph-name="bars"
+      unicode="&#xF0C9;"
+      horiz-adv-x="448" d=" M16 316H432C440.837 316 448 323.163 448 332V372C448 380.837 440.837 388 432 388H16C7.163 388 0 380.837 0 372V332C0 323.163 7.163 316 16 316zM16 156H432C440.837 156 448 163.163 448 172V212C448 220.837 440.837 228 432 228H16C7.163 228 0 220.837 0 212V172C0 163.163 7.163 156 16 156zM16 -4H432C440.837 -4 448 3.163 448 12V52C448 60.837 440.837 68 432 68H16C7.163 68 0 60.837 0 52V12C0 3.163 7.163 -4 16 -4z" />
+    <glyph glyph-name="baseball-ball"
+      unicode="&#xF433;"
+      horiz-adv-x="496" d=" M368.5 84.1L397.3 98C408.4000000000001 75.1 423.3 54.8 441.4000000000001 37.1C475.4 79.6 495.9 133.4 495.9 192C495.9 250.5000000000001 475.5000000000001 304.2000000000001 441.7000000000001 346.6C423.9000000000001 329.3 409.1 309.5 398.1 287.1L369.4000000000001 301.2000000000001C382.2000000000001 327.2000000000001 399.4000000000001 350.2000000000001 420.2000000000001 370.2000000000001C375.6 413.3 315 440 248 440C181.1 440 120.5 413.4 75.9 370.3C96.6 350.4 113.8 327.4 126.6 301.5L97.9 287.4C86.9 309.7000000000001 72.2 329.5 54.4 346.8C20.4 304.3 0 250.6 0 192C0 133.4 20.4 79.7 54.4 37.3C72.6 55 87.6 75.3 98.7 98.3L127.5 84.4C114.6 57.7000000000001 97.2 34.1 76 13.7C120.5 -29.4 181.1 -55.9999999999999 248 -55.9999999999999C314.8 -55.9999999999999 375.3 -29.4999999999999 419.9 13.5000000000001C398.8 33.9 381.4 57.4 368.5 84.1zM140.2 116.1L109.7 125.9C124.6 172.3 122.4 219.7000000000001 109.1 259.9000000000001L139.5 269.9000000000001C154.5 224.3000000000001 157.5 170 140.2 116.1zM356.5 269.5L386.9 259.5C373.7 219.4 371.4 172 386.3 125.5L355.8 115.7C338.5 169.7 341.5 224 356.5 269.5z" />
+    <glyph glyph-name="basketball-ball"
+      unicode="&#xF434;"
+      horiz-adv-x="496" d=" M212.3 437.7C168.5 431.4 126.1 413.6 90.1 383.9L167.5 306.5C195.3 342.3 210.8 387.7 212.3 437.7zM248 226L405.9 383.9C363.5 418.9 312.3 437.4 260.4 440C259.2 376.1 238.9 317.7000000000001 201.7 272.3L248 226zM56.1 349.9C26.4 313.9 8.6 271.5 2.3 227.7C52.3 229.2 97.8 244.7 133.5 272.5L56.1 349.9zM328.3 145.7000000000001C373.6 182.8000000000001 432 203.1000000000001 496 204.4C493.4 256.3000000000001 474.9 307.5 439.9 349.9000000000001L282 192L328.3 145.7zM248 158L90.1 0.1C132.5 -34.8 183.7 -53.4 235.6 -56C236.9 8 257.2 66.4 294.3 111.7L248 158zM439.9 34.1C469.6 70.1 487.4 112.5 493.7 156.3C443.6 154.7 398.2 139.2 362.5 111.5L439.9 34.1zM167.7 238.3C122.3 201.1 63.9 180.7 0 179.6C2.6 127.7000000000001 21.1 76.5 56.1 34.1L214 192L167.7 238.3zM283.7 -53.7C327.5 -47.4 369.9 -29.6 405.9 0.1L328.5 77.5C300.8 41.8 285.3 -3.7 283.7 -53.7z" />
+    <glyph glyph-name="bath"
+      unicode="&#xF2CD;"
+      horiz-adv-x="512" d=" M488 192H80V336C80 353.645 94.355 368 112 368C123.351 368 133.332 362.055 139.015 353.12C122.523 327.913 124.328 293.544 145.853 270.0850000000001C141.677 265.372 141.832 258.169 146.344 253.657L157.658 242.343C162.344 237.657 169.942 237.657 174.629 242.343L269.659 337.372C274.345 342.058 274.345 349.656 269.659 354.343L258.345 365.6570000000001C253.833 370.169 246.63 370.323 241.917 366.148C223.968 382.617 199.623 387.577 177.739 381.5130000000001C163.281 402.333 139.212 416 112 416C67.888 416 32 380.112 32 336V192H24C10.745 192 0 181.255 0 168V152C0 138.745 10.745 128 24 128H32V96C32 67.57 44.362 42.031 64 24.453V-8C64 -21.255 74.745 -32 88 -32H104C117.255 -32 128 -21.255 128 -8V0H384V-8C384 -21.255 394.745 -32 408 -32H424C437.255 -32 448 -21.255 448 -8V24.453C467.638 42.031 480 67.57 480 96V128H488C501.255 128 512 138.745 512 152V168C512 181.255 501.255 192 488 192z" />
+    <glyph glyph-name="battery-empty"
+      unicode="&#xF244;"
+      horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352z" />
+    <glyph glyph-name="battery-full"
+      unicode="&#xF240;"
+      horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM512 256H96V128H512V256z" />
+    <glyph glyph-name="battery-half"
+      unicode="&#xF242;"
+      horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM320 256H96V128H320V256z" />
+    <glyph glyph-name="battery-quarter"
+      unicode="&#xF243;"
+      horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM224 256H96V128H224V256z" />
+    <glyph glyph-name="battery-three-quarters"
+      unicode="&#xF241;"
+      horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM416 256H96V128H416V256z" />
+    <glyph glyph-name="bed"
+      unicode="&#xF236;"
+      horiz-adv-x="576" d=" M552 160C565.255 160 576 149.255 576 136V0H480V64H96V0H0V360C0 373.255 10.745 384 24 384H72C85.255 384 96 373.255 96 360V160H552zM192 352C147.817 352 112 316.183 112 272S147.817 192 192 192S272 227.817 272 272S236.183 352 192 352zM576 224C576 277.019 533.019 320 480 320H312C298.745 320 288 309.255 288 296V192H576V224z" />
+    <glyph glyph-name="beer"
+      unicode="&#xF0FC;"
+      horiz-adv-x="448" d=" M368 352H320V392C320 405.255 309.255 416 296 416H24C10.745 416 0 405.255 0 392V-8C0 -21.255 10.745 -32 24 -32H296C309.255 -32 320 -21.255 320 -8V34.11L400.606 70.087C429.396 82.937 448 111.612 448 143.14V272C448 316.112 412.112 352 368 352zM384 143.14A16.018 16.018 0 0 0 374.521 128.529L320 104.195V288H368C376.822 288 384 280.822 384 272V143.14zM208 64C199.164 64 192 71.164 192 80V304C192 312.836 199.164 320 208 320S224 312.836 224 304V80C224 71.164 216.836 64 208 64zM112 64C103.164 64 96 71.164 96 80V304C96 312.836 103.164 320 112 320S128 312.836 128 304V80C128 71.164 120.836 64 112 64z" />
+    <glyph glyph-name="bell-slash"
+      unicode="&#xF1F6;"
+      horiz-adv-x="576" d=" M78.107 81.941C47.958 51.792 69.325 0 112.048 0H224C224 -35.346 252.654 -64 288 -64C323.346 -64 352 -35.346 352 0H384.685L127.848 226.621C125.65 129.543 99.409 103.243 78.107 81.941zM264 0C264 -13.234 274.766 -24 288 -24A8 8 0 0 0 288 -40C265.944 -40 248 -22.056 248 0H264zM569.896 -43.733L559.134 -55.819C550.219 -65.831 534.801 -66.7860000000001 524.697 -57.952L8.256 393.607C-1.848 402.442 -2.811 417.7200000000001 6.104 427.733L16.865 439.819C25.781 449.831 41.199 450.786 51.303 441.951L165.113 342.439C189.13 371.217 223.059 391.435 261.663 397.829A31.85 31.85 0 0 0 256 416C256 433.673 270.327 448 288 448S320 433.673 320 416C320 409.25 317.905 402.992 314.337 397.83C390.169 385.269 448 319.394 448 240C448 131.882 475.634 104.191 497.884 81.941C510.033 69.792 513.807 54.165 511.214 39.8200000000001L567.744 -9.607C577.8480000000001 -18.4419999999999 578.811 -33.72 569.8960000000001 -43.7329999999999z" />
+    <glyph glyph-name="bell"
+      unicode="&#xF0F3;"
+      horiz-adv-x="448" d=" M433.884 81.941C411.634 104.191 384 131.882 384 240C384 319.394 326.169 385.269 250.337 397.8300000000001A31.845000000000002 31.845000000000002 0 0 1 256 416C256 433.673 241.673 448 224 448S192 433.673 192 416C192 409.25 194.095 402.992 197.663 397.83C121.831 385.269 64 319.394 64 240C64 131.882 36.357 104.191 14.107 81.941C-16.042 51.792 5.325 0 48.048 0H160C160 -35.346 188.654 -64 224 -64S288 -35.346 288 0H399.943C442.581 0 464.094 51.731 433.884 81.941zM224 -24A8 8 0 0 0 224 -40C201.944 -40 184 -22.056 184 0H200C200 -13.234 210.766 -24 224 -24z" />
+    <glyph glyph-name="bicycle"
+      unicode="&#xF206;"
+      horiz-adv-x="640" d=" M512.509 255.999C496.136 256.063 480.479 253.044 466.073 247.504L388.3930000000001 372.657A24 24 0 0 1 368.001 384H304.001C295.164 384 288.001 376.837 288.001 368V352C288.001 343.163 295.164 336 304.001 336H354.65L369.546 312H256.002V328C256.002 336.837 248.839 344 240.002 344H152.543C139.102 344 127.766 333.001 128.007 319.563C128.239 306.519 138.883 296 152.002 296H200.728L171.311 248.48C157.878 253.31 143.407 255.963 128.319 256C58.094 256.17 0.412 198.988 0.002 128.764C-0.413 57.721 57.055 0 128.002 0C187.644 0 237.76 40.793 251.969 96H304.002A24 24 0 0 1 324.408 107.367L410.37 246.23L425.308 222.163C399.853 198.715 383.923 165.082 384.001 127.726C384.146 58.893 441.9 0.675 510.73 0.007C581.336 -0.678 638.911 55.81 639.9849999999999 126.003C641.0709999999999 196.944 583.459 255.723 512.5089999999999 255.999zM186.75 182.228C196.477 171.699 203.423 158.567 206.392 144H163.086L186.75 182.228zM128.002 48C83.89 48 48.002 83.888 48.002 128S83.89 208 128.002 208C133.871 208 139.588 207.347 145.101 206.141L99.596 132.632C89.715 116.673 101.213 96 120.002 96H201.302C188.932 67.775 160.74 48 128.002 48zM290.632 144H255.008C251.048 175.756 235.452 203.894 212.625 224.026L237.371 264H364.918L290.632 144zM507.689 48.114C466.653 50.2790000000001 433.64 83.806 432.062 124.869C431.25 145.99 438.695 165.3870000000001 451.3969999999999 180.132L495.8299999999999 108.546C500.49 101.038 510.3539999999999 98.73 517.862 103.39L531.456 111.827C538.964 116.487 541.273 126.351 536.612 133.859L492.1439999999999 205.502A79.901 79.901 0 0 0 512.002 207.999C556.1139999999999 207.999 592.002 172.111 592.002 127.999C592.001 82.459 553.75 45.683 507.689 48.114z" />
+    <glyph glyph-name="binoculars"
+      unicode="&#xF1E5;"
+      horiz-adv-x="512" d=" M192 344H96V392C96 405.255 106.745 416 120 416H168C181.255 416 192 405.255 192 392V344zM416 392C416 405.255 405.255 416 392 416H344C330.745 416 320 405.255 320 392V344H416V392zM0 -8C0 -21.255 10.745 -32 24 -32H144C157.255 -32 168 -21.255 168 -8V8H0V-8zM88 320C74.745 320 64 309.255 64 296C64 192 0 176 0 32H168V136C168 149.255 178.745 160 192 160V320H88zM344 -8C344 -21.255 354.745 -32 368 -32H488C501.255 -32 512 -21.255 512 -8V8H344V-8zM216 320V160H296V320H216zM344 32H512C512 176 448 192 448 296C448 309.255 437.255 320 424 320H320V160C333.255 160 344 149.255 344 136V32z" />
+    <glyph glyph-name="birthday-cake"
+      unicode="&#xF1FD;"
+      horiz-adv-x="448" d=" M448 64C419.98 64 416.74 96 373.5 96C330.07 96 326.675 64 298.75 64C271.055 64 267.296 96 224 96C181.158 96 176.782 64 149.5 64C121.352 64 118.298 96 74.75 96C31.203 96 28.097 64 0 64V144C0 170.5 21.5 192 48 192H64V336H128V192H192V336H256V192H320V336H384V192H400C426.5 192 448 170.5 448 144V64zM448 -64H0V32C43.356 32 46.767 64 74.75 64C102.701 64 106.003 32 149.5 32C192.343 32 196.717 64 224 64C252.148 64 255.201 32 298.75 32C342.107 32 345.517 64 373.5 64C400.988 64 404.752 32 448 32V-64zM96 352C78.25 352 64 366.25 64 384C64 415 96 407 96 448C108 448 128 418.5 128 392S113.75 352 96 352zM224 352C206.25 352 192 366.25 192 384C192 415 224 407 224 448C236 448 256 418.5 256 392S241.75 352 224 352zM352 352C334.25 352 320 366.25 320 384C320 415 352 407 352 448C364 448 384 418.5 384 392S369.75 352 352 352z" />
+    <glyph glyph-name="blind"
+      unicode="&#xF29D;"
+      horiz-adv-x="384" d=" M380.15 -62.837A8 8 0 0 0 369.161 -60.15L243.831 146.2770000000001A31.923 31.923 0 0 1 256.7890000000001 155.7620000000001L382.8370000000001 -51.8459999999999A8 8 0 0 0 380.1500000000001 -62.8369999999999zM142.803 133.662L110.263 44.177L146.383 -44.1080000000001C153.076 -60.4680000000001 171.76 -68.3000000000001 188.116 -61.609C204.473 -54.917 212.309 -36.2330000000001 205.617 -19.8750000000001L142.803 133.6619999999999zM96 360C120.301 360 140 379.699 140 404S120.301 448 96 448S52 428.301 52 404S71.699 360 96 360zM250.837 190.872L130.837 342.872C126.104 348.867 119.087 351.98 112 351.9840000000001V352H80V351.974C72.854 351.971 65.783 348.813 61.056 342.7340000000001L0 264.2340000000001V168.54C0 155.085 11.011 143.749 24.464 144.004C37.505 144.252 48 154.9 48 168V247.766L64 268.337V127.639L9.927 -21.055C3.887 -37.664 12.455 -56.024 29.065 -62.064C45.667 -68.1030000000001 64.033 -59.54 70.074 -42.926L136 138.362V245.559L104.594 285.375A4 4 0 1 0 110.863 290.346L213.163 161.129C222.308 149.545 237.531 149.79 246.871 157.1640000000001C257.281 165.3800000000001 259.0300000000001 180.4980000000001 250.837 190.8720000000001z" />
+    <glyph glyph-name="bold"
+      unicode="&#xF032;"
+      horiz-adv-x="384" d=" M304.793 204.109C338.432 222.646 358.45 258.269 358.45 299.802C358.45 348.038 332.2 387.428 289.824 403.981C265.138 413.99 240.849 416 209.661 416H24C15.163 416 8 408.837 8 400V366.951C8 358.114 15.163 350.951 24 350.951H57.113V32.4210000000001H24C15.163 32.4210000000001 8 25.258 8 16.4210000000001V-16C8 -24.837 15.163 -32 24 -32H219.69C243.893 -32 264.524 -30.711 286.556 -24.416C337.52 -9.193 376 37.353 376 97.986C376 150.154 349.427 189.67 304.793 204.109zM142.217 347.1910000000001H209.661C225.955 347.1910000000001 237.197 345.1720000000001 247.186 340.474C263.014 331.995 272.092 313.972 272.092 291.028C272.092 255.999 251.772 234.2380000000001 219.063 234.2380000000001H142.217V347.1910000000001zM254.859 41.716C244.719 37.66 232.182 36.809 223.45 36.809H142.217V166.057H226.584C266.229 166.057 289.641 140.677 289.641 103C289.642 74.575 275.981 50.517 254.8590000000001 41.716z" />
+    <glyph glyph-name="bolt"
+      unicode="&#xF0E7;"
+      horiz-adv-x="320" d=" M295.973 288H180.572L215.19 417.816C219.25 433.044 207.756 448 192 448H56C43.971 448 33.8 439.0950000000001 32.211 427.1720000000001L0.215 187.172C-1.704 172.783 9.504 160 24.004 160H142.705L96.646 -34.466C93.05 -49.649 104.659 -64 119.992 -64C128.342 -64 136.368 -59.626 140.77 -52.022L316.7430000000001 251.975C325.9870000000001 267.942 314.4550000000001 288 295.9730000000001 288z" />
+    <glyph glyph-name="bomb"
+      unicode="&#xF1E2;"
+      horiz-adv-x="512" d=" M440.5 359.5L388.5 307.5L415 281C424.4 271.6 424.4 256.4 415 247.1L397.6 229.7C409.4000000000001 203.6 416 174.6 416 144.1C416 29.2 322.9 -63.9 208 -63.9S0 29.1 0 144S93.1 352 208 352C238.5 352 267.5 345.4 293.6 333.6L311 351C320.4 360.4 335.6 360.4 344.9 351L371.4 324.5L423.4 376.5L440.5 359.5zM500 388H476C469.4 388 464 382.6 464 376S469.4 364 476 364H500C506.6 364 512 369.4 512 376S506.6 388 500 388zM440 448C433.4 448 428 442.6 428 436V412C428 405.4 433.4 400 440 400S452 405.4 452 412V436C452 442.6 446.6 448 440 448zM473.9 393L490.9 410C495.6 414.7 495.6 422.3 490.9 427C486.2 431.7 478.6 431.7 473.9 427L456.9 410C452.2 405.3 452.2 397.7 456.9 393C461.7 388.3 469.3 388.3 473.9 393zM406.1 393C410.8 388.3 418.4 388.3 423.1 393C427.8 397.7 427.8 405.3 423.1 410L406.1 427C401.4 431.7 393.8 431.7 389.1 427C384.4 422.3 384.4 414.7 389.1 410L406.1 393zM473.9 359C469.2 363.7 461.6 363.7 456.9 359C452.2 354.3 452.2 346.7 456.9 342L473.9 325C478.6 320.3 486.2 320.3 490.9 325C495.6 329.7 495.6 337.3 490.9 342L473.9 359zM112 176C112 211.3 140.7 240 176 240C184.8 240 192 247.2 192 256S184.8 272 176 272C123.1 272 80 228.9 80 176C80 167.2 87.2 160 96 160S112 167.2 112 176z" />
+    <glyph glyph-name="book"
+      unicode="&#xF02D;"
+      horiz-adv-x="448" d=" M448 88V424C448 437.3 437.3 448 424 448H96C43 448 0 405 0 352V32C0 -21 43 -64 96 -64H424C437.3 -64 448 -53.3 448 -40V-24C448 -16.5 444.5 -9.7 439.1 -5.3C434.9000000000001 10.1 434.9000000000001 54 439.1 69.4C444.5 73.7 448 80.5 448 88zM128 314C128 317.3 130.7 320 134 320H346C349.3 320 352 317.3 352 314V294C352 290.7 349.3 288 346 288H134C130.7 288 128 290.7 128 294V314zM128 250C128 253.3 130.7 256 134 256H346C349.3 256 352 253.3 352 250V230C352 226.7 349.3 224 346 224H134C130.7 224 128 226.7 128 230V250zM381.4 0H96C78.3 0 64 14.3 64 32C64 49.6 78.4 64 96 64H381.4C379.5 46.9 379.5 17.1 381.4 0z" />
+    <glyph glyph-name="bookmark"
+      unicode="&#xF02E;"
+      horiz-adv-x="384" d=" M0 -64V400C0 426.51 21.49 448 48 448H336C362.51 448 384 426.51 384 400V-64L192 48L0 -64z" />
+    <glyph glyph-name="bowling-ball"
+      unicode="&#xF436;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM120 256C102.3 256 88 270.3 88 288S102.3 320 120 320S152 305.7 152 288S137.7 256 120 256zM184 352C184 369.7 198.3 384 216 384S248 369.7 248 352S233.7 320 216 320S184 334.3 184 352zM232 208C214.3 208 200 222.3 200 240S214.3 272 232 272S264 257.7 264 240S249.7 208 232 208z" />
+    <glyph glyph-name="box-open"
+      unicode="&#xF49E;"
+      horiz-adv-x="640" d=" M53.2 407L1.7 304.2C-2.9 295 2 284 11.8 281.2L209.7 224.7C216.8 222.7 224.4 225.7 228.2 232L320 384L69.8 415.9C62.9 416.7 56.3 413.2 53.2 407zM638.3000000000001 304.2L586.8 407C583.6999999999999 413.2 577 416.8 570.0999999999999 415.9L320 384L411.7 231.9C415.5 225.6 423.1 222.6 430.2 224.6L628.1 281.1C638 284 642.8000000000001 295 638.3000000000001 304.2zM425.7 192C408.8 192 392.9 201 384.3 215.4L320 322L255.8 215.4C247.1 200.9 231.2 191.9 214.3 191.9C209.8 191.9 205.3 192.5 201 193.8L64 233V55C64 40.3 74 27.5 88.2 24L304.4 -30.1C314.6 -32.6 325.3 -32.6 335.4 -30.1L551.8 24C566 27.6 576 40.4 576 55V233L439 193.9C434.7 192.6 430.2 192 425.7 192z" />
+    <glyph glyph-name="box"
+      unicode="&#xF466;"
+      horiz-adv-x="512" d=" M509.5 263.4L458.9 415.2C452.4 434.8 434.1 448 413.4 448H272V256H510.7C510.3 258.5 510.3 261 509.5 263.4zM240 448H98.6C77.9 448 59.6 434.8 53.1 415.2L2.5 263.4C1.7 261 1.7 258.5 1.3 256H240V448zM0 224V-16C0 -42.5 21.5 -64 48 -64H464C490.5 -64 512 -42.5 512 -16V224H0z" />
+    <glyph glyph-name="boxes"
+      unicode="&#xF468;"
+      horiz-adv-x="576" d=" M560 160H480V64L448 85.3L416 64V160H336C327.2 160 320 152.8 320 144V-48C320 -56.8 327.2 -64 336 -64H560C568.8 -64 576 -56.8 576 -48V144C576 152.8 568.8 160 560 160zM176 224H400C408.8 224 416 231.2 416 240V432C416 440.8 408.8 448 400 448H320V352L288 373.3L256 352V448H176C167.2 448 160 440.8 160 432V240C160 231.2 167.2 224 176 224zM240 160H160V64L128 85.3L96 64V160H16C7.2 160 0 152.8 0 144V-48C0 -56.8 7.2 -64 16 -64H240C248.8 -64 256 -56.8 256 -48V144C256 152.8 248.8 160 240 160z" />
+    <glyph glyph-name="braille"
+      unicode="&#xF2A1;"
+      horiz-adv-x="640" d=" M128 192C128 156.654 99.346 128 64 128S0 156.654 0 192S28.654 256 64 256S128 227.346 128 192zM64 64C46.327 64 32 49.673 32 32S46.327 0 64 0S96 14.327 96 32S81.673 64 64 64zM64 416C28.654 416 0 387.346 0 352S28.654 288 64 288S128 316.654 128 352S99.346 416 64 416zM224 224C206.327 224 192 209.673 192 192S206.327 160 224 160S256 174.327 256 192S241.673 224 224 224zM224 64C206.327 64 192 49.673 192 32S206.327 0 224 0S256 14.327 256 32S241.673 64 224 64zM224 416C188.654 416 160 387.346 160 352S188.654 288 224 288S288 316.654 288 352S259.346 416 224 416zM448 224C430.327 224 416 209.673 416 192S430.327 160 448 160S480 174.327 480 192S465.673 224 448 224zM448 64C430.327 64 416 49.673 416 32S430.327 0 448 0S480 14.327 480 32S465.673 64 448 64zM448 416C412.654 416 384 387.346 384 352S412.654 288 448 288S512 316.654 512 352S483.346 416 448 416zM608 224C590.327 224 576 209.673 576 192S590.327 160 608 160S640 174.327 640 192S625.673 224 608 224zM608 64C590.327 64 576 49.673 576 32S590.327 0 608 0S640 14.327 640 32S625.673 64 608 64zM608 384C590.327 384 576 369.673 576 352S590.327 320 608 320S640 334.327 640 352S625.673 384 608 384z" />
+    <glyph glyph-name="briefcase-medical"
+      unicode="&#xF469;"
+      horiz-adv-x="512" d=" M464 320H384V368C384 394.5 362.5 416 336 416H176C149.5 416 128 394.5 128 368V320H48C21.5 320 0 298.5 0 272V-16C0 -42.5 21.5 -64 48 -64H464C490.5 -64 512 -42.5 512 -16V272C512 298.5 490.5 320 464 320zM192 352H320V320H192V352zM352 104C352 99.6 348.4 96 344 96H288V40C288 35.6 284.4 32 280 32H232C227.6 32 224 35.6 224 40V96H168C163.6 96 160 99.6 160 104V152C160 156.4 163.6 160 168 160H224V216C224 220.4 227.6 224 232 224H280C284.4 224 288 220.4 288 216V160H344C348.4 160 352 156.4 352 152V104z" />
+    <glyph glyph-name="briefcase"
+      unicode="&#xF0B1;"
+      horiz-adv-x="512" d=" M320 160H512V16C512 -10.51 490.51 -32 464 -32H48C21.49 -32 0 -10.51 0 16V160H192V140C192 133.373 197.373 128 204 128H308C314.627 128 320 133.373 320 140V160zM512 272V192H0V272C0 298.51 21.49 320 48 320H128V368C128 394.51 149.49 416 176 416H336C362.51 416 384 394.51 384 368V320H464C490.51 320 512 298.51 512 272zM320 352H192V320H320V352z" />
+    <glyph glyph-name="bug"
+      unicode="&#xF188;"
+      horiz-adv-x="512" d=" M511.988 159.1C511.51 141.67 496.771 128 479.335 128H424V112C424 90.136 419.118 69.416 410.4 50.855L470.628 -9.373C483.124 -21.87 483.124 -42.131 470.628 -54.628C458.13 -67.125 437.869 -67.124 425.372 -54.628L370.636 0.108C345.886 -19.965 314.351 -32 280 -32V212C280 218.627 274.627 224 268 224H244C237.373 224 232 218.627 232 212V-32C197.649 -32 166.114 -19.965 141.364 0.108L86.628 -54.628C74.13 -67.125 53.869 -67.124 41.372 -54.628C28.876 -42.131 28.876 -21.87 41.372 -9.373L101.6 50.855C92.882 69.416 88 90.136 88 112V128H32.666C15.23 128 0.491 141.67 0.013 159.1C-0.484 177.184 14.028 192 32 192H88V250.745L41.372 297.373C28.876 309.87 28.876 330.131 41.372 342.628C53.87 355.125 74.13 355.125 86.628 342.628L141.255 288H370.7440000000001L425.3710000000001 342.627C437.8690000000001 355.124 458.129 355.124 470.6270000000001 342.627C483.123 330.13 483.123 309.8690000000001 470.6270000000001 297.372L424 250.745V192H480C497.972 192 512.484 177.184 511.988 159.1zM257 448C195.144 448 145 397.856 145 336H369C369 397.856 318.856 448 257 448z" />
+    <glyph glyph-name="building"
+      unicode="&#xF1AD;"
+      horiz-adv-x="448" d=" M436 -32H416V424C416 437.255 405.255 448 392 448H56C42.745 448 32 437.255 32 424V-32H12C5.373 -32 0 -37.373 0 -44V-64H448V-44C448 -37.373 442.627 -32 436 -32zM128 372C128 378.627 133.373 384 140 384H180C186.627 384 192 378.627 192 372V332C192 325.373 186.627 320 180 320H140C133.373 320 128 325.373 128 332V372zM128 276C128 282.627 133.373 288 140 288H180C186.627 288 192 282.627 192 276V236C192 229.373 186.627 224 180 224H140C133.373 224 128 229.373 128 236V276zM180 128H140C133.373 128 128 133.373 128 140V180C128 186.627 133.373 192 140 192H180C186.627 192 192 186.627 192 180V140C192 133.373 186.627 128 180 128zM256 -32H192V52C192 58.627 197.373 64 204 64H244C250.627 64 256 58.627 256 52V-32zM320 140C320 133.373 314.627 128 308 128H268C261.373 128 256 133.373 256 140V180C256 186.627 261.373 192 268 192H308C314.627 192 320 186.627 320 180V140zM320 236C320 229.373 314.627 224 308 224H268C261.373 224 256 229.373 256 236V276C256 282.627 261.373 288 268 288H308C314.627 288 320 282.627 320 276V236zM320 332C320 325.373 314.627 320 308 320H268C261.373 320 256 325.373 256 332V372C256 378.627 261.373 384 268 384H308C314.627 384 320 378.627 320 372V332z" />
+    <glyph glyph-name="bullhorn"
+      unicode="&#xF0A1;"
+      horiz-adv-x="576" d=" M576 224C576 244.896 562.64 262.666 544 269.2580000000001V384C544 419.346 515.346 448 480 448C415.015 392 337.969 320 208 320H48C21.49 320 0 298.51 0 272V176C0 149.49 21.49 128 48 128H91.263C72.521 63.35 93.742 11.621 110.077 -39.44C111.779 -44.76 115.28 -49.333 119.999 -52.32C140.779 -65.475 188.354 -67.977 213.772 -57.471C229.818 -50.838 233.732 -30.048 221.294 -17.934C202.786 0.092 191.158 18.976 201.499 42.924A12.278 12.278 0 0 1 200.454 54.597C184.145 79.276 196.873 116.704 228.971 127.349C346.403 120.113 418.591 52.919 480 0C515.346 0 544 28.654 544 64V178.742C562.64 185.334 576 203.104 576 224zM480 84.145C425.391 129.124 354.967 177.085 256 189.127V258.874C354.967 270.916 425.391 318.876 480 363.856V84.145z" />
+    <glyph glyph-name="bullseye"
+      unicode="&#xF140;"
+      horiz-adv-x="512" d=" M256 376C357.689 376 440 293.705 440 192C440 90.311 357.705 8 256 8C154.311 8 72 90.295 72 192C72 293.689 154.295 376 256 376M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 256C291.29 256 320 227.29 320 192S291.29 128 256 128S192 156.71 192 192S220.71 256 256 256M256 320C185.308 320 128 262.692 128 192S185.308 64 256 64S384 121.308 384 192S326.692 320 256 320z" />
+    <glyph glyph-name="burn"
+      unicode="&#xF46A;"
+      horiz-adv-x="384" d=" M192 448C79.7 346.7 0 227.1 0 147.5C0 23 79 -64 192 -64S384 23 384 147.5C384 227.4 303.8 347.1 192 448zM192 0C135.5 0 96 39 96 94.8C96 108.3 100.6 156.3 192 256C283.4 156.3 288 108.3 288 94.8C288 39 248.5 0 192 0z" />
+    <glyph glyph-name="bus"
+      unicode="&#xF207;"
+      horiz-adv-x="512" d=" M512 296V216C512 202.745 501.255 192 488 192H480V24C480 10.745 469.255 0 456 0H448V-40C448 -53.255 437.255 -64 424 -64H376C362.745 -64 352 -53.255 352 -40V0H160V-40C160 -53.255 149.255 -64 136 -64H88C74.745 -64 64 -53.255 64 -40V0H56C42.745 0 32 10.745 32 24V192H24C10.745 192 0 202.745 0 216V296C0 309.255 10.745 320 24 320H32V368C32 412.183 132.288 448 256 448S480 412.183 480 368V320H488C501.255 320 512 309.255 512 296zM112 128C89.909 128 72 110.091 72 88S89.909 48 112 48S152 65.909 152 88S134.091 128 112 128zM400 128C377.909 128 360 110.091 360 88S377.909 48 400 48S440 65.909 440 88S422.091 128 400 128zM432 184V328C432 341.255 421.255 352 408 352H104C90.745 352 80 341.255 80 328V184C80 170.745 90.745 160 104 160H408C421.255 160 432 170.745 432 184z" />
+    <glyph glyph-name="calculator"
+      unicode="&#xF1EC;"
+      horiz-adv-x="448" d=" M0 -16V400C0 426.51 21.49 448 48 448H400C426.51 448 448 426.51 448 400V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16zM384 268V372C384 378.627 378.627 384 372 384H76C69.373 384 64 378.627 64 372V268C64 261.373 69.373 256 76 256H372C378.627 256 384 261.373 384 268zM128 140V180C128 186.627 122.627 192 116 192H76C69.373 192 64 186.627 64 180V140C64 133.373 69.373 128 76 128H116C122.627 128 128 133.373 128 140zM384 12V180C384 186.627 378.627 192 372 192H332C325.373 192 320 186.627 320 180V12C320 5.373 325.373 0 332 0H372C378.627 0 384 5.373 384 12zM128 12V52C128 58.627 122.627 64 116 64H76C69.373 64 64 58.627 64 52V12C64 5.373 69.373 0 76 0H116C122.627 0 128 5.373 128 12zM256 140V180C256 186.627 250.627 192 244 192H204C197.373 192 192 186.627 192 180V140C192 133.373 197.373 128 204 128H244C250.627 128 256 133.373 256 140zM256 12V52C256 58.627 250.627 64 244 64H204C197.373 64 192 58.627 192 52V12C192 5.373 197.373 0 204 0H244C250.627 0 256 5.373 256 12z" />
+    <glyph glyph-name="calendar-alt"
+      unicode="&#xF073;"
+      horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM128 52C128 58.6 122.6 64 116 64H76C69.4 64 64 58.6 64 52V12C64 5.4 69.4 0 76 0H116C122.6 0 128 5.4 128 12V52zM128 180C128 186.6 122.6 192 116 192H76C69.4 192 64 186.6 64 180V140C64 133.4 69.4 128 76 128H116C122.6 128 128 133.4 128 140V180zM256 52C256 58.6 250.6 64 244 64H204C197.4 64 192 58.6 192 52V12C192 5.4 197.4 0 204 0H244C250.6 0 256 5.4 256 12V52zM256 180C256 186.6 250.6 192 244 192H204C197.4 192 192 186.6 192 180V140C192 133.4 197.4 128 204 128H244C250.6 128 256 133.4 256 140V180zM384 52C384 58.6 378.6 64 372 64H332C325.4 64 320 58.6 320 52V12C320 5.4 325.4 0 332 0H372C378.6 0 384 5.4 384 12V52zM384 180C384 186.6 378.6 192 372 192H332C325.4 192 320 186.6 320 180V140C320 133.4 325.4 128 332 128H372C378.6 128 384 133.4 384 140V180z" />
+    <glyph glyph-name="calendar-check"
+      unicode="&#xF274;"
+      horiz-adv-x="448" d=" M436 288H12C5.373 288 0 293.373 0 300V336C0 362.51 21.49 384 48 384H96V436C96 442.627 101.373 448 108 448H148C154.627 448 160 442.627 160 436V384H288V436C288 442.627 293.373 448 300 448H340C346.627 448 352 442.627 352 436V384H400C426.51 384 448 362.51 448 336V300C448 293.373 442.627 288 436 288zM12 256H436C442.627 256 448 250.627 448 244V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16V244C0 250.627 5.373 256 12 256zM345.296 160.053L317.127 188.451C312.4600000000001 193.156 304.862 193.187 300.1570000000001 188.519L194.12 83.335L148.14 129.687C143.473 134.392 135.874 134.423 131.169 129.755L102.772 101.5849999999999C98.067 96.918 98.036 89.3199999999999 102.704 84.6149999999999L185.305 1.3459999999999C189.972 -3.3590000000001 197.57 -3.3900000000001 202.275 1.2779999999999L345.228 143.0829999999999C349.933 147.7499999999999 349.964 155.3479999999999 345.296 160.0529999999999z" />
+    <glyph glyph-name="calendar-minus"
+      unicode="&#xF272;"
+      horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM316 64C322.6 64 328 69.4 328 76V116C328 122.6 322.6 128 316 128H132C125.4 128 120 122.6 120 116V76C120 69.4 125.4 64 132 64H316z" />
+    <glyph glyph-name="calendar-plus"
+      unicode="&#xF271;"
+      horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM328 116C328 122.6 322.6 128 316 128H256V188C256 194.6 250.6 200 244 200H204C197.4 200 192 194.6 192 188V128H132C125.4 128 120 122.6 120 116V76C120 69.4 125.4 64 132 64H192V4C192 -2.6 197.4 -8 204 -8H244C250.6 -8 256 -2.6 256 4V64H316C322.6 64 328 69.4 328 76V116z" />
+    <glyph glyph-name="calendar-times"
+      unicode="&#xF273;"
+      horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM269.3 96L317.4000000000001 144.1C322.1 148.8 322.1 156.4 317.4000000000001 161.1L289.1 189.4C284.4000000000001 194.1 276.8 194.1 272.1 189.4L224 141.3L175.9 189.4C171.2 194.1 163.6 194.1 158.9 189.4L130.6 161.1C125.9 156.4 125.9 148.8 130.6 144.1L178.7 96L130.6 47.9C125.9 43.2 125.9 35.6 130.6 30.9L158.9 2.6C163.6 -2.1 171.2 -2.1 175.9 2.6L224 50.7L272.1 2.6C276.8 -2.1 284.4000000000001 -2.1 289.1 2.6L317.4000000000001 30.9C322.1 35.6 322.1 43.2 317.4000000000001 47.9L269.3 96z" />
+    <glyph glyph-name="calendar"
+      unicode="&#xF133;"
+      horiz-adv-x="448" d=" M12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM448 300V336C448 362.5 426.5 384 400 384H352V436C352 442.6 346.6 448 340 448H300C293.4 448 288 442.6 288 436V384H160V436C160 442.6 154.6 448 148 448H108C101.4 448 96 442.6 96 436V384H48C21.5 384 0 362.5 0 336V300C0 293.4 5.4 288 12 288H436C442.6 288 448 293.4 448 300z" />
+    <glyph glyph-name="camera-retro"
+      unicode="&#xF083;"
+      horiz-adv-x="512" d=" M48 416C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416H48zM48 384H154C157.3 384 160 381.3 160 378V358C160 354.7 157.3 352 154 352H38C34.7 352 32 354.7 32 358V368C32 376.8 39.2 384 48 384zM474 288H38C34.7 288 32 290.7 32 294V330C32 333.3 34.7 336 38 336H176L206.2 381.3C207.3 383 209.2 384 211.2 384H464C472.8 384 480 376.8 480 368V294C480 290.7 477.3 288 474 288zM256 24C189.8 24 136 77.8 136 144S189.8 264 256 264S376 210.2 376 144S322.2 24 256 24zM256 232C207.5 232 168 192.5 168 144S207.5 56 256 56S344 95.5 344 144S304.5 232 256 232zM208 128C199.2 128 192 135.2 192 144C192 179.3 220.7 208 256 208C264.8 208 272 200.8 272 192S264.8 176 256 176C238.4 176 224 161.6 224 144C224 135.2 216.8 128 208 128z" />
+    <glyph glyph-name="camera"
+      unicode="&#xF030;"
+      horiz-adv-x="512" d=" M512 304V16C512 -10.5 490.5 -32 464 -32H48C21.5 -32 0 -10.5 0 16V304C0 330.5 21.5 352 48 352H136L148.3 384.9C155.3 403.6 173.2 416 193.2 416H318.7000000000001C338.7000000000001 416 356.6 403.6 363.6 384.9L376 352H464C490.5 352 512 330.5 512 304zM376 160C376 226.2 322.2 280 256 280S136 226.2 136 160S189.8 40 256 40S376 93.8 376 160zM344 160C344 111.5 304.5 72 256 72S168 111.5 168 160S207.5 248 256 248S344 208.5 344 160z" />
+    <glyph glyph-name="capsules"
+      unicode="&#xF46B;"
+      horiz-adv-x="576" d=" M555.3 147.9L424.2 335.2C401.9 367 366.4 384 330.4 384C307.8 384 284.9 377.3 264.9 363.3C245.2 349.5 231.2 330.5 223.4 309.5C220.5 368.8 172 416 112 416C50.1 416 0 365.9 0 304V80C0 18.1 50.1 -32 112 -32S224 18.1 224 80V229.1C227.3 220.5 231.3 212 236.8 204.1L368 16.8C390.2 -15 425.7 -32 461.8 -32C484.5 -32 507.3 -25.3 527.3 -11.3C579 24.9 591.5 96.2 555.3 147.9zM160 192H64V304C64 330.5 85.5 352 112 352S160 330.5 160 304V192zM354.8 147.1L289.2000000000001 240.8C281.5000000000001 251.8 278.5000000000001 265.2000000000001 280.9000000000001 278.4C283.2000000000001 291.6 290.6 303.2000000000001 301.6 310.9C310.1 316.9 320.1 320 330.4000000000001 320C346.9000000000001 320 362.3 312 371.7000000000001 298.5L437.3000000000001 204.8L354.8000000000001 147.1z" />
+    <glyph glyph-name="car"
+      unicode="&#xF1B9;"
+      horiz-adv-x="512" d=" M499.991 280H445.176L437.322 300.944C428.13 325.457 411.897 346.295 390.38 361.207S343.651 384 317.472 384H194.528C168.348 384 143.137 376.118 121.62 361.207C100.102 346.295 83.87 325.457 74.678 300.944L66.824 280H12.009C3.818 280 -1.965 271.976 0.625 264.2050000000001L8.625 240.205A12 12 0 0 1 20.009 232H48.824L48.772 231.86C29.222 220.907 16 200.003 16 176V128C16 111.775 22.049 96.971 32 85.691V24C32 10.745 42.745 0 56 0H104C117.255 0 128 10.745 128 24V64H384V24C384 10.745 394.745 0 408 0H456C469.255 0 480 10.745 480 24V85.691C489.951 96.972 496 111.776 496 128V176C496 200.003 482.778 220.907 463.228 231.86L463.176 232H491.991A12 12 0 0 1 503.375 240.205L511.375 264.2050000000001C513.965 271.976 508.182 280 499.991 280zM134.603 278.472C143.918 303.3110000000001 168 320 194.528 320H317.472C344 320 368.082 303.3110000000001 377.397 278.472L391.824 240H120.176L134.603 278.472zM88 120C70.327 120 56 134.327 56 152C56 169.673 70.327 184 88 184S136 153.673 136 136S105.673 120 88 120zM424 120C406.327 120 376 118.327 376 136C376 153.673 406.327 184 424 184S456 169.673 456 152C456 134.327 441.673 120 424 120z" />
+    <glyph glyph-name="caret-down"
+      unicode="&#xF0D7;"
+      horiz-adv-x="320" d=" M31.3 256H288.6C306.4000000000001 256 315.3 234.5 302.7000000000001 221.9L174.1 93.2C166.3 85.4 153.6 85.4 145.8 93.2L17.2 221.9C4.6 234.5 13.5 256 31.3 256z" />
+    <glyph glyph-name="caret-left"
+      unicode="&#xF0D9;"
+      horiz-adv-x="192" d=" M192 320.6620000000001V63.338C192 45.52 170.457 36.597 157.858 49.196L29.196 177.858C21.386 185.668 21.386 198.332 29.196 206.142L157.858 334.804C170.457 347.404 192 338.48 192 320.6620000000001z" />
+    <glyph glyph-name="caret-right"
+      unicode="&#xF0DA;"
+      horiz-adv-x="192" d=" M0 63.338V320.6620000000001C0 338.48 21.543 347.403 34.142 334.804L162.804 206.142C170.614 198.332 170.614 185.668 162.804 177.858L34.142 49.196C21.543 36.596 0 45.52 0 63.338z" />
+    <glyph glyph-name="caret-square-down"
+      unicode="&#xF150;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM92.5 227.5L215.5 104.5C220.2 99.8 227.8 99.8 232.5 104.5L355.5 227.5C363.1 235.1 357.7 248 347 248H101C90.3 248 84.9 235.1 92.5 227.5z" />
+    <glyph glyph-name="caret-square-left"
+      unicode="&#xF191;"
+      horiz-adv-x="448" d=" M400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32zM259.515 323.515L136.485 200.485C131.799 195.799 131.799 188.201 136.485 183.514L259.514 60.485C267.074 52.925 279.999 58.279 279.999 68.97V315.029C280 325.7200000000001 267.074 331.074 259.5150000000001 323.515z" />
+    <glyph glyph-name="caret-square-right"
+      unicode="&#xF152;"
+      horiz-adv-x="448" d=" M48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416zM188.485 60.485L311.514 183.514C316.2 188.2 316.2 195.798 311.514 200.485L188.485 323.515C180.925 331.0750000000001 168 325.721 168 315.0300000000001V68.971C168 58.28 180.926 52.926 188.485 60.485z" />
+    <glyph glyph-name="caret-square-up"
+      unicode="&#xF151;"
+      horiz-adv-x="448" d=" M0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16zM355.515 156.485L232.485 279.515C227.799 284.201 220.201 284.201 215.514 279.515L92.485 156.485C84.925 148.925 90.279 136 100.97 136H347.029C357.72 136 363.074 148.926 355.515 156.485z" />
+    <glyph glyph-name="caret-up"
+      unicode="&#xF0D8;"
+      horiz-adv-x="320" d=" M288.662 96H31.338C13.52 96 4.597 117.543 17.196 130.142L145.858 258.804C153.668 266.6140000000001 166.332 266.6140000000001 174.142 258.804L302.804 130.142C315.404 117.543 306.48 96 288.662 96z" />
+    <glyph glyph-name="cart-arrow-down"
+      unicode="&#xF218;"
+      horiz-adv-x="576" d=" M504.717 128H211.572L218.117 96H486.535C501.936 96 513.351 81.699 509.938 66.681L504.421 42.405C523.112 33.332 536 14.172 536 -8C536 -39.202 510.481 -64.444 479.176 -63.994C449.353 -63.565 424.826 -39.3630000000001 424.021 -9.547C423.581 6.74 430.106 21.502 440.824 32.001H231.176C241.553 21.835 248 7.674 248 -8C248 -39.813 221.472 -65.431 189.33 -63.938C160.79 -62.613 137.579 -39.553 136.079 -11.021C134.921 11.013 146.515 30.434 164.13 40.5650000000001L93.883 384H24C10.745 384 0 394.745 0 408V424C0 437.255 10.745 448 24 448H126.529C137.93 448 147.757 439.979 150.042 428.81L159.208 384H551.99C567.391 384 578.806 369.699 575.393 354.681L528.12 146.681C525.637 135.754 515.923 128 504.717 128zM403.029 256H360V316C360 322.627 354.627 328 348 328H324C317.373 328 312 322.627 312 316V256H268.971C258.2800000000001 256 252.926 243.074 260.486 235.515L327.515 168.486C332.201 163.8 339.799 163.8 344.486 168.486L411.515 235.515C419.074 243.074 413.72 256 403.029 256z" />
+    <glyph glyph-name="cart-plus"
+      unicode="&#xF217;"
+      horiz-adv-x="576" d=" M504.717 128H211.572L218.117 96H486.535C501.936 96 513.351 81.699 509.938 66.681L504.421 42.405C523.112 33.332 536 14.172 536 -8C536 -39.202 510.481 -64.444 479.176 -63.994C449.353 -63.565 424.826 -39.3630000000001 424.021 -9.547C423.581 6.74 430.106 21.502 440.824 32.001H231.176C241.553 21.835 248 7.674 248 -8C248 -39.813 221.472 -65.431 189.33 -63.938C160.79 -62.613 137.579 -39.553 136.079 -11.021C134.921 11.013 146.515 30.434 164.13 40.5650000000001L93.883 384H24C10.745 384 0 394.745 0 408V424C0 437.255 10.745 448 24 448H126.529C137.93 448 147.757 439.979 150.042 428.81L159.208 384H551.99C567.391 384 578.806 369.699 575.393 354.681L528.12 146.681C525.637 135.754 515.923 128 504.717 128zM408 280H360V320C360 328.837 352.837 336 344 336H328C319.163 336 312 328.837 312 320V280H264C255.163 280 248 272.837 248 264V248C248 239.163 255.163 232 264 232H312V192C312 183.163 319.163 176 328 176H344C352.837 176 360 183.163 360 192V232H408C416.837 232 424 239.163 424 248V264C424 272.837 416.837 280 408 280z" />
+    <glyph glyph-name="certificate"
+      unicode="&#xF0A3;"
+      horiz-adv-x="512" d=" M458.622 192.08L504.607 237.085C518.315 250.062 511.923 273.124 493.943 277.424L431.2930000000001 293.414L448.9540000000001 355.4290000000001C453.9450000000001 373.2670000000001 437.1250000000001 390.092 419.2930000000001 385.1L357.2990000000001 367.433L341.3150000000001 430.1040000000001C337.085 447.803 313.765 454.276 300.99 440.772L256 394.43L211.011 440.771C198.381 454.122 174.964 448.005 170.686 430.103L154.702 367.432L92.707 385.099C74.87 390.093 58.056 373.262 63.046 355.428L80.707 293.413L18.057 277.423C0.069 273.122 -6.31 250.056 7.392 237.085L53.377 192.08L7.392 147.076C-6.316 134.0990000000001 0.076 111.037 18.056 106.737L80.706 90.747L63.045 28.732C58.054 10.894 74.874 -5.931 92.706 -0.939L154.7 16.7280000000001L170.684 -45.9429999999999C175.123 -64.5179999999999 198.38 -69.9609999999999 211.009 -56.6109999999999L256 -10.61L300.989 -56.611C313.489 -70.0989999999999 336.976 -64.097 341.314 -45.943L357.298 16.728L419.2919999999999 -0.939C437.128 -5.933 453.9429999999999 10.898 448.9529999999999 28.732L431.2919999999999 90.747L493.9419999999999 106.737C511.9289999999999 111.0390000000001 518.3079999999999 134.1040000000001 504.6059999999999 147.076L458.6219999999999 192.08z" />
+    <glyph glyph-name="chart-area"
+      unicode="&#xF1FE;"
+      horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM372.7 288.5L288 232L202.7 345.7C197.6 352.5 187.2 352 182.8 344.7L96 200V96H480L390.1 283.8C386.9000000000001 290.3 378.7000000000001 292.5 372.7000000000001 288.5z" />
+    <glyph glyph-name="chart-bar"
+      unicode="&#xF080;"
+      horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM192 108V180C192 186.6 186.6 192 180 192H140C133.4 192 128 186.6 128 180V108C128 101.4 133.4 96 140 96H180C186.6 96 192 101.4 192 108zM384 108V244C384 250.6 378.6 256 372 256H332C325.4 256 320 250.6 320 244V108C320 101.4 325.4 96 332 96H372C378.6 96 384 101.4 384 108zM288 108V308C288 314.6 282.6 320 276 320H236C229.4 320 224 314.6 224 308V108C224 101.4 229.4 96 236 96H276C282.6 96 288 101.4 288 108zM480 108V340C480 346.6 474.6 352 468 352H428C421.4 352 416 346.6 416 340V108C416 101.4 421.4 96 428 96H468C474.6 96 480 101.4 480 108z" />
+    <glyph glyph-name="chart-line"
+      unicode="&#xF201;"
+      horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM456 352H344C322.6 352 311.9 326.1 327 311L359.9 278.1L287.9 205.2L232.3 260.8C227.6 265.5 220.1 265.5 215.4 260.8L96.4 143C91.7 138.4 91.6 130.8 96.2 126.1L124.7 96.7000000000001C129.4 91.9 137.1 91.8000000000001 141.8 96.6L223.9 178.7000000000001L279.4 123.2000000000001C284.1 118.5000000000001 291.7 118.5000000000001 296.4 123.2000000000001L405.6 232.4000000000001L439 199C454.1 183.9 480 194.6 480 216V328C480 341.3 469.3 352 456 352z" />
+    <glyph glyph-name="chart-pie"
+      unicode="&#xF200;"
+      horiz-adv-x="576" d=" M288 435.7V208H515.7C522.6 208 528 213.8 527.7 220.7C521.3000000000001 343.1 423.2000000000001 441.3 300.7000000000001 447.7C293.8000000000001 448 288.0000000000001 442.6 288.0000000000001 435.7zM552.7 160C559.6 160 565 154.2 564.7 147.3C561.9000000000001 94.1 541.5 41.7 503.5000000000001 -0.5C498.9 -5.6 490.9 -5.9 486.0000000000001 -1L325 160H552.7zM401 15C405.8 10.2 405.7 2.2 400.6 -2.3C358 -40.7 301.6 -64 239.8 -64C107.6 -63.9 -0.2 44.2 0 176.5C0.2 304.6 100.8 409.1 227.3 415.7C234.2 416.1 240 410.6 240 403.7V176L401 15z" />
+    <glyph glyph-name="check-circle"
+      unicode="&#xF058;"
+      horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM227.314 60.686L411.314 244.686C417.562 250.934 417.562 261.065 411.314 267.313L388.687 289.94C382.439 296.189 372.308 296.189 366.059 289.94L216 139.882L145.941 209.941C139.693 216.189 129.562 216.189 123.313 209.941L100.686 187.314C94.438 181.066 94.438 170.935 100.686 164.687L204.686 60.687C210.935 54.438 221.065 54.438 227.314 60.686z" />
+    <glyph glyph-name="check-square"
+      unicode="&#xF14A;"
+      horiz-adv-x="448" d=" M400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32zM195.314 66.059L379.314 250.059C385.562 256.307 385.562 266.438 379.314 272.686L356.687 295.313C350.439 301.561 340.308 301.562 334.059 295.313L184 145.255L113.941 215.314C107.693 221.562 97.562 221.562 91.313 215.314L68.686 192.687C62.438 186.439 62.438 176.308 68.686 170.06L172.686 66.06C178.935 59.81 189.065 59.81 195.314 66.059z" />
+    <glyph glyph-name="check"
+      unicode="&#xF00C;"
+      horiz-adv-x="512" d=" M173.898 8.596L7.498 174.996C-2.499 184.993 -2.499 201.202 7.498 211.2L43.701 247.404C53.698 257.402 69.908 257.402 79.905 247.404L192 135.31L432.0950000000001 375.404C442.0920000000001 385.401 458.302 385.401 468.299 375.404L504.5020000000001 339.2C514.499 329.203 514.499 312.9940000000001 504.5020000000001 302.996L210.1020000000001 8.595C200.1040000000001 -1.402 183.8950000000001 -1.402 173.8980000000001 8.5959999999999z" />
+    <glyph glyph-name="chess-bishop"
+      unicode="&#xF43A;"
+      horiz-adv-x="320" d=" M123.158 370.1190000000001C107.369 375.4700000000001 96 390.403 96 408C96 430.091 113.909 448 136 448H183.796C205.887 448 223.796 430.091 223.796 408C223.796 390.459 212.501 375.5660000000001 196.791 370.171C220.784 353.514 245.368 323.332 265.4940000000001 288.121L144.929 167.557A6 6 0 0 1 144.929 159.072L159.071 144.93A6 6 0 0 1 167.556 144.93L280.9 258.274C298.658 219.977 310.271 178.831 310.271 144.001C310.271 90.215 287.374 68.213 251.825 57.968V0H68.174V57.97C32.631 68.216 9.739 90.219 9.739 144C9.739 222.029 68.02 331.766 123.158 370.1190000000001zM320 -52V-28C320 -21.373 314.627 -16 308 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H308C314.627 -64 320 -58.627 320 -52z" />
+    <glyph glyph-name="chess-board"
+      unicode="&#xF43C;"
+      horiz-adv-x="512" d=" M256 192V128H192V192H256zM256 448H192V384H256V448zM256 192H320V256H256V192zM384 448H320V384H384V448zM384 -64H448V0H384V-64zM512 0V64H448V0H512zM128 -64H192V0H128V-64zM128 448H64V384H128V448zM512 256V320H448V256H512zM512 128V192H448V128H512zM0 -64H64V0H0V-64zM0 384V320H64V384H0zM0 256V192H64V256H0zM0 128V64H64V128H0zM256 -64H320V0H256V-64zM192 64V0H256V64H192zM256 256V320H192V256H256zM64 64V0H128V64H64zM128 192H64V128H128V192zM384 64H448V128H384V64zM512 448H448V384H512V448zM384 192H448V256H384V192zM384 384V320H448V384H384zM320 64V0H384V64H320zM128 128V64H192V128H128zM256 128V64H320V128H256zM192 256H128V192H192V256zM128 320H64V256H128V320zM320 128H384V192H320V128zM192 320V384H128V320H192zM320 320V384H256V320H320zM320 256H384V320H320V256z" />
+    <glyph glyph-name="chess-king"
+      unicode="&#xF43F;"
+      horiz-adv-x="448" d=" M416 -28V-52C416 -58.627 410.627 -64 404 -64H44C37.373 -64 32 -58.627 32 -52V-28C32 -21.373 37.373 -16 44 -16H404C410.627 -16 416 -21.373 416 -28zM407.967 296H248V344H298A6 6 0 0 1 304 350V386A6 6 0 0 1 298 392H248V442A6 6 0 0 1 242 448H206A6 6 0 0 1 200 442V392H150A6 6 0 0 1 144 386V350A6 6 0 0 1 150 344H200V296H40.033C12.459 296 -6.846 268.756 2.295 242.741L87.582 0H360.418L445.7050000000001 242.741C454.846 268.756 435.541 296 407.967 296z" />
+    <glyph glyph-name="chess-knight"
+      unicode="&#xF441;"
+      horiz-adv-x="384" d=" M352 224V0H32V46.557C32 76.859 49.12 104.56 76.223 118.111L133.466 146.733A48 48 0 0 1 160 189.666V240L137.873 228.937A23.996 23.996 0 0 1 125.323 213.292L113.488 165.954A12 12 0 0 0 106.303 157.723L76.702 145.8830000000001A11.998 11.998 0 0 0 67.372 146.059L7.126 172.833A12 12 0 0 0 0 183.799V342.059C0 348.424 2.529 354.529 7.03 359.03L16 368L1.789 396.4220000000001A16.937 16.937 0 0 0 0 404C0 410.627 5.373 416 12 416H160C266.039 416 352 330.039 352 224zM372 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H372C378.627 -64 384 -58.627 384 -52V-28C384 -21.373 378.627 -16 372 -16zM52 320C40.954 320 32 311.046 32 300S40.954 280 52 280S72 288.954 72 300S63.046 320 52 320z" />
+    <glyph glyph-name="chess-pawn"
+      unicode="&#xF443;"
+      horiz-adv-x="320" d=" M264 0H56S116 42.743 116 176H84C77.373 176 72 181.373 72 188V212C72 218.627 77.373 224 84 224H124.209C95.721 237.44 76 266.4120000000001 76 300C76 346.392 113.608 384 160 384S244 346.392 244 300C244 266.4120000000001 224.279 237.44 195.791 224H236C242.627 224 248 218.627 248 212V188C248 181.373 242.627 176 236 176H204C204 42.743 264 0 264 0zM292 -16H28C21.373 -16 16 -21.373 16 -28V-52C16 -58.627 21.373 -64 28 -64H292C298.627 -64 304 -58.627 304 -52V-28C304 -21.373 298.627 -16 292 -16z" />
+    <glyph glyph-name="chess-queen"
+      unicode="&#xF445;"
+      horiz-adv-x="512" d=" M436 -64H76C69.373 -64 64 -58.627 64 -52V-28C64 -21.373 69.373 -16 76 -16H436C442.627 -16 448 -21.373 448 -28V-52C448 -58.627 442.627 -64 436 -64zM255.579 448C224.651 448 199.579 422.928 199.579 392S224.651 336 255.579 336S311.579 361.072 311.579 392S286.507 448 255.579 448zM460.147 293.366C454.3790000000001 296.411 447.2310000000001 294.298 444.0650000000001 288.596C435.4490000000001 273.0800000000001 421.3180000000001 250.795 400.0000000000001 250.795C371.2860000000001 250.795 369.3750000000001 270.5990000000001 368.3140000000001 308.337C368.1310000000001 314.829 362.8130000000001 320.0010000000001 356.3190000000001 320.0010000000001H315.3130000000001C310.1380000000001 320.0010000000001 305.5590000000001 316.673 303.9250000000002 311.7630000000001C295.0350000000002 285.0540000000001 277.8520000000002 270.7710000000001 256.0000000000001 270.7710000000001S216.9660000000001 285.0540000000001 208.0750000000001 311.7630000000001C206.4410000000001 316.673 201.8620000000001 320.0010000000001 196.6870000000001 320.0010000000001H155.6820000000001C149.1870000000001 320.0010000000001 143.8690000000001 314.827 143.6870000000001 308.3340000000001C142.6350000000001 270.692 140.7530000000001 250.795 111.9990000000001 250.795C91.3080000000001 250.795 78.1820000000001 271.019 67.5740000000001 288.8200000000001C64.3080000000001 294.3 57.3160000000001 296.2510000000001 51.6750000000001 293.273L12.4960000000001 272.5940000000001A12 12 0 0 1 6.9860000000001 257.449L112 0H400L505.014 257.448A12 12 0 0 1 499.504 272.593L460.147 293.366z" />
+    <glyph glyph-name="chess-rook"
+      unicode="&#xF447;"
+      horiz-adv-x="384" d=" M81.241 232.973C80.957 189.08 77.411 99.924 48 0H335.9820000000001C306.5820000000001 99.604 303.0460000000001 188.912 302.761 232.975L348.1790000000001 275.287A11.998 11.998 0 0 1 351.999 284.067V404C351.999 410.627 346.6260000000001 416 339.999 416H299.999C293.372 416 287.999 410.627 287.999 404V360H239.999V404C239.999 410.627 234.6260000000001 416 227.999 416H155.999C149.372 416 143.999 410.627 143.999 404V360H96V404C96 410.627 90.627 416 84 416H44C37.373 416 32 410.627 32 404V284.068C32 280.738 33.384 277.558 35.82 275.288L81.241 232.973zM160 192C160 209.673 174.327 224 192 224C209.673 224 224 209.673 224 192V127.996H160V192zM384 -28V-52C384 -58.627 378.627 -64 372 -64H12C5.373 -64 0 -58.627 0 -52V-28C0 -21.373 5.373 -16 12 -16H372C378.627 -16 384 -21.373 384 -28z" />
+    <glyph glyph-name="chess"
+      unicode="&#xF439;"
+      horiz-adv-x="512" d=" M199.821 230.367A6 6 0 0 0 205.821 224.367L205.82 203.601A6 6 0 0 0 199.82 197.601H174.015C174.015 165.886 171.862 101.4 191.413 44.372H64.597C84.54 102.548 82.02 168.755 82.02 197.601H56.183A6 6 0 0 0 50.183 203.601L50.185 224.367A6 6 0 0 0 56.185 230.367H199.821zM41.554 332.9120000000001L76.134 237.841H179.868L214.44 332.913C217.286 340.7390000000001 211.49 349.014 203.162 349.014H152V379.2340000000001H173.57A6 6 0 0 1 179.57 385.2340000000001V407.617A6 6 0 0 1 173.57 413.617H145.203V442A6 6 0 0 1 139.203 448H116.82A6 6 0 0 1 110.82 442V413.617H82.421A6 6 0 0 1 76.421 407.617V385.2340000000001A6 6 0 0 1 82.421 379.2340000000001H104V349.015H52.831C44.503 349.014 38.707 340.7390000000001 41.554 332.9120000000001zM222.678 2.83V30.897A6 6 0 0 1 216.678 36.897H39.322A6 6 0 0 1 33.322 30.897V2.83L11.174 -11.334A6 6 0 0 1 8.407 -16.389V-58A6 6 0 0 1 14.407 -64H241.594A6 6 0 0 1 247.594 -58V-16.388A6 6 0 0 1 244.8270000000001 -11.333L222.678 2.83zM313.256 147.055L338.136 130.0919999999999C338.226 111.9679999999999 337.969 66.1879999999999 326.231 15.5699999999999H473.757C462.044 66.045 461.788 111.894 461.875 130.107L486.734 147.056A3.856 3.856 0 0 1 488.418 150.243V220.144A3.8569999999999998 3.8569999999999998 0 0 1 484.561 224.001H456.9059999999999A3.8569999999999998 3.8569999999999998 0 0 1 453.0489999999999 220.144V188.63H430.3119999999999V220.144A3.8569999999999998 3.8569999999999998 0 0 1 426.4539999999999 224.001H373.5359999999999A3.8569999999999998 3.8569999999999998 0 0 1 369.6789999999999 220.144V188.63H346.9419999999999V220.144A3.8569999999999998 3.8569999999999998 0 0 1 343.0849999999998 224.001H315.43A3.8569999999999998 3.8569999999999998 0 0 1 311.573 220.144V150.243A3.8549999999999995 3.8549999999999995 0 0 1 313.256 147.055zM384.841 95.149C384.841 103.521 391.628 110.307 400 110.307S415.158 103.52 415.158 95.149V64.831H384.841V95.149zM504.62 -22.059L490.956 -11.42V4.132A3.8569999999999998 3.8569999999999998 0 0 1 487.099 7.989H312.915A3.8569999999999998 3.8569999999999998 0 0 1 309.058 4.132V-11.42L295.381 -22.059A3.8569999999999998 3.8569999999999998 0 0 1 293.893 -25.103V-60.142A3.8569999999999998 3.8569999999999998 0 0 1 297.75 -63.999H502.25A3.8569999999999998 3.8569999999999998 0 0 1 506.107 -60.142V-25.102A3.859 3.859 0 0 1 504.62 -22.059z" />
+    <glyph glyph-name="chevron-circle-down"
+      unicode="&#xF13A;"
+      horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM273 78.1L408.5 213.6C417.9 223 417.9 238.2 408.5 247.5000000000001L391.5 264.5C382.1 273.9000000000001 366.9 273.9000000000001 357.6 264.5L256 162.9L154.4 264.5C145 273.9 129.8 273.9 120.5 264.5L103.5 247.5C94.1 238.1 94.1 222.9 103.5 213.6L239 78.1C248.4 68.7000000000001 263.6 68.7000000000001 273 78.1z" />
+    <glyph glyph-name="chevron-circle-left"
+      unicode="&#xF137;"
+      horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM142.1 175L277.6 39.5C287 30.1 302.2000000000001 30.1 311.5 39.5L328.5 56.5C337.9 65.9 337.9 81.1 328.5 90.4L226.9 192L328.5 293.6C337.9 303 337.9 318.2 328.5 327.5L311.5 344.5C302.1 353.9 286.9 353.9 277.6 344.5L142.1 209C132.7 199.6 132.7 184.4 142.1 175z" />
+    <glyph glyph-name="chevron-circle-right"
+      unicode="&#xF138;"
+      horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM369.9 209L234.4 344.5C225 353.9 209.8 353.9 200.5 344.5L183.5 327.5C174.1 318.1 174.1 302.9 183.5 293.6L285.1 192L183.5 90.4C174.1 81 174.1 65.8 183.5 56.5L200.5 39.5C209.9 30.1 225.1 30.1 234.4 39.5L369.9 175C379.3 184.4 379.3 199.6 369.9 209z" />
+    <glyph glyph-name="chevron-circle-up"
+      unicode="&#xF139;"
+      horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM239 305.9L103.5 170.4C94.1 161 94.1 145.8 103.5 136.5L120.5 119.5C129.9 110.1 145.1 110.1 154.4 119.5L256 221.1L357.6 119.5C367 110.1 382.2000000000001 110.1 391.5 119.5L408.5 136.5C417.9 145.9 417.9 161.1 408.5 170.4L273 305.9C263.6 315.3 248.4 315.3 239 305.9z" />
+    <glyph glyph-name="chevron-down"
+      unicode="&#xF078;"
+      horiz-adv-x="448" d=" M207.029 66.524L12.686 260.868C3.313 270.241 3.313 285.437 12.686 294.809L35.353 317.476C44.71 326.833 59.875 326.851 69.254 317.516L224 163.495L378.745 317.516C388.124 326.851 403.289 326.833 412.646 317.476L435.313 294.809C444.686 285.4360000000001 444.686 270.24 435.313 260.868L240.971 66.524C231.598 57.152 216.402 57.152 207.029 66.524z" />
+    <glyph glyph-name="chevron-left"
+      unicode="&#xF053;"
+      horiz-adv-x="320" d=" M34.52 208.97L228.87 403.31C238.24 412.68 253.44 412.68 262.81 403.31L285.48 380.64C294.8400000000001 371.28 294.85 356.12 285.5200000000001 346.74L131.49 192L285.51 37.25C294.85 27.87 294.83 12.71 285.47 3.35L262.8 -19.32C253.43 -28.69 238.23 -28.69 228.86 -19.32L34.52 175.03C25.15 184.4 25.15 199.6 34.52 208.97z" />
+    <glyph glyph-name="chevron-right"
+      unicode="&#xF054;"
+      horiz-adv-x="320" d=" M285.476 175.029L91.132 -19.314C81.759 -28.687 66.563 -28.687 57.191 -19.314L34.524 3.353C25.167 12.7099999999999 25.149 27.8749999999999 34.484 37.254L188.505 192L34.484 346.745C25.149 356.124 25.167 371.289 34.524 380.646L57.191 403.313C66.564 412.6860000000001 81.76 412.6860000000001 91.132 403.313L285.475 208.97C294.848 199.598 294.848 184.402 285.476 175.029z" />
+    <glyph glyph-name="chevron-up"
+      unicode="&#xF077;"
+      horiz-adv-x="448" d=" M240.971 317.476L435.314 123.1330000000001C444.687 113.7600000000001 444.687 98.564 435.314 89.192L412.647 66.525C403.29 57.168 388.125 57.15 378.7459999999999 66.485L224 220.505L69.255 66.484C59.876 57.149 44.711 57.167 35.354 66.524L12.687 89.191C3.314 98.564 3.314 113.7600000000001 12.687 123.1320000000001L207.03 317.475C216.402 326.848 231.598 326.848 240.971 317.476z" />
+    <glyph glyph-name="child"
+      unicode="&#xF1AE;"
+      horiz-adv-x="384" d=" M120 376C120 415.765 152.235 448 192 448S264 415.765 264 376C264 336.236 231.765 304 192 304S120 336.236 120 376zM374.627 374.627C362.1310000000001 387.124 341.8690000000001 387.124 329.373 374.627L242.745 288H141.254L54.627 374.627C42.131 387.124 21.869 387.124 9.373 374.627C-3.124 362.13 -3.124 341.8690000000001 9.373 329.372L104 234.746V-32C104 -49.673 118.327 -64 136 -64H152C169.673 -64 184 -49.673 184 -32V80H200V-32C200 -49.673 214.327 -64 232 -64H248C265.673 -64 280 -49.673 280 -32V234.746L374.627 329.373C387.124 341.87 387.124 362.13 374.627 374.627z" />
+    <glyph glyph-name="circle-notch"
+      unicode="&#xF1CE;"
+      horiz-adv-x="512" d=" M288 408.944V392.2850000000001C288 381.481 295.281 372.126 305.686 369.219C383.204 347.5660000000001 440 276.482 440 192C440 90.311 357.705 8 256 8C154.311 8 72 90.295 72 192C72 276.4700000000001 128.786 347.564 206.312 369.219C216.719 372.126 224 381.483 224 392.288V408.936C224 424.645 209.166 436.089 193.954 432.17C86.603 404.5180000000001 7.394 306.794 8.003 190.668C8.723 53.616 119.48 -56.288 256.534 -55.999C393.255 -55.711 504 55.212 504 192C504 307.633 424.86 404.779 317.789 432.236C302.678 436.111 288 424.544 288 408.944z" />
+    <glyph glyph-name="circle"
+      unicode="&#xF111;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440z" />
+    <glyph glyph-name="clipboard-check"
+      unicode="&#xF46C;"
+      horiz-adv-x="384" d=" M336 384H256C256 419.3 227.3 448 192 448S128 419.3 128 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V336C384 362.5 362.5 384 336 384zM192 408C205.3 408 216 397.3 216 384S205.3 360 192 360S168 370.7 168 384S178.7 408 192 408zM313.2 176.2L170.2 34.4C165.5 29.7 157.9 29.8 153.2 34.5L70.6 117.8C65.9 122.5 66 130.1 70.7 134.8L99.1 163C103.8 167.7 111.4 167.6 116.1 162.9L162.1 116.5L268.1 221.7C272.8 226.4 280.4000000000001 226.3 285.1 221.6L313.3 193.2C318 188.4 317.9000000000001 180.9 313.2 176.2z" />
+    <glyph glyph-name="clipboard-list"
+      unicode="&#xF46D;"
+      horiz-adv-x="384" d=" M336 384H256C256 419.3 227.3 448 192 448S128 419.3 128 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V336C384 362.5 362.5 384 336 384zM96 24C82.7 24 72 34.7 72 48S82.7 72 96 72S120 61.3 120 48S109.3 24 96 24zM96 120C82.7 120 72 130.7 72 144S82.7 168 96 168S120 157.3 120 144S109.3 120 96 120zM96 216C82.7 216 72 226.7 72 240S82.7 264 96 264S120 253.3 120 240S109.3 216 96 216zM192 408C205.3 408 216 397.3 216 384S205.3 360 192 360S168 370.7 168 384S178.7 408 192 408zM320 40C320 35.6 316.4 32 312 32H168C163.6 32 160 35.6 160 40V56C160 60.4 163.6 64 168 64H312C316.4 64 320 60.4 320 56V40zM320 136C320 131.6 316.4 128 312 128H168C163.6 128 160 131.6 160 136V152C160 156.4 163.6 160 168 160H312C316.4 160 320 156.4 320 152V136zM320 232C320 227.6 316.4 224 312 224H168C163.6 224 160 227.6 160 232V248C160 252.4 163.6 256 168 256H312C316.4 256 320 252.4 320 248V232z" />
+    <glyph glyph-name="clipboard"
+      unicode="&#xF328;"
+      horiz-adv-x="384" d=" M384 336V-16C384 -42.51 362.51 -64 336 -64H48C21.49 -64 0 -42.51 0 -16V336C0 362.51 21.49 384 48 384H128C128 419.29 156.71 448 192 448S256 419.29 256 384H336C362.51 384 384 362.51 384 336zM192 408C178.745 408 168 397.255 168 384S178.745 360 192 360S216 370.745 216 384S205.255 408 192 408M288 294V314A6 6 0 0 1 282 320H102A6 6 0 0 1 96 314V294A6 6 0 0 1 102 288H282A6 6 0 0 1 288 294z" />
+    <glyph glyph-name="clock"
+      unicode="&#xF017;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM313.1 89.9L224.9 154C221.8 156.3 220 159.9 220 163.7V332C220 338.6 225.4 344 232 344H280C286.6 344 292 338.6 292 332V194.3L355.5 148.1C360.9 144.2000000000001 362 136.7000000000001 358.1 131.3L329.9000000000001 92.5C326.0000000000001 87.2 318.5000000000001 86 313.1 89.9z" />
+    <glyph glyph-name="clone"
+      unicode="&#xF24D;"
+      horiz-adv-x="512" d=" M464 448C490.51 448 512 426.51 512 400V112C512 85.49 490.51 64 464 64H176C149.49 64 128 85.49 128 112V400C128 426.51 149.49 448 176 448H464M176 32C131.888 32 96 67.888 96 112V320H48C21.49 320 0 298.51 0 272V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V32H176z" />
+    <glyph glyph-name="closed-captioning"
+      unicode="&#xF20A;"
+      horiz-adv-x="512" d=" M464 384H48C21.5 384 0 362.5 0 336V48C0 21.5 21.5 0 48 0H464C490.5 0 512 21.5 512 48V336C512 362.5 490.5 384 464 384zM218.1 160.3C220.9 162.8 225.2 162.4 227.3 159.4L246.8 131.7000000000001C248.5 129.3000000000001 248.3 126.1 246.3 124.0000000000001C192.7 67.2000000000001 73.5 91.9 73.5 191.9000000000001C73.5 289.2000000000001 195.2 311.4000000000001 246 262.0000000000001C248.1 260.0000000000001 248.5 258.8000000000001 247 256.3000000000001L229.5 225.8000000000001C227.6 222.7000000000001 223.3 221.8000000000001 220.4 224.1000000000001C179.6 256.1000000000002 125.8 239.0000000000001 125.8 192.9000000000001C125.9 144.9000000000001 176.9 122.4000000000001 218.1 160.3000000000001zM408.5 160.3C411.3 162.8 415.6 162.4 417.7 159.4L437.2 131.7000000000001C438.9 129.3000000000001 438.7 126.1 436.7 124.0000000000001C383.2 67.1000000000001 264 91.9 264 191.9000000000001C264 289.2000000000001 385.7 311.4000000000001 436.5 262.0000000000001C438.6 260.0000000000001 439 258.8000000000001 437.5 256.3000000000001L420 225.8C418.1 222.7 413.8 221.8 410.9 224.1C370.1 256.1 316.3 239.0000000000001 316.3 192.9C316.3 144.9 367.3 122.4 408.5 160.3z" />
+    <glyph glyph-name="cloud-download-alt"
+      unicode="&#xF381;"
+      horiz-adv-x="640" d=" M640 96C640 25.308 582.692 -32 512 -32H144C64.471 -32 0 32.471 0 112C0 174.773 40.171 228.155 96.204 247.867A163.68 163.68 0 0 0 96 256C96 344.366 167.634 416 256 416C315.288 416 367.0420000000001 383.752 394.684 335.841C409.935 346.046 428.271 352 448 352C501.019 352 544 309.019 544 256C544 243.816 541.725 232.164 537.585 221.44C596.017 209.586 640 157.93 640 96zM393.373 160H328V272C328 280.837 320.836 288 312 288H264C255.164 288 248 280.837 248 272V160H182.627C168.373 160 161.234 142.766 171.313 132.686L276.6860000000001 27.313C282.9340000000001 21.065 293.0650000000001 21.065 299.3130000000001 27.313L404.6860000000001 132.686C414.766 142.766 407.627 160 393.3730000000001 160z" />
+    <glyph glyph-name="cloud-upload-alt"
+      unicode="&#xF382;"
+      horiz-adv-x="640" d=" M640 96C640 25.308 582.692 -32 512 -32H144C64.471 -32 0 32.471 0 112C0 174.773 40.171 228.155 96.204 247.867A163.68 163.68 0 0 0 96 256C96 344.366 167.634 416 256 416C315.288 416 367.0420000000001 383.752 394.684 335.841C409.935 346.046 428.271 352 448 352C501.019 352 544 309.019 544 256C544 243.816 541.725 232.164 537.585 221.44C596.017 209.586 640 157.93 640 96zM404.6860000000001 187.314L299.314 292.6860000000001C293.0660000000001 298.934 282.935 298.934 276.687 292.6860000000001L171.314 187.314C161.234 177.234 168.373 160 182.627 160H248V48C248 39.163 255.164 32 264 32H312C320.836 32 328 39.163 328 48V160H393.373C407.627 160 414.766 177.234 404.686 187.314z" />
+    <glyph glyph-name="cloud"
+      unicode="&#xF0C2;"
+      horiz-adv-x="640" d=" M537.585 221.44C541.725 232.164 544 243.816 544 256C544 309.019 501.019 352 448 352C428.271 352 409.935 346.046 394.684 335.841C367.042 383.752 315.288 416 256 416C167.634 416 96 344.366 96 256C96 253.272 96.07 250.561 96.204 247.867C40.171 228.155 0 174.773 0 112C0 32.471 64.471 -32 144 -32H512C582.692 -32 640 25.308 640 96C640 157.93 596.017 209.586 537.585 221.44z" />
+    <glyph glyph-name="code-branch"
+      unicode="&#xF126;"
+      horiz-adv-x="384" d=" M384 304C384 348.2 348.2 384 304 384S224 348.2 224 304C224 267.6 248.3 236.9 281.5 227.2C280.9 211.1 277.3 198.7 270.5 190.3C255.1 171.1 221.2 167.9 185.3 164.6C157.1 162 127.9 159.2000000000001 104 147.7000000000001V291.7000000000001C136.5 301.9000000000001 160 332.2000000000001 160 368.0000000000001C160 412.2000000000001 124.2 448.0000000000001 80 448.0000000000001S0 412.2 0 368C0 332.2 23.5 301.9 56 291.7V92.4C23.5 82.1 0 51.8 0 16C0 -28.2 35.8 -64 80 -64S160 -28.2 160 16C160 50 138.8 79.1 108.8 90.6C111.9 95.8 116.6 100.4 123.7 104C139.9 112.2 164.1 114.4 189.8 116.8C232 120.7 279.8 125.2 308 160.2C322 177.6 329.1 200 329.6 228.1C361.2000000000001 238.9 384 268.8 384 304zM80 384C88.8 384 96 376.8 96 368S88.8 352 80 352S64 359.2 64 368S71.2 384 80 384zM80 0C71.2 0 64 7.2 64 16S71.2 32 80 32S96 24.8 96 16S88.8 0 80 0zM304 320C312.8 320 320 312.8 320 304S312.8 288 304 288S288 295.2 288 304S295.2 320 304 320z" />
+    <glyph glyph-name="code"
+      unicode="&#xF121;"
+      horiz-adv-x="640" d=" M278.9 -63.5L217.9 -45.8C211.5 -44 207.9 -37.3 209.7 -30.9L346.2 439.3C348 445.7 354.7 449.3 361.1 447.5L422.1 429.8C428.5 428 432.1 421.3 430.3 414.9L293.8 -55.3C291.9000000000001 -61.7 285.3 -65.4 278.9000000000001 -63.5zM164.9 48.7L208.4 95.1C213 99.9999999999999 212.7 107.8 207.6 112.3L117 192L207.6 271.7C212.7 276.2 213.1 284 208.4 288.9L164.9 335.3C160.4 340.1 152.8 340.4 147.9 335.8L3.8 200.8C-1.3 196.1 -1.3 188 3.8 183.3L147.9 48.2C152.8 43.6 160.4 43.8000000000001 164.9 48.7zM492.1 48.1L636.1999999999999 183.1999999999999C641.3 187.8999999999999 641.3 196 636.1999999999999 200.6999999999999L492.1 335.9C487.3 340.4 479.7 340.2 475.1 335.4L431.6 289C427 284.1 427.3 276.3 432.4000000000001 271.8L523 192L432.4 112.3C427.3 107.8 426.9 100 431.6 95.1L475.1 48.7C479.6 43.8000000000001 487.2 43.6 492.1 48.1z" />
+    <glyph glyph-name="coffee"
+      unicode="&#xF0F4;"
+      horiz-adv-x="640" d=" M192 64H384C437 64 480 107 480 160H512C582.6 160 640 217.4 640 288S582.6 416 512 416H120C106.7 416 96 405.3 96 392V160C96 107 139 64 192 64zM512 352C547.3 352 576 323.3 576 288S547.3 224 512 224H480V352H512zM559.7 -32H48.3C0.7 -32 -12.7 32 12.3 32H595.5999999999999C620.5999999999999 32 607.3999999999999 -32 559.6999999999999 -32z" />
+    <glyph glyph-name="cog"
+      unicode="&#xF013;"
+      horiz-adv-x="512" d=" M444.788 156.9L487.404 132.301C492.271 129.492 494.53 123.683 492.863 118.316C481.793 82.674 462.893 50.474 438.174 23.73A12.015999999999998 12.015999999999998 0 0 0 423.342 21.4759999999999L380.758 46.0709999999999A191.577 191.577 0 0 0 319.999 10.9409999999999V-38.2410000000001A12.01 12.01 0 0 0 310.622 -49.9590000000001C275.666 -57.8090000000001 238.123 -58.2150000000001 201.403 -49.9660000000001C195.913 -48.7330000000001 192 -43.8700000000001 192 -38.2430000000001V10.9409999999999A191.555 191.555 0 0 0 131.241 46.0709999999999L88.657 21.4759999999999A12.015999999999998 12.015999999999998 0 0 0 73.825 23.7299999999999C49.107 50.4739999999999 30.206 82.6739999999999 19.136 118.3159999999999C17.469 123.6819999999999 19.728 129.4909999999999 24.595 132.3009999999999L67.212 156.9A193.48000000000002 193.48000000000002 0 0 0 67.212 227.099L24.596 251.698C19.729 254.507 17.47 260.316 19.137 265.683C30.207 301.325 49.107 333.525 73.826 360.269A12.015999999999998 12.015999999999998 0 0 0 88.658 362.523L131.242 337.928A191.577 191.577 0 0 0 192.001 373.058V422.241A12.01 12.01 0 0 0 201.3780000000001 433.959C236.3340000000001 441.8090000000001 273.8770000000001 442.215 310.5970000000001 433.966C316.0870000000001 432.733 320.0000000000001 427.87 320.0000000000001 422.243V373.059A191.555 191.555 0 0 0 380.7590000000001 337.929L423.3430000000001 362.524A12.015999999999998 12.015999999999998 0 0 0 438.1750000000001 360.27C462.8930000000001 333.526 481.7940000000001 301.326 492.8640000000001 265.684C494.5310000000001 260.318 492.2720000000001 254.509 487.4050000000001 251.699L444.788 227.1A193.485 193.485 0 0 0 444.788 156.9zM336 192C336 236.112 300.112 272 256 272S176 236.112 176 192S211.888 112 256 112S336 147.888 336 192z" />
+    <glyph glyph-name="cogs"
+      unicode="&#xF085;"
+      horiz-adv-x="640" d=" M512.1 257L503.9 242.7C500.9 237.4 494.5000000000001 235.2 488.8 237.3C477 241.7 466.2 248 456.7 255.9C452.1 259.7 450.9 266.4 453.9 271.6L462.1 285.9C455.2 293.9 449.8 303.2 446.2 313.3H429.7C423.7 313.3 418.5 317.6 417.5 323.6C415.5 335.6 415.4 348.2 417.5 360.7C418.5 366.7 423.7 371.1 429.7 371.1H446.2C449.8 381.2 455.2 390.5 462.1 398.5L453.9 412.8C450.9 418 452 424.7 456.7 428.5C466.2 436.4 477.1 442.7 488.8 447.1C494.5 449.2 500.9 447 503.9 441.7L512.1 427.4C522.6 429.3 533.3000000000001 429.3 543.8000000000001 427.4L552 441.7C555 447 561.4 449.2 567.1 447.1C578.9 442.7 589.7 436.4 599.2 428.5C603.8000000000001 424.7 605 418 602 412.8L593.8 398.5C600.6999999999999 390.5 606.0999999999999 381.2 609.6999999999999 371.1H626.1999999999999C632.1999999999999 371.1 637.4 366.8 638.4 360.8C640.4 348.8 640.5 336.2 638.4 323.7C637.4 317.7 632.1999999999999 313.3 626.1999999999999 313.3H609.6999999999999C606.0999999999999 303.2 600.6999999999999 293.9 593.8 285.9L602 271.6C605 266.4 603.9 259.7 599.2 255.9C589.7 248 578.8000000000001 241.7 567.1 237.3C561.4 235.2 555 237.4 552 242.7L543.8 257C533.4 255.1 522.5999999999999 255.1 512.0999999999999 257zM501.6 315.8C540.1 286.2000000000001 584 330.1 554.4 368.6C515.9 398.3 472 354.3 501.6 315.8zM386.3 161.9L420 145.1C430.1 139.3 434.5 127 430.5 116C421.6 91.8 404.1 69.6 387.9 50.1999999999999C380.5 41.3 367.7 39.0999999999999 357.6 44.8999999999999L328.5 61.6999999999999C312.5 47.9999999999999 293.8999999999999 37.0999999999999 273.6 29.9999999999999V-3.6000000000001C273.6 -15.2000000000001 265.3 -25.2000000000001 253.9 -27.2000000000001C229.3 -31.4000000000001 203.5 -31.6000000000001 178 -27.2000000000001C166.5 -25.2000000000001 158 -15.3000000000001 158 -3.6000000000001V30C137.7 37.2 119.1 48 103.1 61.7L74 45C64 39.2 51.1 41.4 43.7 50.3C27.5 69.7 10.4 91.9 1.5 116C-2.5 126.9 1.9 139.2 12 145.1L45.3 161.9C41.4 182.8 41.4 204.3000000000001 45.3 225.3000000000001L12 242.2C1.9 248 -2.6 260.3 1.5 271.2C10.4 295.4 27.5 317.6 43.7 337C51.1 345.9 63.9 348.1 74 342.3L103.1 325.5C119.1 339.2 137.7 350.1 158 357.2V390.9C158 402.4 166.2 412.4 177.6 414.4C202.2 418.6 228.1 418.8 253.6 414.5C265.1 412.5 273.6 402.6 273.6 390.9V357.3C293.9000000000001 350.1 312.5 339.3 328.5 325.6L357.6 342.4C367.6 348.2 380.5 346 387.9000000000001 337.1C404.1 317.7 421.1 295.5 430.0000000000001 271.3C434.0000000000001 260.4 430.1000000000001 248.1 420.0000000000001 242.2L386.3000000000001 225.4C390.2000000000001 204.4 390.2000000000001 182.9 386.3000000000001 161.9zM268.7000000000001 140.8C327.9000000000001 217.8 240.0000000000001 305.7 163.0000000000001 246.5C103.8000000000001 169.5 191.7000000000001 81.5999999999999 268.7000000000001 140.8zM512.1 -41.9L503.9 -56.2C500.9 -61.5000000000001 494.5000000000001 -63.7 488.8 -61.6C477 -57.2 466.2 -50.9 456.7 -43C452.1 -39.2 450.9 -32.5 453.9 -27.3L462.1 -13C455.2 -5 449.8 4.3 446.2 14.4H429.7C423.7 14.4 418.5 18.7 417.5 24.7C415.5 36.7 415.4 49.3 417.5 61.8C418.5 67.8 423.7 72.2 429.7 72.2H446.2C449.8 82.3 455.2 91.6 462.1 99.6L453.9 113.9C450.9 119.1 452 125.8 456.7 129.6C466.2 137.5 477.1 143.8 488.8 148.2C494.5 150.3 500.9 148.1 503.9 142.8L512.1 128.5C522.6 130.4 533.3000000000001 130.4 543.8000000000001 128.5L552.0000000000001 142.8C555.0000000000001 148.1 561.4000000000001 150.3 567.1000000000001 148.2C578.9000000000001 143.8 589.7000000000002 137.5 599.2000000000002 129.6C603.8000000000002 125.8 605.0000000000001 119.1 602.0000000000001 113.9L593.8000000000001 99.6C600.7 91.6 606.1 82.3 609.7 72.2H626.2C632.2 72.2 637.4000000000001 67.9 638.4000000000001 61.9C640.4000000000001 49.9 640.5000000000001 37.3 638.4000000000001 24.8C637.4000000000001 18.8 632.2 14.4 626.2 14.4H609.7C606.1 4.3 600.7 -5 593.8000000000001 -13L602.0000000000001 -27.3C605.0000000000001 -32.5 603.9000000000001 -39.2 599.2000000000002 -43C589.7000000000002 -50.9 578.8000000000002 -57.2 567.1000000000001 -61.6C561.4000000000001 -63.7 555.0000000000001 -61.5 552.0000000000001 -56.2L543.8000000000001 -41.9C533.4000000000001 -43.8 522.6 -43.8 512.1 -41.9zM501.6 17C540.1 -12.6 584 31.3 554.4 69.8C515.9 99.4 472 55.5 501.6 17z" />
+    <glyph glyph-name="columns"
+      unicode="&#xF0DB;"
+      horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM224 32H64V288H224V32zM448 32H288V288H448V32z" />
+    <glyph glyph-name="comment-alt"
+      unicode="&#xF27A;"
+      horiz-adv-x="512" d=" M448 448H64C28.7 448 0 419.3 0 384V96C0 60.7 28.7 32 64 32H160V-52C160 -61.8 171.2 -67.5 179.1 -61.7L304 32H448C483.3 32 512 60.7 512 96V384C512 419.3 483.3 448 448 448z" />
+    <glyph glyph-name="comment-dots"
+      unicode="&#xF4AD;"
+      horiz-adv-x="512" d=" M256 416C114.6 416 0 322.9 0 208C0 158.4 21.4 113 57 77.3C44.5 26.9 2.7 -18 2.2 -18.5C0 -20.8 -0.6 -24.2 0.7 -27.2S4.8 -32 8 -32C74.3 -32 124 -0.2 148.6 19.4C181.3 7.1 217.6 0 256 0C397.4 0 512 93.1 512 208S397.4 416 256 416zM128 176C110.3 176 96 190.3 96 208S110.3 240 128 240S160 225.7 160 208S145.7 176 128 176zM256 176C238.3 176 224 190.3 224 208S238.3 240 256 240S288 225.7 288 208S273.7 176 256 176zM384 176C366.3 176 352 190.3 352 208S366.3 240 384 240S416 225.7 416 208S401.7 176 384 176z" />
+    <glyph glyph-name="comment-slash"
+      unicode="&#xF4B3;"
+      horiz-adv-x="640" d=" M64 208C64 158.4 85.4 113 121 77.3C108.4 27 66.7 -17.9 66.2 -18.5C64 -20.8 63.4 -24.2 64.7 -27.2C66 -30.1 68.8 -32 72 -32C138.3 -32 188 -0.2 212.6 19.4C245.3 7.1 281.6 0 320 0C347.4 0 373.7 3.6 398.4 10L72.9 261.6C67.3 244.5 64 226.6 64 208zM633.8 -10.1L519.4 78.3C554.6 113.9 576 158.8 576 208C576 322.9 461.4 416 320 416C254.9 416 195.8 395.9 150.6 363.3L45.5 444.6C38.5 450 28.5 448.8 23 441.8L3.4 416.6C-2 409.6 -0.8 399.6 6.2 394.2L594.6 -60.5C601.6 -65.9 611.6 -64.7 617.1 -57.7L636.7 -32.4C642.1 -25.6 640.8000000000001 -15.5 633.8000000000001 -10.1z" />
+    <glyph glyph-name="comment"
+      unicode="&#xF075;"
+      horiz-adv-x="512" d=" M256 416C114.6 416 0 322.9 0 208C0 158.4 21.4 113 57 77.3C44.5 26.9 2.7 -18 2.2 -18.5C0 -20.8 -0.6 -24.2 0.7 -27.2S4.8 -32 8 -32C74.3 -32 124 -0.2 148.6 19.4C181.3 7.1 217.6 0 256 0C397.4 0 512 93.1 512 208S397.4 416 256 416z" />
+    <glyph glyph-name="comments"
+      unicode="&#xF086;"
+      horiz-adv-x="576" d=" M416 256C416 344.4 322.9 416 208 416S0 344.4 0 256C0 221.7 14.1 190.1 38 164C24.6 133.8 2.5 109.8 2.2 109.5C0 107.2 -0.6 103.8 0.7 100.8S4.8 96 8 96C44.6 96 74.9 108.3 96.7 121C128.9 105.3 167 96 208 96C322.9 96 416 167.6 416 256zM538 36C561.9 62 576 93.7 576 128C576 194.9 522.5 252.2 446.7 276.1C447.6 269.5 448 262.8 448 256C448 150.1 340.3 64 208 64C197.2 64 186.7 64.8 176.3 65.9C207.8 8.4 281.8 -32 368 -32C409 -32 447.1 -22.8 479.3 -7C501.1 -19.7 531.4 -32 568 -32C571.2 -32 574.1 -30.1 575.3 -27.2C576.5999999999999 -24.3 576 -20.9 573.8 -18.5C573.5 -18.2 551.4 5.7 538 36z" />
+    <glyph glyph-name="compass"
+      unicode="&#xF14E;"
+      horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM307.4460000000001 327.156L204.804 229.377A23.997 23.997 0 0 1 198.0320000000001 217.648L164.673 79.869C158.993 56.41 187.4500000000001 40.551 204.553 56.845L307.1930000000001 154.624A23.99 23.99 0 0 1 313.9650000000001 166.353L347.324 304.132C352.942 327.3300000000001 324.733 343.625 307.4460000000001 327.156zM256 224C238.327 224 224 209.673 224 192S238.327 160 256 160S288 174.327 288 192S273.673 224 256 224z" />
+    <glyph glyph-name="compress"
+      unicode="&#xF066;"
+      horiz-adv-x="448" d=" M436 256H312C298.7 256 288 266.7 288 280V404C288 410.6 293.4 416 300 416H340C346.6 416 352 410.6 352 404V320H436C442.6 320 448 314.6 448 308V268C448 261.4 442.6 256 436 256zM160 280V404C160 410.6 154.6 416 148 416H108C101.4 416 96 410.6 96 404V320H12C5.4 320 0 314.6 0 308V268C0 261.4 5.4 256 12 256H136C149.3 256 160 266.7 160 280zM160 -20V104C160 117.3 149.3 128 136 128H12C5.4 128 0 122.6 0 116V76C0 69.4 5.4 64 12 64H96V-20C96 -26.6 101.4 -32 108 -32H148C154.6 -32 160 -26.6 160 -20zM352 -20V64H436C442.6 64 448 69.4 448 76V116C448 122.6 442.6 128 436 128H312C298.7 128 288 117.3 288 104V-20C288 -26.6 293.4 -32 300 -32H340C346.6 -32 352 -26.6 352 -20z" />
+    <glyph glyph-name="copy"
+      unicode="&#xF0C5;"
+      horiz-adv-x="448" d=" M320 0V-40C320 -53.255 309.255 -64 296 -64H24C10.745 -64 0 -53.255 0 -40V328C0 341.255 10.745 352 24 352H96V56C96 25.121 121.121 0 152 0H320zM320 344V448H152C138.745 448 128 437.255 128 424V56C128 42.745 138.745 32 152 32H424C437.255 32 448 42.745 448 56V320H344C330.8 320 320 330.8 320 344zM440.971 375.029L375.029 440.971A24 24 0 0 1 358.0590000000001 448H352V352H448V358.059A24 24 0 0 1 440.971 375.029z" />
+    <glyph glyph-name="copyright"
+      unicode="&#xF1F9;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM373.134 93.247C371.5420000000001 91.38 333.358 47.516 263.283 47.516C178.591 47.516 118.799 110.776 118.799 193.083C118.799 274.386 180.803 336.4840000000001 262.5610000000001 336.4840000000001C329.5180000000001 336.4840000000001 364.5260000000001 299.1690000000001 365.9830000000001 297.5800000000001A12 12 0 0 0 367.2210000000001 282.9570000000001L344.8410000000001 248.3020000000001C340.7920000000001 242.0350000000001 332.0670000000001 240.9510000000001 326.6070000000001 246.0070000000001C326.3740000000001 246.2210000000001 300.0780000000001 269.8870000000001 264.7270000000001 269.8870000000001C218.6110000000001 269.8870000000001 190.8110000000001 236.3120000000001 190.8110000000001 193.8050000000001C190.8110000000001 154.2030000000001 216.3250000000001 114.1130000000001 265.0880000000001 114.1130000000001C303.7850000000001 114.1130000000001 330.3680000000001 142.4510000000001 330.6320000000001 142.7380000000001C335.7640000000001 148.3030000000001 344.6910000000001 147.7710000000001 349.1400000000001 141.6850000000001L373.6870000000001 108.1130000000001A12.001000000000001 12.001000000000001 0 0 0 373.1340000000001 93.2470000000001z" />
+    <glyph glyph-name="couch"
+      unicode="&#xF4B8;"
+      horiz-adv-x="640" d=" M160 224V160H480V224C480 259.3 508.7 288 544 288H576C576 341 533 384 480 384H160C107 384 64 341 64 288H96C131.3 288 160 259.3 160 224zM576 256H544C526.3 256 512 241.7 512 224V128H128V224C128 241.7 113.7 256 96 256H64C28.7 256 0 227.3 0 192C0 168.4 13 148 32 136.9V16C32 7.2 39.2 0 48 0H112C120.8 0 128 7.2 128 16V32H512V16C512 7.2 519.2 0 528 0H592C600.8 0 608 7.2 608 16V136.9C627 148 640 168.4 640 192C640 227.3 611.3 256 576 256z" />
+    <glyph glyph-name="credit-card"
+      unicode="&#xF09D;"
+      horiz-adv-x="576" d=" M0 16C0 -10.5 21.5 -32 48 -32H528C554.5 -32 576 -10.5 576 16V192H0V16zM192 84C192 90.6 197.4 96 204 96H340C346.6 96 352 90.6 352 84V44C352 37.4 346.6 32 340 32H204C197.4 32 192 37.4 192 44V84zM64 84C64 90.6 69.4 96 76 96H148C154.6 96 160 90.6 160 84V44C160 37.4 154.6 32 148 32H76C69.4 32 64 37.4 64 44V84zM576 368V320H0V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368z" />
+    <glyph glyph-name="crop"
+      unicode="&#xF125;"
+      horiz-adv-x="512" d=" M488 96H448V338.7L505 395.7C514.4 405.1 514.4 420.3 505 429.6L493.7 441C484.3 450.4 469.1 450.4 459.8 441L402.8 384H160V424C160 437.3 149.3 448 136 448H88C74.7 448 64 437.3 64 424V384H24C10.7 384 0 373.3 0 360V312C0 298.7 10.7 288 24 288H64V24C64 10.7 74.7 0 88 0H352V-40C352 -53.3 362.7 -64 376 -64H424C437.3 -64 448 -53.3 448 -40V0H488C501.3 0 512 10.7 512 24V72C512 85.3 501.3 96 488 96zM306.7 288L160 141.3V288H306.7zM205.3 96L352 242.7V96H205.3z" />
+    <glyph glyph-name="crosshairs"
+      unicode="&#xF05B;"
+      horiz-adv-x="512" d=" M500 224H469.636C455.724 317.675 381.675 391.724 288 405.636V436C288 442.627 282.627 448 276 448H236C229.373 448 224 442.627 224 436V405.636C130.325 391.724 56.276 317.675 42.364 224H12C5.373 224 0 218.627 0 212V172C0 165.373 5.373 160 12 160H42.364C56.276 66.325 130.325 -7.724 224 -21.636V-52C224 -58.627 229.373 -64 236 -64H276C282.627 -64 288 -58.627 288 -52V-21.636C381.675 -7.724 455.724 66.325 469.636 160H500C506.627 160 512 165.373 512 172V212C512 218.627 506.627 224 500 224zM288 43.366V84C288 90.627 282.627 96 276 96H236C229.373 96 224 90.627 224 84V43.366C165.826 55.768 119.783 101.757 107.366 160H148C154.627 160 160 165.373 160 172V212C160 218.627 154.627 224 148 224H107.366C119.768 282.174 165.757 328.217 224 340.634V300C224 293.373 229.373 288 236 288H276C282.627 288 288 293.373 288 300V340.634C346.174 328.232 392.217 282.243 404.634 224H364C357.373 224 352 218.627 352 212V172C352 165.373 357.373 160 364 160H404.634C392.2320000000001 101.826 346.243 55.783 288 43.366zM288 192C288 174.327 273.673 160 256 160S224 174.327 224 192C224 209.673 238.327 224 256 224S288 209.673 288 192z" />
+    <glyph glyph-name="cube"
+      unicode="&#xF1B2;"
+      horiz-adv-x="512" d=" M239.1 441.7L31.1 363.7C12.4 356.7 0 338.7 0 318.7V93.6C0 75.4 10.3 58.8 26.5 50.7L234.5 -53.3C248 -60.1 263.9 -60.1 277.4 -53.3L485.4 50.7C501.7 58.8000000000001 511.9 75.5000000000001 511.9 93.6V318.7C511.9 338.7 499.5 356.6 480.8 363.6L272.8 441.6C262 445.8 250 445.8 239.1 441.7zM256 379.6L448 307.6V306.5L256 228.5L64 306.5V307.6L256 379.6zM288 23.6V172.5L448 237.5V103.6L288 23.6z" />
+    <glyph glyph-name="cubes"
+      unicode="&#xF1B3;"
+      horiz-adv-x="512" d=" M488.6 197.8L392 234V342.5C392 357.5 382.7 370.9 368.6 376.2L268.6 413.7C260.5 416.8 251.5000000000001 416.8 243.3 413.7L143.3 376.2C129.2 370.9 119.9 357.5 119.9 342.5V234L23.3 197.8C9.3 192.5 0 179.1 0 164.1V54C0 40.4 7.7 27.9 19.9 21.8L119.9 -28.2C130 -33.3 142 -33.3 152.1 -28.2L256 23.8L359.9 -28.2C370 -33.3 382 -33.3 392.1 -28.2L492.1 21.8C504.3 27.9 511.9999999999999 40.4 511.9999999999999 54V164.1C511.9999999999999 179.1 502.6999999999999 192.5 488.6 197.8zM358 233.2L273 201.3V269.5L358 306.5V233.2zM154 343.9L256 382.1L358 343.9V343.3L256 301.9L154 343.3V343.9zM238 52.8L153 10.3V89.4L238 128.2V52.8zM238 164.8L136 123.4L34 164.8V165.4L136 203.6L238 165.4V164.8zM478 52.8L393 10.3V89.4L478 128.2V52.8zM478 164.8L376 123.4L274 164.8V165.4L376 203.6L478 165.4V164.8z" />
+    <glyph glyph-name="cut"
+      unicode="&#xF0C4;"
+      horiz-adv-x="448" d=" M444.485 25.574C449.1740000000001 20.885 449.1690000000001 13.287 444.485 8.603C411.6810000000001 -24.201 358.4940000000001 -24.201 325.69 8.603L210.176 124.117L185.317 99.258C189.63 88.343 192 76.448 192 64C192 10.981 149.019 -32 96 -32S0 10.981 0 64S42.981 160 96 160C100.536 160 104.995 159.678 109.363 159.07L142.293 192L109.363 224.93C104.995 224.322 100.536 224 96 224C42.981 224 0 266.981 0 320S42.981 416 96 416S192 373.019 192 320C192 307.552 189.63 295.6570000000001 185.318 284.742L210.177 259.883L325.69 375.397C358.4940000000001 408.201 411.681 408.201 444.485 375.397C449.1690000000001 370.713 449.1740000000001 363.115 444.485 358.426L278.0590000000001 192L444.485 25.574zM96 352C78.355 352 64 337.645 64 320S78.355 288 96 288S128 302.355 128 320S113.645 352 96 352M96 96C78.355 96 64 81.645 64 64S78.355 32 96 32S128 46.355 128 64S113.645 96 96 96M208 204C201.373 204 196 198.627 196 192S201.373 180 208 180S220 185.373 220 192S214.627 204 208 204z" />
+    <glyph glyph-name="database"
+      unicode="&#xF1C0;"
+      horiz-adv-x="448" d=" M448 374.857V329.1430000000001C448 288.857 347.667 256 224 256S0 288.857 0 329.1430000000001V374.857C0 415.1430000000001 100.333 448 224 448S448 415.1430000000001 448 374.857zM448 272V169.143C448 128.857 347.667 96 224 96S0 128.857 0 169.143V272C48.125 238.857 136.208 223.428 224 223.428S399.874 238.857 448 272zM448 112V9.143C448 -31.143 347.667 -64 224 -64S0 -31.143 0 9.143V112C48.125 78.857 136.208 63.428 224 63.428S399.874 78.857 448 112z" />
+    <glyph glyph-name="deaf"
+      unicode="&#xF2A4;"
+      horiz-adv-x="512" d=" M216 188C216 172.536 203.464 160 188 160S160 172.536 160 188C160 232.112 195.888 268 240 268S320 232.112 320 188C320 172.536 307.464 160 292 160S264 172.536 264 188C264 201.234 253.233 212 240 212S216 201.234 216 188zM240 364C142.953 364 64 285.0470000000001 64 188C64 172.536 76.536 160 92 160S120 172.536 120 188C120 254.168 173.832 308 240 308S360 254.168 360 188C360 112.836 288.991 117.689 288.003 44.378L288 44C288 15.327 264.673 -8 236 -8C220.536 -8 208 -20.536 208 -36S220.536 -64 236 -64C295.475 -64 343.876 -15.672 344 43.774C344.5950000000001 78.202 416 92.014 416 188C416 285.0470000000001 337.0470000000001 364 240 364zM508.485 416.201L480.2 444.485C475.513 449.171 467.916 449.171 463.229 444.485L376.2 357.456C371.514 352.77 371.514 345.1720000000001 376.2 340.485L404.485 312.2C409.171 307.514 416.769 307.514 421.4550000000001 312.2L508.485 399.229C513.172 403.917 513.172 411.515 508.485 416.201zM168.97 133.255C164.284 137.941 156.686 137.941 152 133.255L3.515 -15.23C-1.171 -19.916 -1.171 -27.514 3.515 -32.201L31.8 -60.485C36.487 -65.171 44.084 -65.171 48.771 -60.485L197.256 88C201.942 92.686 201.942 100.284 197.256 104.971L168.97 133.255z" />
+    <glyph glyph-name="desktop"
+      unicode="&#xF108;"
+      horiz-adv-x="576" d=" M528 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H240L224 -16H152C138.7 -16 128 -26.7 128 -40S138.7 -64 152 -64H424C437.3 -64 448 -53.3 448 -40S437.3 -16 424 -16H352L336 32H528C554.5 32 576 53.5 576 80V400C576 426.5 554.5 448 528 448zM512 96H64V384H512V96z" />
+    <glyph glyph-name="diagnoses"
+      unicode="&#xF470;"
+      horiz-adv-x="640" d=" M496 192C504.8 192 512 199.2 512 208S504.8 224 496 224S480 216.8 480 208S487.2 192 496 192zM320 272C368.5 272 408 311.5 408 360S368.5 448 320 448S232 408.5 232 360S271.5 272 320 272zM59.8 84C70 68.7 89.1 66.2 102.7 74.2C118.9 83.8 158.9 105.9 208 122.8V32H432V122.7C481.1 105.9 521.1 83.7 537.3 74.1C550.9 66.1 570 68.8 580.1999999999999 83.9L597.9999999999999 110.6C606.7999999999998 123.8 605.5999999999999 145.2 587.9999999999999 155.7C576.0999999999999 162.8 558.2999999999998 172.7 536.8999999999999 183.1C508.7999999999998 137 437.4999999999999 165.3 449.1999999999999 218.2C409.3 230.8 365.1 240 320 240C263 240 207.1 225.5 160 207.8C159.8 167.6 112.4 144.5 80.8 171.8C69.6 165.8 59.5 160.2 52.1 155.8C34.5 145.3 33.3 124 42.1 110.7L59.8 84zM368 104C381.3 104 392 93.3 392 80S381.3 56 368 56S344 66.7 344 80S354.7 104 368 104zM272 200C285.3 200 296 189.3 296 176S285.3 152 272 152S248 162.7 248 176S258.7 200 272 200zM112 192C120.8 192 128 199.2 128 208S120.8 224 112 224S96 216.8 96 208S103.2 192 112 192zM624 0H16C7.2 0 0 -7.2 0 -16V-48C0 -56.8 7.2 -64 16 -64H624C632.8 -64 640 -56.8 640 -48V-16C640 -7.2 632.8 0 624 0z" />
+    <glyph glyph-name="dna"
+      unicode="&#xF471;"
+      horiz-adv-x="448" d=" M447.9 430.1C449 439.6 441.6 447.9 432 447.9L399.6 448C391.5 448 384.7000000000001 442.1 383.6 434.1C382.9000000000001 429.2 381.8 423 380.2000000000001 416H67.9C66.3 422.9 65 429.2 64.4 434.1C63.3 442.1 56.5 448.1 48.4 448L16.1 447.9C6.5 447.9 -1 439.6 0.1 430.1C4.7 392.2 25.7 301.1 119 222.4C136.6 234.8 156.1 246.6 177.5 257.8C171.3 262.4 166.1 267.2000000000001 160.5 272H288.1C266.8 253.9 241.1 236.4 209.4 220.6C37.5 135.1 5.9 1.8 0.1 -46.1C-1 -55.6 6.4 -63.9 16 -63.9L48.3 -64C56.4 -64 63.2 -58.1 64.3 -50.1C65 -45.2 66.1 -39 67.7 -32H380.1C381.7 -39 382.8 -45.1 383.5 -50.1C384.6 -58.1 391.3999999999999 -64.1 399.5 -64L431.8 -63.9C441.4 -63.9 448.9 -55.6 447.7 -46.1C442.7 -3.2 416.5999999999999 107.8000000000001 288 192C416.5 276.2 442.7 387.2 447.9 430.1zM224 155.6C249.1 141.9 270.4 127.2000000000001 288.3 112H159.7C177.6 127.2 198.9 142 224 155.6zM92.9 32C98.7 42.4 105.7 53.1 113.9 64H333.9C342.2 53.1 349.2 42.4 354.9 32H92.9zM355.1 352C349.3 341.6 342.3 330.9 334.1 320H114.6C106.3 330.9 99.2 341.6 93.4 352H355.1z" />
+    <glyph glyph-name="dollar-sign"
+      unicode="&#xF155;"
+      horiz-adv-x="288" d=" M209.2 214.6L101.2 246.2C88.7 249.8 80 261.5 80 274.5C80 290.8 93.2 304 109.5 304H175.8C188 304 200 300.3 210 293.5C216.1 289.4 224.3 290.4 229.5 295.5L264.3 329.5C271.4000000000001 336.4 270.4000000000001 347.9 262.5 354C238 373.2 207.4 383.9 176 384V432C176 440.8 168.8 448 160 448H128C119.2 448 112 440.8 112 432V384H109.5C45.8 384 -5.4 329.3 0.5 264.4C4.7 218.3 39.9 180.8 84.3 167.8L186.8 137.8C199.3 134.1 208 122.5 208 109.5C208 93.2 194.8 80 178.5 80H112.2C100 80 88 83.7 78 90.5C71.9 94.6 63.7 93.6 58.5 88.5L23.7 54.5C16.6 47.6 17.6 36.1 25.5 30C50 10.8 80.6 0.1 112 0V-48C112 -56.8 119.2 -64 128 -64H160C168.8 -64 176 -56.8 176 -48V0.2C222.6 1.1 266.3 28.8 281.7 72.9C303.2 134.5 267.1 197.7 209.2 214.6z" />
+    <glyph glyph-name="dolly-flatbed"
+      unicode="&#xF474;"
+      horiz-adv-x="640" d=" M208 128H592C600.8 128 608 135.2 608 144V400C608 408.8 600.8 416 592 416H448V288L400 320L352 288V416H208C199.2 416 192 408.8 192 400V144C192 135.2 199.2 128 208 128zM624 64H128V432C128 440.8 120.8 448 112 448H16C7.2 448 0 440.8 0 432V400C0 391.2 7.2 384 16 384H64V16C64 7.2 71.2 0 80 0H162.9C161.1 -5 160 -10.4 160 -16C160 -42.5 181.5 -64 208 -64S256 -42.5 256 -16C256 -10.4 254.8 -5 253.1 0H451C449.2 -5 448.1 -10.4 448.1 -16C448.1 -42.5 469.6 -64 496.1 -64S544.1 -42.5 544.1 -16C544.1 -10.4 542.9 -5 541.2 0H624C632.8 0 640 7.2 640 16V48C640 56.8 632.8 64 624 64z" />
+    <glyph glyph-name="dolly"
+      unicode="&#xF472;"
+      horiz-adv-x="576" d=" M294.2 170.3C312.2 165.3 328.9 156.9 343.7 145.6L505.2 199.4C513.6 202.2000000000001 518.1 211.3000000000001 515.3 219.6L454.9 400.8C452.1 409.2 443 413.7 434.7 410.9L373.6 390.5L406.7 291.1L346 271L312.9 370.4L251.3 349.9C242.9 347.1 238.4 338 241.2 329.7L294.2 170.3zM575.2 121.6L565 152C562.2 160.4 553.1 164.9 544.8 162.1L331.3 90.9C314.1 112.9 287.7 127.3 257.8 127.9L158.4 426.1C154 439.2 141.8 448 128 448H16C7.2 448 0 440.8 0 432V400C0 391.2 7.2 384 16 384H104.9L197.1 107.3C171 86.9 155.4 53.7 161.1 16.8C167.2 -22.6 199 -55.5 238.4000000000001 -62.4C298.6 -73.1 350.7000000000001 -27.6 351.8000000000001 30.2L565.1000000000001 101.4C573.4000000000001 104.2000000000001 578.0000000000001 113.2000000000001 575.2000000000002 121.6zM256 -16C229.5 -16 208 5.5 208 32S229.5 80 256 80S304 58.5 304 32S282.5 -16 256 -16z" />
+    <glyph glyph-name="donate"
+      unicode="&#xF4B9;"
+      horiz-adv-x="512" d=" M256 32C370.9 32 464 125.1 464 240S370.9 448 256 448S48 354.9 48 240S141.1 32 256 32zM233.8 350.6V367.4C233.8 376.6 241.2 384 250.4 384H261.5C270.7 384 278.1 376.6 278.1 367.4V350.4C293.6 349.6 308.6 344.3 321.1 335C326.7000000000001 330.9 327.3 322.7 322.3 317.9L306 302.4C302.2 298.7000000000001 296.5 298.6 292 301.4C286.6 304.8 280.6 306.5 274.2 306.5H235.3C226.3 306.5 219 298.3 219 288.2C219 280 224 272.7 231.1 270.6L293.4 251.9C319.1 244.2 337.1 219.5 337.1 191.8C337.1 157.8 310.7 130.3 278 129.4V112.6C278 103.4 270.6 96 261.3999999999999 96H250.3C241.1 96 233.7 103.4 233.7 112.6V129.6C218.1999999999999 130.4 203.1999999999999 135.7000000000001 190.6999999999999 145C185.0999999999999 149.1 184.5 157.3 189.5 162.1L205.8 177.6C209.6 181.3 215.3 181.4 219.8 178.6C225.2 175.2000000000001 231.2 173.5 237.6 173.5H276.5C285.5 173.5 292.8 181.7 292.8 191.8C292.8 200 287.8 207.3 280.7 209.4L218.3999999999999 228.1C192.6999999999999 235.8 174.6999999999999 260.5 174.6999999999999 288.2C174.7999999999999 322.2 201.0999999999999 349.7 233.8 350.6zM480 96H447.5C427.9 70 402.9 48.3 374.5 32H438.3C443.6 32 447.9000000000001 28.4 447.9000000000001 24V8C447.9000000000001 3.6 443.6 0 438.3 0H73.6C68.3 0 64 3.6 64 8V24C64 28.4 68.3 32 73.6 32H137.4C109 48.3 84.1 70 64.4 96H32C14.3 96 0 81.7 0 64V-32C0 -49.7 14.3 -64 32 -64H480C497.7 -64 512 -49.7 512 -32V64C512 81.7 497.7 96 480 96z" />
+    <glyph glyph-name="dot-circle"
+      unicode="&#xF192;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM336 192C336 147.888 300.112 112 256 112S176 147.888 176 192S211.888 272 256 272S336 236.112 336 192z" />
+    <glyph glyph-name="dove"
+      unicode="&#xF4BA;"
+      horiz-adv-x="512" d=" M288 280.8V308.9C259.8 345.2 240.9 388.2 233.9 434.1C231.8 447.6 214.9 452.9 206.1 442.4000000000001C185 417.5 168.4 388.3 157.2 355.9C191.4 317.6 237.2 291.3 288 280.8zM400 384C355.8 384 320 348.1 320 303.9V244.5C215.6 250.7 127 315 87 406.2C81.5 418.7 63.8 419.4 58 407.1C41.4 372 32 332.8 32 291.4C32 220.6 66.1 154.5 117.1 105.5C130.3 92.8 143.2 82.3 156 72.7L12.1 36.7C1.4 34 -3.4 21.6 2.6 12.3C20 -14.6 63 -60.2 155.8 -64C163.8 -64.2999999999999 171.8 -61.4 177.9 -56.1L243.1 0H320C408.4 0 480 71.5 480 159.9V320L512 384H400zM400 287.9C391.2 287.9 384 295.1 384 303.9S391.2 319.9 400 319.9S416 312.7000000000001 416 303.9S408.8 287.9 400 287.9z" />
+    <glyph glyph-name="download"
+      unicode="&#xF019;"
+      horiz-adv-x="512" d=" M216 448H296C309.3 448 320 437.3 320 424V256H407.7C425.5 256 434.4 234.5 421.8 221.9L269.7 69.7C262.2 62.2 249.9 62.2 242.4 69.7L90.1 221.9C77.5 234.5 86.4 256 104.2 256H192V424C192 437.3 202.7 448 216 448zM512 72V-40C512 -53.3 501.3 -64 488 -64H24C10.7 -64 0 -53.3 0 -40V72C0 85.3 10.7 96 24 96H170.7L219.7 47C239.8 26.9 272.2 26.9 292.3 47L341.3 96H488C501.3 96 512 85.3 512 72zM388 -16C388 -5 379 4 368 4S348 -5 348 -16S357 -36 368 -36S388 -27 388 -16zM452 -16C452 -5 443 4 432 4S412 -5 412 -16S421 -36 432 -36S452 -27 452 -16z" />
+    <glyph glyph-name="edit"
+      unicode="&#xF044;"
+      horiz-adv-x="576" d=" M402.6 364.8L492.8 274.6C496.6 270.8 496.6 264.6 492.8 260.8L274.4 42.4L181.6 32.1C169.2 30.7 158.7 41.2 160.1 53.6L170.4 146.4L388.8 364.8C392.6 368.6 398.8 368.6 402.6 364.8zM564.6 387.7L515.8000000000001 436.5C500.6000000000001 451.7 475.9000000000001 451.7 460.6000000000001 436.5L425.2000000000001 401.1C421.4000000000001 397.3 421.4000000000001 391.1 425.2000000000001 387.3L515.4000000000001 297.1C519.2 293.3 525.4000000000001 293.3 529.2 297.1L564.6 332.5C579.8000000000001 347.8 579.8000000000001 372.5 564.6 387.7zM384 101.8V0H64V320H293.8C297 320 300 321.3 302.3 323.5L342.3 363.5C349.9000000000001 371.1 344.5 384 333.8 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V141.8C448 152.5 435.1 157.8 427.5 150.3L387.5 110.3C385.3 108 384 105 384 101.8z" />
+    <glyph glyph-name="eject"
+      unicode="&#xF052;"
+      horiz-adv-x="448" d=" M448 64V0C448 -17.673 433.673 -32 416 -32H32C14.327 -32 0 -17.673 0 0V64C0 81.673 14.327 96 32 96H416C433.673 96 448 81.673 448 64zM48.053 128H399.939C441.5900000000001 128 463.52 177.674 435.322 208.435L259.383 400.442C240.369 421.185 207.632 421.186 188.616 400.442L12.67 208.435C-15.475 177.732 6.324 128 48.053 128z" />
+    <glyph glyph-name="ellipsis-h"
+      unicode="&#xF141;"
+      horiz-adv-x="512" d=" M328 192C328 152.2 295.8 120 256 120S184 152.2 184 192S216.2 264 256 264S328 231.8 328 192zM432 264C392.2 264 360 231.8 360 192S392.2 120 432 120S504 152.2 504 192S471.8 264 432 264zM80 264C40.2 264 8 231.8 8 192S40.2 120 80 120S152 152.2 152 192S119.8 264 80 264z" />
+    <glyph glyph-name="ellipsis-v"
+      unicode="&#xF142;"
+      horiz-adv-x="192" d=" M96 264C135.8 264 168 231.8 168 192S135.8 120 96 120S24 152.2 24 192S56.2 264 96 264zM24 368C24 328.2 56.2 296 96 296S168 328.2 168 368S135.8 440 96 440S24 407.8 24 368zM24 16C24 -23.8 56.2 -56 96 -56S168 -23.8 168 16S135.8 88 96 88S24 55.8 24 16z" />
+    <glyph glyph-name="envelope-open"
+      unicode="&#xF2B6;"
+      horiz-adv-x="512" d=" M512 -16C512 -42.51 490.51 -64 464 -64H48C21.49 -64 0 -42.51 0 -16V247.276A48 48 0 0 0 18.387 285.052C43.3 304.581 63.888 320.4170000000001 182.587 406.563C199.412 418.83 232.797 448.347 256 447.997C279.198 448.351 312.596 418.825 329.413 406.564C448.1 320.427 468.716 304.569 493.613 285.052A48 48 0 0 0 512 247.276V-16zM446.334 180.605C443.771 184.333 438.634 185.2000000000001 434.995 182.512C412.15 165.639 379.533 141.807 329.413 105.433C312.588 93.167 279.2030000000001 63.652 256 64.003C232.789 63.659 199.441 93.146 182.587 105.433C132.473 141.803 99.853 165.637 77.005 182.512C73.366 185.2 68.229 184.333 65.666 180.605L56.594 167.409A7.997999999999999 7.997999999999999 0 0 1 58.433 156.442C81.32 139.543 113.887 115.752 163.736 79.574C184.01 64.793 220.26 31.761 256 32.001C291.724 31.759 327.961 64.7720000000001 348.2630000000001 79.574C398.1130000000001 115.7530000000001 430.6810000000001 139.544 453.566 156.442A7.997999999999999 7.997999999999999 0 0 1 455.405 167.409L446.334 180.605z" />
+    <glyph glyph-name="envelope-square"
+      unicode="&#xF199;"
+      horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM178.117 185.896C87.429 251.713 88.353 251.879 64 270.833V296C64 309.255 74.745 320 88 320H360C373.255 320 384 309.255 384 296V270.833C359.629 251.864 360.566 251.709 269.883 185.895C259.383 178.24 238.491 159.775 224 160.001C209.497 159.783 188.633 178.228 178.117 185.896zM384 230.225V88C384 74.745 373.255 64 360 64H88C74.745 64 64 74.745 64 88V230.225C77.958 219.431 97.329 204.989 159.303 160.011C173.465 149.67 197.278 127.866 223.997 128.001C250.884 127.867 275.034 150.042 288.717 160.026C350.675 204.991 370.042 219.432 384 230.225z" />
+    <glyph glyph-name="envelope"
+      unicode="&#xF0E0;"
+      horiz-adv-x="512" d=" M502.3 257.2C506.2 260.3 512 257.4 512 252.5V48C512 21.5 490.5 0 464 0H48C21.5 0 0 21.5 0 48V252.4C0 257.4 5.7 260.2000000000001 9.7 257.1C32.1 239.7 61.8 217.6 163.8 143.5C184.9 128.1 220.5 95.7 256 95.9C291.7 95.6 328 128.7 348.3 143.5C450.3 217.6 479.9 239.8 502.3 257.2zM256 128C279.2 127.6 312.6 157.2 329.4 169.4C462.1 265.7 472.2 274.1 502.8 298.1C508.6 302.6 511.9999999999999 309.6 511.9999999999999 317V336C511.9999999999999 362.5 490.4999999999999 384 463.9999999999999 384H48C21.5 384 0 362.5 0 336V317C0 309.6 3.4 302.7 9.2 298.1C39.8 274.2 49.9 265.7 182.6 169.4C199.4 157.2 232.8 127.6 256 128z" />
+    <glyph glyph-name="eraser"
+      unicode="&#xF12D;"
+      horiz-adv-x="512" d=" M497.941 174.059C516.6859999999999 192.804 516.6859999999999 223.196 497.941 241.9410000000001L337.941 401.9410000000001C319.196 420.6860000000001 288.805 420.687 270.058 401.9410000000001L14.058 145.941C-4.687 127.196 -4.687 96.804 14.058 78.059L110.058 -17.941A48.004000000000005 48.004000000000005 0 0 1 144 -32H500C506.627 -32 512 -26.627 512 -20V20C512 26.627 506.627 32 500 32H355.883L497.941 174.059zM195.314 236.6860000000001L332.687 99.3130000000001L265.373 32H150.628L70.628 112L195.314 236.686z" />
+    <glyph glyph-name="euro-sign"
+      unicode="&#xF153;"
+      horiz-adv-x="320" d=" M310.706 34.235C309.392 40.865 302.8710000000001 45.107 296.2820000000001 43.604C285.5900000000001 41.165 268.86 38.191 250.8560000000001 38.191C194.0930000000001 38.191 148.9270000000001 72.9810000000001 129.3950000000001 123.6400000000001H243.0840000000001A12 12 0 0 1 254.7920000000001 133.009L261.165 161.369C262.851 168.8710000000001 257.146 176 249.457 176H115.22C114.01 190.328 113.806 204.287 115.357 218.245H261.95A12 12 0 0 1 273.673 227.679L280.185 257.434C281.823 264.918 276.124 272 268.462 272H130.184C150.817 316.991 192.874 347.03 247.803 347.03C262.289 347.03 276.367 344.78 285.654 342.885C291.87 341.617 298.001 345.3830000000001 299.656 351.5080000000001L311.647 395.8760000000001C313.469 402.617 309.182 409.492 302.321 410.793C290.217 413.088 270.71 416 249.635 416C152.451 416 74.03 355.748 45.075 272H12C5.373 272 0 266.627 0 260V230.245C0 223.618 5.373 218.245 12 218.245H33.569C32.56 204.638 32.388 188.958 33.388 176H12C5.373 176 0 170.627 0 164V135.64C0 129.013 5.373 123.64 12 123.64H42.114C67.139 33.308 145.264 -32 249.635 -32C275.936 -32 298.197 -27.456 310.736 -24.212C316.903 -22.617 320.763 -16.504 319.524 -10.255L310.706 34.235z" />
+    <glyph glyph-name="exchange-alt"
+      unicode="&#xF362;"
+      horiz-adv-x="512" d=" M0 280V296C0 309.255 10.745 320 24 320H384V368C384 389.367 409.899 400.0420000000001 424.971 384.971L504.971 304.971C514.343 295.598 514.343 280.4020000000001 504.971 271.03L424.971 191.03C409.956 176.018 384 186.544 384 208V256H24C10.745 256 0 266.745 0 280zM488 128H128V176C128 197.314 102.138 208.08 87.029 192.971L7.029 112.971C-2.343 103.598 -2.343 88.402 7.029 79.03L87.029 -0.97C102.057 -15.997 128 -5.437 128 16V64H488C501.255 64 512 74.745 512 88V104C512 117.255 501.255 128 488 128z" />
+    <glyph glyph-name="exclamation-circle"
+      unicode="&#xF06A;"
+      horiz-adv-x="512" d=" M504 192C504 55.003 392.957 -56 256 -56S8 55.003 8 192C8 328.9170000000001 119.043 440 256 440S504 328.9170000000001 504 192zM256 142C230.595 142 210 121.405 210 96S230.595 50 256 50S302 70.595 302 96S281.405 142 256 142zM212.327 307.346L219.745 171.346C220.092 164.982 225.354 160 231.727 160H280.273C286.646 160 291.908 164.982 292.255 171.346L299.673 307.346C300.048 314.2200000000001 294.575 320 287.6910000000001 320H224.308C217.424 320 211.952 314.2200000000001 212.327 307.346z" />
+    <glyph glyph-name="exclamation-triangle"
+      unicode="&#xF071;"
+      horiz-adv-x="576" d=" M569.517 7.987C587.975 -24.007 564.806 -64 527.94 -64H48.054C11.117 -64 -11.945 -23.945 6.477 7.987L246.423 424.015C264.89 456.024 311.1430000000001 455.966 329.577 424.015L569.517 7.987zM288 94C262.5950000000001 94 242 73.405 242 48S262.5950000000001 2 288 2S334 22.595 334 48S313.405 94 288 94zM244.327 259.346L251.745 123.346C252.092 116.982 257.354 112 263.727 112H312.273C318.646 112 323.908 116.982 324.255 123.346L331.673 259.346C332.048 266.2200000000001 326.575 272 319.6910000000001 272H256.3080000000001C249.4240000000001 272 243.9520000000001 266.2200000000001 244.3270000000001 259.346z" />
+    <glyph glyph-name="exclamation"
+      unicode="&#xF12A;"
+      horiz-adv-x="192" d=" M176 16C176 -28.112 140.112 -64 96 -64S16 -28.112 16 16S51.888 96 96 96S176 60.112 176 16zM25.26 422.801L38.86 150.801C39.499 138.028 50.041 128 62.83 128H129.17C141.959 128 152.501 138.028 153.14 150.801L166.74 422.801C167.425 436.51 156.496 448 142.77 448H49.23C35.504 448 24.575 436.51 25.26 422.801z" />
+    <glyph glyph-name="expand-arrows-alt"
+      unicode="&#xF31E;"
+      horiz-adv-x="448.1" d=" M448.1 104V-8C448.1 -21.3 437.4000000000001 -32 424.1 -32H312.1C290.7000000000001 -32 280 -6.1 295.1 9L331.3 45.2L224 152.4L116.8 45.1L153 9C168.1 -6.1 157.4 -32 136 -32H24C10.7 -32 0 -21.3 0 -8V104C0 125.4 25.9 136.1 41 121L77.2 84.8L184.5 192L77.2 299.3L41 263C25.9 247.9 0 258.6 0 280V392C0 405.3 10.7 416 24 416H136C157.4 416 168.1 390.1 153 375L116.8 338.8L224 231.6L331.3 338.9L295.1 375C280 390.1 290.7000000000001 416 312.1 416H424.1C437.4000000000001 416 448.1 405.3 448.1 392V280C448.1 258.6 422.2000000000001 247.9 407.1 263L370.9000000000001 299.2L263.6 192L370.9000000000001 84.7L407.1 120.9C422.2000000000001 136.1 448.1 125.4 448.1 104z" />
+    <glyph glyph-name="expand"
+      unicode="&#xF065;"
+      horiz-adv-x="448" d=" M0 268V392C0 405.3 10.7 416 24 416H148C154.6 416 160 410.6 160 404V364C160 357.4 154.6 352 148 352H64V268C64 261.4 58.6 256 52 256H12C5.4 256 0 261.4 0 268zM288 404V364C288 357.4 293.4 352 300 352H384V268C384 261.4 389.4 256 396 256H436C442.6 256 448 261.4 448 268V392C448 405.3 437.3 416 424 416H300C293.4 416 288 410.6 288 404zM436 128H396C389.4 128 384 122.6 384 116V32H300C293.4 32 288 26.6 288 20V-20C288 -26.6 293.4 -32 300 -32H424C437.3 -32 448 -21.3 448 -8V116C448 122.6 442.6 128 436 128zM160 -20V20C160 26.6 154.6 32 148 32H64V116C64 122.6 58.6 128 52 128H12C5.4 128 0 122.6 0 116V-8C0 -21.3 10.7 -32 24 -32H148C154.6 -32 160 -26.6 160 -20z" />
+    <glyph glyph-name="external-link-alt"
+      unicode="&#xF35D;"
+      horiz-adv-x="576" d=" M576 424V296.016C576 274.555 550.04 264.0360000000001 535.029 279.045L499.322 314.754L255.799 71.231C246.426 61.858 231.231 61.858 221.858 71.231L199.231 93.858C189.858 103.231 189.858 118.427 199.231 127.799L442.756 371.324L407.053 407.029C391.9820000000001 422.1 402.656 448 424.024 448H552C565.255 448 576 437.255 576 424zM407.029 177.206L391.029 161.206A23.999000000000002 23.999000000000002 0 0 1 384 144.235V0H64V320H328A24.003 24.003 0 0 1 344.9700000000001 327.029L360.9700000000001 343.029C376.089 358.149 365.381 384 344 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V160.236C448 181.618 422.148 192.326 407.029 177.206z" />
+    <glyph glyph-name="external-link-square-alt"
+      unicode="&#xF360;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM360 352H248.029C226.716 352 215.949 326.139 231.058 311.029L263.042 279.0420000000001L67.515 83.515C62.829 78.829 62.829 71.231 67.515 66.544L98.544 35.515C103.231 30.829 110.829 30.829 115.515 35.515L311.041 231.041L343.029 199.05C358.058 184.023 384 194.575 384 216.021V328C384 341.255 373.255 352 360 352z" />
+    <glyph glyph-name="eye-dropper"
+      unicode="&#xF1FB;"
+      horiz-adv-x="512" d=" M177.38 241.36L39.03 103.03A24.01 24.01 0 0 1 32 86.06V24L0 -32L32 -64L88 -32H150.06C156.42 -32 162.53 -29.47 167.03 -24.97L305.38 113.36L177.38 241.36zM402.932 210.89L419.884 193.94C429.254 184.5700000000001 429.254 169.37 419.884 160L378.911 119.03C369.6190000000001 109.718 354.405 109.596 344.971 119.03L183.028 280.9700000000001C173.658 290.3400000000001 173.658 305.54 183.028 314.91L224 355.88C233.289 365.189 248.502 365.318 257.94 355.88L274.932 338.89L357.538 421.491C392.728 456.681 450.038 456.991 485.538 421.491C526.028 373.411 515.198 323.151 485.538 293.491L402.932 210.89z" />
+    <glyph glyph-name="eye-slash"
+      unicode="&#xF070;"
+      horiz-adv-x="576" d=" M286.693 56.016L319.272 9.474A333.958 333.958 0 0 0 288 8C168.19 8 63.031 71.949 6.646 167.631A47.999 47.999 0 0 0 6.646 216.37C30.669 257.136 63.559 292.145 102.67 318.907L159.747 237.368C154.736 223.18 152 207.913 152 192C152 117.264 212.135 56.718 286.693 56.016zM569.354 167.631C537.687 113.894 490.607 70.1710000000001 434.1790000000001 42.1560000000001L434.1900000000001 42.1410000000001L475.6600000000001 -17.0589999999999C483.2600000000001 -27.9189999999999 480.6200000000001 -42.8789999999999 469.7600000000001 -50.4789999999999L456.6500000000001 -59.6589999999999C445.7900000000001 -67.2589999999999 430.8300000000001 -64.6189999999999 423.2300000000001 -53.759L100.34 401.06C92.74 411.92 95.38 426.88 106.24 434.48L119.35 443.6600000000001C130.21 451.26 145.17 448.62 152.77 437.76L203.808 365.1430000000001C230.68 372.224 258.905 376 288 376C407.81 376 512.969 312.051 569.354 216.369A48.00200000000001 48.00200000000001 0 0 0 569.354 167.631zM424 192C424 267.174 363.162 328 288 328C270.061 328 252.944 324.527 237.271 318.228L256.57 291.17C282.439 299.341 311.614 297.3330000000001 336.9700000000001 283.76H336.9400000000001C313.2900000000001 283.76 294.1200000000001 264.5900000000001 294.1200000000001 240.9400000000001C294.1200000000001 217.314 313.2670000000001 198.12 336.9400000000001 198.12C360.5900000000001 198.12 379.7600000000001 217.29 379.7600000000001 240.9400000000001V240.9700000000001C398.2220000000001 206.48 396.0720000000001 163.0560000000001 371.5100000000001 130.0200000000001V130.0100000000001L390.8240000000001 102.9490000000001C411.496 126.8 424 157.926 424 192zM262.014 91.273L184.484 202.03C179.47 149.643 213.798 103.6760000000001 262.014 91.273z" />
+    <glyph glyph-name="eye"
+      unicode="&#xF06E;"
+      horiz-adv-x="576" d=" M569.354 216.369C512.969 312.051 407.81 376 288 376C168.14 376 63.004 312.006 6.646 216.369A47.999 47.999 0 0 1 6.646 167.63C63.031 71.949 168.19 8 288 8C407.86 8 512.996 71.994 569.354 167.631A47.997 47.997 0 0 1 569.354 216.369zM288 56C212.838 56 152 116.827 152 192C152 267.1620000000001 212.826 328 288 328C363.1620000000001 328 424 267.174 424 192C424 116.838 363.174 56 288 56zM392 192C392 134.562 345.438 88 288 88S184 134.562 184 192C184 209.708 188.431 226.379 196.236 240.973L196.235 240.941C196.235 217.29 215.408 198.118 239.059 198.118S281.883 217.291 281.883 240.941C281.883 264.592 262.71 283.765 239.059 283.765L239.027 283.764C253.621 291.569 270.292 296 288 296C345.438 296 392 249.438 392 192z" />
+    <glyph glyph-name="fast-backward"
+      unicode="&#xF049;"
+      horiz-adv-x="512" d=" M0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V220.1L235.5 376.6C256.1 393.7 288 379.4 288 352V220.1L459.5 376.6C480.1 393.7 512 379.4 512 352V32C512 4.6 480.1 -9.7 459.5 7.4L288 162.7V32C288 4.6 256.1 -9.7 235.5 7.4L64 162.7V12C64 5.4 58.6 0 52 0H12C5.4 0 0 5.4 0 12z" />
+    <glyph glyph-name="fast-forward"
+      unicode="&#xF050;"
+      horiz-adv-x="512" d=" M512 372V12C512 5.4 506.6 0 500 0H460C453.4 0 448 5.4 448 12V163.9L276.5 7.4C255.9 -9.8 224 4.6 224 32V163.9L52.5 7.4C31.9 -9.8 0 4.6 0 32V352C0 379.4 31.9 393.7 52.5 376.6L224 221.2V352C224 379.4 255.9 393.7 276.5 376.6L448 221.2V372C448 378.6 453.4 384 460 384H500C506.6 384 512 378.6 512 372z" />
+    <glyph glyph-name="fax"
+      unicode="&#xF1AC;"
+      horiz-adv-x="512" d=" M128 304V-16C128 -42.51 106.51 -64 80 -64H48C21.49 -64 0 -42.51 0 -16V304C0 330.51 21.49 352 48 352H80C106.51 352 128 330.51 128 304zM512 240V-16C512 -42.51 490.51 -64 464 -64H192C165.49 -64 144 -42.51 144 -16V408C144 430.091 161.909 448 184 448H391.432A39.996 39.996 0 0 0 419.716 436.284L468.285 387.715A39.999 39.999 0 0 0 480 359.432V285.258C498.641 278.667 512 260.898 512 240zM192 256H432V352H408C394.7970000000001 352 384 362.7970000000001 384 376V400H192V256zM288 52C288 58.627 282.627 64 276 64H236C229.373 64 224 58.627 224 52V12C224 5.373 229.373 0 236 0H276C282.627 0 288 5.373 288 12V52zM288 180C288 186.627 282.627 192 276 192H236C229.373 192 224 186.627 224 180V140C224 133.373 229.373 128 236 128H276C282.627 128 288 133.373 288 140V180zM416 52C416 58.627 410.627 64 404 64H364C357.373 64 352 58.627 352 52V12C352 5.373 357.373 0 364 0H404C410.627 0 416 5.373 416 12V52zM416 180C416 186.627 410.627 192 404 192H364C357.373 192 352 186.627 352 180V140C352 133.373 357.373 128 364 128H404C410.627 128 416 133.373 416 140V180z" />
+    <glyph glyph-name="female"
+      unicode="&#xF182;"
+      horiz-adv-x="256" d=" M128 448C163.346 448 192 419.346 192 384S163.346 320 128 320C92.654 320 64 348.654 64 384S92.654 448 128 448M247.283 93.821L199.283 285.8210000000001A24 24 0 0 1 176 304H164.64C141.929 293.557 115.05 293.106 91.36 304H80A24 24 0 0 1 56.717 285.8210000000001L8.717 93.821C4.935 78.695 16.383 64 32 64H88V-40C88 -53.255 98.745 -64 112 -64H144C157.255 -64 168 -53.255 168 -40V64H224C239.591 64 251.071 78.671 247.283 93.821z" />
+    <glyph glyph-name="fighter-jet"
+      unicode="&#xF0FB;"
+      horiz-adv-x="640" d=" M544 224L416 240L368 256H344L227.158 404H266.667C278.3330000000001 404 288 406.625 288 410S278.3330000000001 416 266.6670000000001 416H152V404H168V240H120L53.333 320H18.667L8 309.333V240H16V224H64V221.334L0 213.334V170.667L64 162.667V160H16V144H8V74.667L18.667 64H53.334L120 144H168V-20H152V-32H266.6670000000001C278.334 -32 288 -29.375 288 -26S278.3330000000001 -20 266.6670000000001 -20H227.158L344 128H368L416 144L544 160C640 181.333 640 186.583 640 192C640 197.417 640 202.667 544 224z" />
+    <glyph glyph-name="file-alt"
+      unicode="&#xF15C;"
+      horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM288 76C288 69.4 282.6 64 276 64H108C101.4 64 96 69.4 96 76V84C96 90.6 101.4 96 108 96H276C282.6 96 288 90.6 288 84V76zM288 140C288 133.4 282.6 128 276 128H108C101.4 128 96 133.4 96 140V148C96 154.6 101.4 160 108 160H276C282.6 160 288 154.6 288 148V140zM288 212V204C288 197.4 282.6 192 276 192H108C101.4 192 96 197.4 96 204V212C96 218.6 101.4 224 108 224H276C282.6 224 288 218.6 288 212zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="file-archive"
+      unicode="&#xF1C6;"
+      horiz-adv-x="384" d=" M224 312V448H160.4V416H128.4V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM95.9 416H127.9V384H95.9V416zM128.2 32C95 32 70.2 62.4 76.8 94.9L96.4 192V224H128.4V256H96.4V288H128.4V320H96.4V352H128.4V384H160.4V352H128.4V320H160.4V288H128.4V256H160.4V224H128.4V192H150.5C156.2 192 161.2 187.9 162.3 182.3L179.6 94.6C186 62.2000000000001 161.2 32 128.2 32zM160.9 85C160.9 70.1 146.4 58 128.5 58S96 70 96 85C96 99.9 110.5 112 128.4 112S160.9 99.9 160.9 85zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="file-audio"
+      unicode="&#xF1C7;"
+      horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM160 44C160 33.3 147.1 28 139.5 35.5L104 72H76C69.4 72 64 77.4 64 84V140C64 146.6 69.4 152 76 152H104L139.5 188.5C147.1 196.1 160 190.7 160 180V44zM193.2 91.6C202.3 100.9 202.3 115.7000000000001 193.2 125C171.1 147.8 205.4 181.2 227.6 158.5C254.8 130.6 254.8 86.1 227.6 58.1C205.8 35.8 170.7 68.5 193.2 91.6zM279.2 208.7C333.6 152.8 333.6 63.9 279.2 7.9C257.4 -14.5 222.2 18.2 244.8 41.4C281 78.6 281.1 137.9 244.8 175.2C222.7 198 257.1 231.5 279.2 208.7zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="file-code"
+      unicode="&#xF1C9;"
+      horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001C268.4240000000001 448 274.5290000000001 445.471 279.0300000000001 440.971L376.971 343.03A24.005 24.005 0 0 0 384 326.059zM248 288C234.8 288 224 298.8 224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248zM123.206 47.495A5.4 5.4 0 0 0 115.573 47.249L50.707 108.061A5.4 5.4 0 0 0 50.707 115.9400000000001L115.573 176.7520000000001A5.4 5.4 0 0 0 123.206 176.5060000000001L142.785 155.6210000000001A5.4 5.4 0 0 0 142.413 147.8740000000001L101.65 112L142.413 76.126A5.4 5.4 0 0 0 142.785 68.379L123.206 47.495zM174.501 -2.984L147.048 4.986A5.401999999999999 5.401999999999999 0 0 0 143.367 11.6780000000001L204.807 223.3040000000001A5.401999999999999 5.401999999999999 0 0 0 211.499 226.9850000000001L238.951 219.0150000000001A5.4 5.4 0 0 0 242.631 212.3230000000001L181.191 0.6970000000001A5.396999999999999 5.396999999999999 0 0 0 174.501 -2.9839999999999zM335.293 108.061L270.427 47.249A5.4 5.4 0 0 0 262.7940000000001 47.495L243.2140000000001 68.38A5.4 5.4 0 0 0 243.5860000000001 76.127L284.35 112L243.587 147.874A5.4 5.4 0 0 0 243.215 155.6210000000001L262.795 176.506A5.4 5.4 0 0 0 270.428 176.752L335.294 115.94A5.4 5.4 0 0 0 335.293 108.061z" />
+    <glyph glyph-name="file-excel"
+      unicode="&#xF1C3;"
+      horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM284.1 205.5L224 112L284.1 18.5C289.2000000000001 10.5 283.5 0 274 0H239.1C234.7 0 230.6 2.4 228.5 6.3C208.9 42.5 192 75 192 75C185.6 60.2 182 55 155.4 6.2C153.3 2.3 149.3 -0.1 144.9 -0.1H110C100.5 -0.1 94.8 10.4 99.9 18.4L160.2 111.9L99.9 205.4C94.7 213.4 100.5 223.9 110 223.9H144.8C149.2 223.9 153.3 221.5 155.4 217.6C181.5 168.8 175.4 184 192 149.1C192 149.1 198.1 160.8 228.6 217.6C230.7 221.5 234.8 223.9 239.2 223.9H274C283.5 224 289.2 213.5 284.1 205.5zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="file-image"
+      unicode="&#xF1C5;"
+      horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001A24 24 0 0 0 279.029 440.971L376.9700000000001 343.03A24.002000000000002 24.002000000000002 0 0 0 384 326.059zM248 288C234.8 288 224 298.8 224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248zM112.545 272C139.055 272 160.545 250.51 160.545 224S139.055 176 112.545 176S64.545 197.49 64.545 224S86.036 272 112.545 272zM320.545 32H64.545L65.03 80.485L104.545 120C109.231 124.686 116.344 124.201 121.03 119.515L160.545 80L264.06 183.515C268.746 188.201 276.344 188.201 281.031 183.515L320.545 144V32z" />
+    <glyph glyph-name="file-medical-alt"
+      unicode="&#xF478;"
+      horiz-adv-x="448" d=" M288 312V448H88C74.7 448 64 437.3 64 424V192H8C3.6 192 0 188.4 0 184V168C0 163.6 3.6 160 8 160H148.9C151.9 160 154.7 158.3 156.1 155.6L176 115.8L232.8 229.5C235.7 235.4 244.2 235.4 247.1 229.5L281.8 160H352C360.8 160 368 152.8 368 144S360.8 128 352 128H262.1L240 172.2L183.2 58.5C180.3 52.6 171.8 52.6 168.9 58.5L134.1 128H64V-40C64 -53.3 74.7 -64 88 -64H424C437.3 -64 448 -53.3 448 -40V288H312C298.8 288 288 298.8 288 312zM441 343L343.1 441C338.6 445.5 332.5 448 326.1 448H320V320H448V326.1C448 332.4 445.5 338.5 441 343z" />
+    <glyph glyph-name="file-medical"
+      unicode="&#xF477;"
+      horiz-adv-x="384" d=" M377 343L279.1 441C274.6 445.5 268.5 448 262.1 448H256V320H384V326.1C384 332.4 381.5 338.5 377 343zM224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM288 152V104C288 99.6 284.4 96 280 96H224V40C224 35.6 220.4 32 216 32H168C163.6 32 160 35.6 160 40V96H104C99.6 96 96 99.6 96 104V152C96 156.4 99.6 160 104 160H160V216C160 220.4 163.6 224 168 224H216C220.4 224 224 220.4 224 216V160H280C284.4 160 288 156.4 288 152z" />
+    <glyph glyph-name="file-pdf"
+      unicode="&#xF1C1;"
+      horiz-adv-x="384" d=" M181.9 191.9C176.9 207.9 177 238.8 179.9 238.8C188.3 238.8 187.5 201.9 181.9 191.9zM180.2 144.7C172.5 124.5 162.9 101.4 151.8 82C170.1 89 190.8 99.2 214.7 103.9C202 113.5 189.8 127.3 180.2 144.7zM86.1 19.9C86.1 19.1 99.3 25.3 121 60.1C114.3 53.8 91.9 35.6 86.1 19.9zM248 288H384V-40C384 -53.3 373.3 -64 360 -64H24C10.7 -64 0 -53.3 0 -40V424C0 437.3 10.7 448 24 448H224V312C224 298.8 234.8 288 248 288zM240 116.2C220 128.4 206.7 145.2 197.3 170C201.8 188.5 208.9 216.6 203.5 234.2C198.8 263.6 161.1 260.7 155.7 241C150.7 222.7 155.3 196.9 163.8 164C152.2 136.4 135.1 99.4 123 78.2C122.9 78.2 122.9 78.1 122.8 78.1C95.7 64.2 49.2 33.6 68.3 10.1C73.9 3.2 84.3 0.1 89.8 0.1C107.7 0.1 125.5 18.1 150.9 61.9C176.7 70.4 205 81 229.9 85.1C251.6 73.3 277 65.6 293.9 65.6C323.1 65.6 325.1 97.6 313.6 108.9999999999999C299.7 122.6 259.3 118.6999999999999 240 116.1999999999999zM377 343L279 441C274.5 445.5 268.4 448 262 448H256V320H384V326.1C384 332.4 381.5 338.5 377 343zM302.9 87.7C307 90.4 300.4 99.6 260.1 96.7C297.2 80.9 302.9 87.7 302.9 87.7z" />
+    <glyph glyph-name="file-powerpoint"
+      unicode="&#xF1C4;"
+      horiz-adv-x="384" d=" M193.7 176.8C202.5 176.8 209.2 174.1 214 168.7C223.6 157.8 223.8 136 213.8 124.6C208.9 119 201.9 116.1 192.7 116.1H165.8V176.8H193.7zM377 343L279 441C274.5 445.5 268.4 448 262 448H256V320H384V326.1C384 332.4 381.5 338.5 377 343zM224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM277 146.8C277 56.5 188.2 69.2000000000001 165.9 69.2000000000001V12C165.9 5.4 160.5 0 153.9 0H123.1C116.5 0 111.1 5.4 111.1 12V211.8C111.1 218.4 116.5 223.8 123.1 223.8H204.1C248.6 223.8 277 191 277 146.8z" />
+    <glyph glyph-name="file-video"
+      unicode="&#xF1C8;"
+      horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001C268.4240000000001 448 274.5290000000001 445.471 279.0300000000001 440.971L376.971 343.03A24.005 24.005 0 0 0 384 326.059zM224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248C234.8 288 224 298.8 224 312zM320 167.984V56.0210000000001C320 34.5760000000001 294.057 24.0230000000001 279.029 39.0500000000001L224 94.059V56C224 42.745 213.255 32 200 32H88C74.745 32 64 42.745 64 56V168C64 181.255 74.745 192 88 192H200C213.255 192 224 181.255 224 168V129.941L279.029 184.954C294.04 199.964 320 189.445 320 167.984z" />
+    <glyph glyph-name="file-word"
+      unicode="&#xF1C2;"
+      horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM281.1 192H305C312.7 192 318.4 184.9 316.7 177.3L278.7 9.3C277.5 3.8 272.6 0 267 0H229C223.5 0 218.7 3.8 217.4 9.1C191.6 112.6 196.6 90.3 191.8 119.6H191.3C190.2 105.3 188.9 102.2000000000001 165.7 9.1C164.4 3.8 159.6 0 154.1 0H117C111.4 0 106.5 3.9 105.3 9.4L67.5 177.4C65.8 184.9 71.5 192 79.2 192H103.7C109.4 192 114.4 188 115.5 182.3C131.1 104.3 135.6 72.8 136.5 60.1C138.1 70.3 143.8 92.8 165.9 182.8C167.2 188.2 172 191.9 177.6 191.9H206.7C212.3 191.9 217.1 188.1 218.4 182.7000000000001C242.4 82.3000000000001 247.2 58.7000000000001 248 53.3000000000001C247.8 64.5000000000001 245.4 71.1000000000001 269.6 182.5000000000001C270.6 188.1000000000001 275.5 192.0000000000001 281.1 192.0000000000001zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="file"
+      unicode="&#xF15B;"
+      horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" />
+    <glyph glyph-name="film"
+      unicode="&#xF008;"
+      horiz-adv-x="512" d=" M488 384H480V364C480 357.4 474.6 352 468 352H428C421.4 352 416 357.4 416 364V384H96V364C96 357.4 90.6 352 84 352H44C37.4 352 32 357.4 32 364V384H24C10.7 384 0 373.3 0 360V24C0 10.7 10.7 0 24 0H32V20C32 26.6 37.4 32 44 32H84C90.6 32 96 26.6 96 20V0H416V20C416 26.6 421.4 32 428 32H468C474.6 32 480 26.6 480 20V0H488C501.3 0 512 10.7 512 24V360C512 373.3 501.3 384 488 384zM96 76C96 69.4 90.6 64 84 64H44C37.4 64 32 69.4 32 76V116C32 122.6 37.4 128 44 128H84C90.6 128 96 122.6 96 116V76zM96 172C96 165.4 90.6 160 84 160H44C37.4 160 32 165.4 32 172V212C32 218.6 37.4 224 44 224H84C90.6 224 96 218.6 96 212V172zM96 268C96 261.4 90.6 256 84 256H44C37.4 256 32 261.4 32 268V308C32 314.6 37.4 320 44 320H84C90.6 320 96 314.6 96 308V268zM368 60C368 53.4 362.6 48 356 48H156C149.4 48 144 53.4 144 60V156C144 162.6 149.4 168 156 168H356C362.6 168 368 162.6 368 156V60zM368 228C368 221.4 362.6 216 356 216H156C149.4 216 144 221.4 144 228V324C144 330.6 149.4 336 156 336H356C362.6 336 368 330.6 368 324V228zM480 76C480 69.4 474.6 64 468 64H428C421.4 64 416 69.4 416 76V116C416 122.6 421.4 128 428 128H468C474.6 128 480 122.6 480 116V76zM480 172C480 165.4 474.6 160 468 160H428C421.4 160 416 165.4 416 172V212C416 218.6 421.4 224 428 224H468C474.6 224 480 218.6 480 212V172zM480 268C480 261.4 474.6 256 468 256H428C421.4 256 416 261.4 416 268V308C416 314.6 421.4 320 428 320H468C474.6 320 480 314.6 480 308V268z" />
+    <glyph glyph-name="filter"
+      unicode="&#xF0B0;"
+      horiz-adv-x="512" d=" M487.976 448H24.028C2.71 448 -8.047 422.134 7.058 407.029L192 222.059V16C192 8.169 195.821 0.83 202.237 -3.662L282.237 -59.642C298.02 -70.69 320 -59.493 320 -39.98V222.059L504.947 407.029C520.021 422.104 509.338 448 487.976 448z" />
+    <glyph glyph-name="fire-extinguisher"
+      unicode="&#xF134;"
+      horiz-adv-x="448" d=" M434.027 421.671L266.027 393.671C254.693 391.782 256 380.2 256 376H197.668C208.353 411.892 181.446 448 144 448C104.565 448 77.632 408.324 91.772 371.7970000000001C39.733 358.746 16.391 317.584 1.723 280.913C-3.2 268.606 2.786 254.639 15.093 249.716C27.41 244.79 41.372 250.791 46.289 263.086C75.058 335.01 106.964 328 168 328V300.924C126.457 290.062 96 251.689 96 206.795V-40C96 -53.255 106.745 -64 120 -64H264C277.255 -64 288 -53.255 288 -40V208C288 252.731 257.404 290.312 216 300.9700000000001V328H256C256 325.026 254.297 312.284 266.027 310.329L434.027 282.329C441.342 281.11 448 286.75 448 294.166V409.834C448 417.25 441.342 422.89 434.027 421.671zM144 376C135.178 376 128 383.178 128 392S135.178 408 144 408S160 400.822 160 392S152.822 376 144 376z" />
+    <glyph glyph-name="fire"
+      unicode="&#xF06D;"
+      horiz-adv-x="384" d=" M216 424.142C216 447.944 185.347 456.907 171.851 437.18C48 256.149 224 248 224 160C224 124.371 194.886 95.542 159.15 96.006C123.98 96.462 96 125.78 96 160.954V246.464C96 268.1670000000001 69.529 278.689 54.568 262.968C27.801 234.842 0 186.668 0 128C0 22.131 86.131 -64 192 -64S384 22.131 384 128C384 298.29 216 321.003 216 424.142z" />
+    <glyph glyph-name="first-aid"
+      unicode="&#xF479;"
+      horiz-adv-x="576" d=" M0 368V16C0 -10.5 21.5 -32 48 -32H96V416H48C21.5 416 0 394.5 0 368zM128 -32H448V416H128V-32zM192 216C192 220.4 195.6 224 200 224H256V280C256 284.4 259.6 288 264 288H312C316.4 288 320 284.4 320 280V224H376C380.4 224 384 220.4 384 216V168C384 163.6 380.4 160 376 160H320V104C320 99.6 316.4 96 312 96H264C259.6 96 256 99.6 256 104V160H200C195.6 160 192 163.6 192 168V216zM528 416H480V-32H528C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 528 416z" />
+    <glyph glyph-name="flag-checkered"
+      unicode="&#xF11E;"
+      horiz-adv-x="512" d=" M466.515 381.072C487.731 390.926 512 375.449 512 352.056V108.956C512 98.43 506.839 88.549 498.157 82.598C462.32 58.034 423.822 41.74 375.652 41.74C308.279 41.74 264.022 76.523 210.435 76.523C159.582 76.523 124.311 66.465 96 54.401V-40C96 -53.255 85.255 -64 72 -64H56C42.745 -64 32 -53.255 32 -40V346.055C17.497 356.175 8 372.974 8 392C8 423.704 34.345 449.254 66.338 447.952C94.806 446.794 118.117 423.984 119.889 395.548C120.409 387.206 119.079 379.238 116.303 371.986C137.039 379.616 159.393 384 184.348 384C251.721 384 295.978 349.217 349.5650000000001 349.217C390.0610000000001 349.217 432.177 365.123 466.515 381.072zM96 313.37V242.88C125 253.55 147.18 260.71 169.6 263.79V335.36C146.1 333.19 129.16 325.57 96 313.37zM316.8 304.18C290.3830000000001 308.852 266.914 318.159 243.2 325.52V258.1C267.375 251.3940000000001 290.766 241.6560000000001 316.8 235.79V304.18zM169.6 263.79V193.75C202.396 196.728 223.51 194.385 243.2 189.95V258.1C217.953 265.135 196.619 267.523 169.6 263.79zM243.2 121.5600000000001C269.538 116.9080000000001 292.932 107.633 316.8 100.2200000000001V167.6300000000001C292.523 174.3760000000001 269.26 184.0800000000001 243.2 189.9500000000001V121.5600000000001zM96 105.9C119.62 114.29 143.79 119.74 169.6 122.46V193.75C143.49 191.4 122.24 185.71 96 176.39V105.9zM464 327.5C442.7 318.65 417.41 309.86 390.4 305.03V233.12C417.71 237.48 440.43 247.22 464 257.01V327.5zM464 117.54V188.03C441.81 173.83 415.2200000000001 165.42 390.4 162.01V90.43C415.47 92.81 438.89 101.47 464 117.54zM316.8 235.79V167.63C342.464 160.496 363.416 158.288 390.4 162.01V233.12C364.401 228.933 340.457 230.444 316.8 235.79z" />
+    <glyph glyph-name="flag"
+      unicode="&#xF024;"
+      horiz-adv-x="512" d=" M349.565 349.217C295.978 349.217 251.721 384 184.348 384C159.393 384 137.039 379.616 116.303 371.987A55.947 55.947 0 0 1 119.889 395.549C118.117 423.985 94.806 446.794 66.338 447.952C34.345 449.254 8 423.704 8 392C8 372.974 17.497 356.175 32 346.055V-40C32 -53.255 42.745 -64 56 -64H72C85.255 -64 96 -53.255 96 -40V54.4C124.311 66.464 159.582 76.522 210.435 76.522C264.023 76.522 308.279 41.739 375.6520000000001 41.739C423.8210000000001 41.739 462.3190000000001 58.033 498.157 82.597C506.84 88.548 512 98.429 512 108.955V352.055C512 375.448 487.731 390.925 466.515 381.071C432.177 365.123 390.061 349.217 349.565 349.217z" />
+    <glyph glyph-name="flask"
+      unicode="&#xF0C3;"
+      horiz-adv-x="448" d=" M437.2 44.5L320 233V384H328C341.3 384 352 394.7 352 408V424C352 437.3 341.3 448 328 448H120C106.7 448 96 437.3 96 424V408C96 394.7 106.7 384 120 384H128V233L10.8 44.5C-18.5 -2.6 15.3 -64 70.9 -64H377.1C432.8 -64 466.5 -2.5 437.2000000000001 44.5zM137.9 128L186.1 205.6C189.8 210.8 191.9 217.2 191.9 224V384H255.9000000000001V224C255.9000000000001 217.1 258.1 210.8 261.7000000000001 205.6L309.9000000000001 128H137.9z" />
+    <glyph glyph-name="folder-open"
+      unicode="&#xF07C;"
+      horiz-adv-x="576" d=" M572.694 155.907L500.27 31.752A63.99699999999999 63.99699999999999 0 0 0 444.989 0H45.025C26.502 0 14.961 20.093 24.294 36.093L96.718 160.2480000000001A64 64 0 0 0 152 192H551.9639999999999C570.487 192 582.0279999999999 171.907 572.694 155.907zM152 224H480V272C480 298.51 458.51 320 432 320H272L208 384H48C21.49 384 0 362.51 0 336V57.954L69.077 176.372C86.214 205.75 117.989 224 152 224z" />
+    <glyph glyph-name="folder"
+      unicode="&#xF07B;"
+      horiz-adv-x="512" d=" M464 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V272C512 298.51 490.51 320 464 320z" />
+    <glyph glyph-name="font"
+      unicode="&#xF031;"
+      horiz-adv-x="448" d=" M152 32H127.987L154.573 112.782H292.8L319.386 32H296C287.163 32 280 24.837 280 16V-16C280 -24.837 287.163 -32 296 -32H432C440.837 -32 448 -24.837 448 -16V16C448 24.837 440.837 32 432 32H405.261L275.495 405.254A16 16 0 0 1 260.382 416H187.616A16 16 0 0 1 172.503 405.254L42.739 32H16C7.163 32 0 24.837 0 16V-16C0 -24.837 7.163 -32 16 -32H152C160.837 -32 168 -24.837 168 -16V16C168 24.837 160.837 32 152 32zM216.353 303.778C220.701 318.9940000000001 222.963 331.9340000000001 223.939 338.4220000000001C224.778 331.901 226.878 318.9460000000001 231.6660000000001 303.716L273.0010000000001 179.71H174.382L216.353 303.778z" />
+    <glyph glyph-name="football-ball"
+      unicode="&#xF44E;"
+      horiz-adv-x="496" d=" M481.5 387.7C476.7 405.9 462.4 420.2 444.2 425.1C420.3 431.5 383 439.1 339.4 440L496 283.2C495.2 326.7 487.8 363.8 481.5 387.7zM14.5 -3.7C19.3 -21.9 33.6 -36.2 51.8 -41.1C75.7 -47.4999999999999 113 -55.1 156.6 -55.9999999999999L0 100.8C0.8 57.3 8.2 20.2 14.5 -3.7zM4.2 164.6L220.4 -52C352.9 -32.6 469.2 66.7 491.9 219.4L275.6 436C143.1 416.6 26.8 317.3 4.2 164.6zM321.5 288.2000000000001C324.6 291.3 329.7 291.3 332.8 288.2000000000001L344.1 276.9C347.2000000000001 273.8 347.2000000000001 268.7000000000001 344.1 265.6L315.8 237.3L344.1 209C347.2000000000001 205.9 347.2000000000001 200.8 344.1 197.7L332.8 186.4C329.7 183.3 324.6 183.3 321.5 186.4L293.2 214.7L270.6 192L298.9 163.7C302 160.6 302 155.5 298.9 152.4L287.6 141.1C284.5 138 279.4 138 276.3 141.1L248 169.4L225.4 146.8L253.7 118.5C256.8 115.3999999999999 256.8 110.3 253.7 107.1999999999999L242.4 95.8999999999999C239.3 92.7999999999999 234.2 92.7999999999999 231.1 95.8999999999999L202.8 124.1999999999999L174.5 95.8999999999999C171.4 92.7999999999999 166.3 92.7999999999999 163.2 95.8999999999999L151.9 107.1999999999999C148.8 110.3 148.8 115.3999999999999 151.9 118.5L180.2 146.8L151.9 175C148.8 178.1 148.8 183.1999999999999 151.9 186.3L163.2 197.6C166.3 200.7 171.4 200.7 174.5 197.6L202.8 169.3L225.4 191.9L197.1 220.2C194 223.3 194 228.4 197.1 231.5L208.4 242.8C211.5 245.9 216.6 245.9 219.7 242.8L248 214.5L270.6 237.1L242.3 265.4C239.2 268.5 239.2 273.6 242.3 276.7000000000001L253.6 288C256.7000000000001 291.1 261.8 291.1 264.9000000000001 288L293.2000000000001 259.7000000000001L321.5000000000001 288.2000000000001z" />
+    <glyph glyph-name="forward"
+      unicode="&#xF04E;"
+      horiz-adv-x="512" d=" M500.5 216.6L308.5 376.6C287.9 393.7 256 379.4 256 352V32C256 4.6 287.9 -9.8 308.5 7.4L500.5 167.4C515.8 180.2 515.8 203.8 500.5 216.6zM244.5 216.6L52.5 376.6C31.9 393.7 0 379.4 0 352V32C0 4.6 31.9 -9.8 52.5 7.4L244.5 167.4C259.8 180.2 259.8 203.8 244.5 216.6z" />
+    <glyph glyph-name="frown"
+      unicode="&#xF119;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM328 272C345.7 272 360 257.7 360 240S345.7 208 328 208S296 222.3 296 240S310.3 272 328 272zM168 272C185.7 272 200 257.7 200 240S185.7 208 168 208S136 222.3 136 240S150.3 272 168 272zM360.7 51.7C357.7 49.2 354.1 48 350.5 48C345.9 48 341.4 50 338.2 53.8C315.8 80.6 282.9 96 248 96S180.2 80.6 157.8 53.8C152.2 47 142.1 46.1 135.3 51.8C128.5 57.5 127.6 67.5 133.3 74.3C161.7 108.4 203.6 128 248 128S334.3 108.4 362.7 74.2C368.4 67.5 367.5 57.4 360.7 51.7z" />
+    <glyph glyph-name="futbol"
+      unicode="&#xF1E3;"
+      horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM456 192L455.997 192.282L429.933 169.541L367.254 228.041L383.7080000000001 312.396L418.011 309.324C393.122 343.54 358.007 369.413 317.302 382.4650000000001L330.9530000000001 350.526L256 309L181.047 350.525L194.698 382.464C154.067 369.436 118.918 343.594 93.989 309.323L128.554 312.396L144.746 228.041L82.068 169.541L56.004 192.282L56.001 192C56.001 148.985 69.498 108.048 94.473 74.009L102.177 107.906L187.315 97.459L223.616 19.633L193.714 1.847C233.916 -11.275 278.004 -11.301 318.286 1.847L288.384 19.633L324.685 97.4590000000001L409.823 107.9060000000001L417.527 74.0090000000001C442.503 108.048 456 148.985 456 192zM207.898 122.429L178.004 213.741L256 270.2680000000001L333.996 213.741L304.374 122.429H207.898z" />
+    <glyph glyph-name="gamepad"
+      unicode="&#xF11B;"
+      horiz-adv-x="640" d=" M480 352H160C71.6 352 0 280.4 0 192S71.6 32 160 32C204.8 32 245.2 50.4 274.2 80H365.7C394.7 50.4 435.2 32 479.9 32C568.3 32 639.9 103.6 639.9 192S568.4 352 480 352zM256 172C256 165.4 250.6 160 244 160H192V108C192 101.4 186.6 96 180 96H140C133.4 96 128 101.4 128 108V160H76C69.4 160 64 165.4 64 172V212C64 218.6 69.4 224 76 224H128V276C128 282.6 133.4 288 140 288H180C186.6 288 192 282.6 192 276V224H244C250.6 224 256 218.6 256 212V172zM440 104C413.5 104 392 125.5 392 152S413.5 200 440 200S488 178.5 488 152S466.5 104 440 104zM520 184C493.5 184 472 205.5 472 232S493.5 280 520 280S568 258.5 568 232S546.5 184 520 184z" />
+    <glyph glyph-name="gavel"
+      unicode="&#xF0E3;"
+      horiz-adv-x="512" d=" M504.971 248.638L482.344 271.265C472.971 280.6380000000001 457.775 280.6380000000001 448.403 271.265L442.7460000000001 265.608L329.608 378.745L335.265 384.402C344.638 393.775 344.638 408.971 335.265 418.343L312.638 440.971C303.265 450.344 288.069 450.344 278.697 440.971L154.246 316.52C144.873 307.1470000000001 144.873 291.951 154.246 282.579L176.873 259.952C186.246 250.579 201.442 250.579 210.814 259.952L216.471 265.6090000000001L256.069 226.011L175.029 144.971L169.372 150.628C156.875 163.125 136.614 163.125 124.117 150.628L9.373 35.882C-3.124 23.385 -3.124 3.124 9.373 -9.373L54.628 -54.628C67.125 -67.125 87.386 -67.125 99.883 -54.628L214.628 60.117C227.125 72.614 227.125 92.875 214.628 105.372L208.971 111.029L290.011 192.069L329.6090000000001 152.471L323.9520000000001 146.814C314.5790000000001 137.441 314.5790000000001 122.245 323.9520000000001 112.8730000000001L346.5790000000001 90.246C355.9520000000001 80.8730000000001 371.1480000000001 80.8730000000001 380.5200000000001 90.246L504.9710000000001 214.697C514.3430000000001 224.069 514.3430000000001 239.2650000000001 504.9710000000001 248.6380000000001z" />
+    <glyph glyph-name="gem"
+      unicode="&#xF3A5;"
+      horiz-adv-x="576" d=" M485.5 448L576 288H474.9L405.7 448H485.5zM357.5 448L426.7 288H149.3L218.5 448H357.5zM90.5 448H170.3L101.1 288H0L90.5 448zM0 256H100.7L223.7 4.3C225.2 1.2 221 -1.6 218.7 1L0 256zM148.2 256H427.8L290.8 -62.2C289.8 -64.6 286.3 -64.6 285.3 -62.2L148.2 256zM352.3 4.3L475.3 256H576L357.3 1.1C355 -1.6 350.8 1.2 352.3 4.3z" />
+    <glyph glyph-name="genderless"
+      unicode="&#xF22D;"
+      horiz-adv-x="288" d=" M144 272C188.1 272 224 236.1 224 192S188.1 112 144 112S64 147.9 64 192S99.9 272 144 272M144 336C64.5 336 0 271.5 0 192S64.5 48 144 48S288 112.5 288 192S223.5 336 144 336z" />
+    <glyph glyph-name="gift"
+      unicode="&#xF06B;"
+      horiz-adv-x="512" d=" M32 0C32 -17.7 46.3 -32 64 -32H224V128H32V0zM480 288H437.9C444.1 300.1 448 313.5 448 328C448 376.5 408.5 416 360 416C318.4 416 291.5 394.7 257 347.7C222.5 394.7 195.6 416 154 416C105.5 416 66 376.5 66 328C66 313.5 69.8 300.1 76.1 288H32C14.3 288 0 273.7 0 256V176C0 167.2 7.2 160 16 160H496C504.8 160 512 167.2 512 176V256C512 273.7 497.7 288 480 288zM153.9 288C131.8 288 113.9 305.9 113.9 328S131.8 368 153.9 368C173.8 368 188.5 364.7 240 288H153.9zM360 288H273.9C325.3 364.5 339.6 368 360 368C382.1 368 400 350.1 400 328S382.1 288 360 288zM288 -32H448C465.7 -32 480 -17.7 480 0V128H288V-32z" />
+    <glyph glyph-name="glass-martini"
+      unicode="&#xF000;"
+      horiz-adv-x="512" d=" M507.3 420.7C517.3 430.7 510.2 448 496 448H16C1.8 448 -5.4 430.8 4.7 420.7L216 209.4V-24H124C108.5 -24 96 -36.5 96 -52C96 -58.6 101.4 -64 108 -64H404C410.6 -64 416 -58.6 416 -52C416 -36.5 403.5 -24 388 -24H296V209.4L507.3 420.7z" />
+    <glyph glyph-name="globe"
+      unicode="&#xF0AC;"
+      horiz-adv-x="496" d=" M336.5 288C322 377.3 287.8 440 248 440S174 377.3 159.5 288H336.5zM152 192C152 169.8 153.2 148.5 155.3 128H340.6C342.7000000000001 148.5 343.9000000000001 169.8 343.9000000000001 192S342.7000000000001 235.5 340.6 256H155.3C153.2 235.5 152 214.2 152 192zM476.7 288C448.1 355.9 390.2 408.4 318.7 429.6C343.1 395.8 359.9 344.9 368.7 288H476.7zM177.2 429.6C105.8 408.4 47.8 355.9 19.3 288H127.3C136 344.9 152.8 395.8 177.2 429.6zM487.4 256H372.7C374.8 235 376 213.5 376 192S374.8 149 372.7 128H487.3C492.8 148.5 495.9 169.8 495.9 192S492.8 235.5 487.4 256zM120 192C120 213.5 121.2 235 123.3 256H8.6C3.2 235.5 0 214.2 0 192S3.2 148.5 8.6 128H123.2C121.2 149 120 170.5 120 192zM159.5 96C174 6.7 208.2 -56 248 -56S322 6.7 336.5 96H159.5zM318.8 -45.6C390.2000000000001 -24.4 448.2000000000001 28.1 476.8 96H368.8C360 39.1 343.2 -11.8 318.8 -45.6zM19.3 96C47.9 28.1 105.8 -24.4 177.3 -45.6C152.9 -11.8 136.1 39.1 127.3 96H19.3z" />
+    <glyph glyph-name="golf-ball"
+      unicode="&#xF450;"
+      horiz-adv-x="416" d=" M96 32H320C320 14.3 305.7 0 288 0H272C254.3 0 240 -14.3 240 -32V-52C240 -58.6 234.6 -64 228 -64H188C181.4 -64 176 -58.6 176 -52V-32C176 -14.3 161.7 0 144 0H128C110.3 0 96 14.3 96 32zM416 240C416 165.8 377 100.8 318.5 64H97.5C39 100.8 0 165.8 0 240C0 354.9 93.1 448 208 448S416 354.9 416 240zM235.9 196.1C254.2 196.1 269 210.9 269 229.2C269 243.6 259.7 255.5 246.9 260.1C256.5 233.3 231.3 208.8 205 218.2C209.6 205.4 221.5 196.1 235.9 196.1zM285 149.2C285 163.6 275.7 175.5 262.9 180.1C272.5 153.3 247.3 128.8 221 138.2C225.6 125.4 237.5 116.1 251.9 116.1C270.2 116.1 285 131 285 149.2zM349 213.2C349 227.6 339.7 239.5 326.9 244.1C336.5 217.3 311.3 192.8 285 202.2C289.6 189.4 301.5 180.1 315.9 180.1C334.2 180.1 349 195 349 213.2z" />
+    <glyph glyph-name="graduation-cap"
+      unicode="&#xF19D;"
+      horiz-adv-x="640" d=" M622.884 248.995L347.067 163.895A96 96 0 0 0 292.933 163.895L92.398 225.768C83.834 214.33 81.38 202.718 80.48 187.433C89.778 181.835 96 171.645 96 160C96 148.048 89.443 137.634 79.735 132.139L95.932 9.043C96.562 4.257 92.832 0 88 0H40C35.172 0 31.438 4.253 32.068 9.044L48.265 132.14C38.557 137.634 32 148.048 32 160C32 172.034 38.646 182.511 48.465 187.976C49.412 205.927 52.439 221.207 60.617 235.573L17.115 248.995C-5.761 255.796 -5.651 288.236 17.115 295.005L292.932 380.105A96 96 0 0 0 347.0660000000001 380.105L622.883 295.005C645.76 288.204 645.6500000000001 255.764 622.884 248.995zM356.503 133.318L356.296 133.254L356.089 133.193A127.99799999999999 127.99799999999999 0 0 0 283.912 133.193L283.705 133.254L283.498 133.318L132.584 179.888L120 96C120 60.654 209.543 32 320 32S520 60.654 520 96L507.417 179.888L356.503 133.3180000000001z" />
+    <glyph glyph-name="h-square"
+      unicode="&#xF0FD;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM336 320H304C295.163 320 288 312.837 288 304V224H160V304C160 312.837 152.837 320 144 320H112C103.163 320 96 312.837 96 304V80C96 71.163 103.163 64 112 64H144C152.837 64 160 71.163 160 80V160H288V80C288 71.163 295.163 64 304 64H336C344.837 64 352 71.163 352 80V304C352 312.837 344.837 320 336 320z" />
+    <glyph glyph-name="hand-holding-heart"
+      unicode="&#xF4BE;"
+      horiz-adv-x="576" d=" M275.3 197.5C282.3 190.1 293.7 190.1 300.8 197.5L409.7000000000001 311.7C441.3000000000001 344.9 439.5000000000001 399.9 404.1 430.5C373.3 457.2 327.4000000000001 452.4 299.2000000000001 422.8L288 411.1L276.9 422.7C248.7 452.4 202.8 457.2 172 430.5C136.7 399.9 134.8 344.9 166.4 311.7L275.3 197.5zM565.3 119.9C553.5 130.6 535.0999999999999 129.9 522.6999999999999 119.9L430.3 46C419 36.9 404.9000000000001 32 390.3 32H272C263.2 32 256 39.2 256 48S263.2 64 272 64H350.3C366.2 64 381 74.9 383.6 90.6C386.9000000000001 110.6 371.5 128 352 128H192C165 128 138.9 118.7 117.9 101.7L71.4 64H16C7.2 64 0 56.8 0 48V-48C0 -56.8 7.2 -64 16 -64H372.8C387.3 -64 401.4000000000001 -59.1 412.8 -50L564 71C579.2 83.1 580.4 106.3 565.3 119.9z" />
+    <glyph glyph-name="hand-holding-usd"
+      unicode="&#xF4C0;"
+      horiz-adv-x="544" d=" M257.6 303.7L307.6 289.4C311.2000000000001 288.4 313.7000000000001 285 313.7000000000001 281.3C313.7000000000001 276.7 309.9000000000001 272.9 305.3000000000001 272.9H272.5000000000001C268.9000000000001 272.9 265.4000000000001 273.7 262.2000000000001 275.1C257.4000000000001 277.3 251.8000000000001 276.8 248.1000000000001 273.1L230.6000000000001 255.6C225.3000000000001 250.3 225.9000000000001 241.3 232.1000000000001 237.2C241.6000000000001 230.9 252.4000000000001 227.1 263.9000000000001 225.7V208C263.9000000000001 199.2 271.1 192 279.9000000000001 192H295.9000000000001C304.7000000000001 192 311.9000000000001 199.2 311.9000000000001 208V225.6C342.2000000000001 229.2 365.2000000000001 256.6 361.2000000000001 288.6C358.3000000000001 311.6 340.5000000000001 329.9 318.3000000000001 336.3L268.3000000000001 350.6C264.7000000000001 351.6 262.2000000000001 355 262.2000000000001 358.7C262.2000000000001 363.3 266.0000000000001 367.1 270.6 367.1H303.4000000000001C307.0000000000001 367.1 310.5000000000001 366.3 313.7000000000001 364.9C318.5000000000001 362.7 324.1 363.2 327.8000000000001 366.9L345.3000000000001 384.4C350.6000000000001 389.7 350.0000000000001 398.7 343.8000000000001 402.8C334.3000000000001 409.1 323.5000000000001 412.9 312.0000000000001 414.3V432C312.0000000000001 440.8 304.8000000000001 448 296.0000000000001 448H280.0000000000001C271.2000000000001 448 264.0000000000001 440.8 264.0000000000001 432V414.4C233.7000000000001 410.8 210.7000000000001 383.4 214.7000000000001 351.4C217.6000000000001 328.4 235.4000000000001 310.1 257.6 303.7zM533.9000000000001 119.9C522.7 130.6 505.4000000000001 129.9 493.6000000000001 119.9L406.4 46C395.7 36.9 382.4 32 368.6 32H256.9C248.6 32 241.8 39.2 241.8 48S248.6 64 256.9 64H330.8C345.9 64 359.8 74.9 362.2 90.6C365.3 110.6 350.7 128 332.3999999999999 128H181.3C155.8 128 131.1 118.7 111.4 101.7L67.5 64H15.1C6.8 64 0 56.8 0 48V-48C0 -56.8 6.8 -64 15.1 -64H352C365.7 -64 379 -59.1 389.8 -50L532.6 71C547 83.1 548.1 106.3 533.9 119.9z" />
+    <glyph glyph-name="hand-holding"
+      unicode="&#xF4BD;"
+      horiz-adv-x="576" d=" M565.3 119.9C553.5 130.6 535.0999999999999 129.9 522.6999999999999 119.9L430.3 46C419 36.9 404.9000000000001 32 390.3 32H272C263.2 32 256 39.2 256 48S263.2 64 272 64H350.3C366.2 64 381 74.9 383.6 90.6C386.9000000000001 110.6 371.5 128 352 128H192C165 128 138.9 118.7 117.9 101.7L71.4 64H16C7.2 64 0 56.8 0 48V-48C0 -56.8 7.2 -64 16 -64H372.8C387.3 -64 401.4000000000001 -59.1 412.8 -50L564 71C579.2 83.1 580.4 106.3 565.3 119.9z" />
+    <glyph glyph-name="hand-lizard"
+      unicode="&#xF258;"
+      horiz-adv-x="576" d=" M384 -32H576V84.222A95.998 95.998 0 0 1 561.167 135.485L398.127 393.632A48 48 0 0 1 357.544 416H24C10.745 416 0 405.255 0 392V376C0 345.072 25.072 320 56 320H285.981C298.825 320 307.537 306.933 302.596 295.077L281.186 243.692A32 32 0 0 0 251.648 224H128C92.654 224 64 195.346 64 160V152C64 138.745 74.745 128 88 128H235.406A47.995 47.995 0 0 0 261.098 120.545L372.846 49.734A24.001000000000005 24.001000000000005 0 0 0 384 29.461V-32z" />
+    <glyph glyph-name="hand-paper"
+      unicode="&#xF256;"
+      horiz-adv-x="448" d=" M408.781 319.993C386.356 320.4220000000001 368 301.64 368 279.2100000000001V192H360V368.21C360 390.64 341.644 409.4220000000001 319.219 408.993C297.488 408.577 280 390.831 280 369V192H272V407.21C272 429.64 253.644 448.4220000000001 231.219 447.993C209.488 447.577 192 429.831 192 408V192H184V367.21C184 389.64 165.644 408.4220000000001 143.219 407.993C121.488 407.577 104 389.831 104 368V132.0080000000001L72.352 175.5270000000001C59.359 193.393 34.343 197.3440000000001 16.475 184.35C-1.39 171.356 -5.34 146.34 7.653 128.473L133.254 -44.232A48 48 0 0 1 172.073 -64H369.663C391.937 -64 411.2850000000001 -48.676 416.387 -26.994L442.895 85.6659999999999A192.011 192.011 0 0 1 447.999 129.641V280C448 301.831 430.512 319.577 408.781 319.993z" />
+    <glyph glyph-name="hand-peace"
+      unicode="&#xF25B;"
+      horiz-adv-x="448" d=" M408 232C385.908 232 368 214.091 368 192H360V224C360 246.091 342.092 264 320 264S280 246.091 280 224V192H272V400C272 426.51 250.51 448 224 448S176 426.51 176 400V192H162.428L92.688 369.551C82.994 394.226 55.134 406.37 30.461 396.676C5.787 386.983 -6.356 359.123 3.337 334.449L78.102 144.107L47.012 119.235C31.631 106.929 27.497 85.257 37.271 68.1539999999999L101.271 -43.8460000000001A39.998 39.998 0 0 1 136 -64H376C394.562 -64 410.686 -51.23 414.937 -33.162L446.937 102.838A39.97 39.97 0 0 1 448 112V192C448 214.091 430.092 232 408 232z" />
+    <glyph glyph-name="hand-point-down"
+      unicode="&#xF0A7;"
+      horiz-adv-x="384" d=" M91.826 -19.2V130.034C83.578 124.193 75.268 119.464 66.908 115.881C35.098 102.248 -0.014 125.778 0 160C0.008 178.616 10.897 192.203 29.092 200C57.378 212.122 93.421 278.648 106.415 307.534C114.371 325.391 131.894 335.987 150.26 335.998L150.261 336H321.7870000000001C333.5990000000001 336 343.6840000000001 327.404 345.49 315.731C352.74 268.894 383.973 253.971 383.805 192C383.798 189.276 384 178.746 384 176C384 125.346 361.878 94.426 312.737 103.4C303.44 84.803 273.251 72.662 250.422 86.95C229.245 62.305 196.526 64.311 179.478 80.651V-19.2C179.478 -43.35 159.277 -64 135.652 -64C112.369 -64 91.826 -42.65 91.826 -19.2zM112 376V424C112 437.255 122.745 448 136 448H328C341.255 448 352 437.255 352 424V376C352 362.745 341.255 352 328 352H136C122.745 352 112 362.745 112 376zM324 400C324 411.046 315.046 420 304 420S284 411.046 284 400S292.954 380 304 380S324 388.954 324 400z" />
+    <glyph glyph-name="hand-point-left"
+      unicode="&#xF0A5;"
+      horiz-adv-x="512" d=" M44.8 292.174H194.034C188.193 300.4220000000001 183.464 308.732 179.881 317.092C166.248 348.902 189.778 384.014 224 384C242.616 383.992 256.203 373.103 264 354.908C276.122 326.622 342.648 290.579 371.534 277.5850000000001C389.391 269.629 399.987 252.106 399.998 233.74L400 233.739V62.213C400 50.401 391.404 40.316 379.731 38.51C332.894 31.26 317.971 0.027 256 0.195C253.276 0.202 242.746 0 240 0C189.346 0 158.426 22.122 167.4 71.263C148.803 80.5600000000001 136.662 110.749 150.95 133.578C126.305 154.7550000000001 128.311 187.4740000000001 144.651 204.5220000000001H44.8C20.65 204.5220000000001 0 224.7230000000001 0 248.3480000000001C0 271.6310000000001 21.35 292.1740000000001 44.8 292.1740000000001zM440 272H488C501.255 272 512 261.255 512 248V56C512 42.745 501.255 32 488 32H440C426.745 32 416 42.745 416 56V248C416 261.255 426.745 272 440 272zM464 60C475.046 60 484 68.954 484 80S475.046 100 464 100S444 91.046 444 80S452.954 60 464 60z" />
+    <glyph glyph-name="hand-point-right"
+      unicode="&#xF0A4;"
+      horiz-adv-x="512" d=" M512 248.348C512 224.723 491.35 204.522 467.2 204.522H367.349C383.689 187.4740000000001 385.695 154.756 361.05 133.578C375.338 110.749 363.197 80.561 344.6 71.263C353.574 22.122 322.654 0 272 0C269.254 0 258.724 0.203 256 0.195C194.029 0.027 179.106 31.26 132.269 38.51C120.596 40.317 112 50.401 112 62.214V233.739L112.002 233.74C112.013 252.106 122.609 269.629 140.466 277.5850000000001C169.352 290.579 235.879 326.623 248 354.908C255.797 373.102 269.384 383.992 288 384C322.222 384.014 345.752 348.902 332.1190000000001 317.092C328.536 308.733 323.807 300.422 317.966 292.174H467.2C490.65 292.174 512 271.631 512 248.348zM96 248V56C96 42.745 85.255 32 72 32H24C10.745 32 0 42.745 0 56V248C0 261.255 10.745 272 24 272H72C85.255 272 96 261.255 96 248zM68 80C68 91.046 59.046 100 48 100S28 91.046 28 80S36.954 60 48 60S68 68.954 68 80z" />
+    <glyph glyph-name="hand-point-up"
+      unicode="&#xF0A6;"
+      horiz-adv-x="384" d=" M135.652 448C159.277 448 179.478 427.35 179.478 403.2V303.349C196.526 319.689 229.244 321.695 250.422 297.05C273.251 311.338 303.439 299.197 312.737 280.6C361.878 289.574 384 258.654 384 208C384 205.254 383.7970000000001 194.724 383.805 192C383.973 130.029 352.74 115.106 345.49 68.269C343.683 56.596 333.599 48 321.786 48H150.261L150.26 48.002C131.894 48.013 114.371 58.609 106.415 76.466C93.421 105.352 57.377 171.878 29.092 184C10.897 191.797 0.008 205.384 0 224C-0.014 258.222 35.098 281.752 66.908 268.1190000000001C75.267 264.536 83.578 259.807 91.826 253.966V403.2C91.826 426.65 112.369 448 135.652 448zM136 32H328C341.255 32 352 21.255 352 8V-40C352 -53.255 341.255 -64 328 -64H136C122.745 -64 112 -53.255 112 -40V8C112 21.255 122.745 32 136 32zM304 4C292.954 4 284 -4.954 284 -16S292.954 -36 304 -36S324 -27.046 324 -16S315.046 4 304 4z" />
+    <glyph glyph-name="hand-pointer"
+      unicode="&#xF25A;"
+      horiz-adv-x="448" d=" M448 208V112C448 108.916 447.644 105.841 446.937 102.838L414.937 -33.162C410.686 -51.23 394.562 -64 376 -64H168A40.004 40.004 0 0 0 135.65 -47.527L7.653 128.473C-5.34 146.339 -1.39 171.356 16.475 184.349C34.342 197.343 59.359 193.392 72.352 175.526L104 132.008V408C104 430.091 121.908 448 144 448S184 430.091 184 408V208H192V248C192 270.091 209.908 288 232 288S272 270.091 272 248V208H280V232C280 254.091 297.908 272 320 272S360 254.091 360 232V208H368C368 230.091 385.908 248 408 248S448 230.091 448 208zM192 128H184V32H192V128zM280 128H272V32H280V128zM368 128H360V32H368V128z" />
+    <glyph glyph-name="hand-rock"
+      unicode="&#xF255;"
+      horiz-adv-x="512" d=" M512 319.2100000000001C512 345.5320000000001 491.139 367.554 464.82 367.993C437.935 368.442 416 346.783 416 320H408V351.21C408 377.532 387.139 399.554 360.82 399.993C333.935 400.442 312 378.783 312 352V320H304V367.21C304 393.532 283.139 415.554 256.82 415.993C229.935 416.442 208 394.783 208 368V320H200V351.21C200 377.532 179.139 399.554 152.82 399.993C125.935 400.442 104 378.783 104 352V216L96 223.111V271.2100000000001C96 297.5320000000001 75.139 319.554 48.82 319.993C21.935 320.442 0 298.783 0 272V205.555A95.998 95.998 0 0 1 32.221 133.804L143.889 34.543A47.999 47.999 0 0 0 160 -1.333V-8C160 -21.255 170.745 -32 184 -32H424C437.255 -32 448 -21.255 448 -8V-5.079A96.01 96.01 0 0 0 455.523 32.175L504.477 148.44A96.002 96.002 0 0 1 512 185.694V319.2100000000001z" />
+    <glyph glyph-name="hand-scissors"
+      unicode="&#xF257;"
+      horiz-adv-x="512" d=" M216 8C216 30.092 233.909 48 256 48V56H224C201.909 56 184 73.908 184 96S201.909 136 224 136H256V144H48C21.49 144 0 165.49 0 192S21.49 240 48 240H256V253.572L78.449 323.312C53.775 333.006 41.631 360.867 51.324 385.54C61.017 410.214 88.878 422.357 113.552 412.664L303.894 337.899L328.766 368.9890000000001C341.072 384.37 362.7440000000001 388.504 379.8470000000001 378.73L491.847 314.73A40.002 40.002 0 0 0 512 280V40C512 21.438 499.23 5.314 481.162 1.063L345.162 -30.937A39.982 39.982 0 0 0 336 -32H256C233.909 -32 216 -14.092 216 8z" />
+    <glyph glyph-name="hand-spock"
+      unicode="&#xF259;"
+      horiz-adv-x="512" d=" M10.872 131.415C26.011 147.501 51.326 148.269 67.415 133.1280000000001L128 76.107V155.5120000000001L88.995 327.135C84.099 348.677 97.593 370.1090000000001 119.135 375.005C140.684 379.899 162.11 366.406 167.005 344.8640000000001L201.747 192H211.58L164.016 399.034C159.07 420.565 172.514 442.028 194.044 446.974C215.576 451.924 237.038 438.476 241.984 416.9460000000001L293.664 192H308.769L357.194 385.702C362.5510000000001 407.134 384.269 420.164 405.701 414.806C427.1330000000001 409.448 440.1640000000001 387.731 434.805 366.299L391.231 192H402.311L433.079 321.265C438.196 342.756 459.764 356.033 481.256 350.912C502.747 345.795 516.021 324.226 510.903 302.735L474.611 150.268A96.02400000000002 96.02400000000002 0 0 1 472 128.033V85.931A96.002 96.002 0 0 0 468.04 58.6440000000001L441.8660000000001 -29.6429999999999C435.825 -50.022 417.101 -64 395.846 -64H179.172A48.00200000000001 48.00200000000001 0 0 0 146.274 -50.954L12.585 74.872C-3.502 90.013 -4.268 115.328 10.872 131.415z" />
+    <glyph glyph-name="hands-helping"
+      unicode="&#xF4C4;"
+      horiz-adv-x="640" d=" M488 256H336V200C336 160.3 303.7 128 264 128S192 160.3 192 200V321.6L127.1 282.6C107.8 271.1 96 250.2 96 227.8V180.5L16 134.3C0.7 125.5 -4.6 105.9 4.3 90.6L84.3 -48C93.1 -63.3 112.7 -68.5 128 -59.7L231.4 0H368C403.3 0 432 28.7 432 64H448C465.7 64 480 78.3 480 96V160H488C501.3 160 512 170.7 512 184V232C512 245.3 501.3 256 488 256zM635.7 293.4L555.7 432C546.9 447.3 527.3 452.5 512 443.7L408.6 384H306.4C294.4 384 282.7 380.6 272.5 374.3L239 353.4C229.6 347.6 224 337.3 224 326.3V200C224 177.9 241.9 160 264 160S304 177.9 304 200V288H488C518.9 288 544 262.9 544 232V203.5L624 249.7C639.3 258.6 644.5 278.1 635.7 293.4z" />
+    <glyph glyph-name="hands"
+      unicode="&#xF4C2;"
+      horiz-adv-x="640" d=" M204.8 217.6C194.2 231.7 174.1 234.6 160 224C145.9 213.4 143 193.3 153.6 179.2L191.7 128.4C196.5 122 195.8 113.1 190.2 107.5L177.4 94.7C170.7 88 159.8 88.5 153.8 95.8L64 203.6V352C64 369.7 49.7 384 32 384S0 369.7 0 352V133.6C0 122.7000000000001 3.7 112.1 10.5 103.6L114.6 -30.7C119.6 -37.2 123 -44.6 125 -52.4C126.8 -59.2999999999999 133.1 -64 140.3 -64H272C280.8 -64 288 -56.8 288 -48V64C288 91.7 279 118.6 262.4 140.8L204.8 217.6zM608 384C590.3 384 576 369.7 576 352V203.6L486.2 95.8C480.2 88.6 469.2 88.1 462.6 94.7L449.8 107.5C444.2 113.1 443.5 122 448.3 128.4L486.4 179.2C497 193.3 494.1 213.4 480 224C465.9 234.6 445.8 231.7 435.2 217.6L377.6 140.8C361 118.6 352 91.7 352 64V-48C352 -56.8 359.2 -64 368 -64H499.7C506.8 -64 513.2 -59.3 515 -52.4C517 -44.6 520.4 -37.2 525.4 -30.7L629.5 103.6C636.3 112.1 640 122.7000000000001 640 133.6V352C640 369.7 625.7 384 608 384z" />
+    <glyph glyph-name="handshake"
+      unicode="&#xF2B5;"
+      horiz-adv-x="640" d=" M434.7 384H348.8C340.8 384 333.1 381 327.2 375.6L228.8999999999999 285.6C228.8 285.5 228.7 285.3 228.5999999999999 285.2C211.9999999999999 269.6 212.2999999999999 244.7 226.4999999999999 229.2C239.1999999999999 215.3 265.8999999999999 211.6 282.5999999999999 226.5C282.7 226.6 282.8999999999999 226.6 282.9999999999999 226.7L362.8999999999999 299.9C369.3999999999999 305.8 379.5999999999999 305.4 385.4999999999999 298.9C391.4999999999999 292.4 390.9999999999999 282.3 384.4999999999999 276.3L358.3999999999999 252.4L504 134.2C506.9 131.8 509.5 129.2 511.9 126.5V320L457.3 374.6C451.4 380.6 443.2 384 434.7 384zM544 319.8V95.9C544 78.2 558.3 63.9 576 63.9H640V319.8H544zM592 95.9C583.2 95.9 576 103.1 576 111.9S583.2 127.9 592 127.9S608 120.7 608 111.9S600.8 95.9 592 95.9zM0 64H64C81.7 64 96 78.3 96 96V319.8H0V64zM48 127.9C56.8 127.9 64 120.7 64 111.9S56.8 95.9 48 95.9S32 103.1 32 111.9C32 120.8 39.2 127.9 48 127.9zM483.9 109.3L334.6 230.5L304.6 203C274.9000000000001 175.9 229.4000000000001 178.5 202.9 207.4C176 236.8 178.1 282.3 207.3000000000001 309.1L289.1 384H205.3C196.8 384 188.7 380.6 182.7 374.6L128 320V96.1H146.3L236.8 14.2C264.2 -8.1 304.5 -3.9 326.8 23.5000000000001L327 23.7L344.9 8.2C360.8 -4.8 384.3 -2.3 397.2 13.6L428.6 52.2L434 47.8000000000001C447.7 36.7 467.8999999999999 38.7 478.9999999999999 52.5000000000001L488.4999999999999 64.2000000000001C499.6999999999999 78.0000000000001 497.6 98.1 483.8999999999999 109.3000000000001z" />
+    <glyph glyph-name="hashtag"
+      unicode="&#xF292;"
+      horiz-adv-x="448" d=" M440.667 265.891L447.81 305.891C449.123 313.246 443.468 320 435.997 320H361.187L375.81 401.891C377.123 409.246 371.468 416 363.997 416H323.365A12 12 0 0 1 311.552 406.109L296.175 320H197.54L212.163 401.891C213.477 409.246 207.822 416 200.35 416H159.718A12 12 0 0 1 147.905 406.109L132.528 320H53.432A12 12 0 0 1 41.619 310.1090000000001L34.476 270.1090000000001C33.163 262.754 38.818 256 46.289 256H121.099L98.242 128H19.146A12 12 0 0 1 7.333 118.109L0.19 78.109C-1.123 70.754 4.532 64 12.003 64H86.813L72.19 -17.891C70.877 -25.246 76.532 -32 84.003 -32H124.635A12 12 0 0 1 136.448 -22.109L151.826 64H250.46L235.837 -17.891C234.523 -25.246 240.178 -32 247.65 -32H288.282A12 12 0 0 1 300.095 -22.109L315.472 64H394.568A12 12 0 0 1 406.381 73.891L413.524 113.891C414.837 121.2460000000001 409.182 128 401.711 128H326.901L349.7579999999999 256H428.854A12 12 0 0 1 440.6669999999999 265.891zM261.889 128H163.255L186.112 256H284.746L261.889 128z" />
+    <glyph glyph-name="hdd"
+      unicode="&#xF0A0;"
+      horiz-adv-x="576" d=" M576 144V48C576 21.49 554.51 0 528 0H48C21.49 0 0 21.49 0 48V144C0 170.51 21.49 192 48 192H528C554.51 192 576 170.51 576 144zM528 224A79.557 79.557 0 0 0 558.777 217.835L462.25 362.626A48.003 48.003 0 0 1 422.311 384H153.689A48 48 0 0 1 113.751 362.626L17.223 217.835A79.557 79.557 0 0 0 48 224H528zM480 128C462.327 128 448 113.673 448 96S462.327 64 480 64S512 78.327 512 96S497.673 128 480 128zM384 128C366.327 128 352 113.673 352 96S366.327 64 384 64S416 78.327 416 96S401.673 128 384 128z" />
+    <glyph glyph-name="heading"
+      unicode="&#xF1DC;"
+      horiz-adv-x="512" d=" M496 368V400C496 408.837 488.837 416 480 416H320C311.163 416 304 408.837 304 400V368C304 359.163 311.163 352 320 352H357.621V224H154.379V352H192C200.837 352 208 359.163 208 368V400C208 408.837 200.837 416 192 416H32C23.163 416 16 408.837 16 400V368C16 359.163 23.163 352 32 352H69.275V32H32C23.163 32 16 24.837 16 16V-16C16 -24.837 23.163 -32 32 -32H192C200.837 -32 208 -24.837 208 -16V16C208 24.837 200.837 32 192 32H154.379V160H357.62V32H320C311.163 32 304 24.837 304 16V-16C304 -24.837 311.163 -32 320 -32H480C488.837 -32 496 -24.837 496 -16V16C496 24.837 488.837 32 480 32H442.725V352H480C488.837 352 496 359.163 496 368z" />
+    <glyph glyph-name="headphones"
+      unicode="&#xF025;"
+      horiz-adv-x="512" d=" M256 416C114.52 416 0 301.504 0 160V112A32 32 0 0 1 17.689 83.378L32.072 76.187C34.083 16.097 83.421 -32 144 -32H168C181.255 -32 192 -21.255 192 -8V168C192 181.255 181.255 192 168 192H144C112.658 192 84.329 179.121 64 158.373V160C64 265.8690000000001 150.131 352 256 352S448 265.8690000000001 448 160V158.373C427.671 179.121 399.342 192 368 192H344C330.745 192 320 181.255 320 168V-8C320 -21.255 330.745 -32 344 -32H368C428.579 -32 477.917 16.098 479.928 76.187L494.31 83.378A32 32 0 0 1 512 112V160C512 301.4790000000001 397.504 416 256 416z" />
+    <glyph glyph-name="heart"
+      unicode="&#xF004;"
+      horiz-adv-x="512" d=" M462.3 385.4C407.5 432.1 326 423.7 275.7 371.8L256 351.5L236.3 371.8C186.1 423.7 104.5 432.1 49.7 385.4C-13.1 331.8 -16.4 235.6 39.8 177.5L233.3 -22.3C245.8 -35.2 266.1 -35.2 278.6 -22.3L472.1 177.5C528.4 235.6 525.1 331.8 462.3 385.4z" />
+    <glyph glyph-name="heartbeat"
+      unicode="&#xF21E;"
+      horiz-adv-x="512" d=" M320.2 204.2L270.5 104.8C264.5 92.6999999999999 247.1 93.1 241.6 105.4L184.7 231.7L154.7 160H60.6L243.1 -26.5C250.2 -33.8 261.7 -33.8 268.8 -26.5L451.4 160H342.3L320.2 204.2zM473.7 374.1L471.3 376.6C419.8 429.2 335.5 429.2 283.9 376.6L256 348L228.1 376.5C176.6 429.2 92.2 429.2 40.7 376.5L38.3 374.1C-10.4 324.3 -12.5 245 31 192H133.4L169.3 278.2C174.7 291.1 192.9 291.4 198.7 278.6L256.9000000000001 149.3L305.9000000000001 247.2C311.8 259 328.6 259 334.5000000000001 247.2L362.1000000000001 192H481C524.5 245 522.4 324.3 473.7 374.0999999999999z" />
+    <glyph glyph-name="history"
+      unicode="&#xF1DA;"
+      horiz-adv-x="512" d=" M504 192.469C504.253 55.829 392.82 -55.903 256.18 -55.999C197.165 -56.041 142.957 -35.469 100.358 -1.088C89.281 7.852 88.453 24.453 98.519 34.519L109.786 45.786C118.395 54.395 132.139 55.337 141.677 47.77C173.062 22.865 212.781 8 256 8C357.705 8 440 90.311 440 192C440 293.705 357.689 376 256 376C207.186 376 162.851 357.031 129.932 326.068L180.686 275.314C190.766 265.234 183.627 248 169.373 248H24C15.163 248 8 255.163 8 264V409.373C8 423.627 25.234 430.766 35.314 420.687L84.686 371.315C129.209 413.864 189.552 440 256 440C392.81 440 503.747 329.2200000000001 504 192.469zM323.088 113.685L332.911 126.315C341.0489999999999 136.778 339.164 151.857 328.701 159.994L288 191.651V296C288 309.255 277.255 320 264 320H248C234.745 320 224 309.255 224 296V160.349L289.409 109.475C299.872 101.338 314.95 103.222 323.088 113.685z" />
+    <glyph glyph-name="hockey-puck"
+      unicode="&#xF453;"
+      horiz-adv-x="512" d=" M0 288C0 341 114.6 384 256 384S512 341 512 288S397.4 192 256 192S0 235 0 288zM0 205.8V96C0 43 114.6 0 256 0S512 43 512 96V205.8C398.6 123.5 113.5 123.4 0 205.8z" />
+    <glyph glyph-name="home"
+      unicode="&#xF015;"
+      horiz-adv-x="576" d=" M488 135.3V-8C488 -21.3 477.3 -32 464 -32H348C341.4 -32 336 -26.6 336 -20V92C336 98.6 330.6 104 324 104H252C245.4 104 240 98.6 240 92V-20C240 -26.6 234.6 -32 228 -32H112C98.7 -32 88 -21.3 88 -8V135.3C88 138.9 89.6 142.3 92.4 144.6L280.4 299.4000000000001C284.8 303 291.2 303 295.7 299.4000000000001L483.7 144.6C486.4 142.3 488 138.9 488 135.3zM571.6 196.2L488 265.1V403.6C488 410.2 482.6 415.6 476 415.6H420C413.4 415.6 408 410.2 408 403.6V331L318.5 404.7C300.8 419.3 275.2 419.3 257.5 404.7L4.4 196.2C-0.7 192 -1.4 184.4 2.8 179.3L28.3 148.3C32.5 143.2 40.1 142.5 45.2 146.7L280.4 340.4C284.8 344 291.2 344 295.7 340.4L530.9 146.7C536 142.5 543.6 143.2 547.8 148.3L573.3 179.3C577.5 184.5 576.6999999999999 192 571.5999999999999 196.2z" />
+    <glyph glyph-name="hospital-alt"
+      unicode="&#xF47D;"
+      horiz-adv-x="576" d=" M544 352H416V416C416 433.7 401.7 448 384 448H192C174.3 448 160 433.7 160 416V352H32C14.3 352 0 337.7 0 320V-48C0 -56.8 7.2 -64 16 -64H560C568.8 -64 576 -56.8 576 -48V320C576 337.7 561.7 352 544 352zM160 12C160 5.4 154.6 0 148 0H108C101.4 0 96 5.4 96 12V52C96 58.6 101.4 64 108 64H148C154.6 64 160 58.6 160 52V12zM160 140C160 133.4 154.6 128 148 128H108C101.4 128 96 133.4 96 140V180C96 186.6 101.4 192 108 192H148C154.6 192 160 186.6 160 180V140zM320 12C320 5.4 314.6 0 308 0H268C261.4 0 256 5.4 256 12V52C256 58.6 261.4 64 268 64H308C314.6 64 320 58.6 320 52V12zM320 140C320 133.4 314.6 128 308 128H268C261.4 128 256 133.4 256 140V180C256 186.6 261.4 192 268 192H308C314.6 192 320 186.6 320 180V140zM336 310C336 306.7 333.3 304 330 304H304V278C304 274.7 301.3 272 298 272H278C274.7 272 272 274.7 272 278V304H246C242.7 304 240 306.7 240 310V330C240 333.3 242.7 336 246 336H272V362C272 365.3 274.7 368 278 368H298C301.3 368 304 365.3 304 362V336H330C333.3 336 336 333.3 336 330V310zM480 12C480 5.4 474.6 0 468 0H428C421.4 0 416 5.4 416 12V52C416 58.6 421.4 64 428 64H468C474.6 64 480 58.6 480 52V12zM480 140C480 133.4 474.6 128 468 128H428C421.4 128 416 133.4 416 140V180C416 186.6 421.4 192 428 192H468C474.6 192 480 186.6 480 180V140z" />
+    <glyph glyph-name="hospital-symbol"
+      unicode="&#xF47E;"
+      horiz-adv-x="512" d=" M256 448C114.6 448 0 333.4 0 192S114.6 -64 256 -64S512 50.6 512 192S397.4 448 256 448zM368 72C368 67.6 364.4 64 360 64H312C307.6 64 304 67.6 304 72V160H208V72C208 67.6 204.4 64 200 64H152C147.6 64 144 67.6 144 72V312C144 316.4 147.6 320 152 320H200C204.4 320 208 316.4 208 312V224H304V312C304 316.4 307.6 320 312 320H360C364.4 320 368 316.4 368 312V72z" />
+    <glyph glyph-name="hospital"
+      unicode="&#xF0F8;"
+      horiz-adv-x="448" d=" M448 -44V-64H0V-44C0 -37.373 5.373 -32 12 -32H32V328C32 341.255 42.745 352 56 352H144V424C144 437.255 154.745 448 168 448H280C293.255 448 304 437.255 304 424V352H392C405.255 352 416 341.255 416 328V-32H436C442.627 -32 448 -37.373 448 -44zM308 256H268C261.373 256 256 250.627 256 244V204C256 197.373 261.373 192 268 192H308C314.627 192 320 197.373 320 204V244C320 250.627 314.627 256 308 256zM140 192H180C186.627 192 192 197.373 192 204V244C192 250.627 186.627 256 180 256H140C133.373 256 128 250.627 128 244V204C128 197.373 133.373 192 140 192zM244 64H204C197.373 64 192 58.627 192 52V-32H256V52C256 58.627 250.627 64 244 64zM308 160H268C261.373 160 256 154.627 256 148V108C256 101.373 261.373 96 268 96H308C314.627 96 320 101.373 320 108V148C320 154.627 314.627 160 308 160zM192 148C192 154.627 186.627 160 180 160H140C133.373 160 128 154.627 128 148V108C128 101.373 133.373 96 140 96H180C186.627 96 192 101.373 192 108V148zM182 352H208V326A6 6 0 0 1 214 320H234A6 6 0 0 1 240 326V352H266A6 6 0 0 1 272 358V378A6 6 0 0 1 266 384H240V410A6 6 0 0 1 234 416H214A6 6 0 0 1 208 410V384H182A6 6 0 0 1 176 378V358A6 6 0 0 1 182 352z" />
+    <glyph glyph-name="hourglass-end"
+      unicode="&#xF253;"
+      horiz-adv-x="384" d=" M360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384zM192 240C134.213 240 88 306.5180000000001 88 384H296C296 306.055 249.49 240 192 240z" />
+    <glyph glyph-name="hourglass-half"
+      unicode="&#xF252;"
+      horiz-adv-x="384" d=" M360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448zM284.9220000000001 64H99.08C116.139 110.797 151.176 144 192 144C232.821 144 267.862 110.804 284.9220000000001 64zM284.9410000000001 320H99.078C91.988 339.452 88 361.252 88 384H296C296 361.195 292.013 339.413 284.941 320z" />
+    <glyph glyph-name="hourglass-start"
+      unicode="&#xF251;"
+      horiz-adv-x="384" d=" M360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448zM296 0H88C88 77.458 134.204 144 192 144C249.786 144 296 77.483 296 0z" />
+    <glyph glyph-name="hourglass"
+      unicode="&#xF254;"
+      horiz-adv-x="384" d=" M360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384z" />
+    <glyph glyph-name="i-cursor"
+      unicode="&#xF246;"
+      horiz-adv-x="256" d=" M256 395.952V435.935C256 442.504 250.726 447.852 244.158 447.9340000000001C211.621 448.344 166.469 447.989 128 410.041C90.266 447.264 46.979 448.114 11.913 447.886C5.318 447.843 0 442.481 0 435.886V396.241C0 389.554 5.458 384.163 12.145 384.243C38.111 384.553 96 380.757 96 335.818V224H60C53.373 224 48 218.627 48 212V172C48 165.373 53.373 160 60 160H96V48C96 3.068 39.925 -0.031 12.05 0.041C5.404 0.058 0 -5.306 0 -11.952V-51.935C0 -58.504 5.274 -63.852 11.842 -63.934C44.379 -64.3430000000001 89.531 -63.988 128 -26.04C165.734 -63.263 209.021 -64.1130000000001 244.087 -63.885C250.682 -63.842 256 -58.48 256 -51.885V-12.24C256 -5.553 250.542 -0.162 243.855 -0.242C217.889 -0.553 160 3.061 160 48V160H196C202.627 160 208 165.373 208 172V212C208 218.627 202.627 224 196 224H160V335.818C160 380.75 216.075 384.031 243.95 383.9600000000001C250.596 383.942 256 389.3060000000001 256 395.952z" />
+    <glyph glyph-name="id-badge"
+      unicode="&#xF2C1;"
+      horiz-adv-x="384" d=" M336 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V400C384 426.51 362.51 448 336 448zM128 404C128 410.627 133.373 416 140 416H244C250.627 416 256 410.627 256 404V396C256 389.373 250.627 384 244 384H140C133.373 384 128 389.373 128 396V404zM192 288C236.183 288 272 252.183 272 208S236.183 128 192 128S112 163.817 112 208S147.817 288 192 288zM320 56C320 42.745 309.255 32 296 32H88C74.745 32 64 42.745 64 56V74.523C64 96.549 78.99 115.7480000000001 100.358 121.09L136.014 130.004C165.115 109.072 210.523 103.059 247.984 130.004L283.64 121.09C305.01 115.7480000000001 320 96.548 320 74.523V56z" />
+    <glyph glyph-name="id-card-alt"
+      unicode="&#xF47F;"
+      horiz-adv-x="576" d=" M512 384H384V288H192V384H64C28.7 384 0 355.3 0 320V0C0 -35.3 28.7 -64 64 -64H160V-53.3C160 -6.2 198.2 32 245.3 32H330.6C377.7000000000001 32 415.9000000000001 -6.2 415.9000000000001 -53.3V-64H511.9C547.2 -64 575.9000000000001 -35.3 575.9000000000001 0V320C576.0000000000001 355.3 547.3000000000001 384 512.0000000000001 384zM288 64C243.8 64 208 99.8 208 144S243.8 224 288 224S368 188.2 368 144S332.2 64 288 64zM352 416C352 433.7 337.7 448 320 448H256C238.3 448 224 433.7 224 416V320H352V416z" />
+    <glyph glyph-name="id-card"
+      unicode="&#xF2C2;"
+      horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM256 98C256 88.059 247.941 80 238 80H82C72.059 80 64 88.059 64 98V111.892C64 128.411 75.243 142.811 91.269 146.817L118.011 153.503C139.837 137.804 173.893 133.294 201.989 153.503L228.732 146.817C244.757 142.811 256 128.411 256 111.892V98zM100 212C100 245.137 126.863 272 160 272S220 245.137 220 212S193.137 152 160 152S100 178.863 100 212zM448 108C448 101.373 442.627 96 436 96H300C293.373 96 288 101.373 288 108V116C288 122.627 293.373 128 300 128H436C442.627 128 448 122.627 448 116V108zM448 172C448 165.373 442.627 160 436 160H300C293.373 160 288 165.373 288 172V180C288 186.627 293.373 192 300 192H436C442.627 192 448 186.627 448 180V172zM448 236C448 229.373 442.627 224 436 224H300C293.373 224 288 229.373 288 236V244C288 250.627 293.373 256 300 256H436C442.627 256 448 250.627 448 244V236zM480 332C480 325.373 474.627 320 468 320H44C37.373 320 32 325.373 32 332V340C32 346.627 37.373 352 44 352H468C474.627 352 480 346.627 480 340V332z" />
+    <glyph glyph-name="image"
+      unicode="&#xF03E;"
+      horiz-adv-x="512" d=" M464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336V48C512 21.49 490.51 0 464 0zM112 328C81.072 328 56 302.928 56 272S81.072 216 112 216S168 241.072 168 272S142.928 328 112 328zM64 64H448V176L360.485 263.515C355.7990000000001 268.201 348.201 268.201 343.514 263.515L208 128L152.485 183.515C147.799 188.201 140.201 188.201 135.514 183.515L64 112V64z" />
+    <glyph glyph-name="images"
+      unicode="&#xF302;"
+      horiz-adv-x="576" d=" M480 32V16C480 -10.51 458.51 -32 432 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V112C64 67.888 99.888 32 144 32H480zM576 112V368C576 394.51 554.51 416 528 416H144C117.49 416 96 394.51 96 368V112C96 85.49 117.49 64 144 64H528C554.51 64 576 85.49 576 112zM256 320C256 293.49 234.51 272 208 272S160 293.49 160 320S181.49 368 208 368S256 346.51 256 320zM160 176L215.515 231.515C220.201 236.201 227.799 236.201 232.486 231.515L272 192L407.515 327.515C412.201 332.201 419.799 332.201 424.486 327.515L512 240V128H160V176z" />
+    <glyph glyph-name="inbox"
+      unicode="&#xF01C;"
+      horiz-adv-x="576" d=" M567.938 204.092L462.25 362.626A48.003 48.003 0 0 1 422.311 384H153.689A48 48 0 0 1 113.751 362.626L8.062 204.092A47.994 47.994 0 0 1 0 177.467V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V177.467A47.994 47.994 0 0 1 567.938 204.092zM162.252 320H413.749L499.082 192H376L344 128H232L200 192H76.918L162.252 320z" />
+    <glyph glyph-name="indent"
+      unicode="&#xF03C;"
+      horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM176 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H176C167.163 292 160 284.837 160 276V236C160 227.163 167.163 220 176 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM176 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H176C167.163 164 160 156.837 160 148V108C160 99.163 167.163 92 176 92zM123.313 203.313L27.313 299.297C17.266 309.348 0 302.224 0 287.9840000000001V96.009C0 81.68 17.325 74.705 27.313 84.696L123.313 180.6880000000001C129.562 186.9350000000001 129.562 197.0650000000001 123.313 203.3130000000001z" />
+    <glyph glyph-name="industry"
+      unicode="&#xF275;"
+      horiz-adv-x="512" d=" M475.115 284.219L336 195.691V263.971C336 282.887 315.069 294.37 299.115 284.219L160 195.691V392C160 405.255 149.255 416 136 416H24C10.745 416 0 405.255 0 392V-8C0 -21.255 10.745 -32 24 -32H488C501.255 -32 512 -21.255 512 -8V263.971C512 282.8880000000001 491.069 294.37 475.115 284.219z" />
+    <glyph glyph-name="info-circle"
+      unicode="&#xF05A;"
+      horiz-adv-x="512" d=" M256 440C119.043 440 8 328.9170000000001 8 192C8 55.003 119.043 -56 256 -56S504 55.003 504 192C504 328.9170000000001 392.957 440 256 440zM256 330C279.1960000000001 330 298 311.1960000000001 298 288S279.1960000000001 246 256 246S214 264.804 214 288S232.804 330 256 330zM312 76C312 69.373 306.627 64 300 64H212C205.373 64 200 69.373 200 76V100C200 106.627 205.373 112 212 112H224V176H212C205.373 176 200 181.373 200 188V212C200 218.627 205.373 224 212 224H276C282.627 224 288 218.627 288 212V112H300C306.627 112 312 106.627 312 100V76z" />
+    <glyph glyph-name="info"
+      unicode="&#xF129;"
+      horiz-adv-x="192" d=" M20 23.771H40V168.229H20C8.954 168.229 0 177.183 0 188.229V236C0 247.046 8.954 256 20 256H132C143.046 256 152 247.046 152 236V23.771H172C183.046 23.771 192 14.817 192 3.771V-44C192 -55.046 183.046 -64 172 -64H20C8.954 -64 0 -55.046 0 -44V3.771C0 14.817 8.954 23.771 20 23.771zM96 448C56.235 448 24 415.765 24 376S56.235 304 96 304S168 336.235 168 376S135.764 448 96 448z" />
+    <glyph glyph-name="italic"
+      unicode="&#xF033;"
+      horiz-adv-x="320" d=" M204.758 32H170.909L233.0010000000001 352H273.7260000000001A16 16 0 0 1 289.4300000000001 364.937L295.6720000000001 396.937C297.599 406.8160000000001 290.034 416 279.968 416H120.235A16 16 0 0 1 104.531 403.063L98.289 371.063C96.362 361.184 103.927 352 113.993 352H147.839L85.749 32H46.278A16 16 0 0 1 30.574 19.065L24.329 -12.935C22.402 -22.815 29.967 -32 40.034 -32H198.513A16 16 0 0 1 214.217 -19.065L220.462 12.935C222.389 22.815 214.824 32 204.758 32z" />
+    <glyph glyph-name="key"
+      unicode="&#xF084;"
+      horiz-adv-x="512" d=" M512 271.999C512 174.797 433.202 96 336 96C324.78 96 313.81 97.062 303.173 99.069L279.161 72.055A23.999000000000002 23.999000000000002 0 0 0 261.223 64H224V24C224 10.745 213.255 0 200 0H160V-40C160 -53.255 149.255 -64 136 -64H24C10.745 -64 0 -53.255 0 -40V38.059C0 44.424 2.529 50.529 7.029 55.03L168.831 216.832C163.108 234.186 160 252.729 160 272C160 369.202 238.797 447.999 335.999 448C433.488 448.001 512 369.4890000000001 512 271.999zM336 320C336 293.49 357.49 272 384 272S432 293.49 432 320S410.51 368 384 368S336 346.51 336 320z" />
+    <glyph glyph-name="keyboard"
+      unicode="&#xF11C;"
+      horiz-adv-x="576" d=" M528 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H528C554.51 384 576 362.51 576 336V48C576 21.49 554.51 0 528 0zM128 268V308C128 314.627 122.627 320 116 320H76C69.373 320 64 314.627 64 308V268C64 261.373 69.373 256 76 256H116C122.627 256 128 261.373 128 268zM224 268V308C224 314.627 218.627 320 212 320H172C165.373 320 160 314.627 160 308V268C160 261.373 165.373 256 172 256H212C218.627 256 224 261.373 224 268zM320 268V308C320 314.627 314.627 320 308 320H268C261.373 320 256 314.627 256 308V268C256 261.373 261.373 256 268 256H308C314.627 256 320 261.373 320 268zM416 268V308C416 314.627 410.627 320 404 320H364C357.373 320 352 314.627 352 308V268C352 261.373 357.373 256 364 256H404C410.627 256 416 261.373 416 268zM512 268V308C512 314.627 506.627 320 500 320H460C453.373 320 448 314.627 448 308V268C448 261.373 453.373 256 460 256H500C506.627 256 512 261.373 512 268zM176 172V212C176 218.627 170.627 224 164 224H124C117.373 224 112 218.627 112 212V172C112 165.373 117.373 160 124 160H164C170.627 160 176 165.373 176 172zM272 172V212C272 218.627 266.627 224 260 224H220C213.373 224 208 218.627 208 212V172C208 165.373 213.373 160 220 160H260C266.627 160 272 165.373 272 172zM368 172V212C368 218.627 362.627 224 356 224H316C309.373 224 304 218.627 304 212V172C304 165.373 309.373 160 316 160H356C362.627 160 368 165.373 368 172zM464 172V212C464 218.627 458.627 224 452 224H412C405.373 224 400 218.627 400 212V172C400 165.373 405.373 160 412 160H452C458.627 160 464 165.373 464 172zM128 76V116C128 122.627 122.627 128 116 128H76C69.373 128 64 122.627 64 116V76C64 69.373 69.373 64 76 64H116C122.627 64 128 69.373 128 76zM416 76V116C416 122.627 410.627 128 404 128H172C165.373 128 160 122.627 160 116V76C160 69.373 165.373 64 172 64H404C410.627 64 416 69.373 416 76zM512 76V116C512 122.627 506.627 128 500 128H460C453.373 128 448 122.627 448 116V76C448 69.373 453.373 64 460 64H500C506.627 64 512 69.373 512 76z" />
+    <glyph glyph-name="language"
+      unicode="&#xF1AB;"
+      horiz-adv-x="640" d=" M304 32H24C10.745 32 0 42.745 0 56V328C0 341.255 10.745 352 24 352H304V32zM183.324 104.622A12 12 0 0 1 194.839 96H217.702C225.922 96 231.709 104.078 229.064 111.861L171.61 280.915A12 12 0 0 1 160.248 289.054H127.759A12.001000000000001 12.001000000000001 0 0 1 116.397 280.915L58.942 111.861C56.297 104.078 62.084 96 70.304 96H93.109A12 12 0 0 1 104.644 104.693L113.762 136.5H173.973L183.324 104.622zM144.273 245.042S148.593 223.981 152.103 211.832L162.9030000000001 174.301H124.8330000000001L135.9030000000001 211.832C139.4130000000001 223.982 143.7330000000001 245.042 143.7330000000001 245.042H144.2730000000001zM616 32H336V352H616C629.255 352 640 341.255 640 328V56C640 42.745 629.255 32 616 32zM580 260H516V276C516 282.627 510.627 288 504 288H488C481.373 288 476 282.627 476 276V260H412C405.373 260 400 254.627 400 248V232C400 225.373 405.373 220 412 220H526.106C519.843 205.701 509.588 191.028 496.083 176.794C489.523 183.692 483.686 190.704 478.718 197.727C475.079 202.871 468.133 204.402 462.723 201.173L455.443 196.827L448.945 192.948C442.989 189.392 441.252 181.527 445.21 175.831C451.275 167.102 458.308 158.495 466.194 150.105C458.0719999999999 143.879 449.353 137.861 440.091 132.141C434.57 128.731 432.7099999999999 121.585 435.929 115.951L443.87 102.055C447.232 96.172 454.8049999999999 94.2289999999999 460.576 97.7789999999999C473.308 105.61 485.147 113.954 496.0189999999999 122.67C506.9359999999999 113.9089999999999 518.785 105.568 531.415 97.789C537.189 94.233 544.7679999999999 96.171 548.132 102.059L556.0759999999999 115.962C559.2889999999999 121.585 557.4459999999999 128.722 551.9409999999999 132.133A312.737 312.737 0 0 0 525.881 150.152C546.905 172.577 561.649 196.441 568.5939999999999 220.002H580C586.627 220.002 592 225.375 592 232.002V248.002C592 254.627 586.627 260 580 260z" />
+    <glyph glyph-name="laptop"
+      unicode="&#xF109;"
+      horiz-adv-x="640" d=" M512 384V128H128V384H512M528 448H112C85.5 448 64 426.5 64 400V112C64 85.5 85.5 64 112 64H528C554.5 64 576 85.5 576 112V400C576 426.5 554.5 448 528 448zM628 32H389.5C386.5 32 384 29.9 383.6 26.9C381.2 11.7 368 0 352 0H288C272 0 258.8 11.7 256.4 26.9C255.9 29.8 253.4 32 250.5 32H12C5.4 32 0 26.6 0 20V-16C0 -42.5 21.5 -64 48 -64H592C618.5 -64 640 -42.5 640 -16V20C640 26.6 634.6 32 628 32z" />
+    <glyph glyph-name="leaf"
+      unicode="&#xF06C;"
+      horiz-adv-x="576" d=" M546.2 438.3C540.6 450.8 524.6 451.3 517.9000000000001 439.5C486.9 385.6 431.4 352 368 352H288C182 352 96 266 96 160C96 153 96.8 146.3 97.5 139.5C161.3 185.2 253.4 224 384 224C392.8 224 400 216.8 400 208S392.8 192 384 192C132.6 192 26 37.9 2.4 -20C-4.2 -36.3 3.6 -54.9 19.9 -61.6C36.3 -68.4 54.9 -60.5 61.7 -44.3C63.2 -40.7 82.6 3.6 133.6 46.3C166 2.4 227.6 -39.5000000000001 308.5 -30.9C465.5 -19.5 576 121.3 576 293.7C576 343.9 565.2 395.9 546.2 438.3z" />
+    <glyph glyph-name="lemon"
+      unicode="&#xF094;"
+      horiz-adv-x="512" d=" M489.038 425.037C465.944 448.13 434.648 453.93 413.947 441.871C355.041 407.5590000000001 232.697 494.948 92.874 355.125S40.441 92.959 6.129 34.055C-5.93 13.353 -0.131 -17.944 22.962 -41.038C46.057 -64.133 77.354 -69.929 98.057 -57.87C156.958 -23.56 279.303 -110.9489999999999 419.125 28.873S471.56 291.04 505.871 349.944C517.93 370.646 512.132 401.943 489.038 425.0370000000001zM243.881 352.478C185.692 337.931 110.073 262.323 95.523 204.12C93.706 196.85 87.181 191.996 80.012 191.996C78.728 191.996 77.422 192.152 76.119 192.477C67.547 194.621 62.335 203.307 64.477 211.88C81.901 281.573 166.316 366.07 236.119 383.522C244.694 385.665 253.38 380.453 255.522 371.88S252.453 354.621 243.881 352.478z" />
+    <glyph glyph-name="level-down-alt"
+      unicode="&#xF3BE;"
+      horiz-adv-x="320" d=" M313.553 55.669L209.587 -56.334C200.102 -66.548 183.911 -66.563 174.413 -56.334L70.438 55.669C56.232 70.969 67.062 96 88.025 96H152V368H68.024A11.996 11.996 0 0 0 59.539 371.515L3.539 427.515C-4.021 435.074 1.333 448 12.024 448H208C221.255 448 232 437.255 232 424V96H295.966C316.844 96 327.817 71.031 313.553 55.669z" />
+    <glyph glyph-name="level-up-alt"
+      unicode="&#xF3BF;"
+      horiz-adv-x="320" d=" M313.553 328.331L209.587 440.334C200.102 450.548 183.911 450.563 174.413 440.334L70.438 328.331C56.232 313.031 67.062 288 88.025 288H152V16H68.024A11.996 11.996 0 0 1 59.539 12.485L3.539 -43.515C-4.021 -51.074 1.333 -64 12.024 -64H208C221.255 -64 232 -53.255 232 -40V288H295.966C316.844 288 327.817 312.969 313.553 328.331z" />
+    <glyph glyph-name="life-ring"
+      unicode="&#xF1CD;"
+      horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM429.6960000000001 320.4410000000001L366.2970000000001 257.0420000000001C355.31 275.601 339.627 291.294 321.0420000000001 302.2970000000001L384.4410000000001 365.6960000000001A218.396 218.396 0 0 0 429.6960000000001 320.4410000000001zM256 96C202.981 96 160 138.981 160 192S202.981 288 256 288S352 245.019 352 192S309.019 96 256 96zM127.559 365.6960000000001L190.958 302.2970000000001C172.399 291.31 156.706 275.627 145.703 257.0420000000001L82.304 320.4410000000001A218.372 218.372 0 0 0 127.559 365.6960000000001zM82.304 63.559L145.703 126.958C156.69 108.399 172.373 92.706 190.958 81.703L127.559 18.304A218.396 218.396 0 0 0 82.304 63.559zM384.4410000000001 18.304L321.0420000000001 81.703C339.6010000000001 92.6900000000001 355.2940000000001 108.3730000000001 366.2970000000001 126.958L429.6960000000001 63.559A218.40299999999996 218.40299999999996 0 0 0 384.4410000000001 18.304z" />
+    <glyph glyph-name="lightbulb"
+      unicode="&#xF0EB;"
+      horiz-adv-x="384" d=" M272 20V-8C272 -18.449 265.32 -27.334 256 -30.629V-40C256 -53.255 245.255 -64 232 -64H152C138.745 -64 128 -53.255 128 -40V-30.629C118.68 -27.334 112 -18.449 112 -8V20C112 26.627 117.373 32 124 32H260C266.627 32 272 26.627 272 20zM128.893 64C118.986 64 110.067 70.078 106.517 79.327C67.697 180.459 16 170.269 16 272C16 369.197 94.805 448 192 448S368 369.197 368 272C368 170.269 316.303 180.459 277.484 79.327C273.934 70.078 265.014 64 255.108 64H128.893zM112 272C112 316.112 147.888 352 192 352C200.837 352 208 359.164 208 368S200.837 384 192 384C130.243 384 80 333.757 80 272C80 263.164 87.164 256 96 256S112 263.164 112 272z" />
+    <glyph glyph-name="link"
+      unicode="&#xF0C1;"
+      horiz-adv-x="512" d=" M326.612 262.6090000000001C386.3590000000001 202.8 385.5390000000001 106.911 326.9720000000001 48.019C326.862 47.899 326.7320000000001 47.769 326.612 47.649L259.4120000000001 -19.551C200.142 -78.821 103.713 -78.813 44.452 -19.551C-14.818 39.709 -14.818 136.149 44.452 195.409L81.558 232.515C91.398 242.355 108.344 235.8150000000001 108.852 221.909C109.5 204.187 112.678 186.382 118.542 169.1880000000001C120.528 163.3660000000001 119.109 156.9260000000001 114.759 152.576L101.672 139.489C73.646 111.463 72.767 65.8290000000001 100.517 37.5290000000001C128.541 8.95 174.603 8.78 202.842 37.0190000000001L270.0420000000001 104.2090000000001C298.233 132.4 298.115 177.9660000000001 270.0420000000001 206.0390000000001C266.341 209.733 262.6130000000001 212.603 259.701 214.608A16.037 16.037 0 0 0 252.754 227.2140000000001C252.3580000000001 237.7810000000001 256.1020000000001 248.67 264.452 257.0200000000001L285.506 278.0750000000001C291.027 283.596 299.688 284.2740000000001 306.09 279.8060000000001A152.482 152.482 0 0 0 326.612 262.6090000000001zM467.547 403.551C408.286 462.813 311.8570000000001 462.821 252.587 403.551L185.387 336.351C185.267 336.231 185.137 336.101 185.027 335.981C126.461 277.089 125.64 181.2 185.387 121.391A152.454 152.454 0 0 1 205.908 104.1949999999999C212.31 99.7269999999999 220.972 100.406 226.492 105.9259999999999L247.546 126.981C255.896 135.331 259.6400000000001 146.2199999999999 259.2440000000001 156.7869999999999A16.037 16.037 0 0 1 252.2970000000001 169.3929999999999C249.385 171.3979999999999 245.6570000000001 174.2679999999999 241.956 177.9619999999999C213.883 206.035 213.765 251.601 241.956 279.7919999999999L309.156 346.9819999999999C337.395 375.2209999999999 383.456 375.051 411.481 346.4719999999999C439.231 318.1719999999999 438.353 272.5379999999999 410.326 244.5119999999999L397.2390000000001 231.425C392.889 227.075 391.4700000000001 220.6349999999999 393.456 214.8129999999999C399.32 197.619 402.498 179.8139999999999 403.146 162.0919999999999C403.6550000000001 148.1859999999999 420.6 141.6459999999999 430.44 151.4859999999999L467.546 188.5919999999999C526.817 247.851 526.817 344.291 467.547 403.551z" />
+    <glyph glyph-name="lira-sign"
+      unicode="&#xF195;"
+      horiz-adv-x="384" d=" M371.9940000000001 192H323.975C317.64 192 312 187.088 312 180.754C312 80 230.179 32 144 32V191.219L278.603 221.131A12 12 0 0 1 288 232.845V273.8210000000001C288 281.498 280.891 287.201 273.397 285.535L144 256.781V287.2200000000001L278.603 317.132A12 12 0 0 1 288 328.846V369.8210000000001C288 377.498 280.891 383.201 273.397 381.535L144 352.781V404C144 410.627 138.627 416 132 416H76C69.373 416 64 410.627 64 404V335.003L9.397 322.8690000000001A12 12 0 0 1 0 311.155V270.179C0 262.502 7.109 256.799 14.603 258.4650000000001L64 269.442V239.003L9.397 226.869A12 12 0 0 1 0 215.155V174.179C0 166.502 7.109 160.799 14.603 162.465L64 173.442V-20C64 -26.627 69.373 -32 76 -32H155.583C289.674 -32 378.838 45.834 383.991 179.592C384.252 186.374 378.78 192 371.994 192z" />
+    <glyph glyph-name="list-alt"
+      unicode="&#xF022;"
+      horiz-adv-x="512" d=" M464 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H464C490.51 416 512 394.51 512 368V16C512 -10.51 490.51 -32 464 -32zM128 328C105.909 328 88 310.091 88 288S105.909 248 128 248S168 265.909 168 288S150.091 328 128 328zM128 232C105.909 232 88 214.091 88 192S105.909 152 128 152S168 169.909 168 192S150.091 232 128 232zM128 136C105.909 136 88 118.091 88 96S105.909 56 128 56S168 73.909 168 96S150.091 136 128 136zM416 272V304C416 310.627 410.627 316 404 316H204C197.373 316 192 310.627 192 304V272C192 265.373 197.373 260 204 260H404C410.627 260 416 265.373 416 272zM416 176V208C416 214.627 410.627 220 404 220H204C197.373 220 192 214.627 192 208V176C192 169.373 197.373 164 204 164H404C410.627 164 416 169.373 416 176zM416 80V112C416 118.627 410.627 124 404 124H204C197.373 124 192 118.627 192 112V80C192 73.373 197.373 68 204 68H404C410.627 68 416 73.373 416 80z" />
+    <glyph glyph-name="list-ol"
+      unicode="&#xF0CB;"
+      horiz-adv-x="512" d=" M3.263 308.473C3.263 315.9500000000001 7.18 320.045 14.836 320.045H29.967V359.9220000000001C29.967 365.085 30.501 370.425 30.501 370.425H30.145S28.366 367.755 27.297 366.687C22.846 362.414 16.793 362.236 11.631 367.755L6.113 373.986C0.771 379.327 1.129 385.202 6.647 390.365L28.367 410.303C32.815 414.398 36.732 416 42.785 416H54.89C62.546 416 66.639 412.084 66.639 404.428V320.044H82.127C89.782 320.044 93.699 315.95 93.699 308.472V299.5710000000001C93.699 292.094 89.782 287.999 82.127 287.999H14.836C7.18 287.999 3.263 292.094 3.263 299.5710000000001V308.473zM2.211 143.409C2.211 190.687 53.166 199.792 53.166 212.574C53.166 219.754 47.212 221.329 43.886 221.329C40.733 221.329 37.407 220.278 34.431 217.477C29.352 212.574 23.924 210.473 18.32 215.026L9.741 221.855C3.962 226.408 2.561 231.6600000000001 6.938 237.264C13.592 246.019 26.025 256 47.387 256C66.824 256 91.863 245.494 91.863 216.427C91.863 178.08 45.11 170.025 43.184 159.518H82.233C89.762 159.518 93.79 155.491 93.79 148.136V139.381C93.79 132.027 89.762 127.999 82.233 127.999H14.293C7.288 127.999 2.21 132.027 2.21 139.381V143.409zM5.654 -6.61L11.257 2.67C15.11 9.324 20.362 9.674 26.841 5.8219999999999C31.744 3.7209999999999 36.471 2.67 41.2 2.67C51.355 2.67 55.558 6.172 55.558 10.9C55.558 17.554 49.954 20.006 39.624 20.006H34.896C28.942 20.006 25.616 22.107 22.638 27.886L21.588 29.812C19.137 34.54 20.362 39.6179999999999 24.389 44.696L29.993 51.7C36.822 60.105 42.25 65.183 42.25 65.183V65.533S38.047 64.482 29.642 64.482H16.685C9.155 64.482 5.302 68.5100000000001 5.302 75.864V84.619C5.302 92.149 9.155 96.001 16.685 96.001H75.169C82.698 96.001 86.551 91.9740000000001 86.551 84.619V81.292C86.551 75.514 85.15 71.4860000000001 81.472 67.109L63.963 46.972C83.574 41.8940000000001 92.679 26.485 92.679 12.1270000000001C92.679 -9.2359999999999 78.321 -31.9989999999999 44.176 -31.9989999999999C27.54 -31.9989999999999 15.984 -27.2709999999999 8.28 -22.5439999999999C2.501 -18.3419999999999 1.976 -12.7389999999999 5.654 -6.6099999999999zM144 316H496C504.837 316 512 323.163 512 332V372C512 380.837 504.837 388 496 388H144C135.163 388 128 380.837 128 372V332C128 323.163 135.163 316 144 316zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4z" />
+    <glyph glyph-name="list-ul"
+      unicode="&#xF0CA;"
+      horiz-adv-x="512" d=" M96 352C96 325.49 74.51 304 48 304S0 325.49 0 352S21.49 400 48 400S96 378.51 96 352zM48 240C21.49 240 0 218.51 0 192S21.49 144 48 144S96 165.49 96 192S74.51 240 48 240zM48 80C21.49 80 0 58.51 0 32S21.49 -16 48 -16S96 5.49 96 32S74.51 80 48 80zM144 316H496C504.837 316 512 323.163 512 332V372C512 380.837 504.837 388 496 388H144C135.163 388 128 380.837 128 372V332C128 323.163 135.163 316 144 316zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4z" />
+    <glyph glyph-name="list"
+      unicode="&#xF03A;"
+      horiz-adv-x="512" d=" M128 332V372C128 380.837 135.163 388 144 388H496C504.837 388 512 380.837 512 372V332C512 323.163 504.837 316 496 316H144C135.163 316 128 323.163 128 332zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4zM16 304H80C88.837 304 96 311.163 96 320V384C96 392.837 88.837 400 80 400H16C7.163 400 0 392.837 0 384V320C0 311.163 7.163 304 16 304zM16 144H80C88.837 144 96 151.163 96 160V224C96 232.837 88.837 240 80 240H16C7.163 240 0 232.837 0 224V160C0 151.163 7.163 144 16 144zM16 -16H80C88.837 -16 96 -8.837 96 0V64C96 72.837 88.837 80 80 80H16C7.163 80 0 72.837 0 64V0C0 -8.837 7.163 -16 16 -16z" />
+    <glyph glyph-name="location-arrow"
+      unicode="&#xF124;"
+      horiz-adv-x="512" d=" M443.683 443.471L27.818 251.582C-18.702 230.111 -3.39 160 47.933 160H224V-15.993C224 -67.72 294.161 -82.519 315.582 -36.108L507.38 379.775C526.285 420.736 483.628 461.908 443.683 443.471z" />
+    <glyph glyph-name="lock-open"
+      unicode="&#xF3C1;"
+      horiz-adv-x="576" d=" M423.5 448C339.5 447.7 272 378.5 272 294.5V224H48C21.5 224 0 202.5 0 176V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V176C448 202.5 426.5 224 400 224H352V295.1C352 334.7 383.7 367.6 423.3 368C463.3 368.4 496 335.9 496 296V216C496 202.7 506.7 192 520 192H552C565.3 192 576 202.7 576 216V296C576 380 507.5 448.3 423.5 448z" />
+    <glyph glyph-name="lock"
+      unicode="&#xF023;"
+      horiz-adv-x="448" d=" M400 224H376V296C376 379.8 307.8 448 224 448S72 379.8 72 296V224H48C21.5 224 0 202.5 0 176V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V176C448 202.5 426.5 224 400 224zM296 224H152V296C152 335.7 184.3 368 224 368S296 335.7 296 296V224z" />
+    <glyph glyph-name="long-arrow-alt-down"
+      unicode="&#xF309;"
+      horiz-adv-x="256" d=" M168 102.059V404C168 410.627 162.627 416 156 416H100C93.373 416 88 410.627 88 404V102.059H41.941C20.559 102.059 9.851 76.208 24.97 61.088L111.029 -24.971C120.402 -34.344 135.598 -34.344 144.97 -24.971L231.029 61.088C246.148 76.207 235.44 102.059 214.058 102.059H168z" />
+    <glyph glyph-name="long-arrow-alt-left"
+      unicode="&#xF30A;"
+      horiz-adv-x="448" d=" M134.059 152H436C442.627 152 448 157.373 448 164V220C448 226.627 442.627 232 436 232H134.059V278.059C134.059 299.4410000000001 108.208 310.149 93.088 295.03L7.029 208.971C-2.344 199.598 -2.344 184.402 7.029 175.03L93.088 88.971C108.207 73.852 134.059 84.56 134.059 105.942V152z" />
+    <glyph glyph-name="long-arrow-alt-right"
+      unicode="&#xF30B;"
+      horiz-adv-x="448" d=" M313.941 232H12C5.373 232 0 226.627 0 220V164C0 157.373 5.373 152 12 152H313.941V105.941C313.941 84.559 339.792 73.851 354.912 88.97L440.971 175.029C450.344 184.402 450.344 199.598 440.971 208.97L354.9120000000001 295.029C339.793 310.148 313.9410000000001 299.44 313.9410000000001 278.058V232z" />
+    <glyph glyph-name="long-arrow-alt-up"
+      unicode="&#xF30C;"
+      horiz-adv-x="256" d=" M88 281.9410000000001V-20C88 -26.627 93.373 -32 100 -32H156C162.627 -32 168 -26.627 168 -20V281.9410000000001H214.059C235.441 281.9410000000001 246.149 307.7920000000001 231.03 322.9120000000001L144.971 408.971C135.598 418.344 120.402 418.344 111.03 408.971L24.971 322.9120000000001C9.852 307.793 20.56 281.9410000000001 41.942 281.9410000000001H88z" />
+    <glyph glyph-name="low-vision"
+      unicode="&#xF2A8;"
+      horiz-adv-x="576" d=" M569.344 216.369C512.96 312.051 407.81 376 288 376C259.532 376 231.898 372.381 205.549 365.591L152.778 437.76C145.177 448.618 130.214 451.26 119.355 443.6600000000001L106.241 434.482C95.381 426.881 92.739 411.916 100.341 401.056L143.472 342.661C89.449 316.27 40.228 273.317 6.682 216.419C6.672 216.402 6.659 216.386 6.648 216.369C-2.117 201.494 -2.316 182.841 6.648 167.63C45.148 102.298 106.39 51.768 179.507 26.281L55.316 203.698A272.194 272.194 0 0 0 83.61 239.61L203.01 69.03H203.02L243.65 10.99A330.055 330.055 0 0 1 322.59 9.8199999999999L132.61 281.2199999999999A277.628 277.628 0 0 0 171.387 302.7829999999999L423.223 -53.7610000000001C430.824 -64.619 445.7870000000001 -67.2600000000001 456.646 -59.6610000000001L469.76 -50.4830000000001C480.62 -42.8820000000001 483.262 -27.9160000000001 475.66 -17.0570000000001L432.54 41.3199999999999L432.533 41.329C489.694 69.307 537.3679999999999 113.369 569.343 167.63A47.937999999999995 47.937999999999995 0 0 1 569.3439999999999 216.369zM390.026 102.06L370.9600000000001 129.29C395.6420000000001 161.857 398.6710000000001 205.643 379.7600000000001 240.9700000000001V240.9400000000001C379.7600000000001 217.29 360.5900000000001 198.12 336.9400000000001 198.12C313.1120000000001 198.12 294.1200000000001 217.469 294.1200000000001 240.9400000000001C294.1200000000001 264.5900000000001 313.2900000000001 283.76 336.9400000000001 283.76H336.9700000000001C312.2200000000001 297.009 283.4480000000001 299.403 257.4600000000001 291.4400000000001L238.392 318.677C253.758 324.694 270.488 328 288 328C363.1620000000001 328 424 267.174 424 192C424 157.496 411.167 126.025 390.026 102.06z" />
+    <glyph glyph-name="magic"
+      unicode="&#xF0D0;"
+      horiz-adv-x="512" d=" M101.1 -57L7 37.1C-2.4 46.5 -2.4 61.7000000000001 7 71L377 441C386.4 450.4 401.6 450.4 410.9 441L505 346.9C514.4 337.5 514.4 322.3 505 313L135 -57C125.7 -66.2999999999999 110.5 -66.2999999999999 101.1 -57zM304 288.8L352.8 240L442.7000000000001 329.9L393.9000000000001 378.7L304 288.8zM138.9 408.7L127.2 384.9L101 381.1C96.3 380.4 94.4 374.6 97.8 371.3L116.8 352.8L112.3 326.7000000000001C111.5 322 116.4 318.4 120.6 320.6L144 333L167.4 320.7C171.6 318.5 176.5 322.1 175.7 326.8L171.2 352.9L190.2 371.4C193.6 374.7 191.7 380.5 187 381.2L160.8 385L149.1 408.8C147.1 412.9 141 412.9 138.9 408.7zM236.6 429.4L228.8 413.6L211.3 411C208.2 410.5 206.9 406.7 209.2 404.5L221.8 392.2L218.8 374.8C218.3 371.7000000000001 221.6 369.3 224.4 370.8L240 379L255.6 370.8C258.4 369.3 261.7 371.7 261.2 374.8L258.2 392.2L270.8 404.5C273.1 406.7 271.8 410.6 268.7 411L251.2 413.5L243.4 429.3C242 432.3 238 432.3 236.6 429.4zM44.6 429.4L36.8 413.6L19.3 411C16.2 410.5 14.9 406.7 17.2 404.5L29.8 392.2L26.8 374.8C26.3 371.7000000000001 29.6 369.3 32.4 370.8L48 379L63.6 370.8C66.4 369.3 69.7 371.7 69.2 374.8L66.2 392.2L78.8 404.5C81.1 406.7 79.8 410.6 76.7 411L59.2 413.5L51.4 429.3C50 432.3 46 432.3 44.6 429.4zM460.6 205.9L452.8 190.1L435.3 187.6C432.2 187.1 430.9000000000001 183.3 433.2 181.1L445.8 168.8L442.8 151.4C442.3 148.3 445.6 145.9 448.4000000000001 147.4L464.0000000000001 155.6L479.6000000000001 147.4C482.4000000000001 145.9 485.7000000000001 148.3 485.2000000000001 151.4L482.2000000000001 168.8L494.8000000000001 181.1C497.1000000000001 183.3 495.8000000000001 187.2000000000001 492.7000000000001 187.6L475.2000000000001 190.1L467.4000000000001 205.9C466.0000000000001 208.7000000000001 462.0000000000001 208.7000000000001 460.6000000000001 205.9z" />
+    <glyph glyph-name="magnet"
+      unicode="&#xF076;"
+      horiz-adv-x="512.1" d=" M164.1 288H12C5.4 288 0 293.4 0 300V380C0 399.9 16.1 416 36 416H140C159.9 416 176 399.9 176 380V300C176.1 293.4 170.7 288 164.1 288zM512.1 300V380.1C512.1 400 496 416.1 476.1 416.1H372.1C352.2000000000001 416.1 336.1 400 336.1 380.1V300.1C336.1 293.5 341.5 288.1 348.1 288.1H500.1C506.7 288 512.1 293.4 512.1 300zM348.1 256C341.5 256 336.1 250.6 336.1 244V192C336.1 63.9 176.1 64.1 176.1 192V244C176.1 250.6 170.7 256 164.1 256H12.1C5.4 256 0.1 250.6 0.1 243.9C0.2 222.5 0.7 203.6 0.1 190.6C0.1 40 136.3 -56 256.9 -56C377.5 -56 512 40 512 190.7C511.4 203.5 511.8 223.7 512 243.9C512 250.6 506.7 256 500 256H348.1z" />
+    <glyph glyph-name="male"
+      unicode="&#xF183;"
+      horiz-adv-x="192" d=" M96 448C131.346 448 160 419.346 160 384S131.346 320 96 320S32 348.654 32 384S60.654 448 96 448M144 304H132.64C109.929 293.557 83.05 293.106 59.36 304H48C21.49 304 0 282.51 0 256V120C0 106.745 10.745 96 24 96H40V-40C40 -53.255 50.745 -64 64 -64H128C141.255 -64 152 -53.255 152 -40V96H168C181.255 96 192 106.745 192 120V256C192 282.51 170.51 304 144 304z" />
+    <glyph glyph-name="map-marker-alt"
+      unicode="&#xF3C5;"
+      horiz-adv-x="384" d=" M172.268 -53.67C26.97 156.969 0 178.587 0 256C0 362.039 85.961 448 192 448S384 362.039 384 256C384 178.587 357.03 156.969 211.732 -53.67C202.197 -67.444 181.802 -67.443 172.268 -53.67zM192 176C236.183 176 272 211.817 272 256S236.183 336 192 336S112 300.183 112 256S147.817 176 192 176z" />
+    <glyph glyph-name="map-marker"
+      unicode="&#xF041;"
+      horiz-adv-x="384" d=" M172.268 -53.67C26.97 156.969 0 178.587 0 256C0 362.039 85.961 448 192 448S384 362.039 384 256C384 178.587 357.03 156.969 211.732 -53.67C202.197 -67.444 181.802 -67.443 172.268 -53.67z" />
+    <glyph glyph-name="map-pin"
+      unicode="&#xF276;"
+      horiz-adv-x="320" d=" M192 147.187V-25.633L169.985 -58.656C165.235 -65.7809999999999 154.766 -65.7809999999999 150.016 -58.656L128 -25.633V147.187A162.221 162.221 0 0 1 192 147.187zM160 448C239.529 448 304 383.529 304 304S239.529 160 160 160S16 224.471 16 304S80.471 448 160 448M80 312C80 351.701 112.299 384 152 384A8 8 0 0 1 152 400C103.477 400 64 360.523 64 312A8 8 0 0 1 80 312z" />
+    <glyph glyph-name="map-signs"
+      unicode="&#xF277;"
+      horiz-adv-x="512" d=" M487.515 343.515L439.03 295.03A23.998000000000005 23.998000000000005 0 0 0 422.06 288.001H56C42.745 288.001 32 298.746 32 312.001V392C32 405.255 42.745 416 56 416H216V424C216 437.255 226.745 448 240 448H272C285.255 448 296 437.255 296 424V416H422.059A24 24 0 0 0 439.029 408.971L487.514 360.486C492.201 355.799 492.201 348.201 487.515 343.515zM216 80V-40C216 -53.255 226.745 -64 240 -64H272C285.255 -64 296 -53.255 296 -40V80H216zM456 224H296V272H216V224H89.941A24 24 0 0 1 72.971 216.971L24.486 168.486C19.8 163.8 19.8 156.202 24.486 151.515L72.971 103.03A23.998000000000005 23.998000000000005 0 0 1 89.941 96.001H456C469.255 96.001 480 106.746 480 120.001V200.001C480 213.255 469.255 224 456 224z" />
+    <glyph glyph-name="map"
+      unicode="&#xF279;"
+      horiz-adv-x="576" d=" M576 391.985V56.015A23.998000000000005 23.998000000000005 0 0 0 562.733 34.549L434.733 -29.451C418.948 -37.344 400 -25.992 400 -7.985V327.985A23.998000000000005 23.998000000000005 0 0 0 413.267 349.451L541.267 413.451C557.052 421.344 576 409.992 576 391.985zM369.747 349.915L225.747 413.915C209.996 420.915 192 409.454 192 391.983V56.016A24 24 0 0 1 206.253 34.085L350.253 -29.915C366.004 -36.915 384 -25.4539999999999 384 -7.984V327.983A24 24 0 0 1 369.747 349.915zM141.267 413.451L13.267 349.466A23.998000000000005 23.998000000000005 0 0 1 0 328V-7.985C0 -25.992 18.948 -37.344 34.733 -29.451L162.733 34.534A23.998000000000005 23.998000000000005 0 0 1 176 56V391.985C176 409.992 157.052 421.344 141.267 413.451z" />
+    <glyph glyph-name="mars-double"
+      unicode="&#xF227;"
+      horiz-adv-x="512" d=" M340 448H261C250.3 448 245 435.1 252.5 427.5L269.4 410.6L220.7 361.9C198.5 375.9 172.2 384 144 384C64.5 384 0 319.5 0 240S64.5 96 144 96S288 160.5 288 240C288 268.2 279.9 294.5 265.9 316.7L314.6 365.4L331.5 348.5C333.8999999999999 346.1 337 345 339.8999999999999 345C346.0999999999999 345 352 349.8 352 357V436C352 442.6 346.6 448 340 448zM144 160C99.9 160 64 195.9 64 240S99.9 320 144 320S224 284.1 224 240S188.1 160 144 160zM500 288.1H421C410.3 288.1 405 275.2 412.5 267.6L429.4 250.7L380.7 202C362.5 213.4 341.7 220.9 319.2 223.3C317.1 201.5 311 180 300.8 160C301.9000000000001 160 303 160.1 304 160.1C348.1 160.1 384 124.2000000000001 384 80.1S348.1 0.1 304 0.1S224 36 224 80.1C224 81.2000000000001 224 82.3 224.1 83.3C204.1 73.1 182.6 66.9 160.8 64.9C168.4 -7.6 229.6 -64 304 -64C383.5 -64 448 0.5 448 80C448 108.2 439.9 134.5 425.9 156.7L474.6 205.4L491.4999999999999 188.5C493.8999999999999 186.1 496.8999999999999 185 499.8999999999999 185C506.0999999999999 185 511.9999999999999 189.8 511.9999999999999 197V276C511.9999999999999 282.7 506.6 288.1 499.9999999999999 288.1z" />
+    <glyph glyph-name="mars-stroke-h"
+      unicode="&#xF22B;"
+      horiz-adv-x="480" d=" M476.2 200.5L420.3 256.4C412.7 264 399.8 258.6 399.8 247.9V224H376V244C376 250.6 370.6 256 364 256H324C317.4 256 312 250.6 312 244V224H284.4C278.6 249.6 265.7 273.9 245.8 293.8C189.6 350 98.4 350 42.2 293.8C-14 237.6 -14 146.4 42.2 90.2000000000001C98.4 34.0000000000001 189.6 34.0000000000001 245.8 90.2000000000001C265.7 110.1 278.6 134.4 284.4000000000001 160.0000000000001H312V140.0000000000001C312 133.4 317.4 128.0000000000001 324 128.0000000000001H364C370.6 128.0000000000001 376 133.4 376 140.0000000000001V160.0000000000001H399.9V136.1000000000001C399.9 125.4000000000001 412.8 120.1000000000001 420.4 127.6000000000001L476.3 183.5000000000001C480.9 188.2000000000001 480.9 195.8000000000001 476.1999999999999 200.5000000000001zM200.6 135.4C169.4 104.2 118.7 104.2 87.5 135.4C56.3 166.6 56.3 217.3 87.5 248.5C118.7 279.7 169.4 279.7 200.6 248.5C231.8 217.4 231.8 166.6 200.6 135.4z" />
+    <glyph glyph-name="mars-stroke-v"
+      unicode="&#xF22A;"
+      horiz-adv-x="288" d=" M245.8 213.8C225.9 233.7 201.6 246.6 176 252.4V277.8H196C202.6 277.8 208 283.2000000000001 208 289.8V329.8C208 336.4 202.6 341.8 196 341.8H176V366.6H199.9C210.6 366.6 215.9 379.5 208.4 387.1L152.5 442.9C147.8 447.6 140.2 447.6 135.5 442.9L79.6 387C72 379.4 77.4 366.5 88.1 366.5H112V341.8H92C85.4 341.8 80 336.4 80 329.8V289.8C80 283.2000000000001 85.4 277.8 92 277.8H112V252.4C86.4 246.6 62.1 233.7 42.2 213.8C-14 157.6 -14 66.4 42.2 10.2C98.4 -45.9999999999999 189.6 -45.9999999999999 245.8 10.2C302.1 66.4 302.1 157.6 245.8 213.8000000000001zM200.6 55.4C169.4 24.2 118.7 24.2 87.5 55.4C56.3 86.6 56.3 137.3 87.5 168.5C118.7 199.7 169.4 199.7 200.6 168.5C231.8 137.4 231.8 86.6 200.6 55.4z" />
+    <glyph glyph-name="mars-stroke"
+      unicode="&#xF229;"
+      horiz-adv-x="384" d=" M372 384H293C282.3 384 277 371.1 284.5 363.5L301.4 346.6L283.9 329.1L269.8 343.2C265.1 347.9 257.5 347.9 252.8 343.2L224.5 315C219.8 310.3 219.8 302.7 224.5 298L238.6 283.9L220.6 265.9C198.4 279.9 172.1 288 143.9 288C64.5 288 0 223.5 0 144S64.5 0 144 0S288 64.5 288 144C288 172.2 279.9 198.5 265.9 220.7L283.9 238.7L298 224.6C302.7 219.9 310.3 219.9 315 224.6L343.3 252.9C348 257.6 348 265.2000000000001 343.3 269.9L329.2 284L346.7 301.5L363.6 284.6C371.2 277 384.1 282.4 384.1 293.1V372C384 378.6 378.6 384 372 384zM144 64C99.9 64 64 99.9 64 144S99.9 224 144 224S224 188.1 224 144S188.1 64 144 64z" />
+    <glyph glyph-name="mars"
+      unicode="&#xF222;"
+      horiz-adv-x="384" d=" M372 384H293C282.3 384 277 371.1 284.5 363.5L301.4 346.6L220.7 265.9C198.5 279.9 172.2 288 144 288C64.5 288 0 223.5 0 144S64.5 0 144 0S288 64.5 288 144C288 172.2 279.9 198.5 265.9 220.7L346.6 301.4L363.5 284.5C371.1 276.9 384 282.3 384 293V372C384 378.6 378.6 384 372 384zM144 64C99.9 64 64 99.9 64 144S99.9 224 144 224S224 188.1 224 144S188.1 64 144 64z" />
+    <glyph glyph-name="medkit"
+      unicode="&#xF0FA;"
+      horiz-adv-x="512" d=" M96 -32H416V320H384V368C384 394.51 362.51 416 336 416H176C149.49 416 128 394.51 128 368V320H96V-32zM192 352H320V320H192V352zM512 272V16C512 -10.51 490.51 -32 464 -32H448V320H464C490.51 320 512 298.51 512 272zM64 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V-32zM352 176V144C352 135.163 344.837 128 336 128H288V80C288 71.163 280.837 64 272 64H240C231.163 64 224 71.163 224 80V128H176C167.163 128 160 135.163 160 144V176C160 184.837 167.163 192 176 192H224V240C224 248.837 231.163 256 240 256H272C280.837 256 288 248.837 288 240V192H336C344.837 192 352 184.837 352 176z" />
+    <glyph glyph-name="meh"
+      unicode="&#xF11A;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM168 272C185.7 272 200 257.7 200 240S185.7 208 168 208S136 222.3 136 240S150.3 272 168 272zM344 80H152C143.2 80 136 87.2 136 96S143.2 112 152 112H344C352.8 112 360 104.8 360 96S352.8 80 344 80zM328 208C310.3 208 296 222.3 296 240S310.3 272 328 272S360 257.7 360 240S345.7 208 328 208z" />
+    <glyph glyph-name="mercury"
+      unicode="&#xF223;"
+      horiz-adv-x="288" d=" M288 240C288 284.2 268.1 323.7 236.8 350.1C239.3 351.9 241.7 353.9 244 355.9C268.7 377.1 283.8 404.7 287.2 434.7C288.1 441.8 282.5 448 275.3 448H234.8C229 448 224.1 443.9 223 438.2C220.6 425.7 213.4 413.9 202.3 404.4C187 391.2 166.3 384 144 384S101 391.2 85.6 404.4C74.5 413.9 67.4 425.7 64.9 438.2C63.8 443.9 58.9 448 53.2 448H12.7C5.5 448 -0.1 441.8 0.8 434.7C4.2 404.6 19.2 377 44 355.8C46.3 353.8 48.7 351.9 51.2 350C19.9 323.7 0 284.2 0 240C0 171.5 47.9 114.1 112 99.6V48H76C69.4 48 64 42.6 64 36V-4C64 -10.6 69.4 -16 76 -16H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-16H212C218.6 -16 224 -10.6 224 -4V36C224 42.6 218.6 48 212 48H176V99.6C240.1 114.1 288 171.5 288 240.0000000000001zM64 240C64 284.1 99.9 320 144 320S224 284.1 224 240S188.1 160 144 160S64 195.9 64 240z" />
+    <glyph glyph-name="microchip"
+      unicode="&#xF2DB;"
+      horiz-adv-x="512" d=" M416 400V-16C416 -42.51 394.51 -64 368 -64H144C117.49 -64 96 -42.51 96 -16V400C96 426.51 117.49 448 144 448H368C394.51 448 416 426.51 416 400zM512 342V330A6 6 0 0 0 506 324H488V318A6 6 0 0 0 482 312H440V360H482A6 6 0 0 0 488 354V348H506A6 6 0 0 0 512 342zM512 246V234A6 6 0 0 0 506 228H488V222A6 6 0 0 0 482 216H440V264H482A6 6 0 0 0 488 258V252H506A6 6 0 0 0 512 246zM512 150V138A6 6 0 0 0 506 132H488V126A6 6 0 0 0 482 120H440V168H482A6 6 0 0 0 488 162V156H506A6 6 0 0 0 512 150zM512 54V42A6 6 0 0 0 506 36H488V30A6 6 0 0 0 482 24H440V72H482A6 6 0 0 0 488 66V60H506A6 6 0 0 0 512 54zM30 72H72V24H30A6 6 0 0 0 24 30V36H6A6 6 0 0 0 0 42V54A6 6 0 0 0 6 60H24V66A6 6 0 0 0 30 72zM30 168H72V120H30A6 6 0 0 0 24 126V132H6A6 6 0 0 0 0 138V150A6 6 0 0 0 6 156H24V162A6 6 0 0 0 30 168zM30 264H72V216H30A6 6 0 0 0 24 222V228H6A6 6 0 0 0 0 234V246A6 6 0 0 0 6 252H24V258A6 6 0 0 0 30 264zM30 360H72V312H30A6 6 0 0 0 24 318V324H6A6 6 0 0 0 0 330V342A6 6 0 0 0 6 348H24V354A6 6 0 0 0 30 360z" />
+    <glyph glyph-name="microphone-slash"
+      unicode="&#xF131;"
+      horiz-adv-x="512" d=" M421.45 162.805L376 208.254V236C376 242.627 381.373 248 388 248H412C418.627 248 424 242.627 424 236V192C424 182.043 423.1190000000001 172.29 421.45 162.805zM352 352C352 405.019 309.019 448 256 448C223.426 448 194.646 431.773 177.29 406.9650000000001L352 232.254V352zM504.971 -11.716L52.284 440.971C42.911 450.344 27.715 450.344 18.343 440.971L7.029 429.657C-2.343 420.284 -2.343 405.089 7.029 395.716L160 242.746V193.169C160 140.0800000000001 203.436 95.717 256.524 96.002C271.15 96.08 284.995 99.442 297.378 105.368L315.124 87.622C297.595 77.651 277.33 71.956 255.752 72C189.355 72.136 136 126.947 136 193.344V236C136 242.627 130.627 248 124 248H100C93.373 248 88 242.627 88 236V192C88 107.512 150.693 37.403 232 25.722V-20H164C157.373 -20 152 -25.373 152 -32V-52C152 -58.627 157.373 -64 164 -64H348C354.627 -64 360 -58.627 360 -52V-32C360 -25.373 354.627 -20 348 -20H280V25.722C305.625 29.404 329.396 38.894 349.942 52.805L459.717 -56.97C469.09 -66.3430000000001 484.286 -66.3430000000001 493.658 -56.97L504.971 -45.657C514.343 -36.284 514.343 -21.0890000000001 504.971 -11.716z" />
+    <glyph glyph-name="microphone"
+      unicode="&#xF130;"
+      horiz-adv-x="384" d=" M96 192V352C96 405.019 138.981 448 192 448S288 405.019 288 352V192C288 138.981 245.019 96 192 96S96 138.981 96 192zM348 248H324C317.373 248 312 242.627 312 236V193.32C312 127.103 258.918 72.382 192.702 72.002C126.213 71.62 72 125.598 72 192V236C72 242.627 66.627 248 60 248H36C29.373 248 24 242.627 24 236V192C24 107.512 86.693 37.403 168 25.722V-20H100C93.373 -20 88 -25.373 88 -32V-52C88 -58.627 93.373 -64 100 -64H284C290.627 -64 296 -58.627 296 -52V-32C296 -25.373 290.627 -20 284 -20H216V25.722C297.307 37.403 360 107.512 360 192V236C360 242.627 354.627 248 348 248z" />
+    <glyph glyph-name="minus-circle"
+      unicode="&#xF056;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM124 152C117.4 152 112 157.4 112 164V220C112 226.6 117.4 232 124 232H388C394.6 232 400 226.6 400 220V164C400 157.4 394.6 152 388 152H124z" />
+    <glyph glyph-name="minus-square"
+      unicode="&#xF146;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM92 152C85.4 152 80 157.4 80 164V220C80 226.6 85.4 232 92 232H356C362.6 232 368 226.6 368 220V164C368 157.4 362.6 152 356 152H92z" />
+    <glyph glyph-name="minus"
+      unicode="&#xF068;"
+      horiz-adv-x="448" d=" M424 129.8C437.3 129.8 448 140.5 448 153.8V230.2C448 243.5000000000001 437.3 254.2 424 254.2H24C10.7 254.2 0 243.5000000000001 0 230.2V153.8C0 140.5 10.7 129.8 24 129.8H424z" />
+    <glyph glyph-name="mobile-alt"
+      unicode="&#xF3CD;"
+      horiz-adv-x="320" d=" M272 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H272C298.5 -64 320 -42.5 320 -16V400C320 426.5 298.5 448 272 448zM160 -32C142.3 -32 128 -17.7 128 0S142.3 32 160 32S192 17.7 192 0S177.7 -32 160 -32zM272 76C272 69.4 266.6 64 260 64H60C53.4 64 48 69.4 48 76V388C48 394.6 53.4 400 60 400H260C266.6 400 272 394.6 272 388V76z" />
+    <glyph glyph-name="mobile"
+      unicode="&#xF10B;"
+      horiz-adv-x="320" d=" M272 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H272C298.5 -64 320 -42.5 320 -16V400C320 426.5 298.5 448 272 448zM160 -32C142.3 -32 128 -17.7 128 0S142.3 32 160 32S192 17.7 192 0S177.7 -32 160 -32z" />
+    <glyph glyph-name="money-bill-alt"
+      unicode="&#xF3D1;"
+      horiz-adv-x="640" d=" M640 328V56C640 42.745 629.255 32 616 32H24C10.745 32 0 42.745 0 56V328C0 341.255 10.745 352 24 352H616C629.255 352 640 341.255 640 328zM96 64C96 99.346 67.346 128 32 128V64H96zM96 320H32V256C67.346 256 96 284.654 96 320zM400 192C400 245.021 364.184 288 320 288S240 245.021 240 192C240 138.988 275.814 96 320 96C364.1670000000001 96 400 138.969 400 192zM608 128C572.654 128 544 99.346 544 64H608V128zM608 320H544C544 284.654 572.654 256 608 256V320zM277.563 148.473C277.563 155.95 281.48 160.045 289.136 160.045H304.267V199.923C304.267 205.086 304.801 210.426 304.801 210.426H304.445S302.666 207.756 301.5969999999999 206.688C297.1459999999999 202.415 291.0929999999999 202.237 285.931 207.756L280.413 213.987C275.071 219.328 275.429 225.203 280.947 230.366L302.6669999999999 250.305C307.116 254.4 311.0329999999999 256.002 317.087 256.002H329.192C336.848 256.002 340.941 252.086 340.941 244.43V160.046H356.429C364.084 160.046 368.001 155.952 368.001 148.474V139.573C368.001 132.096 364.084 128.001 356.429 128.001H289.136C281.48 128.001 277.563 132.096 277.563 139.573V148.473z" />
+    <glyph glyph-name="moon"
+      unicode="&#xF186;"
+      horiz-adv-x="512" d=" M283.211 -64C362.173 -64 434.29 -28.075 482.068 30.792C489.136 39.5000000000001 481.429 52.222 470.506 50.1420000000001C346.303 26.4880000000001 232.244 121.7180000000001 232.244 247.0960000000001C232.244 319.3180000000001 270.906 385.7310000000001 333.742 421.4900000000001C343.428 427.0020000000001 340.992 441.6870000000001 329.986 443.7200000000001A258.156 258.156 0 0 1 283.211 448C141.902 448 27.211 333.4890000000001 27.211 192C27.211 50.691 141.722 -64 283.211 -64z" />
+    <glyph glyph-name="motorcycle"
+      unicode="&#xF21C;"
+      horiz-adv-x="640" d=" M512.949 255.997C498.0869999999999 256.105 483.809 253.675 470.515 249.123L437.589 304H520C533.255 304 544 314.745 544 328V360C544 373.255 533.255 384 520 384H474.689A24 24 0 0 1 456.85 376.055L419.3540000000001 334.392L396.5800000000001 372.348A24 24 0 0 1 376 384H296C287.163 384 280 376.837 280 368V352C280 343.163 287.163 336 296 336H362.411L381.611 304H227.904C210.177 327.073 182.98 344 128 344H72.54C59.085 344 47.749 332.9890000000001 48.004 319.536C48.252 306.495 58.9 296 72 296H128C152.504 296 166.686 285.081 175.787 271.231L164.496 250.702C151.49 254.567 137.625 256.438 123.245 255.912C55.857 253.451 1.565 198.395 0.034 130.979C-1.603 58.924 56.317 0 128 0C187.642 0 237.744 40.794 251.953 96H336.189C349.862 96 360.778 107.421 360.165 121.077C358.0470000000001 168.197 377.687 214.742 416.35 246.103L428.8350000000001 225.295C401.189 201.641 383.7380000000001 166.415 384.004 127.116C384.4740000000001 57.56 441.207 0.664 510.762 0.006C582.391 -0.672 640.601 57.493 639.996 129.105C639.408 198.696 582.5409999999999 255.491 512.949 255.997zM128 48C83.888 48 48 83.888 48 128S83.888 208 128 208C132.242 208 136.405 207.659 140.469 207.018L98.97 131.566C90.187 115.593 101.762 96 120 96H201.297C188.927 67.775 160.737 48 128 48zM516.351 48.116C470.272 45.663 432 82.446 432 128C432 149.363 440.4340000000001 168.781 454.125 183.144L503.537 100.792C508.083 93.215 517.912 90.758 525.489 95.304L539.2090000000001 103.5360000000001C546.7860000000001 108.0820000000001 549.243 117.9110000000001 544.6970000000001 125.4880000000001L496.1410000000001 206.4150000000001A80.005 80.005 0 0 0 512 208C557.554 208 594.338 169.727 591.884 123.648C589.724 83.09 556.91 50.276 516.351 48.116z" />
+    <glyph glyph-name="mouse-pointer"
+      unicode="&#xF245;"
+      horiz-adv-x="320" d=" M302.189 118.874H196.105L251.936 -17.119C255.825 -26.547 251.381 -37.118 242.492 -41.118L193.327 -62.545C184.162 -66.5450000000001 173.884 -61.974 169.995 -52.831L116.942 76.305L30.278 -12.8330000000001C18.729 -24.71 0 -15.554 0 0.023V429.701C0 446.101 19.921 454.096 30.277 442.557L314.689 150.0150000000001C326.161 138.8360000000001 317.696 118.874 302.189 118.874z" />
+    <glyph glyph-name="music"
+      unicode="&#xF001;"
+      horiz-adv-x="512" d=" M470.4 446.5L166.4 350.5C153.1 346.3 144 334 144 320V55.4C129.9 60.8 113.5 64 96 64C43 64 0 35.3 0 0S43 -64 96 -64S192 -35.3 192 0V227.5L464 313.4V119.4C449.9 124.8 433.5 128 416 128C363 128 320 99.3 320 64S363 0 416 0S512 28.7 512 64V416C512 437.7 490.9 453 470.4 446.5z" />
+    <glyph glyph-name="neuter"
+      unicode="&#xF22C;"
+      horiz-adv-x="288" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V131.6C240.1 146.1 288 203.5 288 272zM144 192C99.9 192 64 227.9 64 272S99.9 352 144 352S224 316.1 224 272S188.1 192 144 192z" />
+    <glyph glyph-name="newspaper"
+      unicode="&#xF1EA;"
+      horiz-adv-x="576" d=" M552 384H88C74.745 384 64 373.255 64 360V352H24C10.745 352 0 341.255 0 328V56C0 25.072 25.072 0 56 0H528C554.51 0 576 21.49 576 48V360C576 373.255 565.255 384 552 384zM56 48A8 8 0 0 0 48 56V304H64V56A8 8 0 0 0 56 48zM292 64H140C133.373 64 128 69.373 128 76V84C128 90.627 133.373 96 140 96H292C298.627 96 304 90.627 304 84V76C304 69.373 298.627 64 292 64zM500 64H348C341.373 64 336 69.373 336 76V84C336 90.627 341.373 96 348 96H500C506.627 96 512 90.627 512 84V76C512 69.373 506.627 64 500 64zM292 160H140C133.373 160 128 165.373 128 172V180C128 186.627 133.373 192 140 192H292C298.627 192 304 186.627 304 180V172C304 165.373 298.627 160 292 160zM500 160H348C341.373 160 336 165.373 336 172V180C336 186.627 341.373 192 348 192H500C506.627 192 512 186.627 512 180V172C512 165.373 506.627 160 500 160zM500 256H140C133.373 256 128 261.373 128 268V308C128 314.627 133.373 320 140 320H500C506.627 320 512 314.627 512 308V268C512 261.373 506.627 256 500 256z" />
+    <glyph glyph-name="notes-medical"
+      unicode="&#xF481;"
+      horiz-adv-x="384" d=" M336 384H256C256 419.3 227.3 448 192 448S128 419.3 128 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V336C384 362.5 362.5 384 336 384zM192 408C205.3 408 216 397.3 216 384S205.3 360 192 360S168 370.7 168 384S178.7 408 192 408zM288 104C288 99.6 284.4 96 280 96H224V40C224 35.6 220.4 32 216 32H168C163.6 32 160 35.6 160 40V96H104C99.6 96 96 99.6 96 104V152C96 156.4 99.6 160 104 160H160V216C160 220.4 163.6 224 168 224H216C220.4 224 224 220.4 224 216V160H280C284.4 160 288 156.4 288 152V104zM288 296C288 291.6 284.4 288 280 288H104C99.6 288 96 291.6 96 296V312C96 316.4 99.6 320 104 320H280C284.4 320 288 316.4 288 312V296z" />
+    <glyph glyph-name="object-group"
+      unicode="&#xF247;"
+      horiz-adv-x="512" d=" M480 320V352H500C506.627 352 512 357.373 512 364V404C512 410.627 506.627 416 500 416H460C453.373 416 448 410.627 448 404V384H64V404C64 410.627 58.627 416 52 416H12C5.373 416 0 410.627 0 404V364C0 357.373 5.373 352 12 352H32V32H12C5.373 32 0 26.627 0 20V-20C0 -26.627 5.373 -32 12 -32H52C58.627 -32 64 -26.627 64 -20V0H448V-20C448 -26.627 453.373 -32 460 -32H500C506.627 -32 512 -26.627 512 -20V20C512 26.627 506.627 32 500 32H480V320zM96 172V308C96 314.627 101.373 320 108 320H276C282.627 320 288 314.627 288 308V172C288 165.373 282.627 160 276 160H108C101.373 160 96 165.373 96 172zM416 76C416 69.373 410.627 64 404 64H236C229.373 64 224 69.373 224 76V128H296C309.255 128 320 138.745 320 152V224H404C410.627 224 416 218.627 416 212V76z" />
+    <glyph glyph-name="object-ungroup"
+      unicode="&#xF248;"
+      horiz-adv-x="576" d=" M64 128V102A6 6 0 0 0 58 96H6A6 6 0 0 0 0 102V154A6 6 0 0 0 6 160H32V352H6A6 6 0 0 0 0 358V410A6 6 0 0 0 6 416H58A6 6 0 0 0 64 410V384H352V410A6 6 0 0 0 358 416H410A6 6 0 0 0 416 410V358A6 6 0 0 0 410 352H384V160H410A6 6 0 0 0 416 154V102A6 6 0 0 0 410 96H358A6 6 0 0 0 352 102V128H64zM544 192V224H570A6 6 0 0 1 576 230V282A6 6 0 0 1 570 288H518A6 6 0 0 1 512 282V256H408V184H416C429.255 184 440 173.255 440 160V96C440 82.745 429.255 72 416 72H352C338.745 72 328 82.745 328 96V104H192V32H166A6 6 0 0 1 160 26V-26A6 6 0 0 1 166 -32H218A6 6 0 0 1 224 -26V0H512V-26A6 6 0 0 1 518 -32H570A6 6 0 0 1 576 -26V26A6 6 0 0 1 570 32H544V192z" />
+    <glyph glyph-name="outdent"
+      unicode="&#xF03B;"
+      horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM208 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H208C199.163 292 192 284.837 192 276V236C192 227.163 199.163 220 208 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM208 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H208C199.163 164 192 156.837 192 148V108C192 99.163 199.163 92 208 92zM4.687 180.687L100.687 84.703C110.734 74.652 128 81.776 128 96.016V287.992C128 302.3210000000001 110.675 309.296 100.687 299.305L4.687 203.313C-1.562 197.065 -1.562 186.935 4.687 180.687z" />
+    <glyph glyph-name="paint-brush"
+      unicode="&#xF1FC;"
+      horiz-adv-x="512" d=" M269.9 83.4C271.3 77 272 70.4 272 63.7C272 -17.5 217.8 -64 137.2 -64C41.5 -64 0 12.9 0 100.4C10.4 93.3 46.9 63.9 58.7 63.9C65.7 63.9 71.7 67.9 74.2 74.5C97.8 136.7 140.7 151 187.1 151.9C202.7 118.1 233.2 92.3 269.9000000000001 83.4zM460.6 448C446.2000000000001 448 432.7000000000001 441.6 422.4000000000001 432.3C228.2 258 208 253.9 208 202.6C208 153.8 248.5 112 298.2 112C357.2 112 391.4 155.4 498.8 356.8C505.8 370.5 511.9999999999999 385.3 511.9999999999999 400.7C512 428.3 487.3 448 460.6 448z" />
+    <glyph glyph-name="pallet"
+      unicode="&#xF482;"
+      horiz-adv-x="640" d=" M144 192H496C504.8 192 512 199.2 512 208V432C512 440.8 504.8 448 496 448H384V320L320 352L256 320V448H144C135.2 448 128 440.8 128 432V208C128 199.2 135.2 192 144 192zM624 64C632.8 64 640 71.2 640 80V112C640 120.8 632.8 128 624 128H16C7.2 128 0 120.8 0 112V80C0 71.2 7.2 64 16 64H64V0H16C7.2 0 0 -7.2 0 -16V-48C0 -56.8 7.2 -64 16 -64H624C632.8 -64 640 -56.8 640 -48V-16C640 -7.2 632.8 0 624 0H576V64H624zM288 0H128V64H288V0zM512 0H352V64H512V0z" />
+    <glyph glyph-name="paper-plane"
+      unicode="&#xF1D8;"
+      horiz-adv-x="512" d=" M476 444.8L12.5 177.4C-5.6 167 -3.3 141.8 14.7 134.2L121 89.6L408.3 342.8C413.8 347.7000000000001 421.6 340.2000000000001 416.9000000000001 334.5L176 41V-39.5C176 -63.1 204.5 -72.4 218.5 -55.3L282 22L406.6 -30.2C420.8 -36.2 437 -27.3 439.6 -12L511.6 420C515 440.2 493.3 454.8 476 444.8z" />
+    <glyph glyph-name="paperclip"
+      unicode="&#xF0C6;"
+      horiz-adv-x="448" d=" M43.246 -18.142C-15.184 42.147 -14.095 139.369 44.632 199.439L254.392 414C298.708 459.332 370.743 459.336 415.063 414C458.953 369.106 459.006 296.671 415.063 251.724L232.214 64.872C202.359 34.335 153.581 34.761 124.232 65.87C95.957 95.84 96.864 143.343 125.684 172.823L269.427 319.658C275.6090000000001 325.972 285.7390000000001 326.08 292.053 319.899L314.914 297.52C321.229 291.338 321.336 281.208 315.155 274.894L171.427 128.073C166.495 123.028 166.191 114.645 170.779 109.781C175.151 105.1469999999999 182.024 105.0699999999999 186.467 109.6159999999999L369.316 296.467C388.929 316.529 388.929 349.1919999999999 369.305 369.265C350.116 388.892 319.348 388.902 300.151 369.265L90.39 154.705C55.627 119.145 55.091 61.585 89.199 26.392C123.209 -8.701 178.184 -8.745 212.257 26.106L384.317 202.105C390.4940000000001 208.424 400.624 208.538 406.943 202.361L429.82 179.997C436.139 173.82 436.254 163.69 430.076 157.3710000000001L258.016 -18.627C198.44 -79.5649999999999 102.073 -78.843 43.246 -18.1419999999999z" />
+    <glyph glyph-name="parachute-box"
+      unicode="&#xF4CD;"
+      horiz-adv-x="512" d=" M511.9 273C502.8 348.6 433.5 405.4 353.6 431.7C390 392.3 416 331.1 416 256H444.1L327.5 126.5C325 127.1 322.7 128 320 128H272V256H384C384 371.2 315.1 448 256 448S128 371.2 128 256H240V128H192C189.3 128 187 127.1 184.5 126.5L67.9 256H96C96 331.1 122 392.3 158.4 431.7C78.5 405.3 9.2 348.5 0.1 273C-1 263.9 6.9 256 16.1 256H24.8L161.5 104.1C160.8 101.5 159.9 98.9 159.9 96V-32C159.9 -49.7 174.2 -64 191.9 -64H319.9C337.6 -64 351.9 -49.7 351.9 -32V96C351.9 98.9 351 101.4 350.3 104.1L487.1 256H495.8C505.1 256 513 263.8 511.9 273z" />
+    <glyph glyph-name="paragraph"
+      unicode="&#xF1DD;"
+      horiz-adv-x="448" d=" M408 416H177.531C88.948 416 16.045 344.665 16 256.082C15.956 167.679 87.607 96 176 96V-8C176 -21.255 186.745 -32 200 -32H232C245.255 -32 256 -21.255 256 -8V336H288V-8C288 -21.255 298.745 -32 312 -32H344C357.255 -32 368 -21.255 368 -8V336H408C421.255 336 432 346.745 432 360V392C432 405.255 421.255 416 408 416z" />
+    <glyph glyph-name="paste"
+      unicode="&#xF0EA;"
+      horiz-adv-x="448" d=" M128 264C128 294.879 153.122 320 184 320H320V392C320 405.255 309.255 416 296 416H215.39C204.306 435.11 183.637 448 160 448S115.694 435.11 104.61 416H24C10.745 416 0 405.255 0 392V56C0 42.745 10.745 32 24 32H128V264zM160 408C173.255 408 184 397.255 184 384S173.255 360 160 360S136 370.745 136 384S146.745 408 160 408zM344 160H448V-40C448 -53.255 437.255 -64 424 -64H184C170.745 -64 160 -53.255 160 -40V264C160 277.255 170.745 288 184 288H320V184C320 170.8 330.8 160 344 160zM448 198.059V192H352V288H358.0590000000001A24 24 0 0 0 375.029 280.971L440.9700000000001 215.03A24.002000000000002 24.002000000000002 0 0 0 448 198.059z" />
+    <glyph glyph-name="pause-circle"
+      unicode="&#xF28B;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM240 112C240 103.2 232.8 96 224 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H224C232.8 288 240 280.8 240 272V112zM352 112C352 103.2 344.8 96 336 96H288C279.2 96 272 103.2 272 112V272C272 280.8 279.2 288 288 288H336C344.8 288 352 280.8 352 272V112z" />
+    <glyph glyph-name="pause"
+      unicode="&#xF04C;"
+      horiz-adv-x="448" d=" M144 -31H48C21.5 -31 0 -9.5 0 17V369C0 395.5 21.5 417 48 417H144C170.5 417 192 395.5 192 369V17C192 -9.5 170.5 -31 144 -31zM448 17V369C448 395.5 426.5 417 400 417H304C277.5 417 256 395.5 256 369V17C256 -9.5 277.5 -31 304 -31H400C426.5 -31 448 -9.5 448 17z" />
+    <glyph glyph-name="paw"
+      unicode="&#xF1B0;"
+      horiz-adv-x="512" d=" M85.231 117.042C36 117.042 0 174.208 0 216.5C0 244.792 16 274.5420000000001 49.538 274.5420000000001C98.769 274.5420000000001 134.769 217.084 134.769 174.792C134.769 146.5 119.077 117.042 85.231 117.042zM433.231 10.875C433.231 -26.167 401.231 -32 369.846 -32C328.615 -32 295.384 -5.75 256 -5.75C214.769 -5.75 179.692 -31.708 135.077 -31.708C105.23 -31.708 78.769 -22.083 78.769 10.875C78.769 80 180.616 182.667 256 182.667S433.231 79.708 433.231 10.875zM182.462 244.208C132.615 244.208 102.462 303.708 102.462 344.541C102.462 377.208 120.308 416 160 416C210.154 416 240 356.5 240 315.6670000000001C240 283 222.154 244.208 182.462 244.208zM272 315.6670000000001C272 356.5 301.846 416 352 416C391.692 416 409.539 377.208 409.539 344.5420000000001C409.539 303.709 379.385 244.209 329.538 244.209C289.846 244.208 272 283 272 315.6670000000001zM512 216.5C512 174.208 476 117.042 426.769 117.042C392.9220000000001 117.042 377.231 146.5 377.231 174.792C377.231 217.083 413.23 274.5420000000001 462.462 274.5420000000001C496 274.5420000000001 512 244.792 512 216.5z" />
+    <glyph glyph-name="pen-square"
+      unicode="&#xF14B;"
+      horiz-adv-x="448" d=" M400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368V16C448 -10.5 426.5 -32 400 -32zM238.1 270.1L102.4 134.4L96.1 77.3C95.3 69.6999999999999 101.7 63.1999999999999 109.4 63.9999999999999L166.5 70.3L302.2 206C304.5 208.3 304.5 212.1 302.2 214.5L246.7 270C244.2 272.4 240.4 272.4 238.1 270.1zM345 282.9L314.9 313C305.5 322.4 290.3 322.4 281 313L257.9 289.9C255.6 287.6 255.6 283.8 257.9 281.4L313.4 225.9C315.7 223.6 319.5 223.6 321.9 225.9L345 249C354.3 258.3 354.3 273.5 345 282.9z" />
+    <glyph glyph-name="pencil-alt"
+      unicode="&#xF303;"
+      horiz-adv-x="512" d=" M497.9 305.9L451.8 259.8C447.1 255.1 439.5 255.1 434.8 259.8L323.8 370.8C319.1 375.5 319.1 383.1 323.8 387.8L369.9 433.9000000000001C388.6 452.6 419 452.6 437.8 433.9000000000001L497.9 373.8C516.6999999999999 355.1 516.6999999999999 324.7000000000001 497.9 305.9zM284.2 348.2L21.6 85.6L0.4 -35.9C-2.5 -52.3 11.8 -66.5 28.2 -63.7L149.7 -42.4L412.3 220.2000000000001C417 224.9 417 232.5000000000001 412.3 237.2000000000001L301.3 348.2000000000001C296.5 352.9000000000001 288.9000000000001 352.9000000000001 284.2 348.2000000000001zM124.1 108.1C118.6 113.6 118.6 122.4 124.1 127.9L278.1 281.9000000000001C283.6 287.4000000000001 292.4000000000001 287.4000000000001 297.9000000000001 281.9000000000001S303.4000000000001 267.6 297.9000000000001 262.1L143.9 108.1C138.4 102.6 129.6 102.6 124.1 108.1zM88 24H136V-12.3L71.5 -23.6L40.4 7.5L51.7 72H88V24z" />
+    <glyph glyph-name="people-carry"
+      unicode="&#xF4CE;"
+      horiz-adv-x="640" d=" M128 352C154.5 352 176 373.5 176 400S154.5 448 128 448S80 426.5 80 400S101.5 352 128 352zM512 352C538.5 352 560 373.5 560 400S538.5 448 512 448S464 426.5 464 400S485.5 352 512 352zM637.7 -20.1L593.7 89.9L552.6 43.5L550.6 25.3L578.3000000000001 -43.9C583.3000000000001 -56.4 595.3000000000001 -64 608.0000000000001 -64C612.0000000000001 -64 616.0000000000001 -63.3 619.9000000000001 -61.7C636.3000000000001 -55.1 644.3000000000001 -36.5 637.7 -20.1zM603.5 189.7L585 269.9C580.4 289.9 566.4 306.7 547.5 314.8C529 322.8 508.5 321.5 491.4 311.5C468.7 298.1 451.7 277 443.3 252.1L432 218.2L416 208V304C416 312.8 408.8 320 400 320H240C231.2 320 224 312.8 224 304V208L207.9 218.2L196.6 252.1C188.3 277.1 171.2 298.1 148.5 311.5C131.3 321.5 110.9 322.8 92.4 314.8C73.5 306.7000000000001 59.5 289.9 54.9 269.9L36.5 189.7C31.9 169.7 37.2 148.5 50.9 133L118.1 57.1L128.2 -35.5C130 -51.8 143.8 -64 160 -64C161.2 -64 162.3 -63.9 163.5 -63.8C181.1 -61.9 193.7 -46.1 191.8 -28.5L181.7 64.3C180.2 77.3 174.8 89.4 166.1 99.3L122.8 148.3L140.4 218.6L147.2000000000001 198.2C151.3000000000001 185.7000000000001 159.1000000000001 174.8 171.7000000000001 165.6L222.8000000000001 133.1C227.4000000000001 130.2000000000001 234.9000000000001 128.5 240.0000000000001 128.1H400C405.1 128.5 412.6 130.2000000000001 417.2 133.1L468.3 165.6C480.9 174.8 488.7 185.6 492.8 198.2L499.6 218.6L517.2 148.3L473.9 99.3C465.2 89.4 459.8 77.3 458.3 64.3L448.2 -28.5C446.3 -46.1 459 -61.9 476.5 -63.8C477.7 -63.9 478.8 -64 480 -64C496.1 -64 510 -51.9 511.8 -35.5L521.9 57.1L589.1 133C602.7 148.5 608.1 169.7 603.5 189.7zM46.3 89.9L2.3 -20.1C-4.3 -36.5 3.7 -55.1 20.1 -61.7C36.9 -68.3000000000001 55.2 -60.0000000000001 61.7 -43.9L89.4 25.3L87.4 43.4999999999999L46.3 89.8999999999999z" />
+    <glyph glyph-name="percent"
+      unicode="&#xF295;"
+      horiz-adv-x="448" d=" M112 224C173.9 224 224 274.1 224 336S173.9 448 112 448S0 397.9 0 336S50.1 224 112 224zM112 384C138.5 384 160 362.5 160 336S138.5 288 112 288S64 309.5 64 336S85.5 384 112 384zM336 160C274.1 160 224 109.9 224 48S274.1 -64 336 -64S448 -13.9 448 48S397.9 160 336 160zM336 0C309.5 0 288 21.5 288 48S309.5 96 336 96S384 74.5 384 48S362.5 0 336 0zM392.3 447.8L423.9000000000001 447.9C443.3 448 454.8 426.1 443.6 410.1L77.4 -53.6A23.95 23.95 0 0 0 57.8 -63.8L24.4 -63.9C4.9 -63.9 -6.5 -42.0000000000001 4.7 -26.1L372.7 437.6C377.2 444 384.5 447.8 392.3 447.8z" />
+    <glyph glyph-name="phone-slash"
+      unicode="&#xF3DD;"
+      horiz-adv-x="640" d=" M268.2 66.6L218.6 127.2000000000001C211.8 135.5000000000001 200.4 138.3000000000001 190.6 134.1L78.6 86.1C67.9 81.5 62.1 70 64.7 58.6L88.7 -45.4C91.2 -56.2 100.8 -64 112.1 -64C212.8 -64 305.8 -31.6 381.8 22.9L301.8 84.7C290.9 78.2 279.7 72 268.2 66.6zM633.8 -10.1L475.1 112.5C537.9 191.6 576 291.1 576 400C576 411.2 568.3 420.9 557.4 423.4L453.4 447.4C442.1 450 430.5 444.1 425.9 433.5L377.9 321.5C373.7 311.7 376.5 300.2 384.8 293.5L445.4 243.9C433.2 217.8 417.5 193.6 399.4 171.1L45.5 444.6C38.5 450 28.5 448.8 23 441.8L3.4 416.6C-2 409.6 -0.8 399.6 6.2 394.2L594.6 -60.5C601.6 -65.9 611.6 -64.7 617.1 -57.7L636.7 -32.4C642.1 -25.6 640.8000000000001 -15.5 633.8000000000001 -10.1z" />
+    <glyph glyph-name="phone-square"
+      unicode="&#xF098;"
+      horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM94 32C86.967 32 80.943 36.873 79.384 43.627L64.386 108.627A15 15 0 0 0 73.093 125.787L143.091 155.7860000000001A15 15 0 0 0 160.609 151.4970000000001L191.606 113.6120000000001C240.55 136.5750000000001 279.903 176.4700000000001 302.387 224.3920000000001L264.501 255.3890000000001A15.000999999999998 15.000999999999998 0 0 0 260.212 272.9070000000001L290.212 342.9050000000001A15 15 0 0 0 307.372 351.6120000000001L372.372 336.6140000000001A14.997000000000002 14.997000000000002 0 0 0 384 322C384 161.708 254.055 32 94 32z" />
+    <glyph glyph-name="phone-volume"
+      unicode="&#xF2A0;"
+      horiz-adv-x="384" d=" M97.333 -58.966C-32.541 70.908 -32.348 281.286 97.333 410.967C103.031 416.665 111.86 417.599 118.596 413.389L183.413 372.876A17.187 17.187 0 0 0 190.262 351.918L157.854 270.897A17.188 17.188 0 0 0 140.185 260.178L84.375 265.7580000000001C63.324 207.497 63.763 143.287 84.375 86.2430000000001L140.186 91.8240000000001A17.188 17.188 0 0 0 157.855 81.1050000000001L190.263 0.0830000000001A17.188 17.188 0 0 0 183.414 -20.8749999999999L118.597 -61.3879999999999A17.19 17.19 0 0 0 97.333 -58.9659999999998zM247.126 352.527C258.9580000000001 332.48 258.9580000000001 307.519 247.126 287.472C243.176 280.779 234.018 279.513 228.408 284.891L222.433 290.617C218.522 294.365 217.64 300.239 220.172 305.027A32.063 32.063 0 0 1 220.172 334.972C217.6390000000001 339.76 218.522 345.634 222.433 349.382L228.408 355.108C234.0180000000001 360.486 243.176 359.22 247.126 352.527zM338.913 443.714C399.053 372.11 399.005 267.832 338.913 196.286C334.439 190.959 326.3830000000001 190.54 321.361 195.353L315.563 200.91C311.003 205.281 310.586 212.439 314.633 217.289C364.32 276.827 364.279 363.222 314.633 422.711C310.586 427.561 311.002 434.719 315.563 439.09L321.361 444.647C326.383 449.46 334.439 449.041 338.913 443.714zM292.9410000000001 398.773C328.9910000000001 352.451 329.0490000000001 287.624 292.9410000000001 241.227C288.5510000000001 235.586 280.2440000000001 234.976 275.0850000000001 239.923L269.2670000000001 245.502C264.8670000000001 249.721 264.2690000000001 256.597 267.9820000000001 261.433C294.5180000000001 295.997 294.516 344.005 267.9820000000001 378.567C264.269 383.403 264.867 390.278 269.2670000000001 394.4980000000001L275.0850000000001 400.077C280.2440000000001 405.024 288.5510000000001 404.414 292.9410000000001 398.773z" />
+    <glyph glyph-name="phone"
+      unicode="&#xF095;"
+      horiz-adv-x="512" d=" M493.4 423.4L389.4 447.4C378.1 450 366.5 444.1 361.9 433.5L313.9 321.5C309.7 311.7 312.5 300.2 320.8 293.5L381.4 243.9C345.4 167.2 282.5 103.4 204.2 66.7000000000001L154.6 127.3000000000001C147.8 135.6000000000001 136.4 138.4000000000001 126.6 134.2000000000001L14.6 86.2000000000001C3.9 81.5 -2 69.9 0.6 58.6L24.6 -45.4C27.1 -56.2 36.7 -64 48 -64C304.1 -64 512 143.5 512 400C512 411.2 504.3 420.9 493.4 423.4z" />
+    <glyph glyph-name="piggy-bank"
+      unicode="&#xF4D3;"
+      horiz-adv-x="576" d=" M560 224H530.5C521.7 244 508.9 261.7 493.1 276.5L512 352H480C450.6 352 424.6 338.5 407 317.7C399.4 318.8 391.9 320 384 320H256C178.6 320 114.1 265 99.2 192H56C41.2 192 29.5 205.5 32.5 220.8C34.7 232.2 45.4 240 57 240H58C61.3 240 64 242.7 64 246V266C64 269.3 61.3 272 58 272C29.5 272 4.1 251.6 0.5 223.4C-3.9 189.2 22.7 160 56 160H96C96 107.8 121.4 61.9 160 32.7V-48C160 -56.8 167.2 -64 176 -64H240C248.8 -64 256 -56.8 256 -48V0H384V-48C384 -56.8 391.2 -64 400 -64H464C472.8 -64 480 -56.8 480 -48V32.7C491.8 41.6 502.3 52.1 511.3 64H560C568.8 64 576 71.2 576 80V208C576 216.8 568.8 224 560 224zM432 160C423.2 160 416 167.2 416 176S423.2 192 432 192S448 184.8 448 176S440.8 160 432 160zM256 352H384C389.4 352 394.7 351.6 399.9 351.2C399.9 351.5 400 351.7 400 352C400 405 357 448 304 448S208 405 208 352C208 349.9 208.5 347.9 208.6 345.8C223.8 349.7 239.6 352 256 352z" />
+    <glyph glyph-name="pills"
+      unicode="&#xF484;"
+      horiz-adv-x="576" d=" M112 416C50.1 416 0 365.9 0 304V80C0 18.1 50.1 -32 112 -32S224 18.1 224 80V304C224 365.9 173.9 416 112 416zM160 192H64V304C64 330.5 85.5 352 112 352S160 330.5 160 304V192zM299.7 221.7C296.2 225.2 290.3 224.8 287.4 220.9C242.1 158.4 247 70.8 303.3 14.5C359.6 -41.8 447.2 -46.7 509.6999999999999 -1.4C513.6999999999999 1.5 513.9999999999999 7.4 510.4999999999999 10.9L299.7 221.7zM529.5 240.7C473.2 297 385.6 301.9 323.1 256.6C319.1 253.7 318.8 247.8 322.3 244.3L533.1 33.5C536.6 30 542.5 30.4 545.4 34.3C590.6999999999999 96.9 585.9 184.4 529.5 240.7z" />
+    <glyph glyph-name="plane"
+      unicode="&#xF072;"
+      horiz-adv-x="576" d=" M472 248H360.211L256.013 442.289A12 12 0 0 1 245.793 448H188.006C180.156 448 174.42 440.587 176.39 432.989L209.624 248H99.766L64.862 306.174A12 12 0 0 1 54.572 312H12.004C4.432 312 -1.248 305.072 0.237 297.647L21.366 191.999L0.237 86.354C-1.248 78.928 4.432 72 12.005 72.001L54.573 72.003C58.788 72.003 62.694 74.215 64.862 77.829L99.766 136H209.624L176.39 -48.989C174.42 -56.588 180.156 -64 188.006 -64H245.793A12 12 0 0 1 256.013 -58.289L360.212 136H472C529.438 136 576 161.072 576 192S529.438 248 472 248z" />
+    <glyph glyph-name="play-circle"
+      unicode="&#xF144;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM371.7 168L195.7 67C179.9 58.2 160 69.5 160 88V296C160 314.4 179.8 325.8 195.7 317L371.7 210C388.1 200.8 388.1 177.1 371.7 168z" />
+    <glyph glyph-name="play"
+      unicode="&#xF04B;"
+      horiz-adv-x="448" d=" M424.4 233.3L72.4 441.4C43.8 458.3 0 441.9 0 400.1V-16C0 -53.5 40.7 -76.1 72.4 -57.3L424.4 150.7C455.8 169.2 455.9 214.8 424.4 233.3z" />
+    <glyph glyph-name="plug"
+      unicode="&#xF1E6;"
+      horiz-adv-x="384" d=" M256 304V416C256 433.673 270.327 448 288 448S320 433.673 320 416V304H256zM368 288H16C7.163 288 0 280.837 0 272V240C0 231.163 7.163 224 16 224H32V192C32 114.594 86.969 50.029 160 35.204V-64H224V35.204C297.031 50.029 352 114.594 352 192V224H368C376.837 224 384 231.163 384 240V272C384 280.837 376.837 288 368 288zM128 304V416C128 433.673 113.673 448 96 448S64 433.673 64 416V304H128z" />
+    <glyph glyph-name="plus-circle"
+      unicode="&#xF055;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM400 164C400 157.4 394.6 152 388 152H296V60C296 53.4 290.6 48 284 48H228C221.4 48 216 53.4 216 60V152H124C117.4 152 112 157.4 112 164V220C112 226.6 117.4 232 124 232H216V324C216 330.6 221.4 336 228 336H284C290.6 336 296 330.6 296 324V232H388C394.6 232 400 226.6 400 220V164z" />
+    <glyph glyph-name="plus-square"
+      unicode="&#xF0FE;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM368 164C368 157.4 362.6 152 356 152H264V60C264 53.4 258.6 48 252 48H196C189.4 48 184 53.4 184 60V152H92C85.4 152 80 157.4 80 164V220C80 226.6 85.4 232 92 232H184V324C184 330.6 189.4 336 196 336H252C258.6 336 264 330.6 264 324V232H356C362.6 232 368 226.6 368 220V164z" />
+    <glyph glyph-name="plus"
+      unicode="&#xF067;"
+      horiz-adv-x="448" d=" M448 153.8V230.2C448 243.5000000000001 437.3 254.2 424 254.2H286.2V392C286.2 405.3 275.5 416 262.2 416H185.8C172.5 416 161.8 405.3 161.8 392V254.2H24C10.7 254.2 0 243.5 0 230.2V153.8C0 140.5 10.7 129.8 24 129.8H161.8V-8C161.8 -21.3 172.5 -32 185.8 -32H262.2000000000001C275.5000000000001 -32 286.2000000000001 -21.3 286.2000000000001 -8V129.8H424C437.3 129.8 448 140.5 448 153.8z" />
+    <glyph glyph-name="podcast"
+      unicode="&#xF2CE;"
+      horiz-adv-x="448" d=" M267.429 -40.563C262.286 -59.573 242.858 -64 224 -64C205.143 -64 185.714 -59.573 180.572 -40.563C172.927 -12.134 160 59.102 160 92.25C160 127.406 191.142 136 224 136S288 127.406 288 92.25C288 59.301 275.129 -11.929 267.429 -40.563zM156.867 159.446C138.174 177.754 126.909 203.619 128.083 232.045C130.137 281.769 170.478 322.0010000000001 220.207 323.9260000000001C274.862 326.0420000000001 320 282.193 320 228C320 201.173 308.936 176.884 291.134 159.448C288.459 156.828 288.733 152.462 291.762 150.261C301.074 143.496 308.222 134.918 312.996 124.898C314.737 121.244 319.493 120.238 322.445 123.007C351.271 150.05 368.998 188.79 367.956 231.572C366.101 307.778 304.361 369.78 228.163 371.9409999999999C146.869 374.247 80 308.785 80 228C80 186.639 97.532 149.3 125.55 123.011C128.503 120.24 133.261 121.241 135.003 124.898C139.777 134.919 146.926 143.496 156.238 150.261C159.267 152.461 159.542 156.827 156.867 159.446zM224 448C100.204 448 0 347.815 0 224C0 134.008 52.602 58.353 125.739 22.592C130.072 20.474 135.006 24.136 134.274 28.902C131.892 44.414 129.932 59.848 128.868 73.241C128.722 75.077 127.719 76.727 126.19 77.753C78.79 109.559 47.626 163.769 48.003 225.1C48.595 321.337 127.293 399.748 223.532 399.999C320.793 400.253 400 321.203 400 224C400 162.068 367.842 107.51 319.35 76.133C318.351 62.0960000000001 316.281 45.545 313.726 28.903C312.994 24.136 317.929 20.474 322.261 22.593C395.227 58.273 448 133.813 448 224C448 347.795 347.815 448 224 448zM224 288C188.654 288 160 259.346 160 224S188.654 160 224 160S288 188.654 288 224S259.346 288 224 288z" />
+    <glyph glyph-name="poo"
+      unicode="&#xF2FE;"
+      horiz-adv-x="512" d=" M451.4 78.9C468.7 92 480 112.6 480 136C480 175.8 447.8 208 408 208H393.9C407.3 219.7 416 236.8 416 256C416 291.3 387.3 320 352 320H346.1C349.7000000000001 330.1 352 340.7 352 352C352 405 309 448 256 448C250.8 448 245.8 447.3 240.9 446.5C250.3 433.4 256 417.4 256 400C256 355.8 220.2 320 176 320H160C124.7 320 96 291.3 96 256C96 236.8 104.7 219.7 118.1 208H104C64.2 208 32 175.8 32 136C32 112.6 43.3 92 60.6 78.9C26.3 73.4 0 43.9 0 8C0 -31.8 32.2 -64 72 -64H440C479.8 -64 512 -31.8 512 8C512 43.9 485.7 73.4 451.4 78.9zM192 192C209.7 192 224 177.7 224 160S209.7 128 192 128S160 142.3 160 160S174.3 192 192 192zM351.5 53C341 25.1 293 0 256 0S171 25.1 160.5 53C158.5 58.3 162.5 64 168.3 64H343.7000000000001C349.5000000000001 64 353.5000000000001 58.3 351.5000000000001 53zM320 128C302.3 128 288 142.3 288 160S302.3 192 320 192S352 177.7 352 160S337.7 128 320 128z" />
+    <glyph glyph-name="pound-sign"
+      unicode="&#xF154;"
+      horiz-adv-x="320" d=" M308 96H262.505C255.878 96 250.505 90.627 250.505 84V33.152H128V160H212C218.627 160 224 165.373 224 172V212C224 218.627 218.627 224 212 224H128V287.556C128 319.822 152.562 344.642 189.792 344.642C213.45 344.642 235.67 333.137 247.444 325.793C252.5950000000001 322.58 259.332 323.742 263.132 328.478L291.625 363.991C295.858 369.267 294.904 376.996 289.506 381.072C273.124 393.44 236.576 416 187.931 416C106.026 416 48 363.258 48 290.039V224H20C13.373 224 8 218.627 8 212V172C8 165.373 13.373 160 20 160H48V32H12C5.373 32 0 26.627 0 20V-20C0 -26.627 5.373 -32 12 -32H308C314.627 -32 320 -26.627 320 -20V84C320 90.627 314.627 96 308 96z" />
+    <glyph glyph-name="power-off"
+      unicode="&#xF011;"
+      horiz-adv-x="512" d=" M400 393.9C463 348.9 504 275.3 504 192C504 55.2 393.2 -55.7 256.5 -56C120 -56.3 8.2 55 8 191.6C7.9 274.9 48.9 348.7 111.8 393.8C123.5 402.1 139.8 398.6 146.8 386.1L162.6 358C168.5 347.5 165.7 334.2 156 327C114.5 296.2 88 247.4 88 192.1C87.9 99.8 162.5 24 256 24C347.6 24 424.6 98.2 424 193.1C423.7 244.9 399.3 294.9 355.9 327.1C346.2 334.3 343.5 347.6 349.4 358L365.2 386.1C372.2 398.5 388.4 402.2 400 393.9zM296 184V424C296 437.3 285.3 448 272 448H240C226.7 448 216 437.3 216 424V184C216 170.7 226.7 160 240 160H272C285.3 160 296 170.7 296 184z" />
+    <glyph glyph-name="prescription-bottle-alt"
+      unicode="&#xF486;"
+      horiz-adv-x="384" d=" M360 448H24C10.8 448 0 437.2 0 424V376C0 362.8 10.8 352 24 352H360C373.2 352 384 362.8 384 376V424C384 437.2 373.2 448 360 448zM32 -32C32 -49.6 46.4 -64 64 -64H320C337.6 -64 352 -49.6 352 -32V320H32V-32zM96 152C96 156.4 99.6 160 104 160H160V216C160 220.4 163.6 224 168 224H216C220.4 224 224 220.4 224 216V160H280C284.4 160 288 156.4 288 152V104C288 99.6 284.4 96 280 96H224V40C224 35.6 220.4 32 216 32H168C163.6 32 160 35.6 160 40V96H104C99.6 96 96 99.6 96 104V152z" />
+    <glyph glyph-name="prescription-bottle"
+      unicode="&#xF485;"
+      horiz-adv-x="384" d=" M32 256H152C156.4 256 160 252.4 160 248V232C160 227.6 156.4 224 152 224H32V160H152C156.4 160 160 156.4 160 152V136C160 131.6 156.4 128 152 128H32V64H152C156.4 64 160 60.4 160 56V40C160 35.6 156.4 32 152 32H32V-32C32 -49.6 46.4 -64 64 -64H320C337.6 -64 352 -49.6 352 -32V320H32V256zM360 448H24C10.8 448 0 437.2 0 424V376C0 362.8 10.8 352 24 352H360C373.2 352 384 362.8 384 376V424C384 437.2 373.2 448 360 448z" />
+    <glyph glyph-name="print"
+      unicode="&#xF02F;"
+      horiz-adv-x="512" d=" M464 256H448V366.059A24 24 0 0 1 440.971 383.029L383.029 440.971A24 24 0 0 1 366.0590000000001 448H88C74.745 448 64 437.255 64 424V256H48C21.49 256 0 234.51 0 208V76C0 69.373 5.373 64 12 64H64V-40C64 -53.255 74.745 -64 88 -64H424C437.255 -64 448 -53.255 448 -40V64H500C506.627 64 512 69.373 512 76V208C512 234.51 490.51 256 464 256zM384 0H128V96H384V0zM128 224V384H320V344C320 330.8 330.8 320 344 320H384V224H128zM432 152C418.746 152 408 162.746 408 176S418.746 200 432 200S456 189.254 456 176S445.254 152 432 152z" />
+    <glyph glyph-name="procedures"
+      unicode="&#xF487;"
+      horiz-adv-x="640" d=" M528 224H272C263.2 224 256 216.8 256 208V64H64V304C64 312.8 56.8 320 48 320H16C7.2 320 0 312.8 0 304V-48C0 -56.8 7.2 -64 16 -64H48C56.8 -64 64 -56.8 64 -48V0H576V-48C576 -56.8 583.2 -64 592 -64H624C632.8 -64 640 -56.8 640 -48V112C640 173.9 589.9 224 528 224zM136 352H262.1L289.7000000000001 296.8C295.6 285 312.4000000000001 285 318.3000000000001 296.8L368 396.2L390.1 352H512C520.8 352 528 359.2 528 368S520.8 384 512 384H409.9L382.3 439.2C376.4 451 359.6 451 353.7 439.2L304 339.8L284.1 379.6C282.7000000000001 382.3 280 384 276.9000000000001 384H136C131.6 384 128 380.4 128 376V360C128 355.6 131.6 352 136 352zM160 96C195.3 96 224 124.7 224 160S195.3 224 160 224S96 195.3 96 160S124.7 96 160 96z" />
+    <glyph glyph-name="puzzle-piece"
+      unicode="&#xF12E;"
+      horiz-adv-x="576" d=" M519.442 159.349C477.923 159.349 459.942 127.756 437.384 127.756C377.409 127.756 432 304 432 304S235.712 224 235.712 307.2970000000001C235.712 343.124 272 353.5470000000001 272 393.282C272 428.784 243.885 448 210.539 448C175.885 448 144.173 429.109 144.173 391.654C144.173 350.29 175.884 332.377 175.884 309.904C175.885 240.281 0 281.242 0 281.242V-51.995S178.635 -93.042 178.635 -23.333C178.635 -0.86 138.635 16.774 138.635 58.138C138.635 95.594 167.885 114.484 202.212 114.484C235.885 114.484 264 95.268 264 59.767C264 20.032 227.712 9.609 227.712 -26.218C227.712 -87.021 357.387 -51.948 408.942 -51.948C408.942 -51.948 374.217 68.153 434.769 68.153C470.731 68.153 481.192 32.001 521.077 32.001C556.712 32 576 60.01 576 93.557C576 127.756 557.038 159.3490000000001 519.442 159.3490000000001z" />
+    <glyph glyph-name="qrcode"
+      unicode="&#xF029;"
+      horiz-adv-x="448" d=" M0 224H192V416H0V224zM64 352H128V288H64V352zM256 416V224H448V416H256zM384 288H320V352H384V288zM0 -32H192V160H0V-32zM64 96H128V32H64V96zM416 160H448V32H352V64H320V-32H256V160H352V128H416V160zM416 0H448V-32H416V0zM352 0H384V-32H352V0z" />
+    <glyph glyph-name="question-circle"
+      unicode="&#xF059;"
+      horiz-adv-x="512" d=" M504 192C504 55.003 392.957 -56 256 -56S8 55.003 8 192C8 328.9170000000001 119.043 440 256 440S504 328.9170000000001 504 192zM262.655 358C208.158 358 173.4 335.043 146.106 294.242C142.57 288.956 143.753 281.827 148.821 277.984L183.52 251.674C188.725 247.727 196.141 248.666 200.185 253.796C218.049 276.454 230.298 289.593 257.488 289.593C277.9169999999999 289.593 303.1859999999999 276.445 303.1859999999999 256.635C303.1859999999999 241.659 290.8229999999999 233.968 270.652 222.659C247.128 209.472 216 193.059 216 152V148C216 141.373 221.373 136 228 136H284C290.627 136 296 141.373 296 148V149.333C296 177.795 379.1860000000001 178.98 379.1860000000001 256C379.1860000000001 314.0020000000001 319.021 358 262.6550000000001 358zM256 110C230.635 110 210 89.365 210 64C210 38.636 230.635 18 256 18S302 38.636 302 64C302 89.365 281.365 110 256 110z" />
+    <glyph glyph-name="question"
+      unicode="&#xF128;"
+      horiz-adv-x="384" d=" M202.021 448C122.202 448 70.503 415.2970000000001 29.914 356.974C22.551 346.394 24.821 331.8880000000001 35.092 324.1L78.23 291.391C88.603 283.526 103.362 285.365 111.483 295.539C136.532 326.92 155.113 344.988 194.24 344.988C225.004 344.988 263.0560000000001 325.189 263.0560000000001 295.357C263.0560000000001 272.805 244.4390000000001 261.223 214.0630000000001 244.193C178.6400000000001 224.333 131.7640000000001 199.617 131.7640000000001 137.788V128C131.7640000000001 114.745 142.5090000000001 104 155.7640000000001 104H228.2350000000001C241.4900000000001 104 252.2350000000001 114.745 252.2350000000001 128V133.773C252.2350000000001 176.6330000000001 377.5030000000001 178.418 377.5030000000001 294.4000000000001C377.504 381.7440000000001 286.902 448 202.021 448zM192 74.541C153.804 74.541 122.729 43.466 122.729 5.27C122.729 -32.925 153.804 -64 192 -64S261.271 -32.925 261.271 5.271S230.1960000000001 74.541 192 74.541z" />
+    <glyph glyph-name="quidditch"
+      unicode="&#xF458;"
+      horiz-adv-x="640" d=" M256.5 231.2L343.2 122S326.6 19.6 266.6 -28.1C206.7 -75.7999999999999 0 -62.2 0 -62.2S3.8 -39.1 11 -6.8L105.6 105.4C109.6 110.1 104.7 117 99 114.9L38.6 92.8C53 134.5 71.3 172.8 93.2 190.3C153.1 238.1 256.5 231.2 256.5 231.2zM494.5 96.2C450.5 96.2 414.7 60.4 414.7 16.3C414.7 -27.8000000000001 450.4 -63.6 494.5 -63.6C538.6 -63.6 574.3 -27.8 574.3 16.3C574.3 60.4999999999999 538.5 96.1999999999999 494.4999999999999 96.1999999999999zM636.5 417L616.7 442C611.2 448.9 601.2 450 594.3000000000001 444.6L361.8 266.7L327.7 309.7C322.6 316.1 312.6 314.9 309.1 307.5L283.8 252.9L370.5 143.7L429.3 156.1C437.3 157.8 440.7 167.3 435.6 173.7L401.5 216.6L634 394.5C640.9 400 642 410.1 636.5 417z" />
+    <glyph glyph-name="quote-left"
+      unicode="&#xF10D;"
+      horiz-adv-x="512" d=" M464 192H384V256C384 291.3 412.7 320 448 320H456C469.3 320 480 330.7 480 344V392C480 405.3 469.3 416 456 416H448C359.6 416 288 344.4 288 256V16C288 -10.5 309.5 -32 336 -32H464C490.5 -32 512 -10.5 512 16V144C512 170.5 490.5 192 464 192zM176 192H96V256C96 291.3 124.7 320 160 320H168C181.3 320 192 330.7 192 344V392C192 405.3 181.3 416 168 416H160C71.6 416 0 344.4 0 256V16C0 -10.5 21.5 -32 48 -32H176C202.5 -32 224 -10.5 224 16V144C224 170.5 202.5 192 176 192z" />
+    <glyph glyph-name="quote-right"
+      unicode="&#xF10E;"
+      horiz-adv-x="512" d=" M464 416H336C309.5 416 288 394.5 288 368V240C288 213.5 309.5 192 336 192H416V128C416 92.7 387.3 64 352 64H344C330.7 64 320 53.3 320 40V-8C320 -21.3 330.7 -32 344 -32H352C440.4 -32 512 39.6 512 128V368C512 394.5 490.5 416 464 416zM176 416H48C21.5 416 0 394.5 0 368V240C0 213.5 21.5 192 48 192H128V128C128 92.7 99.3 64 64 64H56C42.7 64 32 53.3 32 40V-8C32 -21.3 42.7 -32 56 -32H64C152.4 -32 224 39.6 224 128V368C224 394.5 202.5 416 176 416z" />
+    <glyph glyph-name="random"
+      unicode="&#xF074;"
+      horiz-adv-x="512" d=" M504.971 88.971C514.344 79.598 514.344 64.402 504.971 55.03L424.971 -24.954C409.961 -39.964 384 -29.444 384 -7.983V32H325.2150000000001A12.004 12.004 0 0 0 316.442 35.812L245.886 111.408L299.2190000000001 168.5510000000001L352 112H384V151.981C384 173.419 409.943 183.979 424.971 168.952L504.971 88.971zM12 272H96L148.781 215.449L202.114 272.592L131.558 348.188A11.999000000000002 11.999000000000002 0 0 1 122.785 352H12C5.373 352 0 346.627 0 340V284C0 277.373 5.373 272 12 272zM384 272V232.016C384 210.556 409.961 200.036 424.971 215.045L504.971 295.029C514.344 304.402 514.344 319.598 504.971 328.9700000000001L424.971 408.951C409.943 423.979 384 413.418 384 391.981V352H325.2150000000001A12.004 12.004 0 0 1 316.442 348.188L96 112H12C5.373 112 0 106.627 0 100V44C0 37.373 5.373 32 12 32H122.785C126.111 32 129.288 33.381 131.558 35.812L352 272H384z" />
+    <glyph glyph-name="recycle"
+      unicode="&#xF1B8;"
+      horiz-adv-x="512" d=" M184.561 186.097C187.793 172.1 172.438 161.462 160.493 168.929L119.757 194.384L68.89 112.982C55.606 91.727 70.96 64 96.012 64H148C154.627 64 160 58.627 160 52V12C160 5.373 154.627 0 148 0H96.115C20.781 0 -25.187 83.048 14.707 146.88L65.529 228.268L24.804 253.716C12.723 261.2630000000001 15.838 279.677 29.683 282.874L139.92 308.324C148.531 310.312 157.121 304.943 159.109 296.334L184.561 186.097zM283.122 369.012L324.411 302.936L283.671 277.479C271.62 269.951 274.671 251.526 288.55 248.321L398.7870000000001 222.871C407.4590000000001 220.872 416.002 226.309 417.9760000000001 234.861L443.4260000000001 345.098C446.6230000000001 358.942 431.4360000000001 369.817 419.3580000000001 362.266L378.6710000000001 336.842L337.4080000000001 402.924C299.8870000000001 462.957 212.1990000000001 463.095 174.5920000000001 402.924L156.6290000000001 374.158C153.1190000000001 368.538 154.8290000000001 361.137 160.4490000000001 357.625L194.3680000000001 336.43C199.9880000000001 332.918 207.3920000000001 334.627 210.9040000000001 340.247L228.8650000000001 368.99C241.5770000000001 389.331 270.8380000000001 388.666 283.1220000000001 369.012zM497.288 146.88L469.773 190.945C466.262 196.568 458.857 198.279 453.235 194.766L419.374 173.607C413.754 170.095 412.0440000000001 162.692 415.5560000000001 157.071L443.1200000000001 112.959C456.3770000000001 91.7479999999999 441.0630000000001 63.999 415.9840000000001 63.999H320V111.98C320 126.1930000000001 302.758 133.363 292.687 123.293L212.687 43.312C206.438 37.064 206.438 26.933 212.687 20.685L292.687 -59.304C302.689 -69.308 320 -62.3 320 -47.989V0H415.88C491.154 0 537.215 82.997 497.288 146.88z" />
+    <glyph glyph-name="redo-alt"
+      unicode="&#xF2F9;"
+      horiz-adv-x="512" d=" M256.455 440C322.724 439.881 382.892 413.767 427.314 371.315L463.029 407.03C478.149 422.149 504 411.4410000000001 504 390.059V256C504 242.745 493.255 232 480 232H345.941C324.559 232 313.851 257.851 328.97 272.971L370.72 314.721C339.856 343.62 299.919 359.628 257.49 359.9940000000001C165.092 360.7920000000001 87.207 286.017 88.0059999999999 190.552C88.764 99.991 162.184 24 256 24C297.127 24 335.997 38.678 366.629 65.556C371.372 69.717 378.5350000000001 69.464 382.997 65.003L422.659 25.341C427.531 20.469 427.29 12.526 422.177 7.908C378.202 -31.813 319.926 -56 256 -56C119.034 -56 8.001 55.033 8 191.998C7.999 328.807 119.646 440.245 256.455 440z" />
+    <glyph glyph-name="redo"
+      unicode="&#xF01E;"
+      horiz-adv-x="512.333" d=" M500.333 448H452.922C446.069 448 440.608 442.271 440.9360000000001 435.426L444.9020000000001 352.6670000000001C399.416 406.101 331.6720000000001 440 256.001 440C119.34 440 7.899 328.474 8 191.813C8.101 54.932 119.096 -56 256 -56C319.926 -56 378.202 -31.813 422.178 7.908C427.291 12.526 427.532 20.469 422.6600000000001 25.341L388.689 59.312C384.223 63.778 377.0490000000001 64.029 372.3090000000001 59.855C341.308 32.552 300.606 16 256 16C158.733 16 80 94.716 80 192C80 289.267 158.716 368 256 368C316.892 368 370.506 337.142 402.099 290.2L300.574 295.065C293.729 295.3930000000001 288 289.932 288 283.079V235.668C288 229.041 293.373 223.668 300 223.668H500.333C506.96 223.668 512.333 229.041 512.333 235.668V436C512.333 442.627 506.96 448 500.333 448z" />
+    <glyph glyph-name="registered"
+      unicode="&#xF25D;"
+      horiz-adv-x="512" d=" M285.363 240.525C285.363 221.925 275.532 212.094 256.932 212.094H227.056V268.234H250.4340000000001C279.1020000000001 268.234 285.3630000000001 259.461 285.3630000000001 240.525zM504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM363.411 87.586C316.682 172.411 320.112 166.222 318.709 168.566C342.141 183.7380000000001 356.654 211.545 356.654 243.052C356.654 297.2960000000001 325.154 332.3040000000001 251.156 332.3040000000001H180.489C167.234 332.3040000000001 156.489 321.5590000000001 156.489 308.3040000000001V76C156.489 62.745 167.234 52 180.489 52H203.056C216.311 52 227.056 62.745 227.056 76V147.663H252.612L296.7410000000001 64.726A24.001000000000005 24.001000000000005 0 0 1 317.9290000000001 51.999H342.3930000000001C360.6540000000001 52 372.2220000000001 71.59 363.4110000000001 87.586z" />
+    <glyph glyph-name="reply-all"
+      unicode="&#xF122;"
+      horiz-adv-x="576" d=" M136.309 258.164L312.313 410.149C327.7200000000001 423.454 352 412.652 352 391.985V309.222C481.182 298.991 576 257.01 576 125.674C576 64.233 536.418 3.365 492.667 -28.458C479.014 -38.389 459.556 -25.925 464.59 -9.827C503.102 113.335 460.668 159.655 352 172.188V88.013C352 67.312 327.7 56.56 312.313 69.849L136.309 221.836C125.238 231.397 125.223 248.589 136.309 258.164zM8.309 221.836L184.313 69.85C199.7 56.561 224 67.313 224 88.014V103.832L115.394 197.617A55.96 55.96 0 0 0 96 240.002A55.95300000000001 55.95300000000001 0 0 0 115.393 282.382L224 376.168V391.985C224 412.652 199.72 423.454 184.313 410.149L8.309 258.164C-2.777 248.589 -2.762 231.397 8.309 221.836z" />
+    <glyph glyph-name="reply"
+      unicode="&#xF3E5;"
+      horiz-adv-x="512" d=" M8.309 258.164L184.313 410.149C199.719 423.454 224 412.653 224 391.985V311.932C384.629 310.093 512 277.9000000000001 512 125.674C512 64.233 472.419 3.365 428.6670000000001 -28.458C415.014 -38.389 395.5560000000001 -25.925 400.5900000000001 -9.827C445.9340000000001 135.185 379.0830000000001 173.683 224 175.915V88C224 67.3 199.7 56.547 184.3130000000001 69.836L8.3090000000001 221.836C-2.7619999999999 231.398 -2.7769999999999 248.589 8.3090000000001 258.164z" />
+    <glyph glyph-name="retweet"
+      unicode="&#xF079;"
+      horiz-adv-x="640" d=" M629.657 104.402L528.971 3.716C519.598 -5.656 504.403 -5.656 495.03 3.716L394.343 104.402C384.9700000000001 113.775 384.9700000000001 128.971 394.343 138.343L405.166 149.166C414.728 158.728 430.299 158.5059999999999 439.585 148.6739999999999L480 105.882V288H292.451A24.005 24.005 0 0 0 275.48 295.029L259.48 311.029C244.361 326.149 255.069 352 276.451 352H520C533.255 352 544 341.255 544 328V105.882L584.4159999999999 148.674C593.7009999999999 158.505 609.2719999999999 158.728 618.8349999999999 149.166L629.6579999999999 138.343C639.0299999999999 128.971 639.0299999999999 113.774 629.6569999999999 104.402zM364.5190000000001 88.971A23.999000000000002 23.999000000000002 0 0 1 347.548 96H160V278.1190000000001L200.416 235.327C209.702 225.496 225.272 225.273 234.835 234.836L245.657 245.658C255.03 255.031 255.03 270.227 245.657 279.599L144.971 380.284C135.598 389.657 120.402 389.657 111.03 380.284L10.343 279.598C0.97 270.225 0.97 255.029 10.343 245.657L21.165 234.835C30.727 225.273 46.298 225.495 55.584 235.326L96 278.1190000000001V56C96 42.745 106.745 32 120 32H363.549C384.931 32 395.639 57.851 380.52 72.971L364.519 88.971z" />
+    <glyph glyph-name="ribbon"
+      unicode="&#xF4D6;"
+      horiz-adv-x="448" d=" M6.1 3.7C-3.5 -7.1 -1.4 -23.9 10.6 -32L79.4 -59.9C89.3 -66.6 102.7 -64.9 110.7 -56.1L202.5 45.8000000000001L123.3 133.7000000000001L6.1 3.7zM441.9000000000001 3.7S149.9 328.3 146.5000000000001 333.8C161.9000000000001 342.2000000000001 186.7000000000001 351.7000000000001 224.0000000000001 351.7000000000001S286.1000000000001 342.2000000000001 301.5000000000001 333.8C298.2000000000001 328.2000000000001 245.5000000000001 269.2000000000001 245.5000000000001 269.2000000000001L324.6 181.5L358.8 219.5C387.5 251.4 392.1 298.1 370.2 335L326.5 408.5C322.2 415.7 316.6 421.8 309.7 426.5C269 454.1 182.3 456.2 138.3 426.5C131.4 421.8 125.8 415.7 121.5 408.5L77.9 335.3C76.4 332.8 40.8 273.1 89.4 219.3L337.5 -56C345.5 -64.9 358.9 -66.5 368.8 -59.8L437.6 -31.9C449.5 -23.9 451.6 -7.1 441.9000000000001 3.7z" />
+    <glyph glyph-name="road"
+      unicode="&#xF018;"
+      horiz-adv-x="576" d=" M567.3 64.4L429.9 369.8C426 378.5 417.4 384 408 384H311.9L313.8 365.2C314.5 358.1 309 352 301.9 352H274C266.9 352 261.3 358.2 262.1 365.2L264 384H168C158.6 384 150 378.5 146.1 369.8L8.7 64.4C3.2 52.2 0 38.4 0 24C0 10.7 10.7 0 24 0H237.6C230.5 0 224.9 6.2 225.7 13.2L236.5 117.2C237.1 123.3 242.3 128 248.4 128H327.6C333.7000000000001 128 338.9000000000001 123.4 339.5 117.2L350.3 13.2C351 6.1 345.5 0 338.4000000000001 0H552C565.2 0 576 10.7 576 24C576 37.9 573 51.7 567.3 64.4zM254.7 293.2L258 325.2C258.6 331.3 263.8 336 269.9 336H306.1C312.2 336 317.4 331.4 318 325.2L321.3 293.2C322 286.1 316.5 280 309.4 280H266.6C259.5 280 253.9 286.2 254.7 293.2zM321.8 160H254.2C247.1 160 241.5000000000001 166.2 242.3 173.2L249.7 245.2C250.3 251.3 255.5000000000001 256 261.6 256H314.3C320.4000000000001 256 325.6 251.4 326.2 245.2L333.6 173.2C334.5 166.2 328.9 160 321.8 160z" />
+    <glyph glyph-name="rocket"
+      unicode="&#xF135;"
+      horiz-adv-x="512" d=" M505.1 428.9C503.8 435 499 439.8 492.9 441.1C460.7 448 435.5 448 410.4 448C307.2 448 245.3 392.8 199.1 320H94.9C76.7 320 60.1 309.7 52 293.5L2.6 194.7C-5.4 178.7 6.2 160 24.1 160H119.2C113.3 147.2 107.3 134.5 101.2 122.3C98.1 116.1 99.3 108.7 104.2 103.8L167.8 40.2C172.7 35.3 180.1 34.1 186.3 37.2C198.5 43.3 211.2 49.2 224 55.1V-40C224 -57.8 242.8 -69.4 258.7 -61.5L357.4 -12.1C373.7 -4 383.9 12.7 383.9 30.8V135.2C456.5 181.5 511.9 243.6 511.9 346.3C512 371.5 512 396.7 505.1 428.9zM400 288C373.5 288 352 309.5 352 336S373.5 384 400 384S448 362.5 448 336S426.5 288 400 288z" />
+    <glyph glyph-name="rss-square"
+      unicode="&#xF143;"
+      horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM112 32C85.49 32 64 53.49 64 80S85.49 128 112 128S160 106.51 160 80S138.51 32 112 32zM269.533 32H235.198C229.187 32 224.147 36.636 223.756 42.634C218.542 122.684 154.513 186.554 74.633 191.757C68.636 192.147 64 197.188 64 203.198V237.533C64 244.068 69.468 249.31 75.994 248.9580000000001C186.54 242.9840000000001 274.9910000000001 154.422 280.9580000000001 43.994C281.31 37.468 276.0680000000001 32 269.533 32zM372.56 32H338.226C332.065 32 327.051 36.882 326.799 43.038C321.201 179.573 211.595 289.199 75.039 294.798C68.882 295.051 64 300.065 64 306.226V340.56C64 347.014 69.338 352.224 75.787 351.992C243.617 345.967 377.997 210.801 383.992 43.787C384.224 37.338 379.014 32.0000000000001 372.56 32.0000000000001z" />
+    <glyph glyph-name="rss"
+      unicode="&#xF09E;"
+      horiz-adv-x="448" d=" M128.081 32.041C128.081 -3.328 99.409 -32 64.04 -32S0 -3.328 0 32.041S28.672 96.082 64.041 96.082S128.081 67.409 128.081 32.041zM303.741 -15.209C295.387 139.391 171.556 263.378 16.791 271.741C7.656 272.235 0 264.895 0 255.747V207.678C0 199.263 6.49 192.206 14.887 191.66C126.719 184.376 216.36 94.958 223.659 -17.112C224.206 -25.509 231.263 -31.999 239.677 -31.999H287.746C296.895 -32 304.235 -24.344 303.741 -15.209zM447.99 -15.497C439.596 218.323 251.465 407.555 16.503 415.99C7.473 416.314 0 409.019 0 399.984V351.916C0 343.291 6.835 336.271 15.453 335.9170000000001C206.632 328.078 360.08 174.601 367.918 -16.548C368.271 -25.166 375.291 -32.001 383.917 -32.001H431.985C441.019 -32 448.314 -24.527 447.99 -15.497z" />
+    <glyph glyph-name="ruble-sign"
+      unicode="&#xF158;"
+      horiz-adv-x="384" d=" M239.36 128C324.48 128 384 187.458 384 272.929S324.48 416 239.36 416H76C69.373 416 64 410.627 64 404V197.368H12C5.373 197.368 0 191.995 0 185.368V140C0 133.373 5.373 128 12 128H64V96H12C5.373 96 0 90.627 0 84V44C0 37.373 5.373 32 12 32H64V-20C64 -26.627 69.373 -32 76 -32H134.56C141.187 -32 146.56 -26.627 146.56 -20V32H308C314.627 32 320 37.373 320 44V84C320 90.627 314.627 96 308 96H146.56V128H239.36zM146.56 347.252H225.28C272 347.252 300.16 318.142 300.16 272.9290000000001C300.16 227.0970000000001 272 197.368 224 197.368H146.56V347.252z" />
+    <glyph glyph-name="rupee-sign"
+      unicode="&#xF156;"
+      horiz-adv-x="320" d=" M308 352C314.627 352 320 357.373 320 364V404C320 410.627 314.627 416 308 416H12C5.373 416 0 410.627 0 404V359.252C0 352.625 5.373 347.252 12 347.252H97.28C124.588 347.252 145.541 337.294 158.25 320H12C5.373 320 0 314.627 0 308V268C0 261.373 5.373 256 12 256H170.757C164.54 219.914 137.796 197.368 96 197.368H12C5.373 197.368 0 191.995 0 185.368V132.356C0 129.007 1.4 125.81 3.861 123.538L168.913 -28.818A12.001000000000001 12.001000000000001 0 0 1 177.052 -32H259.614C270.538 -32 275.78 -18.592 267.753 -11.182L116.871 128.094C193.37 130.434 248.015 181.489 255.189 256H308C314.627 256 320 261.373 320 268V308C320 314.627 314.627 320 308 320H249.31C245.824 331.541 241.03 342.246 235.058 352H308z" />
+    <glyph glyph-name="save"
+      unicode="&#xF0C7;"
+      horiz-adv-x="448" d=" M433.941 318.059L350.059 401.9410000000001A48 48 0 0 1 316.118 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V284.118A48 48 0 0 1 433.941 318.059zM224 32C188.654 32 160 60.654 160 96C160 131.346 188.654 160 224 160S288 131.346 288 96C288 60.654 259.346 32 224 32zM320 336.52V236C320 229.373 314.627 224 308 224H76C69.373 224 64 229.373 64 236V340C64 346.627 69.373 352 76 352H304.52C307.703 352 310.755 350.736 313.005 348.485L316.485 345.005A11.996 11.996 0 0 0 320 336.52z" />
+    <glyph glyph-name="search-minus"
+      unicode="&#xF010;"
+      horiz-adv-x="512" d=" M304 256V224C304 217.4 298.6 212 292 212H124C117.4 212 112 217.4 112 224V256C112 262.6 117.4 268 124 268H292C298.6 268 304 262.6 304 256zM505 -28.7L476.7 -57C467.3 -66.4 452.1 -66.4 442.8 -57L343 42.7C338.5 47.2 336 53.3 336 59.7V76C300.7 48.4 256.3 32 208 32C93.1 32 0 125.1 0 240S93.1 448 208 448S416 354.9 416 240C416 191.7 399.6 147.3 372 112H388.3C394.7 112 400.8 109.5 405.3 105L505 5.3C514.3 -4.1 514.3 -19.3 505 -28.7zM344 240C344 315.2 283.2 376 208 376S72 315.2 72 240S132.8 104 208 104S344 164.8 344 240z" />
+    <glyph glyph-name="search-plus"
+      unicode="&#xF00E;"
+      horiz-adv-x="512" d=" M304 256V224C304 217.4 298.6 212 292 212H236V156C236 149.4 230.6 144 224 144H192C185.4 144 180 149.4 180 156V212H124C117.4 212 112 217.4 112 224V256C112 262.6 117.4 268 124 268H180V324C180 330.6 185.4 336 192 336H224C230.6 336 236 330.6 236 324V268H292C298.6 268 304 262.6 304 256zM505 -28.7L476.7 -57C467.3 -66.4 452.1 -66.4 442.8 -57L343 42.7C338.5 47.2 336 53.3 336 59.7V76C300.7 48.4 256.3 32 208 32C93.1 32 0 125.1 0 240S93.1 448 208 448S416 354.9 416 240C416 191.7 399.6 147.3 372 112H388.3C394.7 112 400.8 109.5 405.3 105L505 5.3C514.3 -4.1 514.3 -19.3 505 -28.7zM344 240C344 315.2 283.2 376 208 376S72 315.2 72 240S132.8 104 208 104S344 164.8 344 240z" />
+    <glyph glyph-name="search"
+      unicode="&#xF002;"
+      horiz-adv-x="512" d=" M505 5.3L405.3 105C400.8 109.5 394.7 112 388.3 112H372C399.6 147.3 416 191.7 416 240C416 354.9 322.9 448 208 448S0 354.9 0 240S93.1 32 208 32C256.3 32 300.7 48.4 336 76V59.7C336 53.3 338.5 47.2 343 42.7L442.7 -57C452.1 -66.4 467.3 -66.4 476.6 -57L504.9 -28.7C514.3 -19.3 514.3 -4.1 505 5.3zM208 112C137.3 112 80 169.2 80 240C80 310.7 137.2 368 208 368C278.7 368 336 310.8 336 240C336 169.3 278.8 112 208 112z" />
+    <glyph glyph-name="seedling"
+      unicode="&#xF4D8;"
+      horiz-adv-x="512" d=" M64 352H0C0 228.3 100.3 128 224 128V-16C224 -24.8 231.2 -32 240 -32H272C280.8 -32 288 -24.8 288 -16V128C288 251.7 187.7 352 64 352zM448 416C363.8 416 290.6 369.5 252.3 300.8C280 270.6 300.5 233.9 311.3 193.2C424 204.9 512 300.1 512 416H448z" />
+    <glyph glyph-name="server"
+      unicode="&#xF233;"
+      horiz-adv-x="512" d=" M480 288H32C14.327 288 0 302.327 0 320V384C0 401.673 14.327 416 32 416H480C497.673 416 512 401.673 512 384V320C512 302.327 497.673 288 480 288zM432 376C418.745 376 408 365.255 408 352S418.745 328 432 328S456 338.745 456 352S445.255 376 432 376zM368 376C354.745 376 344 365.255 344 352S354.745 328 368 328S392 338.745 392 352S381.255 376 368 376zM480 128H32C14.327 128 0 142.327 0 160V224C0 241.673 14.327 256 32 256H480C497.673 256 512 241.673 512 224V160C512 142.327 497.673 128 480 128zM432 216C418.745 216 408 205.255 408 192S418.745 168 432 168S456 178.745 456 192S445.255 216 432 216zM368 216C354.745 216 344 205.255 344 192S354.745 168 368 168S392 178.745 392 192S381.255 216 368 216zM480 -32H32C14.327 -32 0 -17.673 0 0V64C0 81.673 14.327 96 32 96H480C497.673 96 512 81.673 512 64V0C512 -17.673 497.673 -32 480 -32zM432 56C418.745 56 408 45.255 408 32S418.745 8 432 8S456 18.745 456 32S445.255 56 432 56zM368 56C354.745 56 344 45.255 344 32S354.745 8 368 8S392 18.745 392 32S381.255 56 368 56z" />
+    <glyph glyph-name="share-alt-square"
+      unicode="&#xF1E1;"
+      horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM304 152C289.438 152 276.177 146.439 266.217 137.329L198.259 178.104A56.33899999999999 56.33899999999999 0 0 1 198.259 205.897L266.217 246.672C276.177 237.561 289.438 232 304 232C334.928 232 360 257.072 360 288S334.928 344 304 344S248 318.928 248 288C248 283.203 248.605 278.5470000000001 249.74 274.103L181.782 233.328C171.823 242.439 158.562 248 144 248C113.072 248 88 222.928 88 192S113.072 136 144 136C158.562 136 171.823 141.561 181.783 150.671L249.741 109.896A56.08800000000001 56.08800000000001 0 0 1 248.001 95.999C248.001 65.071 273.073 39.999 304.001 39.999S360.001 65.071 360.001 95.999C360 126.928 334.928 152 304 152z" />
+    <glyph glyph-name="share-alt"
+      unicode="&#xF1E0;"
+      horiz-adv-x="448" d=" M352 128C329.392 128 308.613 120.181 292.21 107.105L189.724 171.159A96.551 96.551 0 0 1 189.724 212.842L292.21 276.896C308.613 263.819 329.392 256 352 256C405.019 256 448 298.981 448 352S405.019 448 352 448S256 405.019 256 352C256 344.842 256.79 337.87 258.276 331.159L155.79 267.105C139.387 280.1810000000001 118.608 288 96 288C42.981 288 0 245.019 0 192S42.981 96 96 96C118.608 96 139.387 103.819 155.79 116.895L258.276 52.841A96.301 96.301 0 0 1 256 32C256 -21.019 298.981 -64 352 -64S448 -21.019 448 32S405.019 128 352 128z" />
+    <glyph glyph-name="share-square"
+      unicode="&#xF14D;"
+      horiz-adv-x="576" d=" M568.482 270.552L424.479 134.567C409.3 120.232 384 130.86 384 152.015V223.978C239.425 223.008 178.434 188.865 219.225 52.625C223.708 37.652 206.379 26.058 194.219 35.295C155.252 64.895 120 121.512 120 178.661C120 322.598 237.599 351.161 384 351.973V423.988C384 445.162 409.317 455.756 424.479 441.436L568.482 305.448C578.502 295.985 578.51 280.023 568.482 270.552zM384 68.872V0H64V320H114.916A11.989999999999998 11.989999999999998 0 0 1 123.564 323.693C138.517 339.261 155.801 351.583 174.578 361.3690000000001C185.708 367.17 181.584 384 169.033 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V72.806C448 81.094 439.803 86.872 431.989 84.108A71.83 71.83 0 0 0 397.8 80.731C390.53 81.777 384 76.217 384 68.872z" />
+    <glyph glyph-name="share"
+      unicode="&#xF064;"
+      horiz-adv-x="512" d=" M503.691 258.164L327.687 410.149C312.281 423.454 288 412.653 288 391.985V311.932C127.371 310.093 0 277.9 0 125.674C0 64.233 39.581 3.365 83.333 -28.458C96.986 -38.389 116.444 -25.925 111.41 -9.827C66.066 135.186 132.917 173.684 288 175.915V88C288 67.3 312.3 56.547 327.687 69.836L503.691 221.836C514.7620000000001 231.398 514.777 248.589 503.691 258.164z" />
+    <glyph glyph-name="shekel-sign"
+      unicode="&#xF20B;"
+      horiz-adv-x="448" d=" M170.12 352H80V-20C80 -26.627 74.627 -32 68 -32H12C5.373 -32 0 -26.627 0 -20V404C0 410.627 5.373 416 12 416H180.36C265.48 416 325 358.4 325 272.929V89C325 82.373 319.627 77 313 77H269C255.745 77 245 87.745 245 101V277.677C245 322.89 216.839 352 170.12 352zM436 416H380C373.373 416 368 410.627 368 404V32H277.88C231.16 32 203 61.11 203 106.323V283C203 296.255 192.255 307 179 307H135C128.373 307 123 301.627 123 295V111.071C123 25.6 182.52 -32 267.64 -32H436C442.627 -32 448 -26.627 448 -20V404C448 410.627 442.627 416 436 416z" />
+    <glyph glyph-name="shield-alt"
+      unicode="&#xF3ED;"
+      horiz-adv-x="512" d=" M496 320C496 98.718 360.0660000000001 -24.645 274.461 -60.308A48 48 0 0 0 237.538 -60.308C130.495 -15.713 16 121.513 16 320A48 48 0 0 0 45.539 364.308L237.539 444.308A48 48 0 0 0 274.462 444.308L466.462 364.308A48 48 0 0 0 496 320zM256 1.687L256.066 1.653C349.801 48.342 428.563 157.961 431.883 309.382L256 382.6670000000001V1.687z" />
+    <glyph glyph-name="ship"
+      unicode="&#xF21A;"
+      horiz-adv-x="640" d=" M496.616 75.361L566.6279999999999 145.373C583.5269999999999 162.273 576.5699999999999 191.144 553.7919999999999 198.465L512 211.898V352C512 369.673 497.673 384 480 384H416V424C416 437.255 405.255 448 392 448H248C234.745 448 224 437.255 224 424V384H160C142.327 384 128 369.673 128 352V211.898L86.208 198.465C63.455 191.152 56.454 162.292 73.372 145.373L143.384 75.361C125.828 31.713 85.587 0 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64C85.023 -64 131.499 -43.39 167.258 -4.604C181.677 -39.432 216.021 -64 256 -64H384C423.979 -64 458.323 -39.432 472.742 -4.604C508.495 -43.384 554.968 -64 616 -64C629.255 -64 640 -53.255 640 -40V-24C640 -10.745 629.255 0 616 0C555.183 0 514.458 31.001 496.616 75.361zM192 320H448V232.469L329.7920000000001 270.464A31.995 31.995 0 0 1 310.2080000000001 270.464L192 232.469V320z" />
+    <glyph glyph-name="shipping-fast"
+      unicode="&#xF48B;"
+      horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H112C85.5 448 64 426.5 64 400V352H8C3.6 352 0 348.4 0 344V328C0 323.6 3.6 320 8 320H280C284.4 320 288 316.4 288 312V296C288 291.6 284.4 288 280 288H40C35.6 288 32 284.4 32 280V264C32 259.6 35.6 256 40 256H248C252.4 256 256 252.4 256 248V232C256 227.6 252.4 224 248 224H8C3.6 224 0 220.4 0 216V200C0 195.6 3.6 192 8 192H216C220.4 192 224 188.4 224 184V168C224 163.6 220.4 160 216 160H64V32C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" />
+    <glyph glyph-name="shopping-bag"
+      unicode="&#xF290;"
+      horiz-adv-x="448" d=" M352 288V320C352 390.58 294.579 448 224 448C153.42 448 96 390.58 96 320V288H0V16C0 -28.183 35.817 -64 80 -64H368C412.183 -64 448 -28.183 448 16V288H352zM160 320C160 355.29 188.71 384 224 384S288 355.29 288 320V288H160V320zM320 200C306.745 200 296 210.745 296 224S306.745 248 320 248S344 237.255 344 224S333.255 200 320 200zM128 200C114.745 200 104 210.745 104 224S114.745 248 128 248S152 237.255 152 224S141.255 200 128 200z" />
+    <glyph glyph-name="shopping-basket"
+      unicode="&#xF291;"
+      horiz-adv-x="576" d=" M576 232V216C576 202.745 565.255 192 552 192H544L517.887 9.212C514.509 -14.435 494.257 -32 470.37 -32H105.63C81.743 -32 61.491 -14.435 58.112 9.212L32 192H24C10.745 192 0 202.745 0 216V232C0 245.255 10.745 256 24 256H91.341L198.121 402.8210000000001C208.516 417.113 228.528 420.274 242.822 409.879C257.115 399.484 260.275 379.471 249.88 365.178L170.477 256H405.523L326.12 365.179C315.725 379.471 318.886 399.485 333.1790000000001 409.88C347.4700000000001 420.275 367.485 417.115 377.8800000000001 402.822L484.659 256H552C565.255 256 576 245.255 576 232zM312 56V168C312 181.255 301.255 192 288 192S264 181.255 264 168V56C264 42.745 274.745 32 288 32S312 42.745 312 56zM424 56V168C424 181.255 413.255 192 400 192S376 181.255 376 168V56C376 42.745 386.745 32 400 32S424 42.745 424 56zM200 56V168C200 181.255 189.255 192 176 192S152 181.255 152 168V56C152 42.745 162.745 32 176 32S200 42.745 200 56z" />
+    <glyph glyph-name="shopping-cart"
+      unicode="&#xF07A;"
+      horiz-adv-x="576" d=" M528.12 146.681L575.393 354.681C578.806 369.699 567.391 384 551.99 384H159.208L150.042 428.81C147.758 439.979 137.93 448 126.529 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384H93.883L164.131 40.565C147.325 30.9 136 12.778 136 -8C136 -38.928 161.072 -64 192 -64S248 -38.928 248 -8C248 7.674 241.553 21.835 231.176 32H440.823C430.447 21.835 424 7.674 424 -8C424 -38.928 449.072 -64 480 -64S536 -38.928 536 -8C536 14.172 523.112 33.332 504.421 42.405L509.938 66.681C513.351 81.699 501.936 96 486.535 96H218.117L211.572 128H504.717C515.923 128 525.637 135.754 528.12 146.681z" />
+    <glyph glyph-name="shower"
+      unicode="&#xF2CC;"
+      horiz-adv-x="512" d=" M389.6600000000001 312.4L231.6 154.34C222.23 144.97 207.03 144.97 197.66 154.34L186.34 165.66C176.97 175.03 176.97 190.23 186.34 199.6L186.45 199.71C152.42 239.92 151.29 298.65 183.06 340.09C171.09 347.64 156.92 352 141.7600000000001 352C98.88 352 64 317.12 64 274.24V-32H0V274.24C0 352.41 63.59 416 141.76 416C178.69 416 212.37 401.8 237.62 378.58C273.52 390.09 314.12 383.08 344.29 357.55L344.4000000000001 357.66C353.7700000000001 367.03 368.9700000000001 367.03 378.3400000000001 357.66L389.6600000000001 346.3400000000001C399.0300000000001 336.9700000000001 399.0300000000001 321.77 389.6600000000001 312.4zM384 240C384 231.163 376.837 224 368 224S352 231.163 352 240S359.163 256 368 256S384 248.837 384 240zM416 240C416 248.837 423.163 256 432 256S448 248.837 448 240S440.837 224 432 224S416 231.163 416 240zM512 240C512 231.163 504.837 224 496 224S480 231.163 480 240S487.163 256 496 256S512 248.837 512 240zM352 208C352 199.163 344.837 192 336 192S320 199.163 320 208S327.163 224 336 224S352 216.837 352 208zM400 224C408.837 224 416 216.837 416 208S408.837 192 400 192S384 199.163 384 208S391.163 224 400 224zM480 208C480 199.163 472.837 192 464 192S448 199.163 448 208S455.163 224 464 224S480 216.837 480 208zM320 176C320 167.163 312.837 160 304 160S288 167.163 288 176S295.163 192 304 192S320 184.837 320 176zM352 176C352 184.837 359.163 192 368 192S384 184.837 384 176S376.837 160 368 160S352 167.163 352 176zM448 176C448 167.163 440.837 160 432 160S416 167.163 416 176S423.163 192 432 192S448 184.837 448 176zM320 144C320 152.837 327.163 160 336 160S352 152.837 352 144S344.837 128 336 128S320 135.163 320 144zM416 144C416 135.163 408.837 128 400 128S384 135.163 384 144S391.163 160 400 160S416 152.837 416 144zM320 112C320 103.163 312.837 96 304 96S288 103.163 288 112S295.163 128 304 128S320 120.837 320 112zM384 112C384 103.163 376.837 96 368 96S352 103.163 352 112S359.163 128 368 128S384 120.837 384 112zM352 80C352 71.163 344.837 64 336 64S320 71.163 320 80S327.163 96 336 96S352 88.837 352 80zM320 48C320 39.163 312.837 32 304 32S288 39.163 288 48S295.163 64 304 64S320 56.837 320 48z" />
+    <glyph glyph-name="sign-in-alt"
+      unicode="&#xF2F6;"
+      horiz-adv-x="512" d=" M416 0H332C325.4 0 320 5.4 320 12V52C320 58.6 325.4 64 332 64H416C433.7 64 448 78.3 448 96V288C448 305.7 433.7 320 416 320H332C325.4 320 320 325.4 320 332V372C320 378.6 325.4 384 332 384H416C469 384 512 341 512 288V96C512 43 469 0 416 0zM369 201L201 369C186 384 160 373.5 160 352V256H24C10.7 256 0 245.3 0 232V136C0 122.7 10.7 112 24 112H160V16C160 -5.5 186 -16 201 -1L369 167C378.3 176.4 378.3 191.6 369 201z" />
+    <glyph glyph-name="sign-language"
+      unicode="&#xF2A7;"
+      horiz-adv-x="448" d=" M91.434 -35.987C91.127 -19.969 104.543 -6.858 120.564 -6.858H182.857V-1.144H56.993C40.972 -1.144 27.556 11.967 27.863 27.985C28.16 43.509 40.835 56 56.428 56H182.857V61.714H29.136C13.115 61.714 -0.301 74.825 0.006 90.843C0.303 106.365 12.979 118.856 28.572 118.856H182.858V124.57H57.707C41.686 124.57 28.27 137.681 28.577 153.699C28.874 169.221 41.55 181.712 57.143 181.712H225.709L194.624 204.318C181.862 213.599 179.041 231.467 188.322 244.23C197.603 256.991 215.472 259.812 228.234 250.532L351.5950000000001 160.817A34.287 34.287 0 0 0 365.7150000000001 133.089V-8.047C365.7150000000001 -23.957 354.769 -37.777 339.2820000000001 -41.421L258.8110000000001 -60.3550000000001A137.16 137.16 0 0 0 227.4000000000001 -64.0010000000001H120C104.407 -64.0000000000001 91.731 -51.5090000000001 91.434 -35.9870000000001zM164.683 189.714H201.106L189.919 197.8499999999999C171.34 211.3609999999999 169.606 238.737 186.749 254.386L173.745 271.0859999999999C163.902 283.7269999999999 145.315 286.257 132.865 276.1739999999999C120.8 266.4029999999999 118.732 248.7269999999999 128.312 236.4239999999999L164.683 189.714zM447.981 191.817L442.978 344.269C442.4600000000001 360.04 429.2560000000001 372.405 413.485 371.8879999999999C397.712 371.37 385.348 358.166 385.866 342.395L387.128 303.98L283.565 436.981C273.985 449.284 256.342 451.611 243.912 442.3090000000001C231.085 432.71 228.983 414.069 238.826 401.428L315.715 302.683L311.206 299.1720000000001L216.416 420.906C206.8359999999999 433.209 189.1929999999999 435.536 176.763 426.234C163.936 416.635 161.834 397.994 171.6769999999999 385.353L266.12 264.065L261.611 260.554L183.9359999999999 360.308C174.3559999999999 372.611 156.7129999999999 374.938 144.2829999999999 365.636C131.4559999999999 356.0370000000001 129.3539999999999 337.396 139.1969999999999 324.755L191.2499999999999 257.906C203.7469999999999 266.163 220.3049999999999 266.1910000000001 232.9399999999999 257.002L356.2999999999999 167.288C367.2039999999999 159.358 373.7149999999999 146.573 373.7149999999999 133.09V116.091L434.779 163.64A34.285 34.285 0 0 1 447.981 191.817z" />
+    <glyph glyph-name="sign-out-alt"
+      unicode="&#xF2F5;"
+      horiz-adv-x="512" d=" M497 175L329 7C314 -8 288 2.5 288 24V120H152C138.7 120 128 130.7 128 144V240C128 253.3 138.7 264 152 264H288V360C288 381.4 313.9 392 329 377L497 209C506.3 199.6 506.3 184.4 497 175zM192 12V52C192 58.6 186.6 64 180 64H96C78.3 64 64 78.3 64 96V288C64 305.7 78.3 320 96 320H180C186.6 320 192 325.4 192 332V372C192 378.6 186.6 384 180 384H96C43 384 0 341 0 288V96C0 43 43 0 96 0H180C186.6 0 192 5.4 192 12z" />
+    <glyph glyph-name="sign"
+      unicode="&#xF4D9;"
+      horiz-adv-x="512" d=" M496 384H128V432C128 440.8 120.8 448 112 448H80C71.2 448 64 440.8 64 432V384H16C7.2 384 0 376.8 0 368V336C0 327.2 7.2 320 16 320H64V-48C64 -56.8 71.2 -64 80 -64H112C120.8 -64 128 -56.8 128 -48V320H496C504.8 320 512 327.2 512 336V368C512 376.8 504.8 384 496 384zM160 64H480V288H160V64z" />
+    <glyph glyph-name="signal"
+      unicode="&#xF012;"
+      horiz-adv-x="640" d=" M36 64H92C98.6 64 104 58.6 104 52V-52C104 -58.6 98.6 -64 92 -64H36C29.4 -64 24 -58.6 24 -52V52C24 58.6 29.4 64 36 64zM152 100V-52C152 -58.6 157.4 -64 164 -64H220C226.6 -64 232 -58.6 232 -52V100C232 106.6 226.6 112 220 112H164C157.4 112 152 106.6 152 100zM280 180V-52C280 -58.6 285.4 -64 292 -64H348C354.6 -64 360 -58.6 360 -52V180C360 186.6 354.6 192 348 192H292C285.4 192 280 186.6 280 180zM408 292V-52C408 -58.6 413.4 -64 420 -64H476C482.6 -64 488 -58.6 488 -52V292C488 298.6 482.6 304 476 304H420C413.4 304 408 298.6 408 292zM536 436V-52C536 -58.6 541.4 -64 548 -64H604C610.6 -64 616 -58.6 616 -52V436C616 442.6 610.6 448 604 448H548C541.4 448 536 442.6 536 436z" />
+    <glyph glyph-name="sitemap"
+      unicode="&#xF0E8;"
+      horiz-adv-x="640" d=" M616 128H568V176C568 198.056 550.056 216 528 216H344V256H392C405.255 256 416 266.745 416 280V424C416 437.255 405.255 448 392 448H248C234.745 448 224 437.255 224 424V280C224 266.745 234.745 256 248 256H296V216H112C89.944 216 72 198.056 72 176V128H24C10.745 128 0 117.255 0 104V-40C0 -53.255 10.745 -64 24 -64H168C181.255 -64 192 -53.255 192 -40V104C192 117.255 181.255 128 168 128H120V168H296V128H248C234.745 128 224 117.255 224 104V-40C224 -53.255 234.745 -64 248 -64H392C405.255 -64 416 -53.255 416 -40V104C416 117.255 405.255 128 392 128H344V168H520V128H472C458.745 128 448 117.255 448 104V-40C448 -53.255 458.745 -64 472 -64H616C629.255 -64 640 -53.255 640 -40V104C640 117.255 629.255 128 616 128z" />
+    <glyph glyph-name="sliders-h"
+      unicode="&#xF1DE;"
+      horiz-adv-x="576" d=" M576 368V328C576 321.4 570.6 316 564 316H160V308C160 294.7 149.3 284 136 284H120C106.7 284 96 294.7 96 308V316H12C5.4 316 0 321.4 0 328V368C0 374.6 5.4 380 12 380H96V388C96 401.3 106.7 412 120 412H136C149.3 412 160 401.3 160 388V380H564C570.6 380 576 374.6 576 368zM564 220H480V228C480 241.3 469.3 252 456 252H440C426.7 252 416 241.3 416 228V220H12C5.4 220 0 214.6 0 208V168C0 161.4 5.4 156 12 156H416V148C416 134.7 426.7 124 440 124H456C469.3 124 480 134.7 480 148V156H564C570.6 156 576 161.4 576 168V208C576 214.6 570.6 220 564 220zM564 60H288V68C288 81.3 277.3 92 264 92H248C234.7 92 224 81.3 224 68V60H12C5.4 60 0 54.6 0 48V8C0 1.4 5.4 -4 12 -4H224V-12C224 -25.3 234.7 -36 248 -36H264C277.3 -36 288 -25.3 288 -12V-4H564C570.6 -4 576 1.4 576 8V48C576 54.6 570.6 60 564 60z" />
+    <glyph glyph-name="smile"
+      unicode="&#xF118;"
+      horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM328 272C345.7 272 360 257.7 360 240S345.7 208 328 208S296 222.3 296 240S310.3 272 328 272zM168 272C185.7 272 200 257.7 200 240S185.7 208 168 208S136 222.3 136 240S150.3 272 168 272zM362.8 101.8C334.3 67.6 292.5 48 248 48S161.7 67.6 133.2 101.8C127.5 108.6 128.5 118.7 135.2 124.3C142 130 152.1 129 157.7 122.3C180.1 95.4 212.9 80.1 247.9 80.1S315.7 95.5 338.1 122.3C343.8 129.1 353.8 130 360.6 124.3C367.5 118.6 368.4 108.5 362.8 101.8z" />
+    <glyph glyph-name="smoking"
+      unicode="&#xF48D;"
+      horiz-adv-x="640" d=" M632 96H584C579.6 96 576 92.4 576 88V-56C576 -60.4 579.6 -64 584 -64H632C636.4 -64 640 -60.4 640 -56V88C640 92.4 636.4 96 632 96zM553.3 360.9C547.5999999999999 364.7 544 370.9 544 377.7V440C544 444.4 540.4 448 536 448H488C483.6 448 480 444.4 480 440V377.7C480 355.7 490.2 334.3 508.6 322.3C550.8000000000001 295 576 248.5 576 198.3V168C576 163.6 579.6 160 584 160H632C636.4 160 640 163.6 640 168V198.3C640 263.8 607.6 324.5 553.3 360.9zM432 96H48C21.5 96 0 74.5 0 48V-16C0 -42.5 21.5 -64 48 -64H432C440.8 -64 448 -56.8 448 -48V80C448 88.8 440.8 96 432 96zM400 -16H224V48H400V-16zM487.7 306.4C463.8 323 448 348.7 448 377.7V440C448 444.4 444.4 448 440 448H392C387.6 448 384 444.4 384 440V373.6C384 329.9 408.6 292 444.3 266.9C466.7 251.2 480 225.7 480 198.3V168C480 163.6 483.6 160 488 160H536C540.4 160 544 163.6 544 168V198.3C544 241.6 523 281.7000000000001 487.7 306.4zM536 96H488C483.6 96 480 92.4 480 88V-56C480 -60.4 483.6 -64 488 -64H536C540.4 -64 544 -60.4 544 -56V88C544 92.4 540.4 96 536 96z" />
+    <glyph glyph-name="snowflake"
+      unicode="&#xF2DC;"
+      horiz-adv-x="448" d=" M444.816 146.361A24.12 24.12 0 0 1 447.477 163.339C444.752 176.305 432.138 184.584 419.303 181.831L331.896 156.785L264 192L331.896 227.215L419.303 202.169C432.138 199.416 444.752 207.695 447.477 220.661C450.202 233.627 442.006 246.369 429.172 249.122L381.695 256.259L434.772 287.2150000000001C446.135 293.842 450.029 308.521 443.468 320C436.9070000000001 331.479 422.377 335.4120000000001 411.014 328.785L357.937 297.829L375.558 342.933C379.615 355.539 372.79 369.079 360.311 373.178C347.833 377.2770000000001 334.428 370.3810000000001 330.371 357.776L308.139 268.786L247.759 233.571V304L312.9340000000001 367.945C321.7120000000001 377.7970000000001 320.9210000000001 392.972 311.168 401.839C301.415 410.706 286.3930000000001 409.907 277.616 400.055L247.759 362.088V424C247.759 437.255 237.122 448 224.001 448S200.243 437.255 200.243 424V362.088L170.386 400.055C161.607 409.907 146.587 410.707 136.834 401.839C127.081 392.972 126.291 377.7970000000001 135.068 367.945L200.242 304V233.569L139.862 268.784L117.63 357.774C113.573 370.379 100.168 377.2750000000001 87.69 373.1760000000001C75.212 369.077 68.386 355.536 72.443 342.9310000000001L90.063 297.827L36.986 328.783C25.623 335.41 11.093 331.477 4.532 319.998S1.865 293.841 13.228 287.213L66.305 256.257L18.828 249.12C5.993 246.366 -2.203 233.625 0.523 220.659C3.248 207.694 15.862 199.414 28.697 202.167L116.104 227.213L184 192L116.104 156.785L28.698 181.83C15.863 184.583 3.249 176.304 0.524 163.338C-2.201 150.371 5.994 137.63 18.829 134.877L66.306 127.74L13.229 96.7839999999999C1.866 90.157 -2.027 75.479 4.533 64S25.624 48.588 36.987 55.215L90.064 86.171L72.444 41.067A24.157 24.157 0 0 1 74.466 21.639C77.297 16.686 81.882 12.73 87.69 10.823C100.168 6.724 113.573 13.6200000000001 117.63 26.225L139.862 115.215L200.242 150.4300000000001V80L135.067 16.055C126.289 6.203 127.08 -8.972 136.833 -17.839C146.587 -26.707 161.607 -25.907 170.385 -16.055L200.242 21.912V-40C200.242 -53.255 210.879 -64 224 -64S247.758 -53.255 247.758 -40V21.912L277.615 -16.055A23.59 23.59 0 0 1 295.282 -24A23.534 23.534 0 0 1 311.167 -17.839C320.92 -8.972 321.711 6.203 312.933 16.055L247.758 80V150.431L308.1380000000001 115.216L330.37 26.226C334.427 13.621 347.832 6.725 360.31 10.824C372.789 14.923 379.614 28.464 375.557 41.069L357.9360000000001 86.173L411.0130000000001 55.217C422.3760000000001 48.59 436.9060000000001 52.523 443.4670000000001 64.002S446.134 90.159 434.771 96.787L381.694 127.7430000000001L429.171 134.8800000000001C436.031 136.3490000000001 441.565 140.6730000000001 444.816 146.3610000000001z" />
+    <glyph glyph-name="sort-alpha-down"
+      unicode="&#xF15D;"
+      horiz-adv-x="448" d=" M187.298 52.686L107.314 -27.316C101.066 -33.563 90.931 -33.561 84.687 -27.316L4.705 52.686C-5.365 62.756 1.807 80 16.019 80H64V400C64 408.837 71.163 416 80 416H112C120.837 416 128 408.837 128 400V80H175.984C190.225 80 197.347 62.736 187.298 52.686zM306.373 232.693A12 12 0 0 0 294.838 224H259.1210000000001C250.9010000000001 224 245.1140000000001 232.078 247.7590000000001 239.861L304.855 407.861A12 12 0 0 0 316.217 416H355.783C360.9220000000001 416 365.4910000000001 412.727 367.1450000000001 407.861L424.2410000000001 239.861C426.886 232.078 421.1 224 412.879 224H377.144A12 12 0 0 0 365.629 232.622L357.3280000000001 260.9210000000001H314.4650000000001L306.3730000000001 232.693zM329.23 311.39H342.5970000000001L335.997 334.327L329.23 311.39zM341.805 24.067L409.256 119.765A12 12 0 0 1 411.448 126.678V148C411.448 154.627 406.075 160 399.448 160H274.522C267.895 160 262.522 154.627 262.522 148V119.07C262.522 112.443 267.895 107.07 274.522 107.07H330.991C330.252 106.079 329.494 105.034 328.721 103.937L261.5180000000001 8.732A12.001000000000001 12.001000000000001 0 0 1 259.322 1.812V-20C259.322 -26.627 264.695 -32 271.322 -32H400.677C407.3040000000001 -32 412.677 -26.627 412.677 -20V8.93C412.677 15.557 407.3040000000001 20.93 400.677 20.93H339.531C340.271 21.923 341.031 22.969 341.805 24.067z" />
+    <glyph glyph-name="sort-alpha-up"
+      unicode="&#xF15E;"
+      horiz-adv-x="448" d=" M4.702 331.314L84.686 411.316C90.934 417.563 101.069 417.561 107.313 411.316L187.294 331.314C197.364 321.2440000000001 190.193 304 175.98 304H128V-16C128 -24.837 120.837 -32 112 -32H80C71.163 -32 64 -24.837 64 -16V304H16.016C1.775 304 -5.347 321.264 4.702 331.314zM306.373 232.693A12 12 0 0 0 294.838 224H259.1210000000001C250.9010000000001 224 245.1140000000001 232.078 247.7590000000001 239.861L304.855 407.861A12 12 0 0 0 316.217 416H355.783C360.9220000000001 416 365.4910000000001 412.727 367.1450000000001 407.861L424.2410000000001 239.861C426.886 232.078 421.1 224 412.879 224H377.144A12 12 0 0 0 365.629 232.622L357.3280000000001 260.9210000000001H314.4650000000001L306.3730000000001 232.693zM329.23 311.39H342.5970000000001L335.997 334.327L329.23 311.39zM341.805 24.067L409.256 119.765A12 12 0 0 1 411.448 126.678V148C411.448 154.627 406.075 160 399.448 160H274.522C267.895 160 262.522 154.627 262.522 148V119.07C262.522 112.443 267.895 107.07 274.522 107.07H330.991C330.252 106.079 329.494 105.034 328.721 103.937L261.5180000000001 8.732A12.001000000000001 12.001000000000001 0 0 1 259.322 1.812V-20C259.322 -26.627 264.695 -32 271.322 -32H400.677C407.3040000000001 -32 412.677 -26.627 412.677 -20V8.93C412.677 15.557 407.3040000000001 20.93 400.677 20.93H339.531C340.271 21.923 341.031 22.969 341.805 24.067z" />
+    <glyph glyph-name="sort-amount-down"
+      unicode="&#xF160;"
+      horiz-adv-x="512" d=" M187.298 52.686L107.314 -27.316C101.066 -33.563 90.931 -33.561 84.687 -27.316L4.705 52.686C-5.365 62.756 1.807 80 16.019 80H64V400C64 408.837 71.163 416 80 416H112C120.837 416 128 408.837 128 400V80H175.984C190.225 80 197.347 62.736 187.298 52.686zM240 352H496C504.837 352 512 359.163 512 368V400C512 408.837 504.837 416 496 416H240C231.163 416 224 408.837 224 400V368C224 359.163 231.163 352 240 352zM224 240V272C224 280.837 231.163 288 240 288H432C440.837 288 448 280.837 448 272V240C448 231.163 440.837 224 432 224H240C231.163 224 224 231.163 224 240zM224 -16V16C224 24.837 231.163 32 240 32H304C312.837 32 320 24.837 320 16V-16C320 -24.837 312.837 -32 304 -32H240C231.163 -32 224 -24.837 224 -16zM224 112V144C224 152.837 231.163 160 240 160H368C376.837 160 384 152.837 384 144V112C384 103.163 376.837 96 368 96H240C231.163 96 224 103.163 224 112z" />
+    <glyph glyph-name="sort-amount-up"
+      unicode="&#xF161;"
+      horiz-adv-x="512" d=" M4.702 331.314L84.686 411.316C90.934 417.563 101.069 417.561 107.313 411.316L187.294 331.314C197.364 321.2440000000001 190.193 304 175.98 304H128V-16C128 -24.837 120.837 -32 112 -32H80C71.163 -32 64 -24.837 64 -16V304H16.016C1.775 304 -5.347 321.264 4.702 331.314zM240 352H496C504.837 352 512 359.163 512 368V400C512 408.837 504.837 416 496 416H240C231.163 416 224 408.837 224 400V368C224 359.163 231.163 352 240 352zM224 240V272C224 280.837 231.163 288 240 288H432C440.837 288 448 280.837 448 272V240C448 231.163 440.837 224 432 224H240C231.163 224 224 231.163 224 240zM224 -16V16C224 24.837 231.163 32 240 32H304C312.837 32 320 24.837 320 16V-16C320 -24.837 312.837 -32 304 -32H240C231.163 -32 224 -24.837 224 -16zM224 112V144C224 152.837 231.163 160 240 160H368C376.837 160 384 152.837 384 144V112C384 103.163 376.837 96 368 96H240C231.163 96 224 103.163 224 112z" />
+    <glyph glyph-name="sort-down"
+      unicode="&#xF0DD;"
+      horiz-adv-x="320" d=" M41 160H279C300.4 160 311.1 134.1 296 119L177 0C167.6 -9.4 152.4 -9.4 143.1 0L24 119C8.9 134.1 19.6 160 41 160z" />
+    <glyph glyph-name="sort-numeric-down"
+      unicode="&#xF162;"
+      horiz-adv-x="448" d=" M308.811 334.213L289.363 355.008C284.841 359.844 285.089 367.429 289.919 371.958L333.362 412.699A11.999000000000002 11.999000000000002 0 0 0 341.571 415.9460000000001H373.162C379.789 415.9460000000001 385.162 410.573 385.162 403.9460000000001V276.876H410.822C417.449 276.876 422.822 271.5030000000001 422.822 264.876V235.946C422.822 229.319 417.449 223.946 410.822 223.946H301.649C295.022 223.946 289.649 229.319 289.649 235.946V264.876C289.649 271.5030000000001 295.022 276.876 301.649 276.876H327.063V334.814C319.809 328.2340000000001 312.852 329.8930000000001 308.811 334.213zM278.241 95.644C278.241 128.297 302.106 163 346.335 163C384.588 163 425.759 134.139 425.759 70.772C425.759 19.496 393.522 -35 333.776 -35C315.94 -35 303.23 -31.443 295.228 -28.219C289.438 -25.886 286.439 -19.473 288.306 -13.516L297.543 15.964C299.5780000000001 22.46 306.592 25.947 313.01 23.68C326.039 19.078 340.888 18.405 351.113 27.818C312.371 22.746 278.241 53.178 278.241 95.644zM370.514 76.306C370.514 98.591 355.212 112.811 344.6790000000001 112.811C336.0370000000001 112.811 331.5150000000001 104.846 331.5150000000001 96.979C331.5150000000001 91.31 333.3300000000001 72.811 356.6830000000001 72.811C366.6560000000001 72.811 370.0600000000001 74.965 370.427 75.542C370.4480000000001 75.588 370.514 75.833 370.514 76.306zM175.984 80H128V400C128 408.837 120.837 416 112 416H80C71.163 416 64 408.837 64 400V80H16.019C1.807 80 -5.365 62.756 4.705 52.686L84.686 -27.316C90.931 -33.561 101.066 -33.563 107.313 -27.316L187.297 52.686C197.347 62.736 190.225 80 175.984 80z" />
+    <glyph glyph-name="sort-numeric-up"
+      unicode="&#xF163;"
+      horiz-adv-x="448" d=" M308.811 334.213L289.363 355.008C284.841 359.844 285.089 367.429 289.919 371.958L333.362 412.699A11.999000000000002 11.999000000000002 0 0 0 341.571 415.9460000000001H373.162C379.789 415.9460000000001 385.162 410.573 385.162 403.9460000000001V276.876H410.822C417.449 276.876 422.822 271.5030000000001 422.822 264.876V235.946C422.822 229.319 417.449 223.946 410.822 223.946H301.649C295.022 223.946 289.649 229.319 289.649 235.946V264.876C289.649 271.5030000000001 295.022 276.876 301.649 276.876H327.063V334.814C319.809 328.2340000000001 312.852 329.8930000000001 308.811 334.213zM278.241 95.644C278.241 128.297 302.106 163 346.335 163C384.588 163 425.759 134.139 425.759 70.772C425.759 19.496 393.522 -35 333.776 -35C315.94 -35 303.23 -31.443 295.228 -28.219C289.438 -25.886 286.439 -19.473 288.306 -13.516L297.543 15.964C299.5780000000001 22.46 306.592 25.947 313.01 23.68C326.039 19.078 340.888 18.405 351.113 27.818C312.371 22.746 278.241 53.178 278.241 95.644zM370.514 76.306C370.514 98.591 355.212 112.811 344.6790000000001 112.811C336.0370000000001 112.811 331.5150000000001 104.846 331.5150000000001 96.979C331.5150000000001 91.31 333.3300000000001 72.811 356.6830000000001 72.811C366.6560000000001 72.811 370.0600000000001 74.965 370.427 75.542C370.4480000000001 75.588 370.514 75.833 370.514 76.306zM16.016 304H64V-16C64 -24.837 71.163 -32 80 -32H112C120.837 -32 128 -24.837 128 -16V304H175.981C190.193 304 197.365 321.2440000000001 187.295 331.314L107.314 411.316C101.069 417.561 90.934 417.563 84.687 411.316L4.702 331.314C-5.347 321.264 1.775 304 16.016 304z" />
+    <glyph glyph-name="sort-up"
+      unicode="&#xF0DE;"
+      horiz-adv-x="320" d=" M279 224H41C19.6 224 8.9 249.9 24 265L143 384C152.4 393.4 167.6 393.4 176.9 384L295.9 265C311.1 249.9 300.4 224 279 224z" />
+    <glyph glyph-name="sort"
+      unicode="&#xF0DC;"
+      horiz-adv-x="320" d=" M41 160H279C300.4 160 311.1 134.1 296 119L177 0C167.6 -9.4 152.4 -9.4 143.1 0L24 119C8.9 134.1 19.6 160 41 160zM296 265L177 384C167.6 393.4 152.4 393.4 143.1 384L24 265C8.9 249.9 19.6 224 41 224H279C300.4 224 311.1 249.9 296 265z" />
+    <glyph glyph-name="space-shuttle"
+      unicode="&#xF197;"
+      horiz-adv-x="640" d=" M592.604 239.756C559.735 255.164 515.777 264 472 264H186.327C181.375 270.555 175.742 275.978 169.607 280H376C229.157 310.253 219.403 416 96.003 416H96V288H80V416C53.49 416 32 387.346 32 352V288C8.803 288 0 277.968 0 264V224C0 210.017 8.819 200 32 200V184C8.803 184 0 173.968 0 160V120C0 106.017 8.819 96 32 96V32C32 -3.346 53.49 -32 80 -32V96H96V-32H96.003C219.403 -32 229.157 73.747 376 104H169.606C175.741 108.022 181.374 113.445 186.326 120H472C515.777 120 559.735 128.836 592.604 144.244C622.282 158.155 640 176.008 640 192S622.282 225.845 592.604 239.756zM488 152A8 8 0 0 0 480 160V224A8 8 0 0 0 488 232C519.909 232 519.942 152 488 152z" />
+    <glyph glyph-name="spinner"
+      unicode="&#xF110;"
+      horiz-adv-x="512" d=" M304 400C304 373.49 282.51 352 256 352S208 373.49 208 400S229.49 448 256 448S304 426.51 304 400zM256 32C229.49 32 208 10.51 208 -16S229.49 -64 256 -64S304 -42.51 304 -16S282.51 32 256 32zM464 240C437.49 240 416 218.51 416 192S437.49 144 464 144S512 165.49 512 192S490.51 240 464 240zM96 192C96 218.51 74.51 240 48 240S0 218.51 0 192S21.49 144 48 144S96 165.49 96 192zM108.922 92.922C82.412 92.922 60.922 71.432 60.922 44.922S82.412 -3.078 108.922 -3.078S156.922 18.412 156.922 44.922C156.922 71.431 135.431 92.922 108.922 92.922zM403.078 92.922C376.568 92.922 355.078 71.432 355.078 44.922S376.568 -3.078 403.078 -3.078S451.078 18.412 451.078 44.922C451.078 71.431 429.588 92.922 403.078 92.922zM108.922 387.078C82.412 387.078 60.922 365.588 60.922 339.078S82.412 291.078 108.922 291.078S156.922 312.568 156.922 339.078S135.431 387.078 108.922 387.078z" />
+    <glyph glyph-name="square-full"
+      unicode="&#xF45C;"
+      horiz-adv-x="512" d=" M512 -64H0V448H512V-64z" />
+    <glyph glyph-name="square"
+      unicode="&#xF0C8;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416z" />
+    <glyph glyph-name="star-half"
+      unicode="&#xF089;"
+      horiz-adv-x="576" d=" M288 448C276.6 448 265.2 442.1 259.3 430.2L194 297.8L47.9 276.6C21.7 272.8 11.2 240.5 30.2 222L135.9 119L110.9 -26.5C106.4 -52.6 133.9 -72.5 157.3 -60.2L288 8.4V448z" />
+    <glyph glyph-name="star"
+      unicode="&#xF005;"
+      horiz-adv-x="576" d=" M259.3 430.2L194 297.8L47.9 276.5C21.7 272.7 11.2 240.4 30.2 221.9L135.9 118.9L110.9 -26.6C106.4 -52.9 134.1 -72.6 157.3 -60.3L288 8.4L418.7 -60.3C441.9 -72.5 469.6 -52.9 465.1 -26.6L440.1 118.9L545.8 221.9C564.8 240.4 554.3 272.7 528.0999999999999 276.5L382 297.8L316.7 430.2C305 453.8 271.1 454.1 259.3 430.2z" />
+    <glyph glyph-name="step-backward"
+      unicode="&#xF048;"
+      horiz-adv-x="448" d=" M64 -20V404C64 410.6 69.4 416 76 416H124C130.6 416 136 410.6 136 404V227.6L331.5 408.6C352.1 425.7 384 411.4 384 384V0C384 -27.4 352.1 -41.7 331.5 -24.6L136 155.3V-20C136 -26.6 130.6 -32 124 -32H76C69.4 -32 64 -26.6 64 -20z" />
+    <glyph glyph-name="step-forward"
+      unicode="&#xF051;"
+      horiz-adv-x="448" d=" M384 404V-20C384 -26.6 378.6 -32 372 -32H324C317.4 -32 312 -26.6 312 -20V156.4L116.5 -24.6C95.9 -41.7 64 -27.4 64 0V384C64 411.4 95.9 425.7 116.5 408.6L312 228.7V404C312 410.6 317.4 416 324 416H372C378.6 416 384 410.6 384 404z" />
+    <glyph glyph-name="stethoscope"
+      unicode="&#xF0F1;"
+      horiz-adv-x="512" d=" M447.1 336C412.9000000000001 335.5 384.8 307.6 384.1 273.4C383.6 249.1 396.6 227.8 416.1 216.6V104C416.1 46.7 365.9000000000001 0 304.1 0C244.1 0 194.9 44.1 192.2 99.2C265 114.2 320 178.8 320 256V411.4C320 422.8 311.9 432.7 300.7 434.9L237.8 447.5C224.8 450.1 212.2 441.7 209.6 428.7L206.4 413C203.8 400 212.2 387.4 225.2 384.8L255.9 378.7V257.3C255.9 204.4 213.7 160.6 160.8 160.1C107.4 159.6 63.9 202.8 63.9 256.1V378.6L94.6 384.7C107.6 387.3 116 399.9 113.4 412.9L110.3 428.6C107.7 441.6 95.1 450 82.1 447.4L19.3 435C8.1 432.7 0 422.9 0 411.4V256C0 178.7 55.1 114 128.1 99.2C130.7 8.8 208.6 -64 304 -64C401 -64 480 11.4 480 104V216.6C499.1 227.7 512 248.3 512 272C512 307.7 482.8 336.5 447.1 336zM448 256C439.2 256 432 263.2 432 272S439.2 288 448 288S464 280.8 464 272S456.8 256 448 256z" />
+    <glyph glyph-name="sticky-note"
+      unicode="&#xF249;"
+      horiz-adv-x="448" d=" M312 128H448V392C448 405.3 437.3 416 424 416H24C10.7 416 0 405.3 0 392V-8C0 -21.3 10.7 -32 24 -32H288V104C288 117.2 298.8 128 312 128zM441 73L343 -25C338.5 -29.5 332.4 -32 326 -32H320V96H448V89.9C448 83.6 445.5 77.5 441 73z" />
+    <glyph glyph-name="stop-circle"
+      unicode="&#xF28D;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM352 112C352 103.2 344.8 96 336 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H336C344.8 288 352 280.8 352 272V112z" />
+    <glyph glyph-name="stop"
+      unicode="&#xF04D;"
+      horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416z" />
+    <glyph glyph-name="stopwatch"
+      unicode="&#xF2F2;"
+      horiz-adv-x="448" d=" M432 144C432 29.1 338.9 -64 224 -64S16 29.1 16 144C16 248 92.3 334.2 192 349.5V384H164C157.4 384 152 389.4 152 396V436C152 442.6 157.4 448 164 448H284C290.6 448 296 442.6 296 436V396C296 389.4 290.6 384 284 384H256V349.5C293.5 343.7 327.7 327.9 355.7 304.9L383.2 332.4C387.9 337.1 395.5 337.1 400.2 332.4L428.5 304.1C433.2 299.4 433.2 291.8 428.5 287.1L399.1 257.7L398.5 257.1C419.7 224.7 432 185.8 432 144zM256 108V259.5C256 266.1 250.6 271.5 244 271.5H204C197.4 271.5 192 266.1 192 259.5V108C192 101.4 197.4 96 204 96H244C250.6 96 256 101.4 256 108z" />
+    <glyph glyph-name="street-view"
+      unicode="&#xF21D;"
+      horiz-adv-x="512" d=" M192 384C192 419.346 220.654 448 256 448S320 419.346 320 384C320 348.654 291.346 320 256 320S192 348.654 192 384zM304 304H292.64C269.929 293.557 243.05 293.106 219.36 304H208C181.49 304 160 282.51 160 256V152C160 138.745 170.745 128 184 128H200V24C200 10.745 210.745 0 224 0H288C301.255 0 312 10.745 312 24V128H328C341.255 128 352 138.745 352 152V256C352 282.51 330.51 304 304 304zM389.642 114.848A72.50299999999999 72.50299999999999 0 0 0 360.632 87.839C391.133 82.749 480 62.146 480 32C480 -14.304 312.344 -32 256 -32C185.697 -32 32 -11.141 32 32C32 62.123 120.361 82.665 151.367 87.839A72.516 72.516 0 0 0 122.357 114.848C74.959 104.605 0 80.401 0 32C0 -45.111 178.658 -64 256 -64C333.249 -64 512 -45.135 512 32C512 80.403 437.033 104.606 389.642 114.848z" />
+    <glyph glyph-name="strikethrough"
+      unicode="&#xF0CC;"
+      horiz-adv-x="512" d=" M496 160H16C7.163 160 0 167.163 0 176V208C0 216.837 7.163 224 16 224H496C504.837 224 512 216.837 512 208V176C512 167.163 504.837 160 496 160zM281.334 144C308.592 131.063 327.858 115.317 327.858 87.757C327.858 54.649 298.8810000000001 34.081 252.237 34.081C219.912 34.081 175.363 46.161 175.363 78.352V80C175.363 88.837 168.1990000000001 96 159.363 96H113.75C104.914 96 97.75 88.837 97.75 80V60.796C97.75 -6.049 175.467 -41.024 252.237 -41.024C340.815 -41.024 414.25 4.414 414.25 93.4C414.25 113.215 410.632 129.817 404.107 144H281.334zM250.382 240C217.96 253.505 193.546 268.9460000000001 193.546 299.683C193.546 333.603 224.447 347.089 258.508 347.089C301.155 347.089 323.47 330.496 323.47 314.104V312C323.47 303.163 330.634 296 339.47 296H385.083C393.919 296 401.083 303.163 401.083 312V342.318C401.083 394.756 329.358 422.193 258.508 422.193C173.305 422.193 107.782 381.221 107.782 296.5470000000001C107.782 273.837 112.447 255.371 120.559 240H250.382z" />
+    <glyph glyph-name="subscript"
+      unicode="&#xF12C;"
+      horiz-adv-x="512" d=" M395.198 32C398.659 42.526 413.994 53.28 431.463 64.425C448.088 75.03 466.9299999999999 87.051 481.804 103.287C499.2619999999999 122.341 507.748 143.4620000000001 507.748 167.8540000000001C507.748 228.4160000000001 457.046 256.0000000000001 409.938 256.0000000000001C367.447 256.0000000000001 333.56 233.9840000000001 315.506 205.5530000000001C310.852 198.2240000000001 312.914 188.5170000000001 320.129 183.6880000000001L350.457 163.3920000000001C357.4889999999999 158.686 366.9169999999999 160.3080000000001 372.087 167.006C380.1089999999999 177.4 390.9049999999999 185.2310000000001 403.7539999999999 185.2310000000001C423.1409999999999 185.2310000000001 430.0199999999999 172.3300000000001 430.0199999999999 161.2830000000001C430.0199999999999 125.1240000000001 310.5829999999999 104.2600000000001 310.5829999999999 1.2590000000001C310.5829999999999 -5.3949999999999 311.1439999999999 -11.7549999999999 311.998 -18.0719999999999C313.074 -26.0359999999999 319.832 -31.9999999999999 327.868 -31.9999999999999H496C504.837 -31.9999999999999 512 -24.8369999999999 512 -15.9999999999999V16.0000000000001C512 24.837 504.837 32.0000000000001 496 32.0000000000001H395.198zM272 192C280.837 192 288 184.837 288 176V144C288 135.163 280.837 128 272 128H209.601A16 16 0 0 0 196.06 135.478L150.359 208.093C148.062 211.445 145.937 215.062 144.164 218.302C142.514 215.058 140.517 211.365 138.29 207.72L93.578 135.573A15.999 15.999 0 0 0 79.978 128.001H16C7.163 128.001 0 135.1640000000001 0 144.001V176.001C0 184.838 7.163 192.001 16 192.001H42.325L98.877 274.7100000000001L46.111 352H16C7.163 352 0 359.163 0 368V400C0 408.837 7.163 416 16 416H84.806A16 16 0 0 0 98.451 408.356L138.333 343.23C140.405 339.707 142.386 336.059 144.06 332.86C145.837 336.104 147.98 339.814 150.297 343.397L190.629 408.432A15.999 15.999 0 0 0 204.226 416H272C280.837 416 288 408.837 288 400V368C288 359.163 280.837 352 272 352H244.021L191.331 276.329L249.974 192H272z" />
+    <glyph glyph-name="subway"
+      unicode="&#xF239;"
+      horiz-adv-x="448" d=" M448 352V96C448 44.185 386.376 0 317.978 0L380.9580000000001 -49.721C386.905 -54.417 383.562 -64 376 -64H72C64.422 -64 61.108 -54.406 67.043 -49.721L130.022 0C61.82 0 0 44.046 0 96V352C0 405.019 64 448 128 448H320C385 448 448 405.019 448 352zM200 216V328C200 341.255 189.255 352 176 352H72C58.745 352 48 341.255 48 328V216C48 202.745 58.745 192 72 192H176C189.255 192 200 202.745 200 216zM400 216V328C400 341.255 389.255 352 376 352H272C258.745 352 248 341.255 248 328V216C248 202.745 258.745 192 272 192H376C389.255 192 400 202.745 400 216zM352 160C325.49 160 304 138.51 304 112S325.49 64 352 64S400 85.49 400 112S378.51 160 352 160zM96 160C69.49 160 48 138.51 48 112S69.49 64 96 64S144 85.49 144 112S122.51 160 96 160z" />
+    <glyph glyph-name="suitcase"
+      unicode="&#xF0F2;"
+      horiz-adv-x="512" d=" M128 -32H384V368C384 394.5 362.5 416 336 416H176C149.5 416 128 394.5 128 368V-32zM192 352H320V320H192V352zM512 272V16C512 -10.5 490.5 -32 464 -32H416V320H464C490.5 320 512 298.5 512 272zM96 -32H48C21.5 -32 0 -10.5 0 16V272C0 298.5 21.5 320 48 320H96V-32z" />
+    <glyph glyph-name="sun"
+      unicode="&#xF185;"
+      horiz-adv-x="512" d=" M274.835 435.354L300.351 372.961C304.564 362.66 317.022 358.612 326.485 364.469L383.8010000000001 399.948C399.2910000000001 409.536 418.6090000000001 395.501 414.2760000000001 377.806L398.2460000000001 312.331C395.5990000000001 301.521 403.2990000000001 290.923 414.3980000000001 290.1L481.6220000000001 285.1130000000001C499.7890000000001 283.765 507.1680000000001 261.0560000000001 493.2630000000001 249.2870000000001L441.81 205.74C433.315 198.55 433.315 185.451 441.81 178.261L493.264 134.713C507.17 122.944 499.791 100.235 481.623 98.887L414.399 93.9C403.3 93.077 395.6 82.479 398.247 71.669L414.2770000000001 6.194C418.6090000000001 -11.501 399.2910000000001 -25.5360000000001 383.802 -15.948L326.486 19.531C317.023 25.389 304.564 21.341 300.352 11.0389999999999L274.836 -51.354C267.94 -68.216 244.062 -68.216 237.166 -51.354L211.65 11.039C207.437 21.34 194.979 25.388 185.516 19.531L128.199 -15.948C112.709 -25.536 93.391 -11.501 97.724 6.194L113.754 71.669C116.401 82.479 108.701 93.077 97.602 93.9L30.378 98.887C12.211 100.235 4.832 122.944 18.737 134.713L70.19 178.26C78.685 185.45 78.685 198.549 70.19 205.739L18.736 249.287C4.83 261.056 12.209 283.765 30.377 285.113L97.601 290.1C108.7 290.923 116.4 301.521 113.753 312.331L97.723 377.806C93.391 395.501 112.709 409.536 128.198 399.948L185.515 364.469C194.978 358.611 207.436 362.659 211.649 372.961L237.165 435.354C244.061 452.215 267.939 452.215 274.835 435.354zM392 192C392 266.991 330.99 328 256 328C181.009 328 120 266.991 120 192S181.009 56 256 56C330.99 56 392 117.009 392 192zM360 192C360 134.654 313.346 88 256 88S152 134.654 152 192S198.654 296 256 296S360 249.346 360 192z" />
+    <glyph glyph-name="superscript"
+      unicode="&#xF12B;"
+      horiz-adv-x="512" d=" M395.198 192C398.659 202.526 413.994 213.28 431.463 224.425C448.088 235.03 466.9299999999999 247.051 481.804 263.2870000000001C499.2619999999999 282.341 507.748 303.462 507.748 327.854C507.748 388.416 457.046 416 409.938 416C367.447 416 333.56 393.984 315.506 365.553C310.852 358.224 312.914 348.517 320.129 343.688L350.457 323.392C357.4889999999999 318.6860000000001 366.9169999999999 320.308 372.087 327.006C380.1089999999999 337.4 390.9049999999999 345.231 403.7539999999999 345.231C423.1409999999999 345.231 430.0199999999999 332.33 430.0199999999999 321.283C430.0199999999999 285.124 310.5829999999999 264.26 310.5829999999999 161.259C310.5829999999999 154.605 311.1439999999999 148.245 311.998 141.928C313.074 133.964 319.832 128 327.868 128H496C504.837 128 512 135.163 512 144V176C512 184.837 504.837 192 496 192H395.198zM272 32C280.837 32 288 24.837 288 16V-16C288 -24.837 280.837 -32 272 -32H209.601A16 16 0 0 0 196.06 -24.522L150.359 48.093C148.062 51.445 145.937 55.062 144.164 58.302C142.514 55.058 140.517 51.365 138.29 47.72L93.578 -24.427A15.999 15.999 0 0 0 79.978 -31.999H16C7.163 -31.999 0 -24.836 0 -15.999V16.001C0 24.838 7.163 32.001 16 32.001H42.325L98.877 114.71L46.111 192H16C7.163 192 0 199.163 0 208V240C0 248.837 7.163 256 16 256H84.806A16 16 0 0 0 98.451 248.356L138.333 183.23C140.405 179.707 142.386 176.059 144.06 172.86C145.837 176.1040000000001 147.98 179.814 150.297 183.397L190.629 248.432A16 16 0 0 0 204.227 255.999H272C280.837 255.999 288 248.836 288 239.999V207.999C288 199.162 280.837 191.999 272 191.999H244.021L191.331 116.328L249.974 32H272z" />
+    <glyph glyph-name="sync-alt"
+      unicode="&#xF2F1;"
+      horiz-adv-x="512" d=" M370.7200000000001 314.7200000000001C339.4580000000001 343.992 298.888 360.038 255.848 360C178.39 359.932 111.52 306.822 93.057 233.15C91.713 227.787 86.935 224 81.406 224H24.103C16.605 224 10.909 230.807 12.296 238.176C33.933 353.076 134.813 440 256 440C322.448 440 382.791 413.8640000000001 427.315 371.315L463.03 407.03C478.149 422.149 504 411.4410000000001 504 390.059V256C504 242.745 493.255 232 480 232H345.941C324.559 232 313.851 257.851 328.97 272.971L370.72 314.7200000000001zM32 152H166.059C187.441 152 198.149 126.149 183.03 111.029L141.28 69.279C172.542 40.006 213.115 23.96 256.156 23.999C333.574 24.069 400.471 77.143 418.943 150.848C420.287 156.211 425.065 159.998 430.594 159.998H487.898C495.396 159.998 501.092 153.191 499.705 145.822C478.067 30.924 377.187 -56 256 -56C189.552 -56 129.209 -29.864 84.685 12.685L48.97 -23.03C33.851 -38.149 8 -27.441 8 -6.059V128C8 141.255 18.745 152 32 152z" />
+    <glyph glyph-name="sync"
+      unicode="&#xF021;"
+      horiz-adv-x="512.333" d=" M440.935 435.426L444.901 352.66C399.416 406.096 331.674 440 256 440C134.813 440 33.933 353.076 12.296 238.176C10.908 230.807 16.604 224 24.103 224H73.187C78.757 224 83.564 227.842 84.863 233.259C103.407 310.592 172.931 368 256 368C316.8930000000001 368 370.512 337.144 402.1040000000001 290.199L300.5740000000001 295.064C293.7290000000001 295.3920000000001 288.0000000000001 289.9310000000001 288.0000000000001 283.0780000000001V235.6670000000001C288.0000000000001 229.04 293.3730000000001 223.667 300.0000000000001 223.667H500.3330000000001C506.9600000000001 223.667 512.3330000000001 229.04 512.3330000000001 235.6670000000001V436C512.3330000000001 442.627 506.9600000000001 448 500.3330000000001 448H452.9220000000001C446.0690000000001 448 440.6070000000001 442.271 440.9350000000001 435.426zM256 16C195.105 16 141.483 46.858 109.891 93.805L211.759 88.934C218.604 88.607 224.332 94.068 224.332 100.92V148.332C224.332 154.959 218.959 160.332 212.332 160.332H12C5.373 160.332 0 154.959 0 148.332V-52C0 -58.627 5.373 -64 12 -64H59.385C66.248 -64 71.713 -58.255 71.37 -51.401L67.241 31.174C112.725 -22.166 180.405 -56 256 -56C377.187 -56 478.067 30.924 499.704 145.824C501.092 153.193 495.396 160 487.897 160H438.813C433.243 160 428.436 156.158 427.137 150.741C408.593 73.408 339.069 16 256 16z" />
+    <glyph glyph-name="syringe"
+      unicode="&#xF48E;"
+      horiz-adv-x="512" d=" M201.5 273.2L257.2 217.4C260.3 214.3 260.3 209.2 257.2 206.1L245.9 194.8C242.8 191.6999999999999 237.7 191.6999999999999 234.6 194.8L178.9 250.6L133.6 205.3L189.4 149.5C192.5 146.3999999999999 192.5 141.3 189.4 138.1999999999999L178.1 126.8999999999999C175 123.7999999999999 169.9 123.7999999999999 166.8 126.8999999999999L111 182.8L84.6 156.4C67.3 139.1 59 115.3 61.6 91L68.7 27.4L2.3 -39C-0.8 -42.1 -0.8 -47.2 2.3 -50.3L13.6 -61.6C16.7 -64.7 21.8 -64.7 24.9 -61.6L91.2 4.7L154.8 -2.4C178.7 -5.0000000000001 202.7 2.9999999999999 220.2 20.6L402.1 202.5L266.4000000000001 338.2L201.5 273.2zM509.7 366.5L430.5 445.7C427.4 448.8 422.3 448.8 419.2 445.7L407.9 434.4C404.8 431.3 404.8 426.2 407.9 423.1L436.2 394.8L390.9 349.5L334.3 406.1L317.3 423.1C314.2 426.2 309.1 426.2 306 423.1L272.1 389.2C269 386.1 269 381 272.1 377.9L289.1 360.9L424.8 225L441.8 208C444.9000000000001 204.9 450 204.9 453.1 208L487 242C490.1 245.1 490.1 250.2 487 253.3L413.5 326.8L458.8 372.1L487.1 343.8C490.2 340.7000000000001 495.3 340.7000000000001 498.4 343.8L509.7 355.1C512.8000000000001 358.3 512.8000000000001 363.3 509.7 366.5z" />
+    <glyph glyph-name="table-tennis"
+      unicode="&#xF45D;"
+      horiz-adv-x="512" d=" M496.2 151.5C527.7 229.3 512 321.8 449 384.9C365.1 469 229 469 145.1 384.9L89.1 328.8L300.6 117.3C346.7000000000001 179.4 432.1 194.7 496.2 151.5zM278.3 71.8L57.9 292.1C30.6 246.8 36.2 187.1 75.2 148L109.7 113.4L6.7 24C-1.9 16.5 -2.4 3.3 5.7 -4.8L59.1 -58.3C67.1 -66.4 80.3 -65.9 87.8 -57.3L177.1 46L212.8 10.3C232.5 -9.4 257.4000000000001 -20.2 283.1 -23C276 -6 272.1 12.6 272.1 32.1C272 45.9 274.6 59.1 278.3 71.8zM416 128C363 128 320 85 320 32S363 -64 416 -64S512 -21 512 32S469 128 416 128z" />
+    <glyph glyph-name="table"
+      unicode="&#xF0CE;"
+      horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM224 32H64V128H224V32zM224 192H64V288H224V192zM448 32H288V128H448V32zM448 192H288V288H448V192z" />
+    <glyph glyph-name="tablet-alt"
+      unicode="&#xF3FA;"
+      horiz-adv-x="448" d=" M400 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V400C448 426.5 426.5 448 400 448zM224 -32C206.3 -32 192 -17.7 192 0S206.3 32 224 32S256 17.7 256 0S241.7 -32 224 -32zM400 76C400 69.4 394.6 64 388 64H60C53.4 64 48 69.4 48 76V388C48 394.6 53.4 400 60 400H388C394.6 400 400 394.6 400 388V76z" />
+    <glyph glyph-name="tablet"
+      unicode="&#xF10A;"
+      horiz-adv-x="448" d=" M400 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V400C448 426.5 426.5 448 400 448zM224 -32C206.3 -32 192 -17.7 192 0S206.3 32 224 32S256 17.7 256 0S241.7 -32 224 -32z" />
+    <glyph glyph-name="tablets"
+      unicode="&#xF490;"
+      horiz-adv-x="640" d=" M160 256C78.9 256 12.5 197.5 0.1 121.3C-0.7 116.5 3.4 112 8.4 112H311.7C316.7 112 320.8 116.5 320 121.3C307.5 197.5 241.1 256 160 256zM311.6 80H8.4C3.4 80 -0.7 75.5 0.1 70.7C12.5 -5.5 78.9 -64 160 -64S307.5 -5.5 319.9 70.7C320.7 75.5 316.6 80 311.6 80zM593.4 401.4C536.9 457.9 449.2 462.8 386.5 417.4C382.5 414.5 382.2 408.5 385.7 405.1L597 193.7C600.5 190.2 606.5 190.5 609.3 194.5C654.8 257.2 649.9 344.9 593.4 401.4zM363 382.3C359.5 385.8 353.5 385.5 350.7 381.5C305.3 318.8 310.2 231.1 366.6 174.6C423.1 118.1 510.8 113.2000000000001 573.5 158.7000000000001C577.5 161.6 577.8 167.6 574.3 171.0000000000001L363 382.3z" />
+    <glyph glyph-name="tachometer-alt"
+      unicode="&#xF3FD;"
+      horiz-adv-x="576" d=" M75.694 -32A48.02 48.02 0 0 0 33.246 -6.429C12.023 33.7 0 79.444 0 128C0 287.058 128.942 416 288 416S576 287.058 576 128C576 79.444 563.977 33.7 542.754 -6.429A48.01800000000001 48.01800000000001 0 0 0 500.306 -32H75.694zM512 160C494.327 160 480 145.673 480 128C480 110.327 494.327 96 512 96S544 110.327 544 128C544 145.673 529.673 160 512 160zM288 320C305.673 320 320 334.327 320 352C320 369.673 305.673 384 288 384S256 369.673 256 352C256 334.327 270.327 320 288 320zM64 160C46.327 160 32 145.673 32 128C32 110.327 46.327 96 64 96S96 110.327 96 128C96 145.673 81.673 160 64 160zM129.608 318.392C111.935 318.392 97.608 304.065 97.608 286.392C97.608 268.719 111.935 254.392 129.608 254.392S161.608 268.719 161.608 286.392C161.608 304.065 147.281 318.392 129.608 318.392zM446.392 318.392C428.719 318.392 414.392 304.065 414.392 286.392C414.392 268.719 428.719 254.392 446.392 254.392S478.392 268.719 478.392 286.392C478.392 304.065 464.065 318.392 446.392 318.392zM359.314 286.858C346.687 290.898 333.181 283.938 329.141 271.314L283.218 127.803C250.108 125.355 224 97.736 224 64C224 28.654 252.654 0 288 0C323.346 0 352 28.654 352 64C352 83.773 343.029 101.447 328.939 113.187L374.858 256.685C378.897 269.31 371.938 282.818 359.314 286.858z" />
+    <glyph glyph-name="tag"
+      unicode="&#xF02B;"
+      horiz-adv-x="512" d=" M0 195.882V400C0 426.51 21.49 448 48 448H252.118A48 48 0 0 0 286.059 433.941L497.941 222.059C516.6859999999999 203.314 516.6859999999999 172.922 497.941 154.177L293.823 -49.941C275.078 -68.6859999999999 244.686 -68.6859999999999 225.941 -49.941L14.059 161.941A48 48 0 0 0 0 195.882zM112 384C85.49 384 64 362.51 64 336S85.49 288 112 288S160 309.49 160 336S138.51 384 112 384z" />
+    <glyph glyph-name="tags"
+      unicode="&#xF02C;"
+      horiz-adv-x="640" d=" M497.941 222.059L286.0590000000001 433.941A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V195.882A48 48 0 0 1 14.059 161.941L225.941 -49.941C244.685 -68.6859999999999 275.077 -68.687 293.823 -49.941L497.941 154.177C516.6859999999999 172.922 516.6859999999999 203.314 497.941 222.059zM112 288C85.49 288 64 309.49 64 336S85.49 384 112 384S160 362.51 160 336S138.51 288 112 288zM625.941 154.177L421.823 -49.941C403.078 -68.6859999999999 372.686 -68.6859999999999 353.941 -49.941L353.581 -49.581L527.64 124.478C544.639 141.477 554 164.078 554 188.118S544.638 234.759 527.64 251.758L331.397 448H380.118A48 48 0 0 0 414.059 433.941L625.941 222.059C644.686 203.314 644.686 172.922 625.941 154.177z" />
+    <glyph glyph-name="tape"
+      unicode="&#xF4DB;"
+      horiz-adv-x="640" d=" M224 256C188.7 256 160 227.3 160 192S188.7 128 224 128S288 156.7 288 192S259.3 256 224 256zM624 32H380.6C422.1 72.7 448 129.3 448 192C448 315.7 347.7 416 224 416S0 315.7 0 192S100.3 -32 224 -32H624C632.8 -32 640 -24.8 640 -16V16C640 24.8 632.8 32 624 32zM224 96C171 96 128 139 128 192S171 288 224 288S320 245 320 192S277 96 224 96z" />
+    <glyph glyph-name="tasks"
+      unicode="&#xF0AE;"
+      horiz-adv-x="512" d=" M208 316H496C504.8 316 512 323.2 512 332V372C512 380.8 504.8 388 496 388H208C199.2 388 192 380.8 192 372V332C192 323.2 199.2 316 208 316zM208 156H496C504.8 156 512 163.2 512 172V212C512 220.8 504.8 228 496 228H208C199.2 228 192 220.8 192 212V172C192 163.2 199.2 156 208 156zM208 -4H496C504.8 -4 512 3.2 512 12V52C512 60.8 504.8 68 496 68H208C199.2 68 192 60.8 192 52V12C192 3.2 199.2 -4 208 -4zM64 80C37.5 80 15.4 58.5 15.4 32S37.5 -16 64 -16S112 5.5 112 32S90.5 80 64 80zM156.5 379L84.3 306.8L68.7 291.2000000000001C64 286.5 55.8 286.5 51.1 291.2000000000001L3.5 338.6C-1.2 343.3 -1.2 350.9 3.5 355.6L19.2 371.3C23.9 376 31.5 376 36.2 371.3L58.9 349.2L122.6 412.5C127.3 417.2 134.9 417.2 139.6 412.5L156.6 396C161.2 391.3 161.2 383.7 156.5 379zM156.5 219.4L84.3 147.2L68.6 131.5C63.9 126.8 55.7 126.8 51 131.5L3.5 179C-1.2 183.7 -1.2 191.3 3.5 196L19.2 211.7C23.9 216.4 31.5 216.4 36.2 211.7L58.9 189.6L122.6 253.3C127.3 258 134.9 258 139.6 253.3L156.6 236.3C161.2 231.7 161.2 224.1 156.5 219.4z" />
+    <glyph glyph-name="taxi"
+      unicode="&#xF1BA;"
+      horiz-adv-x="512" d=" M461.951 204.135L440.1350000000001 291.403A79.885 79.885 0 0 1 362.522 352H352V392C352 405.255 341.255 416 328 416H184C170.745 416 160 405.255 160 392V352H149.478A79.885 79.885 0 0 1 71.866 291.403L50.05 204.135C25.515 195.177 8 171.634 8 144V96C8 75.793 17.374 57.786 32 46.057V-8C32 -21.255 42.745 -32 56 -32H104C117.255 -32 128 -21.255 128 -8V32H384V-8C384 -21.255 394.745 -32 408 -32H456C469.255 -32 480 -21.255 480 -8V46.057C494.626 57.786 504 75.794 504 96V144C504 171.634 486.485 195.177 461.951 204.135zM149.478 288H362.523A15.975 15.975 0 0 0 378.045 275.88L395.015 208H116.985L133.955 275.881A15.975999999999999 15.975999999999999 0 0 0 149.478 288zM132 112C132 92.118 115.882 76 96 76S60 92.118 60 112S76.118 148 96 148S132 131.882 132 112zM452 112C452 92.118 435.882 76 416 76S380 92.118 380 112S396.118 148 416 148S452 131.882 452 112z" />
+    <glyph glyph-name="terminal"
+      unicode="&#xF120;"
+      horiz-adv-x="640" d=" M257.981 175.029L63.638 -19.314C54.265 -28.687 39.069 -28.687 29.697 -19.314L7.029 3.353C-2.328 12.71 -2.346 27.875 6.989 37.254L161.011 192L6.99 346.745C-2.345 356.124 -2.327 371.289 7.03 380.646L29.697 403.313C39.07 412.6860000000001 54.266 412.6860000000001 63.638 403.313L257.981 208.97C267.354 199.598 267.354 184.402 257.981 175.029zM640 -8V24C640 37.255 629.255 48 616 48H312C298.745 48 288 37.255 288 24V-8C288 -21.255 298.745 -32 312 -32H616C629.255 -32 640 -21.255 640 -8z" />
+    <glyph glyph-name="text-height"
+      unicode="&#xF034;"
+      horiz-adv-x="576" d=" M16 416H304C312.837 416 320 408.837 320 400V304C320 295.163 312.837 288 304 288H268.504C259.6670000000001 288 252.504 295.163 252.504 304V352H197.743V32H232C240.837 32 248 24.837 248 16V-16C248 -24.837 240.837 -32 232 -32H88C79.163 -32 72 -24.837 72 -16V16C72 24.837 79.163 32 88 32H122.257V352H67.496V304C67.496 295.163 60.333 288 51.496 288H16C7.163 288 0 295.163 0 304V400C0 408.837 7.163 416 16 416zM491.308 411.315L571.303 331.314C581.309 321.307 574.297 304 559.99 304H512V80H560C575.639 80 580.635 62.009 571.313 52.686L491.318 -27.3150000000001C485.071 -33.5620000000001 474.937 -33.5600000000001 468.692 -27.3150000000001L388.697 52.6859999999999C378.691 62.693 385.703 80 400.01 80H448V304H400C384.361 304 379.365 321.991 388.687 331.314L468.682 411.315C474.929 417.563 485.063 417.56 491.308 411.315z" />
+    <glyph glyph-name="text-width"
+      unicode="&#xF035;"
+      horiz-adv-x="448" d=" M16 416H432C440.837 416 448 408.837 448 400V304C448 295.163 440.837 288 432 288H396.504C387.6670000000001 288 380.504 295.163 380.504 304V352H261.743V224H296C304.837 224 312 216.837 312 208V176C312 167.163 304.837 160 296 160H152C143.163 160 136 167.163 136 176V208C136 216.837 143.163 224 152 224H186.257V352H67.496V304C67.496 295.163 60.333 288 51.496 288H16C7.163 288 0 295.163 0 304V400C0 408.837 7.163 416 16 416zM443.315 75.318L363.314 155.313C353.991 164.635 336 159.638 336 144V96H112V143.99C112 158.297 94.693 165.309 84.686 155.303L4.685 75.308C-1.56 69.063 -1.562 58.929 4.685 52.682L84.686 -27.313C94.009 -36.635 112 -31.638 112 -16V32H336V-15.99C336 -30.297 353.307 -37.309 363.314 -27.303L443.3150000000001 52.692C449.5600000000001 58.937 449.5630000000001 69.071 443.3150000000001 75.318z" />
+    <glyph glyph-name="th-large"
+      unicode="&#xF009;"
+      horiz-adv-x="512" d=" M296 416H488C501.255 416 512 405.255 512 392V232C512 218.745 501.255 208 488 208H296C282.745 208 272 218.745 272 232V392C272 405.255 282.745 416 296 416zM216 416H24C10.745 416 0 405.255 0 392V232C0 218.745 10.745 208 24 208H216C229.255 208 240 218.745 240 232V392C240 405.255 229.255 416 216 416zM0 152V-8C0 -21.255 10.745 -32 24 -32H216C229.255 -32 240 -21.255 240 -8V152C240 165.255 229.255 176 216 176H24C10.745 176 0 165.255 0 152zM296 -32H488C501.255 -32 512 -21.255 512 -8V152C512 165.255 501.255 176 488 176H296C282.745 176 272 165.255 272 152V-8C272 -21.255 282.745 -32 296 -32z" />
+    <glyph glyph-name="th-list"
+      unicode="&#xF00B;"
+      horiz-adv-x="512" d=" M149.333 232V152C149.333 138.745 138.588 128 125.333 128H24C10.745 128 0 138.745 0 152V232C0 245.255 10.745 256 24 256H125.333C138.588 256 149.333 245.255 149.333 232zM0 72V-8C0 -21.255 10.745 -32 24 -32H125.333C138.588 -32 149.333 -21.255 149.333 -8V72C149.333 85.255 138.588 96 125.333 96H24C10.745 96 0 85.255 0 72zM125.333 416H24C10.745 416 0 405.255 0 392V312C0 298.745 10.745 288 24 288H125.333C138.588 288 149.333 298.745 149.333 312V392C149.333 405.255 138.588 416 125.333 416zM205.333 -32H488C501.255 -32 512 -21.255 512 -8V72C512 85.255 501.255 96 488 96H205.333C192.078 96 181.333 85.255 181.333 72V-8C181.333 -21.255 192.078 -32 205.333 -32zM181.333 392V312C181.333 298.745 192.078 288 205.333 288H488C501.255 288 512 298.745 512 312V392C512 405.255 501.255 416 488 416H205.333C192.078 416 181.333 405.255 181.333 392zM205.333 128H488C501.255 128 512 138.745 512 152V232C512 245.255 501.255 256 488 256H205.333C192.078 256 181.333 245.255 181.333 232V152C181.333 138.745 192.078 128 205.333 128z" />
+    <glyph glyph-name="th"
+      unicode="&#xF00A;"
+      horiz-adv-x="512" d=" M149.333 392V312C149.333 298.745 138.588 288 125.333 288H24C10.745 288 0 298.745 0 312V392C0 405.255 10.745 416 24 416H125.333C138.588 416 149.333 405.255 149.333 392zM330.6670000000001 152V232C330.6670000000001 245.255 319.9220000000001 256 306.6670000000001 256H205.333C192.078 256 181.333 245.255 181.333 232V152C181.333 138.745 192.078 128 205.333 128H306.666C319.9220000000001 128 330.667 138.745 330.667 152zM362.6670000000001 392V312C362.6670000000001 298.745 373.4120000000001 288 386.6670000000001 288H488C501.255 288 512 298.745 512 312V392C512 405.255 501.255 416 488 416H386.667C373.412 416 362.667 405.255 362.667 392zM330.6670000000001 312V392C330.6670000000001 405.255 319.9220000000001 416 306.6670000000001 416H205.333C192.078 416 181.333 405.255 181.333 392V312C181.333 298.745 192.078 288 205.333 288H306.666C319.9220000000001 288 330.667 298.745 330.667 312zM125.333 256H24C10.745 256 0 245.255 0 232V152C0 138.745 10.745 128 24 128H125.333C138.588 128 149.333 138.745 149.333 152V232C149.333 245.255 138.588 256 125.333 256zM0 72V-8C0 -21.255 10.745 -32 24 -32H125.333C138.588 -32 149.333 -21.255 149.333 -8V72C149.333 85.255 138.588 96 125.333 96H24C10.745 96 0 85.255 0 72zM386.667 128H488C501.255 128 512 138.745 512 152V232C512 245.255 501.255 256 488 256H386.667C373.412 256 362.667 245.255 362.667 232V152C362.667 138.745 373.412 128 386.667 128zM386.667 -32H488C501.255 -32 512 -21.255 512 -8V72C512 85.255 501.255 96 488 96H386.667C373.412 96 362.667 85.255 362.667 72V-8C362.667 -21.255 373.412 -32 386.667 -32zM181.333 72V-8C181.333 -21.255 192.078 -32 205.333 -32H306.666C319.921 -32 330.666 -21.255 330.666 -8V72C330.666 85.255 319.921 96 306.666 96H205.333C192.078 96 181.333 85.255 181.333 72z" />
+    <glyph glyph-name="thermometer-empty"
+      unicode="&#xF2CB;"
+      horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 99.346 92.654 128 128 128S192 99.346 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" />
+    <glyph glyph-name="thermometer-full"
+      unicode="&#xF2C7;"
+      horiz-adv-x="256" d=" M224 352C224 405.019 181.019 448 128 448S32 405.019 32 352V148.653C12.225 126.244 0.166 96.864 0.002 64.667C-0.357 -5.636 56.789 -63.509 127.091 -63.997C127.39 -63.999 127.701 -64 128 -64C198.698 -64 256 -6.696 256 64C256 96.459 243.912 126.09 224 148.653V352zM128 -16L127.424 -15.998C83.564 -15.694 47.777 20.546 48.001 64.422C48.174 98.402 67.267 116.074 80 130.502V352C80 378.467 101.533 400 128 400S176 378.467 176 352V130.502C188.63 116.19 208 98.338 208 64C208 19.888 172.112 -16 128 -16zM192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V352C96 369.673 110.327 384 128 384S160 369.673 160 352V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64z" />
+    <glyph glyph-name="thermometer-half"
+      unicode="&#xF2C9;"
+      horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V224C96 241.673 110.327 256 128 256S160 241.673 160 224V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" />
+    <glyph glyph-name="thermometer-quarter"
+      unicode="&#xF2CA;"
+      horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V160C96 177.673 110.327 192 128 192S160 177.673 160 160V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" />
+    <glyph glyph-name="thermometer-three-quarters"
+      unicode="&#xF2C8;"
+      horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0C92.654 0 64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V288C96 305.673 110.327 320 128 320S160 305.673 160 288V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" />
+    <glyph glyph-name="thermometer"
+      unicode="&#xF491;"
+      horiz-adv-x="512" d=" M476.8 427.6C439.3 458.3 381.3 453.9 344.9 417.4L299.2 371.4L349.7 320.9C352.8 317.8 352.8 312.7000000000001 349.7 309.6L338.4 298.3C335.3 295.2 330.2 295.2 327.1 298.3L276.7 348.8L231.6 303.4L281.9 253C285 249.9 285 244.8 281.9 241.7L270.6 230.4C267.5 227.3 262.4 227.3 259.3 230.4L209 280.6L163.9 235.2L214 185C217.1 181.9 217.1 176.8 214 173.7L202.7 162.4C199.6 159.3 194.5 159.3 191.4 162.4L141.3 212.6L96 166.9V66L7 -23C-2.4 -32.4 -2.4 -47.6 7 -56.9C16.4 -66.2999999999999 31.6 -66.2999999999999 40.9 -56.9L129.9 32.1H229.8L484 285.4C518.9 320.3 526.2 386.9 476.8 427.6z" />
+    <glyph glyph-name="thumbs-down"
+      unicode="&#xF165;"
+      horiz-adv-x="512" d=" M0 392V152C0 138.745 10.745 128 24 128H104C117.255 128 128 138.745 128 152V392C128 405.255 117.255 416 104 416H24C10.745 416 0 405.255 0 392zM40 192C40 205.255 50.745 216 64 216S88 205.255 88 192S77.255 168 64 168S40 178.745 40 192zM312 -64C291.817 -64 282.515 -24.707 278.069 -6.205C272.863 15.461 267.48 37.865 252.676 52.697C220.207 85.221 203.173 126.664 163.559 165.808A11.98 11.98 0 0 0 160.001 174.329V388.099C160.001 394.64 165.244 399.977 171.784 400.097C187.615 400.387 208.478 409.176 224.435 416.275C256.189 430.402 295.709 447.983 343.995 448H346.839C389.616 448 440.202 447.587 460.613 418.263C469.005 406.206 471.059 391.229 466.761 373.631C483.073 356.578 491.824 324.7680000000001 483.143 298.874C500.687 275.442 502.2860000000001 242.742 492.451 219.405L492.561 219.295C504.4540000000001 207.346 512.0840000000001 188.036 512 170.098C511.844 139.746 485.843 111.9999999999999 452.447 111.9999999999999H350.723C358.03 83.66 384 59.868 384 17.452C384 -56 336 -64 312 -64z" />
+    <glyph glyph-name="thumbs-up"
+      unicode="&#xF164;"
+      horiz-adv-x="512" d=" M104 224H24C10.745 224 0 213.255 0 200V-40C0 -53.255 10.745 -64 24 -64H104C117.255 -64 128 -53.255 128 -40V200C128 213.255 117.255 224 104 224zM64 -24C50.745 -24 40 -13.255 40 0S50.745 24 64 24S88 13.255 88 0S77.255 -24 64 -24zM384 366.548C384 324.132 358.03 300.3400000000001 350.723 272H452.446C485.843 272 511.843 244.254 511.999 213.902C512.083 195.964 504.453 176.653 492.56 164.705L492.45 164.595C502.286 141.258 500.687 108.558 483.142 85.126C491.823 59.231 483.073 27.422 466.76 10.369C471.058 -7.229 469.004 -22.206 460.612 -34.263C440.202 -63.587 389.616 -64 346.839 -64L343.994 -63.999C295.707 -63.982 256.188 -46.401 224.434 -32.274C208.477 -25.175 187.613 -16.387 171.783 -16.096C165.243 -15.976 160 -10.639 160 -4.098V209.672C160 212.872 161.282 215.943 163.558 218.193C203.172 257.337 220.206 298.78 252.675 331.304C267.479 346.136 272.863 368.54 278.068 390.206C282.515 408.707 291.817 448 312 448C336 448 384 440 384 366.548z" />
+    <glyph glyph-name="thumbtack"
+      unicode="&#xF08D;"
+      horiz-adv-x="384" d=" M298.028 233.733L285.793 352H328C341.255 352 352 362.745 352 376V424C352 437.255 341.255 448 328 448H56C42.745 448 32 437.255 32 424V376C32 362.745 42.745 352 56 352H98.207L85.972 233.733C37.465 211.18 0 170.739 0 120C0 106.745 10.745 96 24 96H160V-8.007C160 -9.249 160.289 -10.474 160.845 -11.585L184.845 -59.585C187.786 -65.467 196.209 -65.4779999999999 199.156 -59.585L223.156 -11.585A8.008 8.008 0 0 1 224.001 -8.007V96H360.001C373.256 96 384.001 106.745 384.001 120C384 171.183 346.018 211.42 298.028 233.733z" />
+    <glyph glyph-name="ticket-alt"
+      unicode="&#xF3FF;"
+      horiz-adv-x="576" d=" M128 288H448V96H128V288zM528 192C528 165.49 549.49 144 576 144V48C576 21.49 554.51 0 528 0H48C21.49 0 0 21.49 0 48V144C26.51 144 48 165.49 48 192S26.51 240 0 240V336C0 362.51 21.49 384 48 384H528C554.51 384 576 362.51 576 336V240C549.49 240 528 218.51 528 192zM480 296C480 309.255 469.255 320 456 320H120C106.745 320 96 309.255 96 296V88C96 74.745 106.745 64 120 64H456C469.255 64 480 74.745 480 88V296z" />
+    <glyph glyph-name="times-circle"
+      unicode="&#xF057;"
+      horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM377.6 126.9C382.3 122.2 382.3 114.6 377.6 109.9L338 70.4C333.3 65.7 325.7 65.7 321 70.4L256 136L190.9 70.4C186.2 65.7 178.6 65.7 173.9 70.4L134.4 110C129.7 114.7 129.7 122.3 134.4 127L200 192L134.4 257.1C129.7 261.8 129.7 269.4 134.4 274.1L174 313.7C178.7 318.4 186.3 318.4 191 313.7L256 248L321.1 313.6C325.8 318.3 333.4000000000001 318.3 338.1 313.6L377.7000000000001 274C382.4000000000001 269.3 382.4000000000001 261.7 377.7000000000001 257L312 192L377.6 126.9z" />
+    <glyph glyph-name="times"
+      unicode="&#xF00D;"
+      horiz-adv-x="384" d=" M323.1 7L377 60.9C386.4 70.3 386.4 85.4 377 94.8L279.8 192L377 289.2C386.4 298.6 386.4 313.7 377 323.1L323.1 377C313.7000000000001 386.4 298.6 386.4 289.2000000000001 377L192 279.8L94.8 377C85.4 386.4 70.3 386.4 60.9 377L7 323.1C-2.4 313.7 -2.4 298.6 7 289.2L104.2 192L7 94.8C-2.4 85.4 -2.4 70.3 7 60.9L60.9 7C70.3 -2.4 85.4 -2.4 94.8 7L192 104.2L289.2 7C298.5 -2.3 313.7 -2.3 323.1 7z" />
+    <glyph glyph-name="tint"
+      unicode="&#xF043;"
+      horiz-adv-x="384" d=" M192 -64C93.565 -64 13.913 15.652 13.913 114.087C13.913 225.283 115.107 268.152 162.435 425.912C171.539 456.028 213.534 454.69 221.565 425.912C269.111 267.426 370.087 225.843 370.087 114.087C370.087 15.652 290.435 -64 192 -64zM149.478 107.826C147.969 113.359 140.031 113.358 138.522 107.826C129.299 78.401 110.609 70.181 110.609 49.391C110.609 30.87 125.478 16 144 16S177.391 30.87 177.391 49.391C177.391 70.23 158.718 78.347 149.478 107.826z" />
+    <glyph glyph-name="toggle-off"
+      unicode="&#xF204;"
+      horiz-adv-x="576" d=" M384 384H192C85.961 384 0 298.039 0 192S85.961 0 192 0H384C490.039 0 576 85.961 576 192S490.039 384 384 384zM64 192C64 262.741 121.249 320 192 320C262.741 320 320 262.751 320 192C320 121.259 262.751 64 192 64C121.259 64 64 121.249 64 192zM384 64H335.0950000000001C400.312 136.858 400.331 247.12 335.0950000000001 320H384C454.741 320 512 262.751 512 192C512 121.26 454.751 64 384 64z" />
+    <glyph glyph-name="toggle-on"
+      unicode="&#xF205;"
+      horiz-adv-x="576" d=" M576 192C576 85.961 490.039 0 384 0H192C85.961 0 0 85.961 0 192S85.961 384 192 384H384C490.039 384 576 298.039 576 192zM384 320C313.259 320 256 262.751 256 192C256 121.259 313.249 64 384 64C454.741 64 512 121.249 512 192C512 262.741 454.751 320 384 320" />
+    <glyph glyph-name="trademark"
+      unicode="&#xF25C;"
+      horiz-adv-x="640" d=" M97.119 284.867H12C5.373 284.867 0 290.24 0 296.867V340C0 346.627 5.373 352 12 352H260.559C267.186 352 272.559 346.627 272.559 340V296.867C272.559 290.24 267.186 284.867 260.559 284.867H175.44V44C175.44 37.373 170.067 32 163.44 32H109.118C102.491 32 97.118 37.373 97.118 44V284.867zM329.825 352H395.25A12 12 0 0 0 406.596 343.907L450.355 216.839C457.516 196.251 466.466 164.027 466.466 164.027H467.362S476.312 196.251 483.473 216.839L527.231 343.907A12 12 0 0 0 538.577 352H603.987A12 12 0 0 0 615.948 340.9700000000001L639.96 44.97C640.527 37.983 635.009 32 627.999 32H573.898A12 12 0 0 0 561.926 43.182L552.844 176.112C551.0540000000001 200.28 552.844 229.8180000000001 552.844 229.8180000000001H551.9480000000001S541.2070000000001 196.2520000000001 534.046 176.112L503.3460000000001 91.381A12 12 0 0 0 492.0640000000001 83.4690000000001H441.7620000000001A12 12 0 0 0 430.4800000000001 91.381L399.7800000000001 176.112C392.6190000000001 196.252 381.8770000000001 229.8180000000001 381.8770000000001 229.8180000000001H380.9820000000001S382.7720000000001 200.28 380.9820000000001 176.112L371.9000000000001 43.182C371.4720000000001 36.887 366.2400000000001 32 359.9300000000001 32H305.4C298.383 32 292.864 37.994 293.441 44.987L317.866 340.987A11.999000000000002 11.999000000000002 0 0 0 329.825 352z" />
+    <glyph glyph-name="train"
+      unicode="&#xF238;"
+      horiz-adv-x="448" d=" M448 352V96C448 44.185 386.376 0 317.978 0L380.9580000000001 -49.721C386.905 -54.417 383.562 -64 376 -64H72C64.422 -64 61.108 -54.406 67.043 -49.721L130.022 0C61.82 0 0 44.046 0 96V352C0 405.019 64 448 128 448H320C385 448 448 405.019 448 352zM400 216V328C400 341.255 389.255 352 376 352H72C58.745 352 48 341.255 48 328V216C48 202.745 58.745 192 72 192H376C389.255 192 400 202.745 400 216zM224 152C193.072 152 168 126.928 168 96S193.072 40 224 40S280 65.072 280 96S254.928 152 224 152z" />
+    <glyph glyph-name="transgender-alt"
+      unicode="&#xF225;"
+      horiz-adv-x="480" d=" M468 448H389C378.3 448 373 435.1 380.5 427.5L397.4 410.6L316.7 329.9C294.5 343.9 268.2 352 240 352C211.8 352 185.5 343.9 163.3 329.9L146.8 346.4L166.6 366.2C171.3 370.9 171.3 378.5 166.6 383.2L138.3 411.5C133.6 416.2 126 416.2 121.3 411.5L101.5 391.7L82.5 410.7L99.4 427.6C107.1 435.1 101.7 448 91 448H12C5.4 448 0 442.6 0 436V357C0 346.3 12.9 341 20.5 348.5L37.4 365.4L56.4 346.4L36.6 326.6C31.9 321.9 31.9 314.3 36.6 309.6L64.9 281.3C69.6 276.6 77.2 276.6 81.9 281.3L101.7 301.1L118.2 284.6C104.1 262.5 96 236.2 96 208C96 139.5 143.9 82.1 208 67.6V40H172C165.4 40 160 34.6 160 28V-12C160 -18.6 165.4 -24 172 -24H208V-52C208 -58.6 213.4 -64 220 -64H260C266.6 -64 272 -58.6 272 -52V-24H308C314.6 -24 320 -18.6 320 -12V28C320 34.6 314.6 40 308 40H272V67.6C336.1 82.2000000000001 384 139.5 384 208C384 236.2 375.9 262.5 361.9 284.7000000000001L442.6 365.4000000000001L459.4999999999999 348.5000000000001C467.1 340.9000000000001 479.9999999999999 346.3000000000001 479.9999999999999 357.0000000000001V436C479.9999999999999 442.6 474.6 448 467.9999999999999 448zM240 128C195.9 128 160 163.9 160 208S195.9 288 240 288S320 252.1 320 208S284.1 128 240 128z" />
+    <glyph glyph-name="transgender"
+      unicode="&#xF224;"
+      horiz-adv-x="384" d=" M372 448H293C282.3 448 277 435.1 284.5 427.5L301.4 410.6L220.7 329.9C198.5 343.9 172.2 352 144 352C64.5 352 0 287.5 0 208C0 139.5 47.9 82.1 112 67.6V40H76C69.4 40 64 34.6 64 28V-12C64 -18.6 69.4 -24 76 -24H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-24H212C218.6 -24 224 -18.6 224 -12V28C224 34.6 218.6 40 212 40H176V67.6C240.1 82.2000000000001 288 139.5 288 208C288 236.2 279.9 262.5 265.9 284.7000000000001L346.6 365.4000000000001L363.5 348.5000000000001C371.1 340.9000000000001 384 346.3000000000001 384 357.0000000000001V436C384 442.6 378.6 448 372 448zM144 128C99.9 128 64 163.9 64 208S99.9 288 144 288S224 252.1 224 208S188.1 128 144 128z" />
+    <glyph glyph-name="trash-alt"
+      unicode="&#xF2ED;"
+      horiz-adv-x="448" d=" M0 364V392C0 405.3 10.7 416 24 416H136L145.4 434.7C149.4 442.9 157.7 448 166.8 448H281.1C290.2000000000001 448 298.5 442.9 302.6 434.7L312 416H424C437.3 416 448 405.3 448 392V364C448 357.4 442.6 352 436 352H12C5.4 352 0 357.4 0 364zM416 308V-16C416 -42.5 394.5 -64 368 -64H80C53.5 -64 32 -42.5 32 -16V308C32 314.6 37.4 320 44 320H404C410.6 320 416 314.6 416 308zM144 240C144 248.8 136.8 256 128 256S112 248.8 112 240V16C112 7.2 119.2 0 128 0S144 7.2 144 16V240zM240 240C240 248.8 232.8 256 224 256S208 248.8 208 240V16C208 7.2 215.2 0 224 0S240 7.2 240 16V240zM336 240C336 248.8 328.8 256 320 256S304 248.8 304 240V16C304 7.2 311.2 0 320 0S336 7.2 336 16V240z" />
+    <glyph glyph-name="trash"
+      unicode="&#xF1F8;"
+      horiz-adv-x="448" d=" M0 364V392C0 405.3 10.7 416 24 416H136L145.4 434.7C149.4 442.9 157.7 448 166.8 448H281.1C290.2000000000001 448 298.5 442.9 302.6 434.7L312 416H424C437.3 416 448 405.3 448 392V364C448 357.4 442.6 352 436 352H12C5.4 352 0 357.4 0 364zM415.2 307.3L394.8 -19C393.2 -44.3 372.2 -64 346.9000000000001 -64H101.1C75.8 -64 54.8 -44.3 53.2 -19L32.8 307.3C32.4 314.2000000000001 37.9 320 44.8 320H403.3C410.1 320 415.6 314.2000000000001 415.2 307.3z" />
+    <glyph glyph-name="tree"
+      unicode="&#xF1BB;"
+      horiz-adv-x="384" d=" M377.33 72.571L293.906 160H328C349.017 160 359.872 185.207 345.448 200.479L262.79 288H296C316.878 288 327.851 312.969 313.587 328.331L209.587 440.334C200.102 450.548 183.911 450.563 174.413 440.334L70.413 328.331C56.206 313.031 67.037 288 88 288H121.21L38.551 200.479C24.121 185.199 34.993 160 56 160H90.094L6.665 72.571C-7.869 57.345 2.925 32 24.025 32H144C144 -0.781 132.812 -17.26 110.005 -35.506C98.225 -44.93 104.914 -64 120 -64H264C279.086 -64 285.776 -44.931 273.995 -35.506C254.227 -19.6919999999999 240.003 -3.841 240 31.99V32H359.9700000000001C381.0200000000001 32 391.899 57.309 377.3300000000001 72.571z" />
+    <glyph glyph-name="trophy"
+      unicode="&#xF091;"
+      horiz-adv-x="576" d=" M552 384H448V424C448 437.3 437.3 448 424 448H152C138.7 448 128 437.3 128 424V384H24C10.7 384 0 373.3 0 360V304C0 268.3 22.5 231.6 61.9 203.3C93.4 180.6 131.7 166.2 171.9 161.6C203.3 109.5 240 88 240 88V16H192C156.7 16 128 -4.7 128 -40V-52C128 -58.6 133.4 -64 140 -64H436C442.6 -64 448 -58.6 448 -52V-40C448 -4.7 419.3 16 384 16H336V88S372.7 109.5 404.1 161.6C444.4000000000001 166.2000000000001 482.7 180.6 514.1 203.3C553.4 231.6 576 268.3 576 304V360C576 373.3 565.3 384 552 384zM99.3 255.2C74.9 272.8 64 292.4 64 304V320H128.2C129.2 287.4 134 258.8 141 233.8C125.9 239 111.8 246.2 99.3 255.2zM512 304C512 287.9 494.3 267.9 476.7 255.2C464.2 246.2 450 239 434.9 233.8C441.9 258.8 446.7 287.4 447.7 320H512V304z" />
+    <glyph glyph-name="truck-loading"
+      unicode="&#xF4DE;"
+      horiz-adv-x="640" d=" M50.2 72.4C52.5 63.9 61.3 58.8 69.8 61.1L286.2000000000001 119.1C294.7000000000001 121.4 299.8000000000001 130.2 297.5000000000001 138.7L247.8000000000001 324.2C245.5000000000001 332.7 236.7000000000001 337.8 228.2000000000001 335.5L151 314.7L175.8 222L114 205.5L89.2 298.2L11.9 277.5C3.4 275.2 -1.7 266.4 0.6 257.9L50.2 72.4zM384 448C366.3 448 352 433.7 352 416V92.4L5.9 -2C1.6 -3.2 -0.9 -7.6 0.3 -11.8L12.9 -58.1C14.1 -62.4 18.5 -64.9 22.7 -63.7L416.4 43.6999999999999C418.8 -16.1 467.6 -64 528 -64C589.9 -64 640 -13.9 640 48V448H384zM528 0C501.5 0 480 21.5 480 48S501.5 96 528 96S576 74.5 576 48S554.5 0 528 0z" />
+    <glyph glyph-name="truck-moving"
+      unicode="&#xF4DF;"
+      horiz-adv-x="640" d=" M621.3 210.7L562.8 269.2C550.8 281.2 534.5 287.9 517.5 287.9H480V384C480 401.7 465.7 416 448 416H32C14.3 416 0 401.7 0 384V48C0 3.8 35.8 -32 80 -32C106.3 -32 129.4 -19.1 144 0.4C158.6 -19.2 181.7 -32 208 -32C252.2 -32 288 3.8 288 48C288 53.5 287.4 58.8 286.4 64H449.6C448.5 58.8 448 53.5 448 48C448 3.8 483.8 -32 528 -32S608 3.8 608 48C608 53.5 607.4 58.8 606.4 64H624C632.8 64 640 71.2 640 80V165.5C640 182.5 633.3 198.7 621.3 210.7zM80 16C62.4 16 48 30.4 48 48S62.4 80 80 80S112 65.6 112 48S97.6 16 80 16zM208 16C190.4 16 176 30.4 176 48S190.4 80 208 80S240 65.6 240 48S225.6 16 208 16zM480 240H517.5C521.8 240 525.8 238.3 528.8 235.3L572.0999999999999 192H480V240zM528 16C510.4 16 496 30.4 496 48S510.4 80 528 80S560 65.6 560 48S545.6 16 528 16z" />
+    <glyph glyph-name="truck"
+      unicode="&#xF0D1;"
+      horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H64C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" />
+    <glyph glyph-name="tty"
+      unicode="&#xF1E4;"
+      horiz-adv-x="512" d=" M5.37 344.178C143.902 482.71 368.306 482.504 506.632 344.178C512.71 338.1 513.706 328.682 509.215 321.497L466.001 252.359A18.332 18.332 0 0 0 443.6450000000001 245.054L357.2230000000001 279.623A18.335 18.335 0 0 0 345.7890000000001 298.469L351.741 358C289.596 380.454 221.105 379.986 160.258 358L166.211 298.468A18.331 18.331 0 0 0 154.777 279.622L68.354 245.0540000000001A18.334 18.334 0 0 0 45.998 252.3590000000001L2.787 321.498A18.333 18.333 0 0 0 5.37 344.178zM96 140V180C96 186.627 90.627 192 84 192H44C37.373 192 32 186.627 32 180V140C32 133.373 37.373 128 44 128H84C90.627 128 96 133.373 96 140zM192 140V180C192 186.627 186.627 192 180 192H140C133.373 192 128 186.627 128 180V140C128 133.373 133.373 128 140 128H180C186.627 128 192 133.373 192 140zM288 140V180C288 186.627 282.627 192 276 192H236C229.373 192 224 186.627 224 180V140C224 133.373 229.373 128 236 128H276C282.627 128 288 133.373 288 140zM384 140V180C384 186.627 378.627 192 372 192H332C325.373 192 320 186.627 320 180V140C320 133.373 325.373 128 332 128H372C378.627 128 384 133.373 384 140zM480 140V180C480 186.627 474.627 192 468 192H428C421.373 192 416 186.627 416 180V140C416 133.373 421.373 128 428 128H468C474.627 128 480 133.373 480 140zM144 44V84C144 90.627 138.627 96 132 96H92C85.373 96 80 90.627 80 84V44C80 37.373 85.373 32 92 32H132C138.627 32 144 37.373 144 44zM240 44V84C240 90.627 234.627 96 228 96H188C181.373 96 176 90.627 176 84V44C176 37.373 181.373 32 188 32H228C234.627 32 240 37.373 240 44zM336 44V84C336 90.627 330.627 96 324 96H284C277.373 96 272 90.627 272 84V44C272 37.373 277.373 32 284 32H324C330.627 32 336 37.373 336 44zM432 44V84C432 90.627 426.627 96 420 96H380C373.373 96 368 90.627 368 84V44C368 37.373 373.373 32 380 32H420C426.627 32 432 37.373 432 44zM96 -52V-12C96 -5.373 90.627 0 84 0H44C37.373 0 32 -5.373 32 -12V-52C32 -58.627 37.373 -64 44 -64H84C90.627 -64 96 -58.627 96 -52zM384 -52V-12C384 -5.373 378.627 0 372 0H140C133.373 0 128 -5.373 128 -12V-52C128 -58.627 133.373 -64 140 -64H372C378.627 -64 384 -58.627 384 -52zM480 -52V-12C480 -5.373 474.627 0 468 0H428C421.373 0 416 -5.373 416 -12V-52C416 -58.627 421.373 -64 428 -64H468C474.627 -64 480 -58.627 480 -52z" />
+    <glyph glyph-name="tv"
+      unicode="&#xF26C;"
+      horiz-adv-x="640" d=" M592 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H293.1V0H133.1C115.4 0 101.1 -14.3 101.1 -32S115.4 -64 133.1 -64H517.1C534.8000000000001 -64 549.1 -49.7 549.1 -32S534.8000000000001 0 517.1 0H357.1V32H592C618.5 32 640 53.5 640 80V400C640 426.5 618.5 448 592 448zM576 96H64V384H576V96z" />
+    <glyph glyph-name="umbrella"
+      unicode="&#xF0E9;"
+      horiz-adv-x="576" d=" M557.011 180.369C505.579 225.586 449.439 224.067 398.444 149.638C393.146 141.7770000000001 383.538 142.473 378.708 149.638C376.225 153.2620000000001 346.49 210.446 288 210.446C242.234 210.446 217.458 179.0680000000001 197.291 149.638C192.462 142.473 182.855 141.7770000000001 177.557 149.638C126.653 223.923 70.944 226.0440000000001 18.99 180.369C8.78 172.105 -1.922 181.478 0.294 189.85C32.146 313.427 158.516 383.3880000000001 288.001 383.3880000000001C416.794 383.3880000000001 544.547 313.427 575.707 189.85C577.913 181.528 567.281 172.057 557.011 180.369zM256 186.999V32C256 14.355 241.645 0 224 0S192 14.355 192 32C192 49.673 177.673 64 160 64S128 49.673 128 32C128 -20.935 171.065 -64 224 -64S320 -20.935 320 32V186.712C298.164 197.518 274.575 196.449 256 186.999zM320 398.0060000000001V416C320 433.673 305.673 448 288 448S256 433.673 256 416V398.0130000000001A372.105 372.105 0 0 0 320 398.0060000000001z" />
+    <glyph glyph-name="underline"
+      unicode="&#xF0CD;"
+      horiz-adv-x="448" d=" M224.264 59.76C132.595 59.76 67.661 110.925 67.661 211.152V384H39.37C30.533 384 23.37 391.163 23.37 400V432C23.37 440.837 30.533 448 39.37 448H176.76C185.597 448 192.76 440.837 192.76 432V400C192.76 391.163 185.597 384 176.76 384H147.947V211.152C147.947 157.453 176.261 131.708 224.264 131.708C271.23 131.708 300.06 157.142 300.06 211.673V384H271.769C262.932 384 255.769 391.163 255.769 400V432C255.769 440.837 262.932 448 271.769 448H408.637C417.474 448 424.637 440.837 424.637 432V400C424.637 391.163 417.474 384 408.637 384H380.346V211.152C380.346 111.747 315.4650000000001 59.76 224.264 59.76zM16 0H432C440.837 0 448 -7.163 448 -16V-48C448 -56.837 440.837 -64 432 -64H16C7.163 -64 0 -56.837 0 -48V-16C0 -7.163 7.163 0 16 0z" />
+    <glyph glyph-name="undo-alt"
+      unicode="&#xF2EA;"
+      horiz-adv-x="512" d=" M255.545 440C189.276 439.881 129.107 413.767 84.685 371.315L48.971 407.029C33.851 422.149 8 411.4410000000001 8 390.059V256C8 242.745 18.745 232 32 232H166.059C187.441 232 198.149 257.851 183.03 272.971L141.28 314.721C172.144 343.62 212.081 359.628 254.51 359.9940000000001C346.908 360.7920000000001 424.793 286.017 423.9940000000001 190.552C423.236 99.991 349.816 24 256 24C214.873 24 176.003 38.678 145.37 65.556C140.627 69.717 133.464 69.464 129.002 65.003L89.34 25.341C84.468 20.469 84.709 12.526 89.822 7.908C133.798 -31.813 192.074 -56 256 -56C392.966 -56 503.999 55.033 504 191.998C504.001 328.807 392.354 440.245 255.545 440z" />
+    <glyph glyph-name="undo"
+      unicode="&#xF0E2;"
+      horiz-adv-x="512" d=" M212.333 223.667H12C5.373 223.667 0 229.04 0 235.667V436C0 442.627 5.373 448 12 448H60C66.627 448 72 442.627 72 436V357.8880000000001C117.773 408.721 184.26 440.53 258.175 439.993C395.081 438.999 504.623 328.37 504.332 191.461C504.041 54.742 393.12 -56 256.3330000000001 -56C192.244 -56 133.8370000000001 -31.687 89.823 8.215C84.724 12.837 84.489 20.769 89.356 25.635L123.323 59.602C127.7970000000001 64.076 134.9850000000001 64.319 139.7240000000001 60.127C170.76 32.664 211.58 16 256.3330000000001 16C353.601 16 432.3330000000001 94.716 432.3330000000001 192C432.3330000000001 289.267 353.617 368 256.3330000000001 368C197.837 368 146.053 339.524 114.059 295.6670000000001H212.333C218.96 295.6670000000001 224.333 290.294 224.333 283.6670000000001V235.667C224.333 229.04 218.96 223.667 212.333 223.667z" />
+    <glyph glyph-name="universal-access"
+      unicode="&#xF29A;"
+      horiz-adv-x="512" d=" M256 400C370.953 400 464 306.971 464 192C464 77.047 370.971 -16 256 -16C141.047 -16 48 77.029 48 192C48 306.953 141.029 400 256 400M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 384C149.961 384 64 298.039 64 192S149.961 0 256 0S448 85.961 448 192S362.039 384 256 384zM256 340C275.882 340 292 323.882 292 304S275.882 268 256 268S220 284.118 220 304S236.118 340 256 340zM373.741 241.977C345.029 235.198 318.23 229.229 291.601 226.17C292.452 125.1470000000001 303.907 103.118 316.638 70.549C320.255 61.289 315.681 50.851 306.421 47.234C297.16 43.617 286.722 48.191 283.105 57.451C274.4000000000001 79.759 266.019 98.087 260.844 136H251.158C245.991 98.149 237.624 79.792 228.896 57.451C225.281 48.196 214.846 43.615 205.581 47.234C196.321 50.8510000000001 191.747 61.29 195.364 70.549C208.077 103.09 219.549 125.09 220.401 226.1700000000001C193.772 229.2280000000001 166.973 235.1970000000001 138.26 241.9770000000001C129.66 244.0080000000001 124.334 252.6250000000001 126.365 261.226S137.012 275.1520000000001 145.614 273.1210000000001C242.3 250.2920000000001 269.897 250.338 366.389 273.1210000000001C374.988 275.1510000000001 383.6070000000001 269.827 385.6380000000001 261.226C387.6670000000001 252.6250000000001 382.341 244.0070000000001 373.7410000000001 241.9770000000001z" />
+    <glyph glyph-name="university"
+      unicode="&#xF19C;"
+      horiz-adv-x="512" d=" M496 320V304A8 8 0 0 0 488 296H464V284C464 277.373 458.627 272 452 272H60C53.373 272 48 277.373 48 284V296H24A8 8 0 0 0 16 304V320A8 8 0 0 0 20.941 327.392L252.941 415.392A7.996000000000001 7.996000000000001 0 0 0 259.0590000000001 415.392L491.059 327.392A8 8 0 0 0 496 320zM472 16H40C26.745 16 16 5.255 16 -8V-24A8 8 0 0 1 24 -32H488A8 8 0 0 1 496 -24V-8C496 5.255 485.255 16 472 16zM96 256V64H60C53.373 64 48 58.627 48 52V32H464V52C464 58.627 458.627 64 452 64H416V256H352V64H288V256H224V64H160V256H96z" />
+    <glyph glyph-name="unlink"
+      unicode="&#xF127;"
+      horiz-adv-x="512" d=" M304.0830000000001 42.093C308.769 37.407 308.769 29.809 304.0830000000001 25.122L259.4090000000001 -19.552C200.1460000000001 -78.814 103.716 -78.818 44.448 -19.552C-14.816 39.713 -14.816 136.144 44.448 195.4080000000001L89.123 240.0830000000001C93.809 244.7690000000001 101.407 244.7690000000001 106.094 240.0830000000001L145.692 200.485C150.3780000000001 195.799 150.3780000000001 188.201 145.692 183.514L101.017 138.84C72.945 110.7670000000001 72.945 65.09 101.017 37.0170000000001C129.089 8.9450000000001 174.7670000000001 8.9440000000001 202.841 37.0170000000001L247.5150000000001 81.691C252.2010000000001 86.377 259.7990000000001 86.377 264.4860000000001 81.691L304.0830000000001 42.093zM247.5150000000001 302.3090000000001C252.2010000000001 297.6230000000001 259.7990000000001 297.6230000000001 264.4860000000001 302.3090000000001L309.1600000000001 346.9830000000001C337.2320000000001 375.0580000000001 382.9100000000001 375.0560000000001 410.9840000000001 346.9830000000001C439.0560000000001 318.9100000000001 439.0560000000001 273.2330000000001 410.9840000000001 245.1600000000001L366.3090000000001 200.486C361.6230000000001 195.8 361.6230000000001 188.202 366.3090000000001 183.5150000000001L405.9070000000001 143.917C410.593 139.2310000000001 418.1910000000001 139.2310000000001 422.8780000000001 143.917L467.5530000000001 188.5920000000001C526.8180000000001 247.8570000000001 526.8180000000001 344.2870000000001 467.5530000000001 403.552C408.2870000000001 462.816 311.8580000000001 462.816 252.5920000000001 403.552L207.918 358.8780000000001C203.232 354.192 203.232 346.5940000000001 207.918 341.9070000000001L247.5150000000001 302.3090000000001zM482.3430000000001 -56.9709999999999L504.9700000000001 -34.3439999999999C514.3430000000001 -24.9709999999999 514.3430000000001 -9.7749999999999 504.9700000000001 -0.4029999999999L63.598 440.971C54.225 450.344 39.029 450.344 29.657 440.971L7.029 418.343C-2.344 408.9700000000001 -2.344 393.774 7.029 384.402L448.402 -56.971C457.775 -66.343 472.971 -66.343 482.343 -56.971z" />
+    <glyph glyph-name="unlock-alt"
+      unicode="&#xF13E;"
+      horiz-adv-x="448" d=" M400 192H152V295.1C152 334.7 183.7 367.6 223.3 368C263.3 368.4 296 335.9 296 296V280C296 266.7 306.7 256 320 256H352C365.3 256 376 266.7 376 280V296C376 380 307.5 448.3 223.5 448C139.5 447.7 72 378.5 72 294.5V192H48C21.5 192 0 170.5 0 144V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V144C448 170.5 426.5 192 400 192zM264 40C264 17.9 246.1 0 224 0S184 17.9 184 40V88C184 110.1 201.9 128 224 128S264 110.1 264 88V40z" />
+    <glyph glyph-name="unlock"
+      unicode="&#xF09C;"
+      horiz-adv-x="448" d=" M400 192H152V295.1C152 334.7 183.7 367.6 223.3 368C263.3 368.4 296 335.9 296 296V280C296 266.7 306.7 256 320 256H352C365.3 256 376 266.7 376 280V296C376 380 307.5 448.3 223.5 448C139.5 447.7 72 378.5 72 294.5V192H48C21.5 192 0 170.5 0 144V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V144C448 170.5 426.5 192 400 192z" />
+    <glyph glyph-name="upload"
+      unicode="&#xF093;"
+      horiz-adv-x="512" d=" M296 64H216C202.7 64 192 74.7 192 88V256H104.3C86.5 256 77.6 277.5 90.2 290.1L242.3 442.3C249.8 449.8 262.1 449.8 269.6 442.3L421.8 290.1C434.4000000000001 277.5 425.5 256 407.7 256H320V88C320 74.7 309.3 64 296 64zM512 72V-40C512 -53.3 501.3 -64 488 -64H24C10.7 -64 0 -53.3 0 -40V72C0 85.3 10.7 96 24 96H160V88C160 57.1 185.1 32 216 32H296C326.9 32 352 57.1 352 88V96H488C501.3 96 512 85.3 512 72zM388 -16C388 -5 379 4 368 4S348 -5 348 -16S357 -36 368 -36S388 -27 388 -16zM452 -16C452 -5 443 4 432 4S412 -5 412 -16S421 -36 432 -36S452 -27 452 -16z" />
+    <glyph glyph-name="user-circle"
+      unicode="&#xF2BD;"
+      horiz-adv-x="512" d=" M8 192C8 328.967 119.033 440 256 440S504 328.967 504 192S392.967 -56 256 -56S8 55.033 8 192zM80.455 66.132C119.657 11.554 183.673 -24 256 -24S392.343 11.554 431.545 66.132C428.404 93.122 408.878 115.78 382.007 122.498L349.6329999999999 130.591C323.565 108.21 290.722 96 256 96S188.435 108.21 162.366 130.591L129.992 122.498C103.122 115.78 83.596 93.122 80.455 66.132zM144 240C144 178.144 194.144 128 256 128S368 178.144 368 240S317.856 352 256 352S144 301.856 144 240z" />
+    <glyph glyph-name="user-md"
+      unicode="&#xF0F0;"
+      horiz-adv-x="448" d=" M224 192C294.7 192 352 249.3 352 320S294.7 448 224 448S96 390.7 96 320S153.3 192 224 192zM104 24C104 10.7 114.7 0 128 0S152 10.7 152 24S141.3 48 128 48S104 37.3 104 24zM354.4 175.6L320 181.3V126.3C356.5 118.9 384 86.5 384 47.9V-8.1C384 -15.7 378.6 -22.3 371.1 -23.8L338.9000000000001 -30.2C334.6 -31.1 330.4000000000001 -28.3 329.5000000000001 -23.9L326.4000000000001 -8.2C325.5000000000001 -3.9 328.3 0.4 332.7000000000001 1.2L352.0000000000001 5.1V48C352.0000000000001 77.6 325.1000000000001 101 294.4000000000001 95.1C271.6 90.7000000000001 256.0000000000001 69.3 256.0000000000001 46.1V5.1L275.3000000000001 1.2C279.6000000000001 0.3000000000001 282.4000000000001 -3.9 281.6000000000001 -8.1999999999999L278.5000000000001 -23.8999999999999C277.6000000000001 -28.1999999999999 273.4000000000001 -30.9999999999999 269.1000000000001 -30.1999999999999L237.9000000000001 -25.9999999999999C230.0000000000001 -24.8999999999999 224.1000000000001 -18.1999999999999 224.1000000000001 -10.1V47.9C224.1000000000001 86.5000000000001 251.6000000000001 118.8000000000001 288.1000000000001 126.3000000000001V173.5000000000001C268.5000000000001 164.9 246.9000000000001 159.9 224.1000000000001 159.9C194.8000000000001 159.9 167.7000000000001 168.4 144.1000000000001 182.2000000000001V77.3000000000001C167.2000000000001 70.4000000000001 184.1000000000001 49.2 184.1000000000001 23.9000000000001C184.1000000000001 -6.9999999999999 159.0000000000001 -32.0999999999999 128.1000000000001 -32.0999999999999S72.1000000000001 -6.9999999999999 72.1000000000001 23.9000000000001C72.1000000000001 49.2000000000001 89.0000000000001 70.4000000000001 112.1000000000001 77.3000000000001V178.7L93.7000000000001 175.6C39.7000000000001 166.6 0.1000000000001 119.9 0.1000000000001 65.1V-32C0.1000000000001 -49.7 14.4000000000001 -64 32.1000000000001 -64H416.1000000000001C433.8000000000001 -64 448.1000000000001 -49.7 448.1000000000001 -32V65.1C448.0000000000001 119.9 408.4000000000001 166.6 354.4000000000001 175.6z" />
+    <glyph glyph-name="user-plus"
+      unicode="&#xF234;"
+      horiz-adv-x="640" d=" M224 416C301.32 416 364 353.32 364 276S301.32 136 224 136S84 198.68 84 276S146.68 416 224 416zM384.373 123.907L321.974 139.507C256.417 92.353 176.953 102.876 126.026 139.507L63.627 123.907C26.233 114.558 0 80.96 0 42.415V10C0 -13.196 18.804 -32 42 -32H406C429.1960000000001 -32 448 -13.196 448 10V42.415C448 80.96 421.767 114.558 384.373 123.9070000000001zM628 223.111H559.111V292C559.111 298.627 553.7379999999999 304 547.111 304H508.889C502.262 304 496.889 298.627 496.889 292L496.887 223.113L428 223.111C421.373 223.111 416 217.738 416 211.111V172.889C416 166.262 421.373 160.889 428 160.889L496.887 160.887L496.889 92C496.889 85.373 502.262 80 508.889 80H547.111C553.7379999999999 80 559.111 85.373 559.111 92L559.1129999999999 160.887L628 160.889C634.627 160.889 640 166.262 640 172.889V211.111C640 217.738 634.627 223.111 628 223.111z" />
+    <glyph glyph-name="user-secret"
+      unicode="&#xF21B;"
+      horiz-adv-x="448" d=" M388.829 152.676L409.801 207.728C412.793 215.582 406.992 224 398.587 224H340.39C347.84 240.236 352 258.297 352 277.333C352 280.964 351.84 284.557 351.544 288.111C391.0830000000001 295.926 416 307.3160000000001 416 320C416 333.2630000000001 388.769 345.112 346.053 352.937C336.868 385.742 318.875 418.734 305.339 435.787C295.887 447.695 279.466 451.421 265.868 444.621L238.311 430.842A31.997 31.997 0 0 0 209.689 430.842L182.132 444.622C168.5330000000001 451.421 152.112 447.696 142.661 435.788C129.125 418.735 111.132 385.743 101.947 352.938C59.231 345.112 32 333.2630000000001 32 320C32 307.3160000000001 56.917 295.926 96.456 288.111A129.362 129.362 0 0 1 96 277.333C96 258.296 100.159 240.235 107.608 224H50.198C41.583 224 35.775 215.192 39.169 207.273L62.075 153.826C25.799 140.118 0 105.075 0 64V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V64C448 103.97 423.57 138.231 388.829 152.676zM184 -40L136 152L184 128L208 88L184 -40zM264 -40L240 88L264 128L312 152L264 -40zM318.778 263.746C318.7700000000001 263.703 314.4790000000001 260.515 313.653 257.975C309.7920000000001 246.111 306.627 233.403 297.139 224.616C287.068 215.289 249.182 202.211 233.143 249.645C230.306 258.04 217.696 258.043 214.858 249.645C197.895 199.477 158.839 217.228 150.862 224.616C141.374 233.402 138.209 246.111 134.348 257.975C133.522 260.515 129.23 263.703 129.223 263.746C128.669 266.671 128.242 269.63 128.003 272.596C127.694 276.444 138.081 276.254 139.081 276.343C165.384 278.669 191.384 276.922 217.104 270.846C219.667 270.24 228.657 270.317 230.897 270.846C256.617 276.9219999999999 282.617 278.67 308.92 276.343C309.922 276.254 320.307 276.445 319.998 272.596C319.759 269.63 319.332 266.671 318.7779999999999 263.746z" />
+    <glyph glyph-name="user-times"
+      unicode="&#xF235;"
+      horiz-adv-x="640" d=" M224 416C301.32 416 364 353.32 364 276S301.32 136 224 136S84 198.68 84 276S146.68 416 224 416zM384.373 123.907L321.974 139.507C256.417 92.353 176.953 102.876 126.026 139.507L63.627 123.907C26.233 114.558 0 80.96 0 42.415V10C0 -13.196 18.804 -32 42 -32H406C429.1960000000001 -32 448 -13.196 448 10V42.415C448 80.96 421.767 114.558 384.373 123.9070000000001zM587.897 192L636.493 240.598C641.168 245.273 641.168 252.854 636.493 257.529L609.529 284.4930000000001C604.854 289.168 597.273 289.168 592.598 284.4930000000001L544 235.895L495.402 284.493C490.727 289.168 483.146 289.168 478.471 284.493L451.507 257.529C446.832 252.854 446.832 245.273 451.507 240.598L500.103 192L451.507 143.402C446.832 138.727 446.832 131.146 451.507 126.471L478.471 99.507C483.146 94.832 490.727 94.832 495.402 99.507L544 148.103L592.598 99.507C597.2729999999999 94.832 604.8539999999999 94.832 609.529 99.507L636.4929999999999 126.471C641.1679999999999 131.146 641.1679999999999 138.727 636.4929999999999 143.402L587.897 192z" />
+    <glyph glyph-name="user"
+      unicode="&#xF007;"
+      horiz-adv-x="512" d=" M256 448C344.366 448 416 376.366 416 288S344.366 128 256 128S96 199.634 96 288S167.634 448 256 448zM439.283 114.179L367.9700000000001 132.007C293.0470000000001 78.117 202.232 90.143 144.03 132.007L72.717 114.179C29.981 103.495 0 65.097 0 21.045V-16C0 -42.51 21.49 -64 48 -64H464C490.51 -64 512 -42.51 512 -16V21.045C512 65.097 482.019 103.495 439.283 114.179z" />
+    <glyph glyph-name="users"
+      unicode="&#xF0C0;"
+      horiz-adv-x="640" d=" M320 384C377.99 384 425 336.99 425 279S377.99 174 320 174S215 221.01 215 279S262.01 384 320 384zM433.463 166.634L393.481 176.63C344.313 141.265 284.715 149.157 246.52 176.63L206.538 166.634C174.485 158.621 152 129.823 152 96.784V36C152 16.118 168.118 0 188 0H452C471.882 0 488 16.118 488 36V96.784C488 129.823 465.515 158.621 433.463 166.634zM528 148C566.66 148 598 179.34 598 218S566.66 288 528 288S458 256.66 458 218S489.34 148 528 148zM112 148C150.66 148 182 179.34 182 218S150.66 288 112 288S42 256.66 42 218S73.34 148 112 148zM136 36V96.784C136 113.335 140.593 128.988 148.703 142.383C118.715 127.663 85.367 133.675 63.013 149.753L36.358 143.089C14.99 137.748 0 118.548 0 96.523V56C0 42.745 10.745 32 24 32H136.169A52.417 52.417 0 0 0 136 36zM603.642 143.09L576.9870000000001 149.754C549.0620000000001 129.668 516.0970000000001 130.521 491.2010000000001 142.536C499.369 129.107 504 113.399 504 96.784V36C504 34.653 503.932 33.322 503.831 32H616C629.255 32 640 42.745 640 56V96.523C640 118.548 625.01 137.7480000000001 603.642 143.09z" />
+    <glyph glyph-name="utensil-spoon"
+      unicode="&#xF2E5;"
+      horiz-adv-x="512" d=" M480.1 416.1C425.1 471.2 315.2000000000001 450.6 252.3 387.6C203 338.3 197.2 277.6 223.5 227.2L9 34.8C-2.6 24.3 -3.1 6.3 8 -4.7L59.3 -56C70.3 -67 88.4 -66.5 98.8 -54.9L291.2 159.5C341.6 133.2 402.3 139 451.6 188.3C514.6 251.2 535.2 361.1 480.1 416.1z" />
+    <glyph glyph-name="utensils"
+      unicode="&#xF2E7;"
+      horiz-adv-x="416" d=" M207.9 432.8C208.7 428.1 224 338.3 224 304C224 251.7 196.2 214.4 155.1 199.4L168 -38.7C168.7 -52.4 157.8 -64 144 -64H80C66.3 -64 55.3 -52.5 56 -38.7L68.9 199.4C27.7 214.4 0 251.8 0 304C0 338.4 15.3 428.1 16.1 432.8C19.3 453.1 61.4 453.4 64 431.7V290.5C65.3 287.1 79.1 287.3 80 290.5C81.4 315.8 87.9 429.7 88 432.3C91.3 453.1 132.7 453.1 135.9 432.3C136.1 429.6 142.5 315.8 143.9 290.5C144.8 287.3 158.7 287.1 159.9 290.5V431.7C162.5 453.3 204.7 453.1 207.9 432.8zM327.1 147.1L312.1 -38C310.9000000000001 -52 322 -64 336 -64H392C405.3 -64 416 -53.3 416 -40V424C416 437.2 405.3 448 392 448C309.5 448 170.6 269.5 327.1 147.1z" />
+    <glyph glyph-name="venus-double"
+      unicode="&#xF226;"
+      horiz-adv-x="512" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V80H76C69.4 80 64 74.6 64 68V28C64 21.4 69.4 16 76 16H112V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V16H212C218.6 16 224 21.4 224 28V68C224 74.6 218.6 80 212 80H176V131.6C240.1 146.1 288 203.5 288 272zM64 272C64 316.1 99.9 352 144 352S224 316.1 224 272S188.1 192 144 192S64 227.9 64 272zM400 131.6V80H436C442.6 80 448 74.6 448 68V28C448 21.4 442.6 16 436 16H400V-20C400 -26.6 394.6 -32 388 -32H348C341.4 -32 336 -26.6 336 -20V16H300C293.4 16 288 21.4 288 28V68C288 74.6 293.4 80 300 80H336V131.6C314.8 136.4 295.4 145.9 278.8 158.9C292.8 175.6 303.8 194.9 310.9000000000001 216C325.4000000000001 201.2 345.6 192 368.0000000000001 192C412.1000000000001 192 448.0000000000001 227.9000000000001 448.0000000000001 272S412.1000000000001 352 368.0000000000001 352C345.7000000000001 352 325.4000000000001 342.8 310.9000000000001 328C303.8 349.1 292.9000000000001 368.4000000000001 278.8 385.1C303.4 404.4 334.3 416 368 416C447.5 416 512 351.5 512 272C512 203.5 464.1 146.1 400 131.6z" />
+    <glyph glyph-name="venus-mars"
+      unicode="&#xF228;"
+      horiz-adv-x="576" d=" M564 448H485C474.3 448 469 435.1 476.5 427.5L493.4 410.6L444.7 361.9C422.5 375.9 396.2 384 368 384C334.3 384 303.4 372.4 278.8 353.1C292.8 336.4 303.8 317.1 310.9000000000001 296C325.4000000000001 310.8 345.6 320 368.0000000000001 320C412.1000000000001 320 448.0000000000001 284.1 448.0000000000001 240S412.1000000000001 160 368.0000000000001 160C345.7000000000001 160 325.4000000000001 169.2 310.9000000000001 184C303.8 162.9 292.9000000000001 143.6 278.8 126.9C303.3 107.5 334.3 96 368 96C447.5 96 512 160.5 512 240C512 268.2 503.9 294.5 489.9 316.7L538.6 365.4L555.5 348.5C557.9 346.1 560.9 345 563.9 345C570.1 345 576 349.8 576 357V436C576 442.6 570.6 448 564 448zM144 384C64.5 384 0 319.5 0 240C0 171.5 47.9 114.1 112 99.6V48H76C69.4 48 64 42.6 64 36V-4C64 -10.6 69.4 -16 76 -16H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-16H212C218.6 -16 224 -10.6 224 -4V36C224 42.6 218.6 48 212 48H176V99.6C240.1 114.2000000000001 288 171.5 288 240.0000000000001C288 319.5 223.5 384 144 384zM144 160C99.9 160 64 195.9 64 240S99.9 320 144 320S224 284.1 224 240S188.1 160 144 160z" />
+    <glyph glyph-name="venus"
+      unicode="&#xF221;"
+      horiz-adv-x="288" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V80H76C69.4 80 64 74.6 64 68V28C64 21.4 69.4 16 76 16H112V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V16H212C218.6 16 224 21.4 224 28V68C224 74.6 218.6 80 212 80H176V131.6C240.1 146.1 288 203.5 288 272zM64 272C64 316.1 99.9 352 144 352S224 316.1 224 272S188.1 192 144 192S64 227.9 64 272z" />
+    <glyph glyph-name="vial"
+      unicode="&#xF492;"
+      horiz-adv-x="480" d=" M477.7 261.9L309.5 429.7C306.4 432.8 301.3 432.8 298.2 429.7L264.2 395.8C261.1 392.7 261.1 387.6 264.2 384.5L275.4 373.4L33 131.5C-5.8 92.8 -12.1 29.5 23.6 -12C44.2 -36 73.1 -48 102 -47.9C128.4 -47.9 154.8 -37.9 174.9 -17.8L421.2000000000001 227.9000000000001L432.4000000000001 216.8000000000001C435.5000000000001 213.7000000000001 440.6 213.7000000000001 443.7000000000001 216.8000000000001L477.7 250.7000000000001C480.8000000000001 253.7000000000001 480.8000000000001 258.8000000000001 477.7 261.9000000000001zM318 192H161L309 339.7L387.5 261.4L318 192z" />
+    <glyph glyph-name="vials"
+      unicode="&#xF493;"
+      horiz-adv-x="640" d=" M72 384H96V144C96 99.9 131.9 64 176 64S256 99.9 256 144V384H280C284.4 384 288 387.6 288 392V440C288 444.4 284.4 448 280 448H72C67.6 448 64 444.4 64 440V392C64 387.6 67.6 384 72 384zM144 384H208V288H144V384zM624 0H16C7.2 0 0 -7.2 0 -16V-48C0 -56.8 7.2 -64 16 -64H624C632.8 -64 640 -56.8 640 -48V-16C640 -7.2 632.8 0 624 0zM360 384H384V144C384 99.9 419.9 64 464 64S544 99.9 544 144V384H568C572.4 384 576 387.6 576 392V440C576 444.4 572.4 448 568 448H360C355.6 448 352 444.4 352 440V392C352 387.6 355.6 384 360 384zM432 384H496V288H432V384z" />
+    <glyph glyph-name="video-slash"
+      unicode="&#xF4E2;"
+      horiz-adv-x="640" d=" M633.8 -10.1L578.8 32.4C594.1999999999999 33.8 608 46.1 608 63.5V320.5C608 346 578.9 360.9 557.6 346.3L448 270.7V133.5L416 158.2V336.2C416 362.6 394.6 384 368.2 384H123.9L45.5 444.6C38.5 450 28.5 448.8 23 441.8L3.4 416.6C-2 409.6 -0.8 399.6 6.2 394.2L42.7 366L416 77.4L594.5 -60.6C601.5 -66 611.5 -64.8000000000001 617 -57.8L636.6 -32.5C642.1 -25.6 640.8000000000001 -15.5 633.8000000000001 -10.1zM32 47.8C32 21.4 53.4 0 79.8 0H368.2C379.4 0 389.6 4 397.8 10.5L32 293.3V47.8z" />
+    <glyph glyph-name="video"
+      unicode="&#xF03D;"
+      horiz-adv-x="576" d=" M336.2 384H47.8C21.4 384 0 362.6 0 336.2V47.8C0 21.4 21.4 0 47.8 0H336.2C362.6 0 384 21.4 384 47.8V336.2C384 362.6 362.6 384 336.2 384zM525.6 346.3L416 270.7V113.3L525.6 37.8C546.8000000000001 23.1999999999999 576 38.1 576 63.6V320.5C576 345.9 546.9 360.9 525.6 346.3z" />
+    <glyph glyph-name="volleyball-ball"
+      unicode="&#xF45F;"
+      horiz-adv-x="495.9" d=" M223.3 204.6C222.4 241.6 214.7 277.4 200.6 310.3C109.8 267.9 43.1 187.9 20.3 93.5C33.7 62.7 53.2 35.2 77.2 12.4C99.9 91.6 151.4 160.2 223.3 204.6zM186.4 339C171.4 365.4 151.9 389.1 129 409.7C38 359.9 -15.8 256.8 4 147.5C37.4 230.6 102.4 299.5 186.4 339zM374 173.9C382.6 273.7 346.7 371.4 276.5 438.3C261.8 440 224.9 443.8 177.6 429.8C234.9 370.5 268.6 291.6 271.1 207.1C303.6 189.4 338.4000000000001 178.1 374 173.9zM249.3 164.4C217.7 145.1 190.6 120.5 169.1 91.8C251.1 34.4999999999999 353.6 16.6999999999999 446.6 43.9999999999999C466.3 70.3999999999999 480.8 100.8 488.8 133.9C462.2 127.3 435.1 123.5 407.9 123.5C353.3 123.6 299 137.6 249.3 164.4zM151 64.7C135.8 38.7 125.3 10.3 118.9 -19.5C156.5 -42.5 200.6 -56 248 -56C309 -56 364.7 -33.9 407.9 2.6C295 -13.5 204.6 27.4 151 64.7zM331.3 425.3C386.6 354.9 413.8 264.1 405.9 171.7C436.2 171.5 466.4 176.5 495.6 185.9C495.6 187.9 495.9 189.9 495.9 191.9C495.9 299.7 427.2 391 331.3 425.3z" />
+    <glyph glyph-name="volume-down"
+      unicode="&#xF027;"
+      horiz-adv-x="384" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983zM384 192C384 225.717 366.814 256.35 338.028 273.944C322.949 283.158 303.2530000000001 278.4070000000001 294.036 263.3280000000001S289.572 228.5530000000001 304.651 219.3360000000001C314.263 213.462 320 203.243 320 192A32.056 32.056 0 0 0 306.198 165.668C291.674 155.599 288.062 135.662 298.131 121.138C308.201 106.6130000000001 328.139 103.002 342.661 113.071C368.546 131.017 384 160.522 384 192z" />
+    <glyph glyph-name="volume-off"
+      unicode="&#xF026;"
+      horiz-adv-x="256" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983z" />
+    <glyph glyph-name="volume-up"
+      unicode="&#xF028;"
+      horiz-adv-x="576" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983zM438.0560000000001 437.8590000000001C422.9820000000001 447.08 403.283 442.332 394.061 427.255C384.84 412.178 389.588 392.481 404.665 383.26C468.967 343.937 512 273.017 512 192C512 118.569 475.923 49.708 415.493 7.794C400.971 -2.278 397.364 -22.216 407.436 -36.738C417.512 -51.266 437.452 -54.864 451.967 -44.795C529.633 9.073 576 97.594 576 192C576 295.2440000000001 521.421 386.877 438.0560000000001 437.8590000000001zM480 192C480 260.5470000000001 443.85 321.777 388.043 355.901C372.967 365.121 353.269 360.372 344.049 345.294C334.829 330.216 339.578 310.52 354.656 301.3C393.067 277.812 416 236.952 416 192C416 150.036 395.38 110.681 360.842 86.724C346.321 76.651 342.714 56.714 352.786 42.192C359.002 33.232 368.971 28.427 379.108 28.427A31.861999999999995 31.861999999999995 0 0 1 397.318 34.136C449.091 70.047 480 129.062 480 192zM384 192C384 225.717 366.814 256.35 338.028 273.944C322.949 283.158 303.2530000000001 278.4070000000001 294.036 263.3280000000001S289.572 228.5530000000001 304.651 219.3360000000001C314.263 213.462 320 203.243 320 192A32.056 32.056 0 0 0 306.198 165.668C291.674 155.599 288.062 135.662 298.131 121.138C308.201 106.6130000000001 328.139 103.002 342.661 113.071C368.546 131.017 384 160.522 384 192z" />
+    <glyph glyph-name="warehouse"
+      unicode="&#xF494;"
+      horiz-adv-x="640" d=" M504 96H136.4C132 96 128.4 92.4 128.4 88L128.3 40C128.3 35.6 131.9 32 136.3 32H504C508.4 32 512 35.6 512 40V88C512 92.4 508.4 96 504 96zM504 0H136.1C131.7 0 128.1 -3.6 128.1 -8L128 -56C128 -60.4 131.6 -64 136 -64H504C508.4 -64 512 -60.4 512 -56V-8C512 -3.6 508.4 0 504 0zM504 192H136.6C132.2 192 128.6 188.4 128.6 184L128.5 136C128.5 131.6 132.1 128 136.5 128H504C508.4 128 512 131.6 512 136V184C512 188.4 508.4 192 504 192zM610.5 331L338.4 444.3A48.15 48.15 0 0 1 301.5 444.3L29.5 331C11.7 323.5 0 306.1 0 286.7V-56C0 -60.4 3.6 -64 8 -64H88C92.4 -64 96 -60.4 96 -56V192C96 209.6 110.6 224 128.6 224H511.4C529.4 224 544 209.6 544 192V-56C544 -60.4 547.6 -64 552 -64H632C636.4 -64 640 -60.4 640 -56V286.7C640 306.1 628.3 323.5 610.5 331z" />
+    <glyph glyph-name="weight"
+      unicode="&#xF496;"
+      horiz-adv-x="512" d=" M448 384H422C438.4 355.7 448 323 448 288C448 182.1 361.9 96 256 96S64 182.1 64 288C64 323 73.6 355.7 90 384H64C28.7 384 0 355.3 0 320V0C0 -35.3 28.7 -64 64 -64H448C483.3 -64 512 -35.3 512 0V320C512 355.3 483.3 384 448 384zM256 128C344.4 128 416 199.6 416 288S344.4 448 256 448S96 376.4 96 288S167.6 128 256 128zM255.7 279.9L289.3 358.3C292.8 366.5 302.2 370.2000000000001 310.3 366.7000000000001S322.2 353.8 318.7 345.7000000000001L285 267.1C291.7 260 295.9 250.5 295.9 240C295.9 217.9 278 200 255.9 200S215.9 217.9 215.9 240C216 262 233.8 279.8 255.7 279.9z" />
+    <glyph glyph-name="wheelchair"
+      unicode="&#xF193;"
+      horiz-adv-x="512" d=" M496.101 62.331L510.328 33.668C514.257 25.753 511.025 16.152 503.11 12.223L437.645 -20.663C421.596 -28.63 402.089 -21.857 394.456 -5.608L331.679 128H192C176.075 128 162.574 139.71 160.321 155.475C126.433 392.692 128.38 377.956 128 384C128 420.358 158.318 449.635 195.052 447.929C228.3230000000001 446.384 255.1 419.024 255.9770000000001 385.728C256.8450000000001 352.795 232.8250000000001 325.305 201.369 320.689L206.039 287.999H336C344.837 287.999 352 280.836 352 271.999V239.999C352 231.162 344.837 223.999 336 223.999H215.182L219.754 191.999H352A32 32 0 0 0 380.962 173.607L438.477 51.2L474.655 69.549C482.57 73.478 492.172 70.246 496.101 62.331zM311.358 96H286.852C279.064 41.796 232.324 0 176 0C114.243 0 64 50.243 64 112C64 153.505 86.694 189.809 120.324 209.156C116.612 235.121 113.48 257.016 110.836 275.4890000000001C45.956 249.536 0 186.037 0 112C0 14.953 78.953 -64 176 -64C247.87 -64 309.8060000000001 -20.692 337.11 41.192L311.358 96z" />
+    <glyph glyph-name="wifi"
+      unicode="&#xF1EB;"
+      horiz-adv-x="640" d=" M384 32C384 -3.346 355.346 -32 320 -32S256 -3.346 256 32C256 67.346 284.654 96 320 96S384 67.346 384 32zM520.659 156.443C527.124 162.908 526.904 173.508 520.095 179.61C406.302 281.5950000000001 233.569 281.4790000000001 119.905 179.61C113.096 173.5080000000001 112.876 162.908 119.341 156.443L153.347 122.437C159.274 116.51 168.811 116.117 175.1160000000001 121.641C257.9960000000001 194.25 382.1900000000001 194.088 464.884 121.641C471.189 116.117 480.726 116.509 486.653 122.437L520.659 156.443zM632.769 270.161C639.154 276.546 639.023 286.977 632.419 293.134C456.651 456.994 183.285 456.934 7.582 293.134C0.978 286.977 0.847 276.545 7.232 270.161L41.198 236.195C47.293 230.1 57.089 229.964 63.422 235.812C208.185 369.48 431.778 369.514 576.578 235.812C582.911 229.964 592.707 230.1 598.802 236.195L632.769 270.161z" />
+    <glyph glyph-name="window-close"
+      unicode="&#xF410;"
+      horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM380.4 125.5C385.2 120.7 385.2 112.9 380.4 108.1L339.9 67.6C335.1 62.8 327.3 62.8 322.5 67.6L256 134.7L189.5 67.6C184.7 62.8 176.9 62.8 172.1 67.6L131.6 108.1C126.8 112.9 126.8 120.7000000000001 131.6 125.5L198.7 192L131.6 258.5C126.8 263.3 126.8 271.1 131.6 275.9L172.1 316.4C176.9 321.2 184.7 321.2 189.5 316.4L256 249.3L322.5 316.4C327.3 321.2 335.1 321.2 339.9 316.4L380.4 275.9C385.2 271.1 385.2 263.3 380.4 258.5L313.3 192L380.4 125.5z" />
+    <glyph glyph-name="window-maximize"
+      unicode="&#xF2D0;"
+      horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM448 256H64V340C64 346.6 69.4 352 76 352H436C442.6 352 448 346.6 448 340V256z" />
+    <glyph glyph-name="window-minimize"
+      unicode="&#xF2D1;"
+      horiz-adv-x="512" d=" M464 96H48C21.5 96 0 74.5 0 48V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V48C512 74.5 490.5 96 464 96z" />
+    <glyph glyph-name="window-restore"
+      unicode="&#xF2D2;"
+      horiz-adv-x="512" d=" M512 400V112C512 85.5 490.5 64 464 64H416V272C416 316.1 380.1 352 336 352H128V400C128 426.5 149.5 448 176 448H464C490.5 448 512 426.5 512 400zM384 272V-16C384 -42.5 362.5 -64 336 -64H48C21.5 -64 0 -42.5 0 -16V272C0 298.5 21.5 320 48 320H336C362.5 320 384 298.5 384 272zM316 244C316 250.6 310.6 256 304 256H76C69.4 256 64 250.6 64 244V192H316V244z" />
+    <glyph glyph-name="wine-glass"
+      unicode="&#xF4E3;"
+      horiz-adv-x="288" d=" M287.4 255.3L271.4 433.4C270.7 441.7 263.9 448 255.7 448H32.3C24.1 448 17.3 441.7 16.6 433.4L0.6 255.3C-6.6 175.3 51.3 106.4 128 97.7000000000001V-32H74.1C49.6 -32 40.9 -64 54.1 -64H233.9C247 -64 238.4 -32 213.9 -32H160V97.7C236.7 106.5 294.6 175.3 287.4 255.3zM226.2 400L233.4 320H54.6L61.8 400H226.2z" />
+    <glyph glyph-name="won-sign"
+      unicode="&#xF159;"
+      horiz-adv-x="576" d=" M564 256C570.627 256 576 261.373 576 268V308C576 314.627 570.627 320 564 320H515.972L534.544 400.61C536.276 408.128 530.566 415.304 522.851 415.304H476.744A11.998 11.998 0 0 1 465.008 405.804L450.73 320H340.839L321.114 405.987A12 12 0 0 1 309.418 415.304H265.43A12 12 0 0 1 253.743 406.027L233.696 320H124.975L107.5 405.701A12 12 0 0 1 95.742 415.303H53.628C45.942 415.303 40.238 408.179 41.919 400.679L60 320H12C5.373 320 0 314.627 0 308V268C0 261.373 5.373 256 12 256H74.342L81.513 224H12C5.373 224 0 218.627 0 212V172C0 165.373 5.373 160 12 160H95.856L136.783 -22.624A12 12 0 0 1 148.492 -32H205.259C210.842 -32 215.687 -28.15 216.948 -22.712L259.335 160H314.421L356.807 -22.712A12 12 0 0 1 368.496 -32H425.322A12 12 0 0 1 437.016 -22.694L479.108 160H564C570.627 160 576 165.373 576 172V212C576 218.627 570.627 224 564 224H493.854L501.227 256H564zM138.024 256H218.781L211.324 224H144.548L138.024 256zM183.82 105.971C177.626 80.14 177.062 58.721 176.499 58.721H175.373S173.684 80.771 168.615 105.971L157.599 160H196.411L183.82 105.971zM274.182 224L276.178 232.602C278.034 240.564 279.635 248.57 280.981 256H292.775C294.122 248.57 295.722 240.564 297.578 232.602L299.574 224H274.182zM405.141 105.971C400.0730000000001 80.771 398.3830000000001 58.721 398.3830000000001 58.721H397.2570000000001C396.6940000000001 58.721 396.1310000000001 80.141 389.9360000000001 105.971L377.542 160H416.649L405.141 105.971zM430.281 224H362.861L355.521 256H437.098L430.281 224z" />
+    <glyph glyph-name="wrench"
+      unicode="&#xF0AD;"
+      horiz-adv-x="512" d=" M481.156 248C490.456 248 496.276 237.845 491.481 229.876C466.295 188.008 420.419 160 368 160C288.778 160 224.499 223.974 224.003 303.079C223.505 382.531 288.548 448.001 368.002 448C420.3640000000001 447.999 466.198 420.051 491.402 378.257C496.24 370.234 490.523 360 481.154 360H376L336 304L376 248H481.156zM309.507 154.997L109.255 -45.255C84.261 -70.248 43.74 -70.249 18.745 -45.255C-6.248 -20.261 -6.248 20.261 18.745 45.255L218.991 245.5C235.151 204.303 268.294 171.165 309.507 154.997zM104 16C104 29.255 93.255 40 80 40S56 29.255 56 16S66.745 -8 80 -8S104 2.745 104 16z" />
+    <glyph glyph-name="x-ray"
+      unicode="&#xF497;"
+      horiz-adv-x="640" d=" M240 64C231.2 64 224 56.8 224 48S231.2 32 240 32S256 39.2 256 48S248.8 64 240 64zM400 32C408.8 32 416 39.2 416 48S408.8 64 400 64S384 56.8 384 48S391.2 32 400 32zM624 448H16C7.2 448 0 440.8 0 432V400C0 391.2 7.2 384 16 384H624C632.8 384 640 391.2 640 400V432C640 440.8 632.8 448 624 448zM624 0H576V352H64V0H16C7.2 0 0 -7.2 0 -16V-48C0 -56.8 7.2 -64 16 -64H624C632.8 -64 640 -56.8 640 -48V-16C640 -7.2 632.8 0 624 0zM480 200C480 195.6 476.4 192 472 192H336V160H440C444.4 160 448 156.4 448 152V136C448 131.6 444.4 128 440 128H336V96H400C426.5 96 448 74.5 448 48S426.5 0 400 0S352 21.5 352 48V64H288V48C288 21.5 266.5 0 240 0S192 21.5 192 48S213.5 96 240 96H304V128H200C195.6 128 192 131.6 192 136V152C192 156.4 195.6 160 200 160H304V192H168C163.6 192 160 195.6 160 200V216C160 220.4 163.6 224 168 224H304V256H200C195.6 256 192 259.6 192 264V280C192 284.4 195.6 288 200 288H304V312C304 316.4 307.6 320 312 320H328C332.4 320 336 316.4 336 312V288H440C444.4 288 448 284.4 448 280V264C448 259.6 444.4 256 440 256H336V224H472C476.4 224 480 220.4 480 216V200z" />
+    <glyph glyph-name="yen-sign"
+      unicode="&#xF157;"
+      horiz-adv-x="384" d=" M351.2080000000001 416H285.9310000000001A12 12 0 0 1 275.153 409.276L219.763 296.113C205.25 261.409 192.63 224.181 192.63 224.181H191.368S178.748 261.409 164.235 296.113L108.845 409.276A11.997 11.997 0 0 1 98.068 416H32.792C23.735 416 17.942 406.35 22.202 398.357L102.322 248H44C37.373 248 32 242.627 32 236V204C32 197.373 37.373 192 44 192H132.162L152 154.772V128H44C37.373 128 32 122.627 32 116V84C32 77.373 37.373 72 44 72H152V-20C152 -26.627 157.373 -32 164 -32H220C226.627 -32 232 -26.627 232 -20V72H340C346.627 72 352 77.373 352 84V116C352 122.627 346.627 128 340 128H232V154.772L251.838 192H340C346.627 192 352 197.373 352 204V236C352 242.627 346.627 248 340 248H281.678L361.798 398.357C366.058 406.35 360.266 416 351.2080000000001 416z" />
+  </font>
+</defs>
+</svg>
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.ttf b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..7ab3e61124dfa3537c3b0a8939672a71958688d4
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.ttf differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff
new file mode 100644
index 0000000000000000000000000000000000000000..9e391695dc391aa5002f92eaed6e5eaef80bd048
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff differ
diff --git a/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff2 b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..3d2add48cefdb7843e19fc5a918e549027fece61
Binary files /dev/null and b/vendor/font-awesome/5.0.9/web-fonts-with-css/webfonts/fa-solid-900.woff2 differ
diff --git a/vendor/jquery/3.2.1/core.js b/vendor/jquery/3.2.1/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e95274cf48da5b7fd9bbd9bd6d2ab66cfc1b999
--- /dev/null
+++ b/vendor/jquery/3.2.1/core.js
@@ -0,0 +1,476 @@
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+define( [
+	"./var/arr",
+	"./var/document",
+	"./var/getProto",
+	"./var/slice",
+	"./var/concat",
+	"./var/push",
+	"./var/indexOf",
+	"./var/class2type",
+	"./var/toString",
+	"./var/hasOwn",
+	"./var/fnToString",
+	"./var/ObjectFunctionString",
+	"./var/support",
+	"./core/DOMEval"
+], function( arr, document, getProto, slice, concat, push, indexOf,
+	class2type, toString, hasOwn, fnToString, ObjectFunctionString,
+	support, DOMEval ) {
+
+"use strict";
+
+var
+	version = "3.2.1",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android <=4.0 only
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && Array.isArray( src ) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isFunction: function( obj ) {
+		return jQuery.type( obj ) === "function";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj === obj.window;
+	},
+
+	isNumeric: function( obj ) {
+
+		// As of jQuery 3.0, isNumeric is limited to
+		// strings and numbers (primitives or objects)
+		// that can be coerced to finite numbers (gh-2662)
+		var type = jQuery.type( obj );
+		return ( type === "number" || type === "string" ) &&
+
+			// parseFloat NaNs numeric-cast false positives ("")
+			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+			// subtraction forces infinities to NaN
+			!isNaN( obj - parseFloat( obj ) );
+	},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+
+		/* eslint-disable no-unused-vars */
+		// See https://github.com/eslint/eslint/issues/6125
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+
+		// Support: Android <=2.3 only (functionish RegExp)
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call( obj ) ] || "object" :
+			typeof obj;
+	},
+
+	// Evaluates a script in a global context
+	globalEval: function( code ) {
+		DOMEval( code );
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Support: IE <=9 - 11, Edge 12 - 13
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android <=4.0 only
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: Date.now,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+
+return jQuery;
+} );
diff --git a/vendor/jquery/3.2.1/jquery.js b/vendor/jquery/3.2.1/jquery.js
new file mode 100644
index 0000000000000000000000000000000000000000..d2d8ca4790e52b0537f3cbb7dcd766099b789583
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.js
@@ -0,0 +1,10253 @@
+/*!
+ * jQuery JavaScript Library v3.2.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2017-03-20T18:59Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+
+
+	function DOMEval( code, doc ) {
+		doc = doc || document;
+
+		var script = doc.createElement( "script" );
+
+		script.text = code;
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.2.1",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android <=4.0 only
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && Array.isArray( src ) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isFunction: function( obj ) {
+		return jQuery.type( obj ) === "function";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj === obj.window;
+	},
+
+	isNumeric: function( obj ) {
+
+		// As of jQuery 3.0, isNumeric is limited to
+		// strings and numbers (primitives or objects)
+		// that can be coerced to finite numbers (gh-2662)
+		var type = jQuery.type( obj );
+		return ( type === "number" || type === "string" ) &&
+
+			// parseFloat NaNs numeric-cast false positives ("")
+			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+			// subtraction forces infinities to NaN
+			!isNaN( obj - parseFloat( obj ) );
+	},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+
+		/* eslint-disable no-unused-vars */
+		// See https://github.com/eslint/eslint/issues/6125
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+
+		// Support: Android <=2.3 only (functionish RegExp)
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call( obj ) ] || "object" :
+			typeof obj;
+	},
+
+	// Evaluates a script in a global context
+	globalEval: function( code ) {
+		DOMEval( code );
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Support: IE <=9 - 11, Edge 12 - 13
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android <=4.0 only
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: Date.now,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	disabledAncestor = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && ("form" in elem || "label" in elem);
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+
+		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+			setDocument( context );
+		}
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+				// ID selector
+				if ( (m = match[1]) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( (elem = context.getElementById( m )) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && (elem = newContext.getElementById( m )) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[2] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( (m = match[3]) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!compilerCache[ selector + " " ] &&
+				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+				if ( nodeType !== 1 ) {
+					newContext = context;
+					newSelector = selector;
+
+				// qSA looks outside Element context, which is not what we want
+				// Thanks to Andrew Dupont for this workaround technique
+				// Support: IE <=8
+				// Exclude object elements
+				} else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+					// Capture the context ID, setting it first if necessary
+					if ( (nid = context.getAttribute( "id" )) ) {
+						nid = nid.replace( rcssescape, fcssescape );
+					} else {
+						context.setAttribute( "id", (nid = expando) );
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = "#" + nid + " " + toSelector( groups[i] );
+					}
+					newSelector = groups.join( "," );
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results,
+							newContext.querySelectorAll( newSelector )
+						);
+						return results;
+					} catch ( qsaError ) {
+					} finally {
+						if ( nid === expando ) {
+							context.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement("fieldset");
+
+	try {
+		return !!fn( el );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+						disabledAncestor( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9-11, Edge
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	if ( preferredDoc !== document &&
+		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( el ) {
+		el.className = "i";
+		return !el.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( el ) {
+		el.appendChild( document.createComment("") );
+		return !el.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	});
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode("id");
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( (elem = elems[i++]) ) {
+						node = elem.getAttributeNode("id");
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( el ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll(":enabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll(":disabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( el ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === document ? -1 :
+				b === document ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!compilerCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || (node[ expando ] = {});
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								(outerCache[ node.uniqueID ] = {});
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+							// Use previously-cached element index if available
+							if ( useCache ) {
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || (node[ expando ] = {});
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									(outerCache[ node.uniqueID ] = {});
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+								// Use the same loop as above to seek `elem` from the start
+								while ( (node = ++nodeIndex && node && node[ dir ] ||
+									(diff = nodeIndex = 0) || start.pop()) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] || (node[ expando ] = {});
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												(outerCache[ node.uniqueID ] = {});
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( (oldCache = uniqueCache[ key ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context === document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					if ( !context && elem.ownerDocument !== document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context || document, xml) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+	return el.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Simple selector that can be filtered directly, removing non-Elements
+	if ( risSimple.test( qualifier ) ) {
+		return jQuery.filter( qualifier, elements, not );
+	}
+
+	// Complex selector, compare the two sets, removing non-Elements
+	qualifier = jQuery.filter( qualifier, elements );
+	return jQuery.grep( elements, function( elem ) {
+		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
+	} );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+        if ( nodeName( elem, "iframe" ) ) {
+            return elem.contentDocument;
+        }
+
+        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+        // Treat the template element as a regular one in browsers that
+        // don't support it.
+        if ( nodeName( elem, "template" ) ) {
+            elem = elem.content || elem;
+        }
+
+        return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( jQuery.isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( jQuery.isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the master Deferred
+			master = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						master.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( master.state() === "pending" ||
+				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return master.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+		}
+
+		return master.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( jQuery.type( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !jQuery.isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+					value :
+					value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ jQuery.camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( jQuery.camelCase );
+			} else {
+				key = jQuery.camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = jQuery.camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			jQuery.contains( elem.ownerDocument, elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+var swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted,
+		scale = 1,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		do {
+
+			// If previous iteration zeroed out, double until we get *something*.
+			// Use string for doubling so we don't accidentally see scale as unchanged below
+			scale = scale || ".5";
+
+			// Adjust and apply
+			initialInUnit = initialInUnit / scale;
+			jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Update scale, tolerating zero or NaN from tween.cur()
+		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
+		} while (
+			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+		);
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// Support: IE <=9 only
+	option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	thead: [ 1, "<table>", "</table>" ],
+	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+	_default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, contains, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( jQuery.type( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		contains = jQuery.contains( elem.ownerDocument, elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( contains ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = {};
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		// Make a writable jQuery.Event from the native event object
+		var event = jQuery.event.fix( nativeEvent );
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
+				// a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: jQuery.isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+							return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+							return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					this.focus();
+					return false;
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+
+	which: function( event ) {
+		var button = event.button;
+
+		// Add which for key events
+		if ( event.which == null && rkeyEvent.test( event.type ) ) {
+			return event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+			if ( button & 1 ) {
+				return 1;
+			}
+
+			if ( button & 2 ) {
+				return 3;
+			}
+
+			if ( button & 4 ) {
+				return 2;
+			}
+
+			return 0;
+		}
+
+		return event.which;
+	}
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	/* eslint-disable max-len */
+
+	// See https://github.com/eslint/eslint/issues/3229
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+	/* eslint-enable */
+
+	// Support: IE <=10 - 11, Edge 12 - 13
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( ">tbody", elem )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+
+	if ( match ) {
+		elem.type = match[ 1 ];
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.access( src );
+		pdataCur = dataPriv.set( dest, pdataOld );
+		events = pdataOld.events;
+
+		if ( events ) {
+			delete pdataCur.handle;
+			pdataCur.events = {};
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = concat.apply( [], args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		isFunction = jQuery.isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( isFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( isFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl ) {
+								jQuery._evalUrl( node.src );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html.replace( rxhtmlTag, "<$1></$2>" );
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rmargin = ( /^margin/ );
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		div.style.cssText =
+			"box-sizing:border-box;" +
+			"position:relative;display:block;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"top:1%;width:50%";
+		div.innerHTML = "";
+		documentElement.appendChild( container );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = divStyle.marginLeft === "2px";
+		boxSizingReliableVal = divStyle.width === "4px";
+
+		// Support: Android 4.0 - 4.3 only
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.marginRight = "50%";
+		pixelMarginRightVal = divStyle.marginRight === "4px";
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
+		"padding:0;margin-top:1px;position:absolute";
+	container.appendChild( div );
+
+	jQuery.extend( support, {
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelMarginRight: function() {
+			computeStyleTests();
+			return pixelMarginRightVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	},
+
+	cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style;
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+	// Shortcut for names that are not vendor prefixed
+	if ( name in emptyStyle ) {
+		return name;
+	}
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a property mapped along what jQuery.cssProps suggests or to
+// a vendor prefixed property.
+function finalPropName( name ) {
+	var ret = jQuery.cssProps[ name ];
+	if ( !ret ) {
+		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
+	}
+	return ret;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i,
+		val = 0;
+
+	// If we already have the right measurement, avoid augmentation
+	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
+		i = 4;
+
+	// Otherwise initialize for horizontal or vertical properties
+	} else {
+		i = name === "width" ? 1 : 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// At this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+
+			// At this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// At this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with computed style
+	var valueIsBorderBox,
+		styles = getStyles( elem ),
+		val = curCSS( elem, name, styles ),
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test( val ) ) {
+		return val;
+	}
+
+	// Check for style in case a browser which returns unreliable values
+	// for getComputedStyle silently falls back to the reliable elem.style
+	valueIsBorderBox = isBorderBox &&
+		( support.boxSizingReliable() || val === elem.style[ name ] );
+
+	// Fall back to offsetWidth/Height when value is "auto"
+	// This happens for inline elements with no explicit setting (gh-3571)
+	if ( val === "auto" ) {
+		val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		"float": "cssFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			if ( type === "number" ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+						swap( elem, cssShow, function() {
+							return getWidthOrHeight( elem, name, extra );
+						} ) :
+						getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = extra && getStyles( elem ),
+				subtract = extra && augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				);
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ name ] = value;
+				value = jQuery.css( elem, name );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+				) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// Passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails.
+			// Simple values such as "10px" are parsed to Float;
+			// complex values such as "rotate(1rad)" are returned as-is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// Use step hook for back compat.
+			// Use cssHook if its there.
+			// Use .style if available and use plain properties where available.
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 &&
+				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
+					jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, inProgress,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+function schedule() {
+	if ( inProgress ) {
+		if ( document.hidden === false && window.requestAnimationFrame ) {
+			window.requestAnimationFrame( schedule );
+		} else {
+			window.setTimeout( schedule, jQuery.fx.interval );
+		}
+
+		jQuery.fx.tick();
+	}
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		i = 0,
+		attrs = { height: type };
+
+	// If we include width, step value is 1 to do all cssExpand values,
+	// otherwise step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// We're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+		isBox = "width" in props || "height" in props,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHiddenWithinTree( elem ),
+		dataShow = dataPriv.get( elem, "fxshow" );
+
+	// Queue-skipping animations hijack the fx hooks
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// Ensure the complete handler is called before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// Detect show/hide animations
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.test( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// Pretend to be hidden if this is a "show" and
+				// there is still data from a stopped show/hide
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+
+				// Ignore all other no-op show/hide data
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	// Bail out if this is a no-op like .hide().hide()
+	propTween = !jQuery.isEmptyObject( props );
+	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+		return;
+	}
+
+	// Restrict "overflow" and "display" styles during box animations
+	if ( isBox && elem.nodeType === 1 ) {
+
+		// Support: IE <=9 - 11, Edge 12 - 13
+		// Record all 3 overflow attributes because IE does not infer the shorthand
+		// from identically-valued overflowX and overflowY
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Identify a display type, preferring old show/hide data over the CSS cascade
+		restoreDisplay = dataShow && dataShow.display;
+		if ( restoreDisplay == null ) {
+			restoreDisplay = dataPriv.get( elem, "display" );
+		}
+		display = jQuery.css( elem, "display" );
+		if ( display === "none" ) {
+			if ( restoreDisplay ) {
+				display = restoreDisplay;
+			} else {
+
+				// Get nonempty value(s) by temporarily forcing visibility
+				showHide( [ elem ], true );
+				restoreDisplay = elem.style.display || restoreDisplay;
+				display = jQuery.css( elem, "display" );
+				showHide( [ elem ] );
+			}
+		}
+
+		// Animate inline elements as inline-block
+		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+			if ( jQuery.css( elem, "float" ) === "none" ) {
+
+				// Restore the original display value at the end of pure show/hide animations
+				if ( !propTween ) {
+					anim.done( function() {
+						style.display = restoreDisplay;
+					} );
+					if ( restoreDisplay == null ) {
+						display = style.display;
+						restoreDisplay = display === "none" ? "" : display;
+					}
+				}
+				style.display = "inline-block";
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always( function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		} );
+	}
+
+	// Implement show/hide animations
+	propTween = false;
+	for ( prop in orig ) {
+
+		// General show/hide setup for this element animation
+		if ( !propTween ) {
+			if ( dataShow ) {
+				if ( "hidden" in dataShow ) {
+					hidden = dataShow.hidden;
+				}
+			} else {
+				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+			}
+
+			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+			if ( toggle ) {
+				dataShow.hidden = !hidden;
+			}
+
+			// Show elements before animating them
+			if ( hidden ) {
+				showHide( [ elem ], true );
+			}
+
+			/* eslint-disable no-loop-func */
+
+			anim.done( function() {
+
+			/* eslint-enable no-loop-func */
+
+				// The final step of a "hide" animation is actually hiding the element
+				if ( !hidden ) {
+					showHide( [ elem ] );
+				}
+				dataPriv.remove( elem, "fxshow" );
+				for ( prop in orig ) {
+					jQuery.style( elem, prop, orig[ prop ] );
+				}
+			} );
+		}
+
+		// Per-property setup
+		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+		if ( !( prop in dataShow ) ) {
+			dataShow[ prop ] = propTween.start;
+			if ( hidden ) {
+				propTween.end = propTween.start;
+				propTween.start = 0;
+			}
+		}
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( Array.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// Not quite $.extend, this won't overwrite existing keys.
+			// Reusing 'index' because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// Don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3 only
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			// If there's more to do, yield
+			if ( percent < 1 && length ) {
+				return remaining;
+			}
+
+			// If this was an empty animation, synthesize a final progress notification
+			if ( !length ) {
+				deferred.notifyWith( elem, [ animation, 1, 0 ] );
+			}
+
+			// Resolve the animation and report its conclusion
+			deferred.resolveWith( elem, [ animation ] );
+			return false;
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// If we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// Resolve when we played the last frame; otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( jQuery.isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					jQuery.proxy( result.stop, result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	// Attach callbacks from options
+	animation
+		.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnothtmlwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	// Go to the end state if fx are off
+	if ( jQuery.fx.off ) {
+		opt.duration = 0;
+
+	} else {
+		if ( typeof opt.duration !== "number" ) {
+			if ( opt.duration in jQuery.fx.speeds ) {
+				opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+			} else {
+				opt.duration = jQuery.fx.speeds._default;
+			}
+		}
+	}
+
+	// Normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// Show any hidden elements after setting opacity to 0
+		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+			// Animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || dataPriv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = dataPriv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Start the next in the queue if the last step wasn't forced.
+			// Timers currently will call their complete callbacks, which
+			// will dequeue but only if they were gotoEnd.
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = dataPriv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// Enable finishing flag on private data
+			data.finish = true;
+
+			// Empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// Look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// Turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		i = 0,
+		timers = jQuery.timers;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Run the timer and safely remove it when done (allowing for external removal)
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+	if ( inProgress ) {
+		return;
+	}
+
+	inProgress = true;
+	schedule();
+};
+
+jQuery.fx.stop = function() {
+	inProgress = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnothtmlwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnothtmlwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( type === "string" ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = value.match( rnothtmlwhite ) || [];
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+						"" :
+						dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+					return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
+	function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+} );
+
+jQuery.fn.extend( {
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+
+
+
+support.focusin = "onfocusin" in window;
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+var location = window.location;
+
+var nonce = jQuery.now();
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE throws on parseFromString with invalid input.
+	try {
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+	} catch ( e ) {
+		xml = undefined;
+	}
+
+	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+		jQuery.error( "Invalid XML: " + data );
+	}
+	return xml;
+};
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = jQuery.isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} )
+		.filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} )
+		.map( function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+var
+	r20 = /%20/g,
+	rhash = /#.*$/,
+	rantiCache = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Anchor tag for parsing the document origin
+	originAnchor = document.createElement( "a" );
+	originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType[ 0 ] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s.throws ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: location.href,
+		type: "GET",
+		isLocal: rlocalProtocol.test( location.protocol ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /\bxml\b/,
+			html: /\bhtml/,
+			json: /\bjson\b/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": JSON.parse,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+
+			// timeout handle
+			timeoutTimer,
+
+			// Url cleanup var
+			urlAnchor,
+
+			// Request state (becomes false upon send and true upon completion)
+			completed,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			// Loop variable
+			i,
+
+			// uncached part of the url
+			uncached,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+					jQuery( callbackContext ) :
+					jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( completed ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return completed ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( completed == null ) {
+						name = requestHeadersNames[ name.toLowerCase() ] =
+							requestHeadersNames[ name.toLowerCase() ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( completed == null ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( completed ) {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						} else {
+
+							// Lazy-add the new callbacks in a way that preserves old ones
+							for ( code in map ) {
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || location.href ) + "" )
+			.replace( rprotocol, location.protocol + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+		// A cross-domain request is in order when the origin doesn't match the current origin.
+		if ( s.crossDomain == null ) {
+			urlAnchor = document.createElement( "a" );
+
+			// Support: IE <=8 - 11, Edge 12 - 13
+			// IE throws exception on accessing the href property if url is malformed,
+			// e.g. http://example.com:80x/
+			try {
+				urlAnchor.href = s.url;
+
+				// Support: IE <=8 - 11 only
+				// Anchor's host property isn't correctly set when s.url is relative
+				urlAnchor.href = urlAnchor.href;
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+					urlAnchor.protocol + "//" + urlAnchor.host;
+			} catch ( e ) {
+
+				// If there is an error parsing the URL, assume it is crossDomain,
+				// it can be rejected by the transport if it is invalid
+				s.crossDomain = true;
+			}
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( completed ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		// Remove hash to simplify url manipulation
+		cacheURL = s.url.replace( rhash, "" );
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// Remember the hash so we can put it back
+			uncached = s.url.slice( cacheURL.length );
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add or update anti-cache param if needed
+			if ( s.cache === false ) {
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+			}
+
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
+			s.url = cacheURL + uncached;
+
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
+		} else if ( s.data && s.processData &&
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+			s.data = s.data.replace( r20, "+" );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// Aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		completeDeferred.add( s.complete );
+		jqXHR.done( s.success );
+		jqXHR.fail( s.error );
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( completed ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				completed = false;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Rethrow post-completion exceptions
+				if ( completed ) {
+					throw e;
+				}
+
+				// Propagate others as results
+				done( -1, e );
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Ignore repeat invocations
+			if ( completed ) {
+				return;
+			}
+
+			completed = true;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// Extract error from statusText and normalize for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// Shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+
+jQuery._evalUrl = function( url ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+		"throws": true
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( jQuery.isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+		// File protocol always yields status code 0, assume 200
+		0: 200,
+
+		// Support: IE <=9 only
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+	var callback, errorCallback;
+
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i,
+					xhr = options.xhr();
+
+				xhr.open(
+					options.type,
+					options.url,
+					options.async,
+					options.username,
+					options.password
+				);
+
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+					headers[ "X-Requested-With" ] = "XMLHttpRequest";
+				}
+
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							callback = errorCallback = xhr.onload =
+								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
+
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+
+								// Support: IE <=9 only
+								// On a manual native abort, IE9 throws
+								// errors on any property access that is not readyState
+								if ( typeof xhr.status !== "number" ) {
+									complete( 0, "error" );
+								} else {
+									complete(
+
+										// File: protocol always yields status 0; see #8605, #14207
+										xhr.status,
+										xhr.statusText
+									);
+								}
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+
+									// Support: IE <=9 only
+									// IE9 has no XHR2 but throws on binary (trac-11426)
+									// For XHR2 non-text, let the caller handle it (gh-2498)
+									( xhr.responseType || "text" ) !== "text"  ||
+									typeof xhr.responseText !== "string" ?
+										{ binary: xhr.response } :
+										{ text: xhr.responseText },
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+
+				// Listen to events
+				xhr.onload = callback();
+				errorCallback = xhr.onerror = callback( "error" );
+
+				// Support: IE 9 only
+				// Use onreadystatechange to replace onabort
+				// to handle uncaught aborts
+				if ( xhr.onabort !== undefined ) {
+					xhr.onabort = errorCallback;
+				} else {
+					xhr.onreadystatechange = function() {
+
+						// Check readyState before timeout as it changes
+						if ( xhr.readyState === 4 ) {
+
+							// Allow onerror to be called first,
+							// but that will not handle a native abort
+							// Also, save errorCallback to a variable
+							// as xhr.onerror cannot be accessed
+							window.setTimeout( function() {
+								if ( callback ) {
+									errorCallback();
+								}
+							} );
+						}
+					};
+				}
+
+				// Create the abort callback
+				callback = callback( "abort" );
+
+				try {
+
+					// Do send the request (this may raise an exception)
+					xhr.send( options.hasContent && options.data || null );
+				} catch ( e ) {
+
+					// #14683: Only rethrow if this hasn't been notified as an error yet
+					if ( callback ) {
+						throw e;
+					}
+				}
+			},
+
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+	if ( s.crossDomain ) {
+		s.contents.script = false;
+	}
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery( "<script>" ).prop( {
+					charset: s.scriptCharset,
+					src: s.url
+				} ).on(
+					"load error",
+					callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					}
+				);
+
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// Force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// Make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// Save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = stripAndCollapse( url.slice( off ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var doc, docElem, rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		rect = elem.getBoundingClientRect();
+
+		doc = elem.ownerDocument;
+		docElem = doc.documentElement;
+		win = doc.defaultView;
+
+		return {
+			top: rect.top + win.pageYOffset - docElem.clientTop,
+			left: rect.left + win.pageXOffset - docElem.clientLeft
+		};
+	},
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+		// because it is its only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume getBoundingClientRect is there when computed position is fixed
+			offset = elem.getBoundingClientRect();
+
+		} else {
+
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset = {
+				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
+				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
+			};
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( jQuery.isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+		function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	}
+} );
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
diff --git a/vendor/jquery/3.2.1/jquery.min.js b/vendor/jquery/3.2.1/jquery.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..644d35e274fd64ddaf6d12af813e820c424176a9
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
+a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
+null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
diff --git a/vendor/jquery/3.2.1/jquery.min.map b/vendor/jquery/3.2.1/jquery.min.map
new file mode 100644
index 0000000000000000000000000000000000000000..e8f55ef79d5a7b7fe7913cdb88c5a61e7b164cea
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","call","support","DOMEval","code","doc","script","createElement","text","head","appendChild","parentNode","removeChild","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","isWindow","isNumeric","isNaN","parseFloat","proto","Ctor","isEmptyObject","globalEval","camelCase","string","isArrayLike","trim","makeArray","results","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","value","guid","proxy","tmp","args","now","Date","Symbol","iterator","split","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","childNodes","nodeType","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","getAttribute","setAttribute","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","targets","l","closest","index","prevAll","add","addBack","sibling","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","createOptions","object","flag","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","readyWait","wait","completed","removeEventListener","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","JSON","parse","dataAttr","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isHiddenWithinTree","style","display","css","swap","old","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","optgroup","tbody","tfoot","colgroup","caption","th","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","div","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","on","types","one","origFn","event","off","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","trigger","blur","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","stopImmediatePropagation","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","computeStyleTests","cssText","container","divStyle","pixelPositionVal","reliableMarginLeftVal","marginLeft","boxSizingReliableVal","width","marginRight","pixelMarginRightVal","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","pixelMarginRight","reliableMarginLeft","curCSS","computed","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","rdisplayswap","rcustomProp","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","finalPropName","cssProps","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","float","origName","isCustomProp","setProperty","isFinite","getClientRects","getBoundingClientRect","left","margin","padding","border","prefix","suffix","expand","expanded","parts","Tween","easing","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","height","createTween","animation","Animation","tweeners","defaultPrefilter","opts","oldfire","propTween","restoreDisplay","isBox","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","properties","stopped","prefilters","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","complete","timer","*","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","removeProp","propFix","tabindex","parseInt","for","class","stripAndCollapse","getClass","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","triggerHandler","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","overrideMimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","firstElementChild","wrapInner","unwrap","visible","offsetWidth","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","onreadystatechange","responseType","responseText","binary","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","rect","win","pageYOffset","clientTop","pageXOffset","clientLeft","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","holdReady","hold","parseJSON","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"}
\ No newline at end of file
diff --git a/vendor/jquery/3.2.1/jquery.slim.js b/vendor/jquery/3.2.1/jquery.slim.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cdf1eecf0d71337fc68d442073511809c05f204
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.slim.js
@@ -0,0 +1,8160 @@
+/*!
+ * jQuery JavaScript Library v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2017-03-20T19:00Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+
+
+	function DOMEval( code, doc ) {
+		doc = doc || document;
+
+		var script = doc.createElement( "script" );
+
+		script.text = code;
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android <=4.0 only
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && Array.isArray( src ) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isFunction: function( obj ) {
+		return jQuery.type( obj ) === "function";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj === obj.window;
+	},
+
+	isNumeric: function( obj ) {
+
+		// As of jQuery 3.0, isNumeric is limited to
+		// strings and numbers (primitives or objects)
+		// that can be coerced to finite numbers (gh-2662)
+		var type = jQuery.type( obj );
+		return ( type === "number" || type === "string" ) &&
+
+			// parseFloat NaNs numeric-cast false positives ("")
+			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+			// subtraction forces infinities to NaN
+			!isNaN( obj - parseFloat( obj ) );
+	},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+
+		/* eslint-disable no-unused-vars */
+		// See https://github.com/eslint/eslint/issues/6125
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+
+		// Support: Android <=2.3 only (functionish RegExp)
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call( obj ) ] || "object" :
+			typeof obj;
+	},
+
+	// Evaluates a script in a global context
+	globalEval: function( code ) {
+		DOMEval( code );
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Support: IE <=9 - 11, Edge 12 - 13
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android <=4.0 only
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: Date.now,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	disabledAncestor = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && ("form" in elem || "label" in elem);
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+
+		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+			setDocument( context );
+		}
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+				// ID selector
+				if ( (m = match[1]) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( (elem = context.getElementById( m )) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && (elem = newContext.getElementById( m )) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[2] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( (m = match[3]) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!compilerCache[ selector + " " ] &&
+				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+				if ( nodeType !== 1 ) {
+					newContext = context;
+					newSelector = selector;
+
+				// qSA looks outside Element context, which is not what we want
+				// Thanks to Andrew Dupont for this workaround technique
+				// Support: IE <=8
+				// Exclude object elements
+				} else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+					// Capture the context ID, setting it first if necessary
+					if ( (nid = context.getAttribute( "id" )) ) {
+						nid = nid.replace( rcssescape, fcssescape );
+					} else {
+						context.setAttribute( "id", (nid = expando) );
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = "#" + nid + " " + toSelector( groups[i] );
+					}
+					newSelector = groups.join( "," );
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results,
+							newContext.querySelectorAll( newSelector )
+						);
+						return results;
+					} catch ( qsaError ) {
+					} finally {
+						if ( nid === expando ) {
+							context.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement("fieldset");
+
+	try {
+		return !!fn( el );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+						disabledAncestor( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9-11, Edge
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	if ( preferredDoc !== document &&
+		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( el ) {
+		el.className = "i";
+		return !el.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( el ) {
+		el.appendChild( document.createComment("") );
+		return !el.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	});
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode("id");
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( (elem = elems[i++]) ) {
+						node = elem.getAttributeNode("id");
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( el ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll(":enabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll(":disabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( el ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === document ? -1 :
+				b === document ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!compilerCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || (node[ expando ] = {});
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								(outerCache[ node.uniqueID ] = {});
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+							// Use previously-cached element index if available
+							if ( useCache ) {
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || (node[ expando ] = {});
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									(outerCache[ node.uniqueID ] = {});
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+								// Use the same loop as above to seek `elem` from the start
+								while ( (node = ++nodeIndex && node && node[ dir ] ||
+									(diff = nodeIndex = 0) || start.pop()) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] || (node[ expando ] = {});
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												(outerCache[ node.uniqueID ] = {});
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( (oldCache = uniqueCache[ key ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context === document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					if ( !context && elem.ownerDocument !== document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context || document, xml) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+	return el.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Simple selector that can be filtered directly, removing non-Elements
+	if ( risSimple.test( qualifier ) ) {
+		return jQuery.filter( qualifier, elements, not );
+	}
+
+	// Complex selector, compare the two sets, removing non-Elements
+	qualifier = jQuery.filter( qualifier, elements );
+	return jQuery.grep( elements, function( elem ) {
+		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
+	} );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+        if ( nodeName( elem, "iframe" ) ) {
+            return elem.contentDocument;
+        }
+
+        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+        // Treat the template element as a regular one in browsers that
+        // don't support it.
+        if ( nodeName( elem, "template" ) ) {
+            elem = elem.content || elem;
+        }
+
+        return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( jQuery.isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( jQuery.isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								jQuery.isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the master Deferred
+			master = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						master.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( master.state() === "pending" ||
+				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return master.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+		}
+
+		return master.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( jQuery.type( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !jQuery.isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+					value :
+					value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ jQuery.camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( jQuery.camelCase );
+			} else {
+				key = jQuery.camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = jQuery.camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			jQuery.contains( elem.ownerDocument, elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+var swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted,
+		scale = 1,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		do {
+
+			// If previous iteration zeroed out, double until we get *something*.
+			// Use string for doubling so we don't accidentally see scale as unchanged below
+			scale = scale || ".5";
+
+			// Adjust and apply
+			initialInUnit = initialInUnit / scale;
+			jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Update scale, tolerating zero or NaN from tween.cur()
+		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
+		} while (
+			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+		);
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// Support: IE <=9 only
+	option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	thead: [ 1, "<table>", "</table>" ],
+	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+	_default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, contains, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( jQuery.type( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		contains = jQuery.contains( elem.ownerDocument, elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( contains ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = {};
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		// Make a writable jQuery.Event from the native event object
+		var event = jQuery.event.fix( nativeEvent );
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
+				// a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: jQuery.isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+							return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+							return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					this.focus();
+					return false;
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+
+	which: function( event ) {
+		var button = event.button;
+
+		// Add which for key events
+		if ( event.which == null && rkeyEvent.test( event.type ) ) {
+			return event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+			if ( button & 1 ) {
+				return 1;
+			}
+
+			if ( button & 2 ) {
+				return 3;
+			}
+
+			if ( button & 4 ) {
+				return 2;
+			}
+
+			return 0;
+		}
+
+		return event.which;
+	}
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	/* eslint-disable max-len */
+
+	// See https://github.com/eslint/eslint/issues/3229
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+	/* eslint-enable */
+
+	// Support: IE <=10 - 11, Edge 12 - 13
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( ">tbody", elem )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+
+	if ( match ) {
+		elem.type = match[ 1 ];
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.access( src );
+		pdataCur = dataPriv.set( dest, pdataOld );
+		events = pdataOld.events;
+
+		if ( events ) {
+			delete pdataCur.handle;
+			pdataCur.events = {};
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = concat.apply( [], args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		isFunction = jQuery.isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( isFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( isFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl ) {
+								jQuery._evalUrl( node.src );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html.replace( rxhtmlTag, "<$1></$2>" );
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rmargin = ( /^margin/ );
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		div.style.cssText =
+			"box-sizing:border-box;" +
+			"position:relative;display:block;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"top:1%;width:50%";
+		div.innerHTML = "";
+		documentElement.appendChild( container );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = divStyle.marginLeft === "2px";
+		boxSizingReliableVal = divStyle.width === "4px";
+
+		// Support: Android 4.0 - 4.3 only
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.marginRight = "50%";
+		pixelMarginRightVal = divStyle.marginRight === "4px";
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
+		"padding:0;margin-top:1px;position:absolute";
+	container.appendChild( div );
+
+	jQuery.extend( support, {
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelMarginRight: function() {
+			computeStyleTests();
+			return pixelMarginRightVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	},
+
+	cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style;
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+	// Shortcut for names that are not vendor prefixed
+	if ( name in emptyStyle ) {
+		return name;
+	}
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a property mapped along what jQuery.cssProps suggests or to
+// a vendor prefixed property.
+function finalPropName( name ) {
+	var ret = jQuery.cssProps[ name ];
+	if ( !ret ) {
+		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
+	}
+	return ret;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i,
+		val = 0;
+
+	// If we already have the right measurement, avoid augmentation
+	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
+		i = 4;
+
+	// Otherwise initialize for horizontal or vertical properties
+	} else {
+		i = name === "width" ? 1 : 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// At this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+
+			// At this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// At this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with computed style
+	var valueIsBorderBox,
+		styles = getStyles( elem ),
+		val = curCSS( elem, name, styles ),
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test( val ) ) {
+		return val;
+	}
+
+	// Check for style in case a browser which returns unreliable values
+	// for getComputedStyle silently falls back to the reliable elem.style
+	valueIsBorderBox = isBorderBox &&
+		( support.boxSizingReliable() || val === elem.style[ name ] );
+
+	// Fall back to offsetWidth/Height when value is "auto"
+	// This happens for inline elements with no explicit setting (gh-3571)
+	if ( val === "auto" ) {
+		val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		"float": "cssFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			if ( type === "number" ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+						swap( elem, cssShow, function() {
+							return getWidthOrHeight( elem, name, extra );
+						} ) :
+						getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = extra && getStyles( elem ),
+				subtract = extra && augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				);
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ name ] = value;
+				value = jQuery.css( elem, name );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+				) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnothtmlwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnothtmlwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( type === "string" ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = value.match( rnothtmlwhite ) || [];
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+						"" :
+						dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+					return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
+	function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+} );
+
+jQuery.fn.extend( {
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+
+
+
+support.focusin = "onfocusin" in window;
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = jQuery.isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} )
+		.filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} )
+		.map( function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( jQuery.isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var doc, docElem, rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		rect = elem.getBoundingClientRect();
+
+		doc = elem.ownerDocument;
+		docElem = doc.documentElement;
+		win = doc.defaultView;
+
+		return {
+			top: rect.top + win.pageYOffset - docElem.clientTop,
+			left: rect.left + win.pageXOffset - docElem.clientLeft
+		};
+	},
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+		// because it is its only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume getBoundingClientRect is there when computed position is fixed
+			offset = elem.getBoundingClientRect();
+
+		} else {
+
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset = {
+				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
+				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
+			};
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( jQuery.isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+		function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	}
+} );
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
diff --git a/vendor/jquery/3.2.1/jquery.slim.min.js b/vendor/jquery/3.2.1/jquery.slim.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..105d00e61dc2185c1f9dab1f4f0a0efe3e0fb0ae
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.slim.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a);
+}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d);
+});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r});
diff --git a/vendor/jquery/3.2.1/jquery.slim.min.map b/vendor/jquery/3.2.1/jquery.slim.min.map
new file mode 100644
index 0000000000000000000000000000000000000000..a44b7b465df5b57c3dfed03b5fcd208efd931e0d
--- /dev/null
+++ b/vendor/jquery/3.2.1/jquery.slim.min.map
@@ -0,0 +1 @@
+{"version":3,"sources":["jquery.slim.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","call","support","DOMEval","code","doc","script","createElement","text","head","appendChild","parentNode","removeChild","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","isWindow","isNumeric","isNaN","parseFloat","proto","Ctor","isEmptyObject","globalEval","camelCase","string","isArrayLike","trim","makeArray","results","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","value","guid","proxy","tmp","args","now","Date","Symbol","iterator","split","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","disabledAncestor","addCombinator","disabled","dir","next","childNodes","nodeType","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","nodeName","getAttribute","setAttribute","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","targets","l","closest","index","prevAll","add","addBack","sibling","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","createOptions","object","flag","Callbacks","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","readyWait","wait","completed","removeEventListener","readyState","doScroll","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","getData","JSON","parse","dataAttr","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isHiddenWithinTree","style","display","css","swap","old","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","optgroup","tbody","tfoot","colgroup","caption","th","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","div","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","on","types","one","origFn","event","off","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","trigger","blur","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","stopImmediatePropagation","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","computeStyleTests","cssText","container","divStyle","pixelPositionVal","reliableMarginLeftVal","marginLeft","boxSizingReliableVal","width","marginRight","pixelMarginRightVal","backgroundClip","clearCloneStyle","pixelPosition","boxSizingReliable","pixelMarginRight","reliableMarginLeft","curCSS","computed","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","rdisplayswap","rcustomProp","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","finalPropName","cssProps","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","float","origName","isCustomProp","setProperty","isFinite","getClientRects","getBoundingClientRect","left","margin","padding","border","prefix","suffix","expand","expanded","parts","delay","time","fx","speeds","timeout","clearTimeout","opt","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","removeProp","propFix","propHooks","tabindex","parseInt","for","class","stripAndCollapse","getClass","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","triggerHandler","hover","fnOver","fnOut","focusin","attaches","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","wrapAll","firstElementChild","wrapInner","unwrap","hidden","visible","offsetWidth","offsetHeight","createHTMLDocument","implementation","keepScripts","parsed","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","rect","win","pageYOffset","clientTop","pageXOffset","clientLeft","offsetParent","parentOffset","scrollLeft","scrollTop","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","holdReady","hold","parseJSON","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.slim.min.js"}
\ No newline at end of file
diff --git a/vendor/vis/4.21.0/vis.js.map b/vendor/vis/4.21.0/vis.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..0c90cb780257584da54656a165e587f77329d025
--- /dev/null
+++ b/vendor/vis/4.21.0/vis.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap eca1787db4da1a54ed82","webpack:///./index.js","webpack:///./lib/util.js","webpack:///./~/babel-runtime/core-js/get-iterator.js","webpack:///./~/core-js/library/fn/get-iterator.js","webpack:///./~/core-js/library/modules/web.dom.iterable.js","webpack:///./~/core-js/library/modules/es6.array.iterator.js","webpack:///./~/core-js/library/modules/_add-to-unscopables.js","webpack:///./~/core-js/library/modules/_iter-step.js","webpack:///./~/core-js/library/modules/_iterators.js","webpack:///./~/core-js/library/modules/_to-iobject.js","webpack:///./~/core-js/library/modules/_iobject.js","webpack:///./~/core-js/library/modules/_cof.js","webpack:///./~/core-js/library/modules/_defined.js","webpack:///./~/core-js/library/modules/_iter-define.js","webpack:///./~/core-js/library/modules/_library.js","webpack:///./~/core-js/library/modules/_export.js","webpack:///./~/core-js/library/modules/_global.js","webpack:///./~/core-js/library/modules/_core.js","webpack:///./~/core-js/library/modules/_ctx.js","webpack:///./~/core-js/library/modules/_a-function.js","webpack:///./~/core-js/library/modules/_hide.js","webpack:///./~/core-js/library/modules/_object-dp.js","webpack:///./~/core-js/library/modules/_an-object.js","webpack:///./~/core-js/library/modules/_is-object.js","webpack:///./~/core-js/library/modules/_ie8-dom-define.js","webpack:///./~/core-js/library/modules/_descriptors.js","webpack:///./~/core-js/library/modules/_fails.js","webpack:///./~/core-js/library/modules/_dom-create.js","webpack:///./~/core-js/library/modules/_to-primitive.js","webpack:///./~/core-js/library/modules/_property-desc.js","webpack:///./~/core-js/library/modules/_redefine.js","webpack:///./~/core-js/library/modules/_has.js","webpack:///./~/core-js/library/modules/_iter-create.js","webpack:///./~/core-js/library/modules/_object-create.js","webpack:///./~/core-js/library/modules/_object-dps.js","webpack:///./~/core-js/library/modules/_object-keys.js","webpack:///./~/core-js/library/modules/_object-keys-internal.js","webpack:///./~/core-js/library/modules/_array-includes.js","webpack:///./~/core-js/library/modules/_to-length.js","webpack:///./~/core-js/library/modules/_to-integer.js","webpack:///./~/core-js/library/modules/_to-index.js","webpack:///./~/core-js/library/modules/_shared-key.js","webpack:///./~/core-js/library/modules/_shared.js","webpack:///./~/core-js/library/modules/_uid.js","webpack:///./~/core-js/library/modules/_enum-bug-keys.js","webpack:///./~/core-js/library/modules/_html.js","webpack:///./~/core-js/library/modules/_set-to-string-tag.js","webpack:///./~/core-js/library/modules/_wks.js","webpack:///./~/core-js/library/modules/_object-gpo.js","webpack:///./~/core-js/library/modules/_to-object.js","webpack:///./~/core-js/library/modules/es6.string.iterator.js","webpack:///./~/core-js/library/modules/_string-at.js","webpack:///./~/core-js/library/modules/core.get-iterator.js","webpack:///./~/core-js/library/modules/core.get-iterator-method.js","webpack:///./~/core-js/library/modules/_classof.js","webpack:///./~/babel-runtime/core-js/object/create.js","webpack:///./~/core-js/library/fn/object/create.js","webpack:///./~/core-js/library/modules/es6.object.create.js","webpack:///./~/babel-runtime/core-js/object/keys.js","webpack:///./~/core-js/library/fn/object/keys.js","webpack:///./~/core-js/library/modules/es6.object.keys.js","webpack:///./~/core-js/library/modules/_object-sap.js","webpack:///./~/babel-runtime/helpers/typeof.js","webpack:///./~/babel-runtime/core-js/symbol/iterator.js","webpack:///./~/core-js/library/fn/symbol/iterator.js","webpack:///./~/core-js/library/modules/_wks-ext.js","webpack:///./~/babel-runtime/core-js/symbol.js","webpack:///./~/core-js/library/fn/symbol/index.js","webpack:///./~/core-js/library/modules/es6.symbol.js","webpack:///./~/core-js/library/modules/_meta.js","webpack:///./~/core-js/library/modules/_wks-define.js","webpack:///./~/core-js/library/modules/_keyof.js","webpack:///./~/core-js/library/modules/_enum-keys.js","webpack:///./~/core-js/library/modules/_object-gops.js","webpack:///./~/core-js/library/modules/_object-pie.js","webpack:///./~/core-js/library/modules/_is-array.js","webpack:///./~/core-js/library/modules/_object-gopn-ext.js","webpack:///./~/core-js/library/modules/_object-gopn.js","webpack:///./~/core-js/library/modules/_object-gopd.js","webpack:///./~/core-js/library/modules/es7.symbol.async-iterator.js","webpack:///./~/core-js/library/modules/es7.symbol.observable.js","webpack:///./~/babel-runtime/core-js/json/stringify.js","webpack:///./~/core-js/library/fn/json/stringify.js","webpack:///./lib/module/moment.js","webpack:///./~/moment/moment.js","webpack:///(webpack)/buildin/module.js","webpack:///./~/moment/locale ^\\.\\/$^$","webpack:///./lib/module/uuid.js","webpack:///./index-graph3d.js","webpack:///./lib/DOMutil.js","webpack:///./lib/DataSet.js","webpack:///./lib/Queue.js","webpack:///./lib/DataView.js","webpack:///./lib/graph3d/Graph3d.js","webpack:///./~/emitter-component/index.js","webpack:///./lib/graph3d/Point3d.js","webpack:///./lib/graph3d/Point2d.js","webpack:///./lib/graph3d/Camera.js","webpack:///./~/babel-runtime/core-js/math/sign.js","webpack:///./~/core-js/library/fn/math/sign.js","webpack:///./~/core-js/library/modules/es6.math.sign.js","webpack:///./~/core-js/library/modules/_math-sign.js","webpack:///./lib/graph3d/Filter.js","webpack:///./lib/graph3d/Slider.js","webpack:///./lib/graph3d/StepNumber.js","webpack:///./lib/graph3d/Range.js","webpack:///./lib/graph3d/Settings.js","webpack:///./lib/module/hammer.js","webpack:///./~/propagating-hammerjs/propagating.js","webpack:///./~/hammerjs/hammer.js","webpack:///./~/keycharm/keycharm.js","webpack:///./index-timeline-graph2d.js","webpack:///./lib/timeline/Timeline.js","webpack:///./lib/shared/Configurator.js","webpack:///./~/babel-runtime/helpers/classCallCheck.js","webpack:///./~/babel-runtime/helpers/createClass.js","webpack:///./~/babel-runtime/core-js/object/define-property.js","webpack:///./~/core-js/library/fn/object/define-property.js","webpack:///./~/core-js/library/modules/es6.object.define-property.js","webpack:///./lib/shared/ColorPicker.js","webpack:///./lib/hammerUtil.js","webpack:///./lib/shared/Validator.js","webpack:///./lib/timeline/Range.js","webpack:///./lib/timeline/component/Component.js","webpack:///./lib/timeline/DateUtil.js","webpack:///./lib/timeline/Core.js","webpack:///./lib/timeline/component/ItemSet.js","webpack:///./lib/shared/Popup.js","webpack:///./lib/timeline/TimeStep.js","webpack:///./lib/timeline/component/Group.js","webpack:///./lib/timeline/Stack.js","webpack:///./lib/timeline/component/item/RangeItem.js","webpack:///./lib/timeline/component/item/Item.js","webpack:///./lib/timeline/component/BackgroundGroup.js","webpack:///./lib/timeline/component/item/BoxItem.js","webpack:///./lib/timeline/component/item/PointItem.js","webpack:///./lib/timeline/component/item/BackgroundItem.js","webpack:///./lib/timeline/component/TimeAxis.js","webpack:///./lib/shared/Activator.js","webpack:///./lib/timeline/component/CustomTime.js","webpack:///./lib/timeline/locales.js","webpack:///./lib/timeline/component/CurrentTime.js","webpack:///./lib/timeline/optionsTimeline.js","webpack:///./lib/timeline/Graph2d.js","webpack:///./lib/timeline/component/LineGraph.js","webpack:///./lib/timeline/component/DataAxis.js","webpack:///./lib/timeline/component/DataScale.js","webpack:///./lib/timeline/component/GraphGroup.js","webpack:///./lib/timeline/component/graph2d_types/bar.js","webpack:///./lib/timeline/component/graph2d_types/points.js","webpack:///./lib/timeline/component/graph2d_types/line.js","webpack:///./lib/timeline/component/Legend.js","webpack:///./lib/timeline/optionsGraph2d.js","webpack:///./index-network.js","webpack:///./lib/network/Network.js","webpack:///./lib/network/Images.js","webpack:///./lib/network/modules/Groups.js","webpack:///./lib/network/modules/NodesHandler.js","webpack:///./lib/network/modules/components/Node.js","webpack:///./lib/network/modules/components/shared/Label.js","webpack:///./~/babel-runtime/helpers/slicedToArray.js","webpack:///./~/babel-runtime/core-js/is-iterable.js","webpack:///./~/core-js/library/fn/is-iterable.js","webpack:///./~/core-js/library/modules/core.is-iterable.js","webpack:///./lib/network/modules/components/nodes/shapes/Box.js","webpack:///./~/babel-runtime/core-js/object/get-prototype-of.js","webpack:///./~/core-js/library/fn/object/get-prototype-of.js","webpack:///./~/core-js/library/modules/es6.object.get-prototype-of.js","webpack:///./~/babel-runtime/helpers/possibleConstructorReturn.js","webpack:///./~/babel-runtime/helpers/inherits.js","webpack:///./~/babel-runtime/core-js/object/set-prototype-of.js","webpack:///./~/core-js/library/fn/object/set-prototype-of.js","webpack:///./~/core-js/library/modules/es6.object.set-prototype-of.js","webpack:///./~/core-js/library/modules/_set-proto.js","webpack:///./lib/network/modules/components/nodes/util/NodeBase.js","webpack:///./lib/network/modules/components/nodes/shapes/Circle.js","webpack:///./lib/network/modules/components/nodes/util/CircleImageBase.js","webpack:///./lib/network/modules/components/nodes/shapes/CircularImage.js","webpack:///./lib/network/modules/components/nodes/shapes/Database.js","webpack:///./lib/network/modules/components/nodes/shapes/Diamond.js","webpack:///./lib/network/modules/components/nodes/util/ShapeBase.js","webpack:///./lib/network/modules/components/nodes/shapes/Dot.js","webpack:///./lib/network/modules/components/nodes/shapes/Ellipse.js","webpack:///./lib/network/modules/components/nodes/shapes/Icon.js","webpack:///./lib/network/modules/components/nodes/shapes/Image.js","webpack:///./lib/network/modules/components/nodes/shapes/Square.js","webpack:///./lib/network/modules/components/nodes/shapes/Star.js","webpack:///./lib/network/modules/components/nodes/shapes/Text.js","webpack:///./lib/network/modules/components/nodes/shapes/Triangle.js","webpack:///./lib/network/modules/components/nodes/shapes/TriangleDown.js","webpack:///./lib/network/modules/EdgesHandler.js","webpack:///./lib/network/modules/components/Edge.js","webpack:///./lib/network/modules/components/edges/CubicBezierEdge.js","webpack:///./lib/network/modules/components/edges/util/CubicBezierEdgeBase.js","webpack:///./lib/network/modules/components/edges/util/BezierEdgeBase.js","webpack:///./lib/network/modules/components/edges/util/EdgeBase.js","webpack:///./lib/network/modules/components/edges/BezierEdgeDynamic.js","webpack:///./lib/network/modules/components/edges/BezierEdgeStatic.js","webpack:///./lib/network/modules/components/edges/StraightEdge.js","webpack:///./lib/network/modules/PhysicsEngine.js","webpack:///./lib/network/modules/components/physics/BarnesHutSolver.js","webpack:///./lib/network/modules/components/physics/RepulsionSolver.js","webpack:///./lib/network/modules/components/physics/HierarchicalRepulsionSolver.js","webpack:///./lib/network/modules/components/physics/SpringSolver.js","webpack:///./lib/network/modules/components/physics/HierarchicalSpringSolver.js","webpack:///./lib/network/modules/components/physics/CentralGravitySolver.js","webpack:///./lib/network/modules/components/physics/FA2BasedRepulsionSolver.js","webpack:///./lib/network/modules/components/physics/FA2BasedCentralGravitySolver.js","webpack:///./lib/network/modules/Clustering.js","webpack:///./lib/network/NetworkUtil.js","webpack:///./lib/network/modules/components/nodes/Cluster.js","webpack:///./lib/network/modules/CanvasRenderer.js","webpack:///./lib/network/modules/Canvas.js","webpack:///./lib/network/modules/View.js","webpack:///./lib/network/modules/InteractionHandler.js","webpack:///./lib/network/modules/components/NavigationHandler.js","webpack:///./lib/network/modules/SelectionHandler.js","webpack:///./lib/network/modules/LayoutEngine.js","webpack:///./lib/network/modules/ManipulationSystem.js","webpack:///./lib/network/options.js","webpack:///./lib/network/modules/KamadaKawai.js","webpack:///./lib/network/modules/components/algorithms/FloydWarshall.js","webpack:///./lib/network/shapes.js","webpack:///./lib/network/dotparser.js","webpack:///./lib/network/gephiParser.js","webpack:///./lib/network/locales.js"],"names":["util","require","extend","exports","moment","uuid","isNumber","object","Number","elementsCensor","replacer","key","value","Element","JSON","parse","recursiveDOMDelete","DOMobject","hasChildNodes","firstChild","removeChild","giveRange","min","max","total","scale","Math","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","randomUUID","v4","assignAllKeys","obj","prop","hasOwnProperty","fillIfDefined","a","b","allowDeletion","undefined","protoExtend","i","arguments","length","other","selectiveExtend","props","Array","isArray","Error","p","selectiveDeepExtend","TypeError","constructor","Object","deepExtend","selectiveNotDeepExtend","indexOf","push","equalArray","len","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","format","copyAndExtendArray","arr","newValue","newArr","copyArray","getAbsoluteLeft","elem","getBoundingClientRect","left","getAbsoluteRight","right","getAbsoluteTop","top","addClassName","className","classes","split","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","throttle","fn","scheduled","throttled","requestAnimationFrame","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","preventDefault","event","window","returnValue","getTarget","target","srcElement","nodeType","parentNode","hasParent","parent","e","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","hexToRGB","hex","shorthandRegex","replace","m","r","g","result","parseInt","overrideOpacity","color","opacity","rgb","substr","RGBToHex","red","green","blue","toString","slice","parseColor","c","isValidRGB","map","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","RGBToHSV","minRGB","maxRGB","d","hue","saturation","cssUtil","cssText","styles","style","trim","parts","addCssText","currentStyles","newStyles","removeCssText","removeStyles","HSVToRGB","floor","f","q","t","isOk","test","isValidRGBA","rgba","selectiveBridgeObject","fields","referenceObject","objectTo","bridgeObject","insertSort","compare","k","j","mergeOptions","mergeTarget","options","globalOptions","enabled","binarySearchCustom","orderedItems","comparator","field","field2","maxIterations","iteration","low","high","middle","item","searchResult","binarySearchValue","sidePreference","prevValue","nextValue","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","getScrollBarWidth","inner","document","createElement","width","height","outer","position","visibility","overflow","appendChild","body","w1","offsetWidth","w2","clientWidth","topMost","pile","accessors","candidate","member","module","_rng","globalVar","global","crypto","getRandomValues","_rnds8","Uint8Array","whatwgRNG","_rnds","random","_byteToHex","_hexToByte","buf","offset","ii","toLowerCase","oct","unparse","bth","_seedBytes","_nodeId","_clockseq","_lastMSecs","_lastNSecs","v1","clockseq","msecs","getTime","nsecs","dt","tl","tmh","node","n","rnds","rng","DOMutil","DataSet","DataView","Queue","Graph3d","graph3d","Camera","Filter","Point2d","Point3d","Slider","StepNumber","Hammer","keycharm","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","resetElements","getSVGElement","svgContainer","shift","createElementNS","getDOMElement","DOMContainer","insertBefore","drawPoint","x","y","groupTemplate","labelObj","point","setAttributeNS","size","label","xOffset","yOffset","content","textContent","drawBar","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","setOptions","prototype","queue","_queue","destroy","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","id","me","_addItem","items","update","updatedIds","oldData","updatedData","addOrUpdate","oldItem","_updateItem","console","warn","get","args","ids","firstType","returnType","allowedValues","itemIds","itemId","_getItem","order","_sort","_filterFields","resultant","getIds","getDataSet","mappedItems","filteredItem","itemFields","name","sort","av","bv","remove","removedIds","removedItems","_remove","ident","clear","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","delay","Infinity","_timeout","_extended","_flushIfNeeded","flush","methods","original","method","context","entry","clearTimeout","setTimeout","apply","_ids","_onEvent","setData","refresh","oldIds","newIds","viewOptions","getArguments","defaultFilter","dataSet","oldItems","updatedItems","Emitter","Range","Settings","STYLE","autoByDefault","DEFAULTS","filterLabel","legendLabel","xLabel","yLabel","zLabel","xValueLabel","yValueLabel","zValueLabel","showGrid","showPerspective","showShadow","keepAspectRatio","verticalRatio","dotSizeRatio","showAnimationControls","animationInterval","animationPreload","animationAutoStart","axisColor","gridColor","xCenter","yCenter","DOT","tooltip","showLegend","backgroundColor","dataColor","fill","stroke","strokeWidth","cameraPosition","horizontal","vertical","distance","xBarWidth","yBarWidth","valueMin","valueMax","xMin","xMax","xStep","yMin","yMax","yStep","zMin","zMax","zStep","container","SyntaxError","containerElement","dataTable","dataPoints","create","setDefaults","colX","colY","colZ","colValue","colFilter","_setScale","xRange","range","yRange","zRange","z","valueRange","center","zCenter","camera","setArmLocation","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","cameraLocation","getCameraLocation","cameraRotation","getCameraRotation","ax","ay","az","cx","cy","cz","sinTx","sin","cosTx","cos","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","ex","eye","ey","ez","bx","by","getArmLength","currentXCenter","frame","canvas","currentYCenter","_calcTranslations","points","trans","screen","transBottom","bottom","dist","sortDepth","getNumberOfRows","getNumberOfColumns","counter","column","getDistinctValues","distinctValues","getColumnRange","adjust","_checkValueField","hasValueField","BARCOLOR","BARSIZE","DOTCOLOR","DOTSIZE","_setRangeDefaults","defaultMin","defaultMax","_dataInitialize","rawData","_onChange","withBars","BAR","defaultXBarWidth","dataX","defaultYBarWidth","dataY","NUMSTEPS","expand","defaultXMin","defaultXMax","defaultXStep","defaultYMin","defaultYMax","defaultYStep","defaultZMin","defaultZMax","defaultZStep","defaultValueMin","defaultValueMax","dataFilter","setOnLoadCallback","redraw","_getDataPoints","GRID","SURFACE","sortNumber","dataMatrix","xIndex","yIndex","pointRight","pointTop","pointCross","LINE","pointNext","noCanvas","fontWeight","padding","innerHTML","onmousedown","_onMouseDown","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","onclick","_onClick","onkeydown","_setSize","_resizeCanvas","clientHeight","animationStart","slider","play","animationStop","stop","_resizeCenter","charAt","parseFloat","getCameraPosition","pos","getArmRotation","_readData","_redrawFilter","setPointDrawingMethod","_redrawBarGraphPoint","_redrawBarColorGraphPoint","_redrawBarSizeGraphPoint","_redrawDotGraphPoint","DOTLINE","_redrawDotLineGraphPoint","_redrawDotColorGraphPoint","_redrawDotSizeGraphPoint","_redrawSurfaceGraphPoint","_redrawGridGraphPoint","_redrawLineGraphPoint","_pointDrawingMethod","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGraph","_redrawInfo","_redrawLegend","_getContext","ctx","getContext","lineJoin","lineCap","clearRect","_dotSize","_getLegendWidth","dotSize","isSizeLegend","isValueLegend","margin","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","widthMin","fillStyle","closePath","gridLineLen","legendMin","legendMax","step","start","from","to","end","getCurrent","_line","textAlign","textBaseline","fillText","next","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","drawAxisLabelX","text","armAngle","yMargin","point2d","drawAxisLabelY","drawAxisLabelZ","_line3d","from2d","to2d","prettyStep","xText","yText","zText","gridLenX","gridLenY","textMargin","armVector","msg","from3d","xMin2d","xMax2d","H","S","V","R","G","B","C","Hi","X","abs","_getStrokeWidth","_redrawBar","xWidth","yWidth","borderColor","surface","surfaces","corners","avg","transCenter","diff","_polygon","_drawCircle","radius","_calcRadius","arc","PI","_getColorsRegular","_getColorsColor","_getColorsSize","colors","fraction","cross","topSideVisible","showGrayBottom","aDiff","subtract","bDiff","crossproduct","crossProduct","zAvg","_drawGridLine","call","_storeMousePosition","startMouseX","getMouseX","startMouseY","getMouseY","_startCameraOffset","getOffset","leftButtonDown","_onMouseUp","which","button","touchDown","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","moving","diffX","diffY","ctrlKey","scaleX","scaleY","offXNew","armLength","offYNew","setOffset","horizontalNew","verticalNew","snapAngle","snapValue","round","setArmRotation","parameters","emit","onclick_callback","boundingRect","mouseX","mouseY","dataPoint","_dataPointFromXY","showTooltip","tooltipTimeout","_hideTooltip","_showTooltip","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","setArmLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","line","dot","borderRadius","boxShadow","borderLeft","dom","contentWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","clientX","targetTouches","clientY","setCameraPosition","setSize","sub","sum","armLocation","armRotation","cameraOffset","offsetMultiplier","calculateCameraOrientation","mul","rot","xa","ya","za","graph","loaded","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","getValue","dataView","dataPointsTemp","progress","visible","prev","bar","MozBorderRadius","slide","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","_start","_end","_step","precision","_current","setRange","isNumeric","isFinite","setStep","calculatePrettyStep","log10","log","LN10","step1","pow","step2","step5","toPrecision","getStep","checkFirst","combine","val","newMin","newMax","STYLENAME","OPTIONKEYS","PREFIXEDOPTIONKEYS","isEmpty","capitalize","str","toUpperCase","prefixFieldName","prefix","fieldName","forceCopy","src","dst","srcKey","dstKey","safeCopy","setSpecialSettings","setBackgroundColor","setDataColor","setStyle","setShowLegend","isAutoByDefault","isLegendGraphStyle","getStyleNumberByName","styleName","number","checkStyleNumber","valid","styleNumber","borderWidth","borderStyle","camPos","propagating","Timeline","Graph2d","timeline","Core","DateUtil","stack","TimeStep","components","Item","BackgroundItem","BoxItem","PointItem","RangeItem","BackgroundGroup","Component","CurrentTime","CustomTime","DataAxis","DataScale","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","printStyle","allOptions","configureOptions","groups","forthArgument","throttleRedraw","defaultOptions","autoResize","orientation","axis","maxHeight","minHeight","_create","rtl","directionFromDom","domNode","root","getComputedStyle","direction","parentElement","rollingMode","domProps","emitter","bind","hiddenDates","getScale","timeAxis","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis2","currentTime","itemSet","itemsData","groupsData","getEventProperties","ondblclick","oncontextmenu","onmouseover","fitDone","getItemRange","setWindow","animation","fit","setGroups","setItems","_redraw","_createConfigurator","markDirty","refreshItems","errorFound","validate","selection","getSelection","setSelection","newDataSet","group","focus","itemData","dataset","getDataRange","minItem","maxItem","factor","lhs","rhs","getStart","getEnd","groupShowing","show","repositionX","startSide","getWidthRight","endSide","getWidthLeft","centerContainer","itemFromTarget","groupFromTarget","customTime","customTimeFromTarget","snap","time","snappedTime","what","foreground","labelSet","groupId","pageX","srcEvent","pageY","Configurator","parentModule","defaultContainer","pixelRatio","changedOptions","allowCreation","initialized","popupCounter","showButton","moduleOptions","domElements","popupDiv","popupLimit","popupHistory","colorPicker","wrapper","_removePopup","_clean","_handleObject","_makeItem","_makeHeader","generateButton","_printOptions","onmouseout","optionsContainer","_push","_showPopupIfNeeded","path","base","div","objectLabel","select","selectedValue","selected","_update","_makeLabel","err","popupString","popupValue","ceil","input","oninput","itemIndex","_setupPopup","string","html","hideTimeout","deleteTimeout","correspondingElement","checkbox","checked","defaultColor","_showColorPicker","insertTo","setColor","setUpdateCallback","colorString","setCloseCallback","checkOnly","visibleInSet","subObj","newPath","_getValue","_handleArray","_makeTextInput","_makeCheckbox","draw","physics","solver","enabledPath","enabledValue","error","_makeColorField","_makeDropdown","_makeRange","_constructOptions","optionsObj","pointer","getOptions","hammerUtil","ColorPicker","generated","centerCoordinates","hueCircle","initialColor","previousColor","applied","updateCallback","closeCallback","hammer","_bindHammer","htmlColors","black","navy","darkblue","mediumblue","darkgreen","teal","darkcyan","deepskyblue","darkturquoise","mediumspringgreen","lime","springgreen","aqua","cyan","midnightblue","dodgerblue","lightseagreen","forestgreen","seagreen","darkslategray","limegreen","mediumseagreen","turquoise","royalblue","steelblue","darkslateblue","mediumturquoise","indigo","darkolivegreen","cadetblue","cornflowerblue","mediumaquamarine","dimgray","slateblue","olivedrab","slategray","lightslategray","mediumslateblue","lawngreen","chartreuse","aquamarine","maroon","purple","olive","gray","skyblue","lightskyblue","blueviolet","darkred","darkmagenta","saddlebrown","darkseagreen","lightgreen","mediumpurple","darkviolet","palegreen","darkorchid","yellowgreen","sienna","brown","darkgray","lightblue","greenyellow","paleturquoise","lightsteelblue","powderblue","firebrick","darkgoldenrod","mediumorchid","rosybrown","darkkhaki","silver","mediumvioletred","indianred","peru","chocolate","tan","lightgrey","palevioletred","thistle","orchid","goldenrod","crimson","gainsboro","plum","burlywood","lightcyan","lavender","darksalmon","violet","palegoldenrod","lightcoral","khaki","aliceblue","honeydew","azure","sandybrown","wheat","beige","whitesmoke","mintcream","ghostwhite","salmon","antiquewhite","linen","lightgoldenrodyellow","oldlace","fuchsia","magenta","deeppink","orangered","tomato","hotpink","coral","darkorange","lightsalmon","orange","lightpink","pink","gold","peachpuff","navajowhite","moccasin","bisque","mistyrose","blanchedalmond","papayawhip","lavenderblush","seashell","cornsilk","lemonchiffon","floralwhite","snow","yellow","lightyellow","ivory","white","setInitial","htmlColor","_isColorString","rgbaArray","rgbObj","alpha","_setColor","display","_generateHueCircle","storePrevious","_hide","_updatePicker","alert","angleConvert","colorPickerSelector","colorPickerCanvas","pixelRation","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","setTransform","w","putImageData","circle","brightnessRange","opacityRange","initialColorDiv","newColorDiv","colorPickerDiv","opacityDiv","brightnessDiv","arrowDiv","_setOpacity","_setBrightness","brightnessLabel","opacityLabel","cancelButton","applyButton","_apply","saveButton","_save","loadButton","_loadLast","drag","pinch","set","enable","onTouch","_moveSelector","sat","hfac","sfac","fillRect","getImageData","centerY","centerX","angle","atan2","newTop","newLeft","inputHandler","isFirst","onRelease","isFinal","offTouch","offRelease","disablePreventDefaultVertically","pinchRecognizer","TOUCH_ACTION_PAN_Y","getTouchAction","Validator","referenceOptions","subObject","usedOptions","check","__any__","getSuggestion","__type__","checkFields","referenceOption","refOptionObj","optionType","refOptionType","print","printLocation","_isAMomentObject","localSearch","findInOptions","globalSearch","localSearchThreshold","globalSearchThreshold","indexMatch","closestMatch","recursive","closestMatchPath","lowerCaseOption","op","levenshteinDistance","matrix","now","hours","minutes","seconds","milliseconds","clone","rolling","deltaDifference","scaleOffset","startToFront","endToFront","moveable","zoomable","zoomMin","zoomMax","touch","animationTimer","_onDragStart","_onDrag","_onDragEnd","_onMouseWheel","_onTouch","_onPinch","rollingModeBtn","startRolling","validateDirection","stopRolling","conversion","currentTimeTimer","byUser","finalStart","finalEnd","_cancelAnimation","initStart","initEnd","duration","easingName","easingFunction","initTime","anyChanged","dragging","ease","done","changed","_applyRange","updateHiddenDates","newStart","newEnd","getRange","totalHidden","previousDelta","_isInsideRange","allowDragging","deltaX","deltaY","getHiddenDurationBetween","diffRange","safeStart","snapAwayFromHidden","safeEnd","startDate","endDate","zoomKey","horizontalScroll","pointerDate","getPointer","_pointerToDate","zoom","centerDate","hiddenDuration","hiddenDurationBefore","getHiddenDurationBefore","hiddenDurationAfter","move","_isResized","resized","_previousWidth","_previousHeight","convertHiddenOptions","repeat","dateItem","totalRange","pixelTime","_d","runUntil","day","dayOfYear","year","dayOffset","date","month","removeDuplicates","startHidden","isHidden","endHidden","rangeStart","rangeEnd","hidden","safeDates","printDates","dates","stepOverHiddenDates","timeStep","previousTime","stepInHidden","currentValue","current","switchedYear","switchedMonth","switchedDay","hiddenBeforeStart","getHiddenDurationBeforeStart","rangeAfterEnd","correctTimeForHidden","totalDuration","partialDuration","accumulatedHiddenDuration","getAccumulatedHiddenDuration","newTime","timeOffset","requiredDuration","previousPoint","correctionEnabled","Activator","backgroundVertical","backgroundHorizontal","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","scrollTop","scrollTopMin","initialDrawDone","_origRedraw","properties","initialItemSetDrawn","threshold","DIRECTION_HORIZONTAL","listeners","events","isActive","onMouseWheel","verticalScroll","adjusted","_setScrollTop","onMouseScrollSide","itemAddedToTimeline","handleDragOver","dataTransfer","dropEffect","handleDrop","getData","_onAddItem","customTimes","redrawCount","drawPoints","onRender","clickToUse","activator","_initAutoResize","component","configurator","configure","appliedOptions","setModuleOptions","active","_stopAutoResize","setCustomTime","getCustomTime","setCustomTimeTitle","title","setCustomTitle","addCustomTime","timestamp","some","removeCustomTime","getVisibleItems","getWindow","zoomIn","percentage","newInterval","zoomOut","borderRootHeight","borderRootWidth","autoHeight","containerHeight","scrollbarWidth","_setDOM","_updateScrollTop","visibilityTop","visibilityBottom","RegExp","contentsOverflow","DIRECTION_ALL","MAX_REDRAW","centerWidth","repaint","setCurrentTime","getCurrentTime","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","initialScrollTop","oldScrollTop","_getScrollTop","newScrollTop","UNGROUPED","BACKGROUND","align","stackSubgroups","groupOrderSwap","fromGroup","toGroup","targetOrder","groupOrder","selectable","multiselect","itemsAlwaysDraggable","editable","updateTime","updateGroup","overrideItems","groupEditable","onAdd","onUpdate","onMove","onRemove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup","followMouse","overflowMethod","tooltipOnItemUpdateTime","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","stackDirty","touchParams","groupTouchParams","box","_updateUngrouped","backgroundGroup","_onSelectItem","_onMultiSelectItem","groupHammer","_onGroupClick","_onGroupDragStart","_onGroupDrag","_onGroupDragEnd","DIRECTION_VERTICAL","_onMouseOver","_onMouseOut","addCallback","Function","dirty","displayed","hide","unselect","rawVisibleItems","visibleItems","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","restack","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","_getGroupId","getLabelSet","oldItemsData","getItems","nestedGroups","nestedGroupId","updatedNestedGroup","nestedInGroup","showNested","_order","getGroups","removeItem","itemObj","popup","_getType","_removeItem","groupData","groupOptions","_orderNestedGroups","newGroupIdsOrder","nestedGroup","nestedGroupIds","oldGroupId","oldSubGroupId","subgroup","oldGroup","_constructByEndArray","endArray","dragLeftItem","dragRightItem","itemProps","_getGroupIndex","itemIsDragging","selectedItem","initialX","dragLeft","_cloneItemData","dragRight","baseGroupIndex","itemsToDrag","groupIndex","groupOffset","stopPropagation","metaKey","_onDragStartAddItem","xAbs","newItem","offsetLeft","updateGroupAllowed","newGroupBase","initial","updateTimeAllowed","initialEnd","initialStart","newOffset","_moveToGroup","collapsedDirClassName","originalOrder","movingUp","targetGroupTop","draggedGroupHeight","targetGroupHeight","targetGroup","draggedGroup","newOrder","origOrder","draggedId","numGroups","curPos","orgOffset","slippedPosition","switchGroup","shouldBeGroup","switchGroupId","shiftKey","oldSelection","newSelection","related","itemFromRelatedTarget","getTitle","setPopup","setPosition","offsetTop","_onUpdateItem","newItemData","itemGroup","lastSelectedGroup","multiselectPerGroup","_getItemRange","_item","itemFromElement","cur","relatedTarget","itemSetFromTarget","Popup","doShow","maxWidth","isLeft","isTop","minimumStep","autoScale","FORMAT","minorLabels","millisecond","second","minute","hour","weekday","majorLabels","setMoment","setFormat","defaultFormat","setMinimumStep","roundToMinor","hasNext","setScale","setAutoScale","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","isMajor","getLabelMinor","getLabelMajor","getClassName","_moment","locale","lang","even","today","isSame","currentWeek","currentMonth","currentYear","subgroups","subgroupIndex","subgroupOrderer","subgroupOrder","isVisible","itemsInRange","byStart","byEnd","checkRangedItems","marker","templateFunction","paddingRight","paddingLeft","getLabelWidth","markerHeight","lastMarkerHeight","_calculateSubGroupHeights","_isGroupVisible","limitSize","customOrderedItems","_updateItemsInRange","nostack","_updateSubgroupsSizes","_calculateHeight","repositionY","resetSubgroups","setParent","orderSubgroups","_checkIfVisible","sortArray","sortField","removeFromDataSet","startArray","orderByStart","orderByEnd","oldVisibleItems","visibleItemsLookup","lowerBound","upperBound","searchFunction","_checkIfVisibleWithReference","initialPosByStart","_traceVisible","initialPosByEnd","initialPos","breakCondition","EPSILON","aTime","bTime","force","collidingItem","jj","collision","otherSubgroup","collisionByTimes","baseClassName","visibleFrame","_updateContents","_updateTitle","_updateDataAttributes","_updateStyle","_repaintOnItemUpdateTimeTooltip","_repaintDeleteButton","_repaintDragCenter","_repaintDragLeft","_repaintDragRight","parentWidth","contentStartPosition","boxWidth","groupChanged","dragCenter","dragCenterItem","anchor","deleteButton","onItemUpdateTimeTooltip","tooltipOffset","itemDistanceFromTop","isCloseToTop","template","itemVisibleFrameContent","visibleFrameTemplateFunction","frameElement","itemVisibleFrameContentElement","getElementsByClassName","visibleFrameTemplate","_contentToString","setText","dataAttributes","attributes","setAttribute","removeAttribute","outerHTML","msPerPixel","widthInMs","previousRight","previousLeft","itemSetHeight","marginLeft","marginRight","itemSubgroup","lines","majorTexts","minorTexts","lineTop","showMinorLabels","showMajorLabels","maxMinorChars","parentChanged","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineHeight","minorLineWidth","majorLineHeight","majorLineWidth","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","timeLabelsize","minorCharWidth","xNext","nextIsMajor","prevWidth","labelMinor","xFirstMajorLabel","MAX","showMinorGrid","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","warnedForOverflow","leftTime","leftText","widthText","majorCharWidth","pop","createTextNode","childNodes","measureCharMinor","measureCharMajor","overlay","_onTapOverlay","onClick","_hasParent","deactivate","escListener","activate","unbind","locales","eventParams","warned","substring","showCurrentTime","bool","any","groupsDraggable","linegraph","initialLoad","getLegend","isGroupVisible","yAxisLeft","yAxisRight","legendLeft","legendRight","screenToValue","Bars","Lines","Points","yAxisOrientation","defaultGroup","sampling","graphHeight","shaded","barChart","sideBySide","interpolation","parametrization","dataAxis","legend","abortedGraphUpdate","updateSVGheight","updateSVGheightOnResize","forceGraphUpdate","lastStart","svgElements","groupsUsingDefaultStyles","svg","framework","_removeGroup","_updateAllGroupData","removeGroup","_updateGroup","addGroup","groupsContent","idMap","groupCounts","existing_items","extended","orginalY","_updateGraph","rangePerPixelInv","_getSortedGroupIds","grouplist","zIndex","bz","groupRanges","changeCalled","minDate","maxDate","_getRelevantData","_applySampling","_convertXcoordinates","_getYRanges","_updateYAxis","below","excludeFromStacking","_stack","_convertYcoordinates","paths","calcPath","subGroupId","drawShading","subData","subPrevPoint","subNextPoint","dateComparator","first","last","dataContainer","increment","amountOfPoints","xDistance","pointsPerPixel","sampledData","idx","combinedDataLeft","combinedDataRight","getYRange","getStackedYRange","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","minVal","maxVal","ignore","_toggleAxisVisiblity","drawIcons","master","masterAxis","lineOffset","tempGroups","axisUsed","datapoints","screen_x","screen_y","svgHeight","convertValue","setZeroPosition","linegraphOptions","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","alignZeros","linegraphSVG","DOMelements","labels","conversionFactor","minWidth","stepPixels","zeroCrossing","amountOfSteps","iconsRemoved","amountOfGroups","lineContainer","graphOptions","_redrawGroupIcons","iconHeight","iconOffset","groupArray","_cleanupIcons","activeGroups","_redrawLabels","_redrawTitle","customRange","autoScaleEnd","autoScaleStart","followScale","maxLabelSize","getLines","major","_redrawLabel","_redrawLine","titleWidth","titleCharHeight","characterHeight","largestWidth","textMinor","textMajor","textTitle","measureCharTitle","titleCharWidth","zeroAlign","formattingFunction","majorSteps","minorSteps","customLines","minorStepIdx","magnitudefactor","determineScale","rounded","setCharHeight","setHeight","minimumStepValue","orderOfMagnitude","solutionFound","l","stepSize","is_major","getFirstMajor","majorStep","formatValue","bottomOffset","oldStepIdx","oldStart","oldEnd","increaseMagnitude","decreaseMagnitude","otherZero","otherStep","newRange","myOriginalZero","majorOffset","zeroOffset","pixels","usingDefaultStyle","zeroPosition","drawIcon","icon","Bargraph","fillHeight","fillPath","outline","barWidth","originalWidth","bar1Height","bar2Height","processedGroupData","combinedData","intersections","coreDistance","drawData","barPoints","_getDataIntersections","heightOffset","_getSafeDrawData","nextKey","amount","resolved","prevKey","accumulatedNegative","accumulatedPositive","pointData","groupLabel","_getStackedYRange","xpos","getCallback","getGroupTemplate","callbackResult","Line","_catmullRom","_linear","pathArray","subPathArray","dFill","zero","serializePath","inverse","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","side","iconSize","iconSpacing","excludeFromLegend","textArea","scrollableHeight","drawLegendIcons","paddingTop","Network","network","Images","dotparser","gephiParser","convertDot","DOTToGraph","convertGephi","parseGephi","nodes","nodeIndices","edges","edgeIndices","once","eventListeners","onTap","onDoubleTap","onHold","onDragStart","onDrag","onDragEnd","onPinch","onMouseMove","onContext","functions","createNode","createEdge","modules","view","bindEventListeners","images","selectionHandler","interactionHandler","renderer","layoutEngine","clustering","manipulation","nodesHandler","edgesHandler","layout","interaction","networkOptions","_updateVisibleIndices","nodeId","edgeId","_updateValueRange","unselectAll","dotData","gephi","gephiData","valueTotal","setValueRange","canvasToDOM","DOMtoCanvas","findNode","isCluster","openCluster","cluster","getNodesInCluster","clusterByConnection","clusterByHubsize","clusterOutliers","getSeed","enableEditMode","disableEditMode","addNodeMode","editNode","editNodeMode","addEdgeMode","editEdgeMode","deleteSelected","getPositions","storePositions","moveNode","getBoundingBox","getConnectedNodes","objectId","getConnectedEdges","startSimulation","stopSimulation","stabilize","getSelectedNodes","getSelectedEdges","getNodeAt","getEdgeAt","edge","selectNodes","selectEdges","getViewPosition","releaseNode","getOptionsFromConfigurator","imageBroken","url","imageToCache","brokenUrl","imageToLoadBrokenUrlOn","onerror","_addImageToCache","Image","imageToRedrawWith","cachedImage","img","onload","_redrawWithImage","_tryloadBrokenUrl","Groups","defaultIndex","groupsArray","defaultGroups","useDefaultGroups","optionFields","groupName","groupname","NodesHandler","nodesListeners","borderWidthSelected","brokenImage","fixed","face","strokeColor","vadjust","multi","bold","mod","boldital","ital","mono","code","image","labelHighlightBold","level","mass","scaling","maxVisible","drawThreshold","customScalingFunction","shadow","shape","shapeProperties","borderDashes","useImageSize","useBorderWithImage","nodeOptions","parseOptions","updateShape","updateLabelModule","_reset","doNotEmit","oldNodesData","newNodes","positionInitially","changedData","dataChanged","constructorClass","clearPositions","dataArray","boundingBox","nodeList","nodeObj","toId","fromId","edgeList","Node","imagelist","baseSize","baseFontSize","predefinedPosition","labelModule","currentShape","groupObj","choosify","imageObj","load","propagateFonts","chooser","chosen","chosenNode","shadowColor","shadowSize","shadowX","shadowY","constrain","distanceToBorder","sizeDiff","fontDiff","getFormattingValues","updateBoundingBox","resize","parentOptions","newOptions","parsedColor","Label","edgelabel","pointToSelf","fontOptions","yLine","isEdgeLabel","elementOptions","labelDirty","constrainWidth","maxWdt","minWdt","widthConstraint","widthConstraintMaximum","widthConstraintMinimum","constrainHeight","minHgt","valign","heightConstraint","heightConstraintMinimum","heightConstraintValign","chosenLabel","margins","widthBias","heightBias","mods","optionsFontMod","modOptionsArray","ratio","baseline","viewFontSize","calculateLabelSize","_drawBackground","_drawText","lineMargin","fontSize","_setAlignment","labelHeight","lineCount","blocks","block","_getColor","fontColor","strokeText","initialStrokeColor","_processLabel","markupSystem","system","decodeMarkupSystem","splitMarkdownBlocks","splitHtmlBlocks","beginable","spacing","buffer","modStack","modName","emitBlock","override","ch","unshift","selectedState","hoverState","nlLines","accumulate","addAndAccumulate","splitBlocks","words","atStart","measure","lastMeasure","pre","measureText","newOptionsArray","Box","_setMargins","differentState","textSize","getTextSize","roundRect","enableShadow","disableShadow","save","enableBorderDashes","disableBorderDashes","restore","NodeBase","adjustSizes","shadowBlur","shadowOffsetX","shadowOffsetY","setLineDash","dashes","Circle","diameter","_drawRawCircle","CircleImageBase","labelOffset","imageLoaded","globalAlpha","can2","ctx2","drawImage","iterations","labelDimensions","CircularImage","_swapToImageResizeWhenImageLoaded","_resizeImage","clip","_drawImageAtPosition","_drawImageLabel","Database","database","_distanceToBorder","Diamond","_resizeShape","_drawShape","ShapeBase","sizeMultiplier","Dot","Ellipse","ellipse","Icon","_icon","iconTextSpacing","neutralborderWidth","selectionLineWidth","Square","Star","Text","Triangle","TriangleDown","EdgesHandler","edgesListeners","arrows","scaleFactor","arrowStrikethrough","inherit","hoverWidth","selectionWidth","selfReferenceSize","smooth","forceDirection","roundness","emitChange","edgeData","edgeOptions","reconnectEdges","updateEdgeType","oldEdgesData","edgesData","oldEdge","disconnect","connect","cleanup","Edge","baseWidth","edgeType","connected","_setInteractionWidths","chosenEdge","toArrow","fromArrow","middleArrow","inheritsColor","toArrowScale","toArrowType","middleArrowScale","middleArrowType","fromArrowScale","fromArrowType","selectedWidth","changeInType","attachEdge","detachEdge","widthDiff","viaNode","getViaNode","arrowData","fromPoint","toPoint","getArrowData","core","drawLine","drawArrows","drawLabel","drawArrowHead","node1","node2","getPoint","translate","_rotateForLabelAlignment","_pointOnCircle","xFrom","yFrom","xTo","yTo","xObj","yObj","getDistanceToEdge","angleInDegrees","rotate","colorsDefined","CubicBezierEdge","viaNodes","via1","via2","bezierCurveTo","x1","y1","x2","y2","_getViaCoordinates","nearNode","_findBorderPositionBezier","x3","y3","_getDistanceToBezierEdge","vec","CubicBezierEdgeBase","minDistance","lastX","lastY","_getDistanceToLine","BezierEdgeBase","distanceToPoint","difference","via","EdgeBase","colorDirty","getColor","_drawDashedLine","_drawLine","_getCircleData","_circle","pattern","lineDashOffset","dashedLine","_findBorderPosition","_findBorderPositionCircle","grd","createLinearGradient","fromColor","toColor","addColorStop","_getDistanceToEdge","px","py","something","u","arrowPoint","guideOffset","findBorderPosition","guidePos","xi","yi","arrowCore","circleEndpoint","arrowEndpoint","BezierEdgeDynamic","_boundFunction","positionBezierNode","physicsChange","setupSupportNode","parentEdgeId","quadraticCurveTo","cr","BezierEdgeStatic","xVia","yVia","pi","originalAngle","myAngle","StraightEdge","edgeSegmentLength","toBorderDist","toBorderPoint","borderPos","PhysicsEngine","physicsBody","physicsNodeIndices","physicsEdgeIndices","forces","velocities","physicsEnabled","simulationInterval","requiresTimeout","previousStates","referenceState","freezeCache","renderTimer","adaptiveTimestep","adaptiveTimestepEnabled","adaptiveCounter","adaptiveInterval","stabilized","startedStabilization","stabilizationIterations","ready","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","avoidOverlap","forceAtlas2Based","repulsion","nodeDistance","hierarchicalRepulsion","maxVelocity","minVelocity","stabilization","updateInterval","onlyDynamicEdges","timestep","layoutFailed","initPhysics","updatePhysicsData","init","nodesSolver","edgesSolver","gravitySolver","modelOptions","viewFunction","simulationStep","_emitStabilized","startTime","physicsTick","physicsTime","runDoubleSpeed","amountOfIterations","calculateForces","moveNodes","revert","_evaluateStepQuality","nodeIds","positions","vx","vy","dpos","reference","posThreshold","maxNodeVelocity","averageNodeVelocity","velocityAdaptiveThreshold","nodeVelocity","_performStep","totalVelocity","solve","targetIterations","_freezeNodes","_stabilizationBatch","_finalizeStabilization","_restoreFrozenNodes","colorFactor","forceSize","arrowSize","BarnesHutSolver","barnesHutTree","randomSeed","thetaInversed","overlapAvoidanceFactor","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","_calculateForces","gravityForce","fx","fy","minX","minY","maxX","maxY","minimumTreeSize","rootSize","halfRootSize","_splitBranch","_placeInTree","totalMass","totalMassInv","biggestSize","skipMassUpdate","_updateBranchMass","_placeInRegion","region","seededRandom","containedNode","_insertRegion","childSize","_drawBranch","branch","RepulsionSolver","repulsingForce","HierarchicalRepulsionSolver","steepness","SpringSolver","edgeLength","node3","_calculateSpringForce","springForce","HierarchicalSpringSolver","springFx","springFy","totalFx","totalFy","correctionFx","correctionFy","CentralGravitySolver","ForceAtlas2BasedRepulsionSolver","degree","ForceAtlas2BasedCentralGravitySolver","ClusterEngine","clusteredNodes","clusteredEdges","hubsize","_getHubSize","_checkOptions","nodesToCluster","refreshData","joinCondition","childNodesObj","childEdgesObj","clonedOptions","cloneOptions","_cluster","edgeCount","clusters","usedNodes","relevantEdgeCount","gatheringSuccessful","childNodeId","_getConnectedId","clusterByEdgeCount","clusterNodeProperties","parentNodeId","parentClonedOptions","childClonedOptions","childNodeIDs","childNode","childEdge","clusterEdgeProperties","otherNodeId","childKeys","createEdges","newEdge","clusteringEdgeReplacingId","edgeReplacedById","_backupEdgeOptions","allowSingleNodeCluster","processProperties","childNodesOptions","childEdgesOptions","clusterId","_getClusterPosition","clusterNode","containedNodes","containedEdges","_createClusterEdges","originalOptions","clusterNodeId","releaseFunction","clusterPosition","newPositions","edgesToBeDeleted","otherCluster","transferEdge","replacedEdge","_restoreEdge","nodesArray","reverse","clusteredNodeId","startEdgeId","allEdgeIds","getClusteredEdges","clusteredEdgeId","baseEdgeId","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","hubThreshold","NetworkUtil","allNodes","specificNodes","amountOfConnections","Cluster","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","CanvasRenderer","redrawRequested","renderingActive","renderRequests","allowRedraw","hideEdgesOnDrag","hideNodesOnDrag","_determineBrowserMethod","_resizeNodes","_requestRedraw","_startRendering","cancelAnimationFrame","_renderStep","_drawEdges","_drawNodes","alwaysShow","topLeft","bottomRight","viewableArea","isSelected","isBoundingBoxOverlappingWith","browserType","Canvas","resizeTimer","resizeFunction","cameraState","canvasViewCenter","hammerFrame","_cleanUp","previousWidth","previousHeight","widthRatio","heightRatio","newScale","currentViewCenter","distanceFromCenter","tabIndex","_prepareValue","emitEvent","oldWidth","oldHeight","previousRatio","_getCameraState","_setCameraState","_XconvertCanvasToDOM","_YconvertCanvasToDOM","_XconvertDOMtoCanvas","_YconvertDOMtoCanvas","View","animationSpeed","renderRefreshRate","animationEasingFunction","easingTime","sourceScale","targetScale","sourceTranslation","targetTranslation","lockedOnNodeId","lockedOnNodeOffset","touchTime","initialZoom","zoomLevel","positionDefined","numberOfNodes","yDistance","xZoomLevel","yZoomLevel","findCenter","animationOptions","nodePosition","lockedOnNode","animateView","locked","_transitionRedraw","viewCenter","_lockedRedraw","finished","InteractionHandler","navigationHandler","popupObj","popupTimer","dragNodes","dragView","keyboard","speed","bindToWindow","navigationButtons","tooltipDelay","zoomView","pinched","changedPointers","checkSelectionChanges","_generateClickEvent","previouslySelectedEdgeCount","_getSelectedEdgeCount","previouslySelectedNodeCount","_getSelectedNodeCount","previousSelection","selectAdditionalOnPoint","selectOnPoint","selectedEdgesCount","selectedNodesCount","currentSelection","_determineIfDifferent","nodesChanged","edgesChanged","nodeSelected","selectObject","selectionObj","xFixed","yFixed","scaleOld","preScaleDragPointer","scaleFrac","tx","ty","postScaleDragPointer","popupVisible","_checkHidePopup","_checkShowPopup","hoverObject","pointerObj","previousPopupObjId","nodeUnderCursor","popupType","overlappingNodes","isOverlappingWith","overlappingEdges","popupTargetType","popupTargetId","_pointerToPositionObject","stillOnObj","overNode","NavigationHandler","iconsCreated","navigationHammers","boundFunctions","activated","configureKeyboardBindings","loadNavigationElements","cleanNavigation","navigationDOM","navigationDivs","navigationDivActions","_fit","bindToRedraw","_stopMovement","boundAction","reset","unbindFromRedraw","SelectionHandler","hoverObj","selectConnectedEdges","hoverConnectedEdges","updateSelection","selectionChanged","deselectObject","eventType","emptySelection","DOM","highlightEdges","_selectConnectedEdges","_addToSelection","_removeFromSelection","canvasPos","returnNode","positionObject","_getAllNodesOverlappingWith","_getEdgesOverlappingWith","returnEdge","mindist","overlappingEdge","_unselectConnectedEdges","clusterSize","_addToHover","hoverChanged","blurObject","_hoverConnectedEdges","edgeIds","idArray","RangeError","LayoutEngine","initialRandomSeed","setPhysics","optionsBackup","improvedLayout","hierarchical","levelSeparation","nodeSpacing","treeSpacing","blockShifting","edgeMinimization","parentCentralization","sortMethod","setupHierarchicalLayout","layoutNetwork","prevHierarchicalState","adaptAllOptionsForHierarchicalLayout","MAX_LEVELS","clusterThreshold","startLength","before","clusterBridges","after","_declusterAll","info","kamadaKawai","_shiftToCenter","getRangeCore","clustersPresent","definedLevel","definedPositions","undefinedLevel","hierarchicalLevels","lastNodeOnLevel","hierarchicalChildrenReference","hierarchicalParentReference","hierarchicalTrees","treeIndex","distributionOrdering","distributionIndex","distributionOrderingPresence","_determineLevelsByHubsize","_determineLevelsDirected","_determineLevelsCustomCallback","distribution","_getDistribution","_generateMap","_placeNodesByHierarchy","_condenseHierarchy","stillShifting","branches","shiftTrees","treeSizes","getTreeSizes","shiftTree","_getPositionForHierarchy","_setPositionForHierarchy","getTreeSize","treeWidths","getBranchNodes","source","getBranchBoundary","branchMap","maxLevel","minSpace","maxSpace","branchNode","_getSpaceAroundNode","minSpaceNode","maxSpaceNode","getMaxLevel","getCollisionLevel","maxLevel1","maxLevel2","hasSameParent","parents1","parents2","shiftElementsCloser","levels","centerParents","levelNodes","branchShiftCallback","centerParent","pos1","pos2","diffAbs","branchNodes1","branchNodes2","min1","max1","minSpace1","maxSpace1","min2","max2","minSpace2","maxSpace2","diffBranch","_shiftBlock","_centerParent","minimizeEdgeLength","allEdges","nodeLevel","C2","referenceNodes","aboveEdges","otherNode","getFx","getDFx","getGuess","guess","guessMap","dfx","limit","moveBranch","branchNodes","minBranch","maxBranch","minSpaceBranch","maxSpaceBranch","branchOffset","newPosition","minimizeEdgeLengthBottomUp","shiftBranchesCloserBottomUp","centerAllParents","centerAllParentsBottomUp","useMap","prevNode","prevPos","nextNode","nextPos","parents","parentId","minPos","maxPos","positionedNodes","nodeArray","_indexArrayToNodes","_sortNodeArray","handledNodeCount","_validataPositionAndContinue","parentLevel","childNodeLevel","previousPos","sharedParent","_findCommonParent","withChild","_placeBranchNodes","hubSize","levelDownstream","nodeA","nodeB","_crawlNetwork","minLevel","customCallback","levelByDirection","levelA","_setMinLevelToZero","fillInRelations","startingNodeId","crawler","tree","childA","childB","iterateParents","child","findParent","foundParent","doNotUpdate","ManipulationSystem","editMode","manipulationDiv","editModeDiv","closeDiv","manipulationHammers","temporaryUIFunctions","temporaryEventFunctions","temporaryIds","guiEnabled","inMode","selectedControlNode","initiallyActive","addNode","addEdge","editEdge","deleteNode","deleteEdge","controlNodeStyle","_restore","_setup","showManipulatorToolbar","_createEditButton","manipulationDOM","selectedNodeCount","selectedEdgeCount","selectedTotalCount","needSeperator","_createAddNodeButton","_createSeperator","_createAddEdgeButton","_createEditNodeButton","_createEditEdgeButton","_createDeleteButton","_bindHammerToDiv","toggleEditMode","_temporaryBindEvent","_createBackButton","_createDescription","_performAddNode","_getSelectedNode","finalizedData","_temporaryBindUI","_handleConnect","_finishConnect","_dragControlNode","editWithoutDrag","edgeBeingEditedId","_performEditEdge","controlNodeFrom","_getNewTargetNode","controlNodeTo","_controlNodeTouch","_controlNodeDragStart","_controlNodeDrag","_controlNodeDragEnd","findBorderPositions","selectedNodes","selectedEdges","deleteFunction","_createWrappers","_removeManipulationDOM","_createButton","_cleanManipulatorHammers","_cleanupTemporaryNodesAndEdges","_unbindTemporaryUIs","_unbindTemporaryEvents","deleteBtnClass","labelClassName","newFunction","boundFunction","UIfunctionName","functionName","eventName","domElement","indexTempEdge","indexTempNode","lastTouch","fromSelect","toSelect","overlappingNodeIds","targetNode","connectionEdge","connectFromId","_performAddEdge","clickData","defaultData","sourceNodeId","targetNodeId","eeFunct","boolean","maximum","minimum","KamadaKawai","edgeStrength","distanceSolver","edgesArray","ignoreClusters","D_matrix","getDistances","_createL_matrix","_createK_matrix","innerThreshold","maxInnerIterations","maxEnergy","highE_nodeId","dE_dx","dE_dy","delta_m","subIterations","_getHighestEnergyNode","_moveNode","_getEnergy","maxEnergyNodeId","dE_dx_max","dE_dy_max","nodeIdx","x_m","y_m","iIdx","x_i","y_i","denominator","K_matrix","L_matrix","d2E_dx2","d2E_dxdy","d2E_dy2","D","E","FloydWarshall","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","diamond","r2d","kappa","ox","oy","xe","ye","xm","ym","wEllipse","hEllipse","ymb","yeb","xt","yt","xl","yl","xr","yr","xc","yc","patternLength","slope","distRemaining","patternIndex","dashLength","parseDOT","parseGraph","NODE_ATTR_MAPPING","EDGE_ATTR_MAPPING","TOKENTYPE","NULL","DELIMITER","IDENTIFIER","UNKNOWN","DELIMITERS","token","tokenType","nextPreview","regexAlphaNumeric","isAlphaNumeric","merge","setValue","keys","o","graphs","attr","getToken","isComment","c2","newSyntaxError","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","forEach2","array1","array2","elem1","elem2","setProp","names","convertAttr","mapping","visProp","visPropI","graphData","dotNode","graphNode","convertEdge","dotEdge","graphEdge","subEdge","gephiJSON","inheritColor","gEdges","gNodes","gEdge","gNode","edit","del","back","addDescription","edgeDescription","editEdgeDescription","createEdgeError","deleteClusterError","editClusterError"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;;AAEA;AACA;AACA,8B;;;;;;ACjCA,8BAA4B,e;;;;;;ACA5B;AACA,YAAU;AACV,I;;;;;;ACFA,sB;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACLA;AACA;AACA;AACA;AACA,I;;;;;;ACJA,mBAAiB;;AAEjB;AACA;AACA,I;;;;;;ACJA;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA4B,aAAa;;AAEzC;AACA;AACA;AACA;AACA;AACA,0CAAwC,oCAAoC;AAC5E,8CAA4C,oCAAoC;AAChF,OAAK,2BAA2B,oCAAoC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAgB,mBAAmB;AACnC;AACA;AACA,mCAAiC,2BAA2B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,I;;;;;;ACrEA,wB;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAmE;AACnE;AACA,uFAAqF;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAW;AACX,WAAS;AACT;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,iDAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAc;AACd,gBAAc;AACd,gBAAc;AACd,gBAAc;AACd,iBAAe;AACf,iBAAe;AACf,iBAAe;AACf,kBAAgB;AAChB,2B;;;;;;AC5DA;AACA;AACA;AACA,yCAAuC,gC;;;;;;ACHvC,+BAA6B;AAC7B,uCAAqC,gC;;;;;;ACDrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACnBA;AACA;AACA;AACA,I;;;;;;ACHA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,I;;;;;;ACPA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG,UAAU;AACb;AACA;AACA;AACA,I;;;;;;ACfA;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA,I;;;;;;ACFA;AACA,uEAAsE,gBAAgB,UAAU,GAAG;AACnG,GAAC,E;;;;;;ACFD;AACA;AACA,mCAAiC,QAAQ,gBAAgB,UAAU,GAAG;AACtE,GAAC,E;;;;;;ACHD;AACA;AACA;AACA,KAAG;AACH;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACPA,2C;;;;;;ACAA,yBAAuB;AACvB;AACA;AACA,I;;;;;;ACHA;AACA;AACA;AACA;AACA;;AAEA;AACA,6FAAgF,aAAa,EAAE;;AAE/F;AACA,uDAAqD,0BAA0B;AAC/E;AACA,I;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA,+BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;;;;;;;ACxCA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACZA;AACA;AACA;;AAEA;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK,WAAW,eAAe;AAC/B;AACA,OAAK;AACL;AACA,I;;;;;;ACpBA;AACA;AACA;AACA;AACA,6DAA2D;AAC3D,I;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA,qDAAmD;AACnD;AACA,yCAAuC;AACvC,I;;;;;;ACLA;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA;AACA,e;;;;;;ACHA,gF;;;;;;ACAA;AACA;AACA;;AAEA;AACA,oEAAkE,+BAA+B;AACjG,I;;;;;;ACNA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yB;;;;;;ACVA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH,I;;;;;;ACZA;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;;AAEA;AACA;AACA,+BAA6B;AAC7B,gBAAc;AACd;AACA,GAAC;AACD;AACA;AACA;AACA,iCAA+B;AAC/B;AACA;AACA,YAAU;AACV,GAAC,E;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACPA;AACA;AACA;AACA;AACA,2BAAyB,kBAAkB,EAAE;;AAE7C;AACA;AACA;AACA;AACA,KAAG,UAAU;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACtBA,oBAAkB,wD;;;;;;ACAlB;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA,gCAA8B,gCAAoC,E;;;;;;ACFlE,oBAAkB,wD;;;;;;ACAlB;AACA,uD;;;;;;ACDA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAC,E;;;;;;ACRD;AACA;AACA;AACA;AACA;AACA,gCAA8B;AAC9B;AACA;AACA,qDAAmD,OAAO,EAAE;AAC5D,I;;;;;;ACTA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mHAAiH,mBAAmB,EAAE,mBAAmB,4JAA4J;;AAErT,wCAAsC,uCAAuC,gBAAgB;;AAE7F;AACA;AACA,GAAC;AACD;AACA,I;;;;;;ACpBA,oBAAkB,wD;;;;;;ACAlB;AACA;AACA,yD;;;;;;ACFA,sC;;;;;;ACAA,oBAAkB,wD;;;;;;ACAlB;AACA;AACA;AACA;AACA,kD;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAsB;AACtB,sBAAoB,uBAAuB,SAAS,IAAI;AACxD,KAAG;AACH,GAAC;AACD;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAAyD;AACzD;AACA,OAAK;AACL;AACA,wBAAsB,iCAAiC;AACvD,OAAK;AACL,KAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA8D,8BAA8B;AAC5F;AACA;AACA;AACA;AACA,KAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4DAA0D,gBAAgB;;AAE1E;AACA;AACA;AACA,sBAAoB,oBAAoB;;AAExC,4CAA0C,oBAAoB;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA,KAAG;AACH,0BAAwB,eAAe,EAAE;AACzC,0BAAwB,gBAAgB;AACxC,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,sDAAoD,KAAK,QAAQ,iCAAiC;AAClG,GAAC;AACD;AACA,iDAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4C;;;;;;AC1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAiD;AACjD,GAAC;AACD;AACA,uBAAqB;AACrB;AACA,WAAS;AACT,MAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA0D,sBAAsB;AAChF,kFAAgF,sBAAsB;AACtG,I;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,I;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH,I;;;;;;ACdA,2C;;;;;;ACAA,gBAAc,sB;;;;;;ACAd;AACA;AACA;AACA;AACA,I;;;;;;ACJA;AACA;AACA;AACA,oBAAkB;;AAElB;AACA;;AAEA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;;;;;;AClBA;AACA;AACA;;AAEA;AACA;AACA,I;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAG,UAAU;AACb;AACA,I;;;;;;;;;;;;ACfA,2C;;;;;;ACAA,wC;;;;;;ACAA,oBAAkB,wD;;;;;;ACAlB;AACA,yCAAuC,0BAA0B;AACjE,0CAAwC;AACxC;AACA,I;;;;;;;;ACJA;AACA;AACAE,SAAOvQ,OAAP,GAAkB,OAAOoH,MAAP,KAAkB,WAAnB,IAAmCA,OAAO,QAAP,CAAnC,IAAuD,mBAAAtH,CAAQ,EAAR,CAAxE,C;;;;;;ACFA;AACA;AACA;AACA;AACA;;AAEA,GAAC;AACD;AACA;AACA;AACA,GAAC,qBAAqB;;AAEtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,gBAAgB;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;;AAEA,yBAAuB,SAAS;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,6CAA2C;AAC3C,mBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oFAAkF,IAAI;AACtF;;AAEA;AACA,yBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,eAAa;AACb;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAiC;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,gCAA8B,IAAI;;AAElC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAoB,iCAAiC;AACrD;AACA;AACA;AACA,OAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,yBAAuB,wBAAwB;AAC/C;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0LAAwL,IAAI;;AAE5L,mEAAiE,IAAI;;AAErE;;AAEA;;AAEA;AACA;AACA;AACA,4BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wCAAsC,YAAY;AAClD;AACA;AACA,WAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,qBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA0B;AAC1B,8BAA4B;AAC5B,2BAAyB,EAAE,EAAE;AAC7B,2BAAyB,EAAE,EAAE;AAC7B,gCAA8B,EAAE,EAAE;AAClC,+BAA6B;AAC7B,mCAAiC;AACjC,uCAAqC;AACrC,2BAAyB,IAAI,EAAE;AAC/B,2BAAyB,IAAI,EAAE;AAC/B,gCAA8B,IAAI,EAAE;;AAEpC,6BAA2B;AAC3B,kCAAgC;;AAEhC,4CAA0C;AAC1C,mDAAiD;;AAEjD,sCAAoC,IAAI,IAAI;;AAE5C;AACA;AACA,8HAA4H,IAAI;;;AAGhI;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA,4CAA0C;AAC1C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAe,kBAAkB;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA,qBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAC;;AAED;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,WAAS;AACT;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,WAAS;AACT;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS,YAAY;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,mBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAa;AACb;;AAEA;AACA;AACA;AACA;;;AAGA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,yCAAuC,EAAE,IAAI,EAAE;AAC/C,sCAAoC,EAAE,IAAI,EAAE;;AAE5C;;AAEA;AACA,+BAA6B,EAAE;AAC/B,yBAAuB,EAAE;AACzB,2BAAyB,EAAE;AAC3B,yBAAuB,EAAE;AACzB,uBAAqB,EAAE,IAAI,EAAE;AAC7B,sBAAoB,EAAE;AACtB,6BAA2B,GAAG;AAC9B,uBAAqB,EAAE;AACvB;AACA,yBAAuB,EAAE,IAAI,EAAE;AAC/B,wBAAsB,EAAE,IAAI,EAAE;AAC9B,sBAAoB,EAAE;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0CAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAe,+BAA+B;AAC9C;AACA;;AAEA;AACA,YAAU,OAAO;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iBAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iBAAe,sBAAsB;AACrC;AACA,oCAAkC;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA8B,gBAAgB;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA,WAAS;AACT;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK,6BAA6B;AAClC;AACA,OAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAe;;AAEf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAgB;AAChB;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAsB,cAAc;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAA+B,qBAAqB;AACpD,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAA+B,qBAAqB;AACpD,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAoB;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAC;;AAED;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,GAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAoB,mBAAmB;AACvC;AACA;;AAEA;AACA;AACA;;AAEA,mBAAiB,mBAAmB;AACpC;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wBAAsB,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;AACA,GAAC;;AAED;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,GAAC;;;;;;;;AC5sID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA;AACA;AACA;AACA,oCAAkC,WAAW;AAC7C;AACA;AACA;;;;;;;;;ACNA,MAAI0Q,IAAJ;;AAEA,MAAIC,YAAY,OAAOrJ,MAAP,KAAkB,WAAlB,GACVA,MADU,GAEV,OAAOsJ,MAAP,KAAkB,WAAlB,GAAgCA,MAAhC,GAAyC,IAF/C;;AAIA,MAAID,aAAaA,UAAUE,MAAvB,IAAiCA,OAAOC,eAA5C,EAA6D;AAC3D;AACA;AACA,QAAIC,SAAS,IAAIC,UAAJ,CAAe,EAAf,CAAb;AACAN,WAAO,SAASO,SAAT,GAAqB;AAC1BJ,aAAOC,eAAP,CAAuBC,MAAvB;AACA,aAAOA,MAAP;AACD,KAHD;AAID;;AAED,MAAI,CAACL,IAAL,EAAW;AACT;AACA;AACA;AACA;AACA,QAAIQ,QAAQ,IAAI9N,KAAJ,CAAU,EAAV,CAAZ;AACAsN,WAAO,gBAAY;AACjB,WAAK,IAAI5N,IAAI,CAAR,EAAW8F,CAAhB,EAAmB9F,IAAI,EAAvB,EAA2BA,GAA3B,EAAgC;AAC9B,YAAI,CAACA,IAAI,IAAL,MAAe,CAAnB,EAAsB8F,IAAInH,KAAK0P,MAAL,KAAgB,WAApB;AACtBD,cAAMpO,CAAN,IAAW8F,OAAO,CAAC9F,IAAI,IAAL,KAAc,CAArB,IAA0B,IAArC;AACD;;AAED,aAAOoO,KAAP;AACD,KAPD;AAQD;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,MAAIE,aAAa,EAAjB;AACA,MAAIC,aAAa,EAAjB;AACA,OAAK,IAAIvO,IAAI,CAAb,EAAgBA,IAAI,GAApB,EAAyBA,GAAzB,EAA8B;AAC5BsO,eAAWtO,CAAX,IAAgB,CAACA,IAAI,KAAL,EAAY2G,QAAZ,CAAqB,EAArB,EAAyBL,MAAzB,CAAgC,CAAhC,CAAhB;AACAiI,eAAWD,WAAWtO,CAAX,CAAX,IAA4BA,CAA5B;AACD;;AAED;AACA,WAAShC,KAAT,CAAesJ,CAAf,EAAkBkH,GAAlB,EAAuBC,MAAvB,EAA+B;AAC7B,QAAIzO,IAAKwO,OAAOC,MAAR,IAAmB,CAA3B;AAAA,QAA8BC,KAAK,CAAnC;;AAEAF,UAAMA,OAAO,EAAb;AACAlH,MAAEqH,WAAF,GAAgB/I,OAAhB,CAAwB,cAAxB,EAAwC,UAAUgJ,GAAV,EAAe;AACrD,UAAIF,KAAK,EAAT,EAAa;AAAE;AACbF,YAAIxO,IAAI0O,IAAR,IAAgBH,WAAWK,GAAX,CAAhB;AACD;AACF,KAJD;;AAMA;AACA,WAAOF,KAAK,EAAZ,EAAgB;AACdF,UAAIxO,IAAI0O,IAAR,IAAgB,CAAhB;AACD;;AAED,WAAOF,GAAP;AACD;;AAED;AACA,WAASK,OAAT,CAAiBL,GAAjB,EAAsBC,MAAtB,EAA8B;AAC5B,QAAIzO,IAAIyO,UAAU,CAAlB;AAAA,QAAqBK,MAAMR,UAA3B;AACA,WAAOQ,IAAIN,IAAIxO,GAAJ,CAAJ,IAAgB8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAAhB,GACH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CADG,GACa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CADb,GAC6B,GAD7B,GAEH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAFG,GAEa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAFb,GAE6B,GAF7B,GAGH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAHG,GAGa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAHb,GAG6B,GAH7B,GAIH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAJG,GAIa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAJb,GAI6B,GAJ7B,GAKH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CALG,GAKa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CALb,GAMH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CANG,GAMa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CANb,GAOH8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAPG,GAOa8O,IAAIN,IAAIxO,GAAJ,CAAJ,CAPpB;AAQD;;AAED;AACA;AACA;AACA;;AAEA;AACA,MAAI+O,aAAanB,MAAjB;;AAEA;AACA,MAAIoB,UAAU,CACZD,WAAW,CAAX,IAAgB,IADJ,EAEZA,WAAW,CAAX,CAFY,EAEGA,WAAW,CAAX,CAFH,EAEkBA,WAAW,CAAX,CAFlB,EAEiCA,WAAW,CAAX,CAFjC,EAEgDA,WAAW,CAAX,CAFhD,CAAd;;AAKA;AACA,MAAIE,YAAY,CAACF,WAAW,CAAX,KAAiB,CAAjB,GAAqBA,WAAW,CAAX,CAAtB,IAAuC,MAAvD;;AAEA;AACA,MAAIG,aAAa,CAAjB;AAAA,MAAoBC,aAAa,CAAjC;;AAEA;AACA,WAASC,EAAT,CAAY/E,OAAZ,EAAqBmE,GAArB,EAA0BC,MAA1B,EAAkC;AAChC,QAAIzO,IAAIwO,OAAOC,MAAP,IAAiB,CAAzB;AACA,QAAI7O,IAAI4O,OAAO,EAAf;;AAEAnE,cAAUA,WAAW,EAArB;;AAEA,QAAIgF,WAAWhF,QAAQgF,QAAR,KAAqBvP,SAArB,GAAiCuK,QAAQgF,QAAzC,GAAoDJ,SAAnE;;AAEA;AACA;AACA;AACA;AACA,QAAIK,QAAQjF,QAAQiF,KAAR,KAAkBxP,SAAlB,GAA8BuK,QAAQiF,KAAtC,GAA8C,IAAIvQ,IAAJ,GAAWwQ,OAAX,EAA1D;;AAEA;AACA;AACA,QAAIC,QAAQnF,QAAQmF,KAAR,KAAkB1P,SAAlB,GAA8BuK,QAAQmF,KAAtC,GAA8CL,aAAa,CAAvE;;AAEA;AACA,QAAIM,KAAMH,QAAQJ,UAAT,GAAuB,CAACM,QAAQL,UAAT,IAAuB,KAAvD;;AAEA;AACA,QAAIM,KAAK,CAAL,IAAUpF,QAAQgF,QAAR,KAAqBvP,SAAnC,EAA8C;AAC5CuP,iBAAWA,WAAW,CAAX,GAAe,MAA1B;AACD;;AAED;AACA;AACA,QAAI,CAACI,KAAK,CAAL,IAAUH,QAAQJ,UAAnB,KAAkC7E,QAAQmF,KAAR,KAAkB1P,SAAxD,EAAmE;AACjE0P,cAAQ,CAAR;AACD;;AAED;AACA,QAAIA,SAAS,KAAb,EAAoB;AAClB,YAAM,IAAIhP,KAAJ,CAAU,kDAAV,CAAN;AACD;;AAED0O,iBAAaI,KAAb;AACAH,iBAAaK,KAAb;AACAP,gBAAYI,QAAZ;;AAEA;AACAC,aAAS,cAAT;;AAEA;AACA,QAAII,KAAK,CAAC,CAACJ,QAAQ,SAAT,IAAsB,KAAtB,GAA8BE,KAA/B,IAAwC,WAAjD;AACA5P,MAAEI,GAAF,IAAS0P,OAAO,EAAP,GAAY,IAArB;AACA9P,MAAEI,GAAF,IAAS0P,OAAO,EAAP,GAAY,IAArB;AACA9P,MAAEI,GAAF,IAAS0P,OAAO,CAAP,GAAW,IAApB;AACA9P,MAAEI,GAAF,IAAS0P,KAAK,IAAd;;AAEA;AACA,QAAIC,MAAOL,QAAQ,WAAR,GAAsB,KAAvB,GAAgC,SAA1C;AACA1P,MAAEI,GAAF,IAAS2P,QAAQ,CAAR,GAAY,IAArB;AACA/P,MAAEI,GAAF,IAAS2P,MAAM,IAAf;;AAEA;AACA/P,MAAEI,GAAF,IAAS2P,QAAQ,EAAR,GAAa,GAAb,GAAmB,IAA5B,CAzDgC,CAyDE;AAClC/P,MAAEI,GAAF,IAAS2P,QAAQ,EAAR,GAAa,IAAtB;;AAEA;AACA/P,MAAEI,GAAF,IAASqP,aAAa,CAAb,GAAiB,IAA1B;;AAEA;AACAzP,MAAEI,GAAF,IAASqP,WAAW,IAApB;;AAEA;AACA,QAAIO,OAAOvF,QAAQuF,IAAR,IAAgBZ,OAA3B;AACA,SAAK,IAAIa,IAAI,CAAb,EAAgBA,IAAI,CAApB,EAAuBA,GAAvB,EAA4B;AAC1BjQ,QAAEI,IAAI6P,CAAN,IAAWD,KAAKC,CAAL,CAAX;AACD;;AAED,WAAOrB,MAAMA,GAAN,GAAYK,QAAQjP,CAAR,CAAnB;AACD;;AAED;;AAEA;AACA,WAASP,EAAT,CAAYgL,OAAZ,EAAqBmE,GAArB,EAA0BC,MAA1B,EAAkC;AAChC;AACA,QAAIzO,IAAIwO,OAAOC,MAAP,IAAiB,CAAzB;;AAEA,QAAI,OAAOpE,OAAP,IAAmB,QAAvB,EAAiC;AAC/BmE,YAAMnE,WAAW,QAAX,GAAsB,IAAI/J,KAAJ,CAAU,EAAV,CAAtB,GAAsC,IAA5C;AACA+J,gBAAU,IAAV;AACD;AACDA,cAAUA,WAAW,EAArB;;AAEA,QAAIyF,OAAOzF,QAAQgE,MAAR,IAAkB,CAAChE,QAAQ0F,GAAR,IAAenC,IAAhB,GAA7B;;AAEA;AACAkC,SAAK,CAAL,IAAWA,KAAK,CAAL,IAAU,IAAX,GAAmB,IAA7B;AACAA,SAAK,CAAL,IAAWA,KAAK,CAAL,IAAU,IAAX,GAAmB,IAA7B;;AAEA;AACA,QAAItB,GAAJ,EAAS;AACP,WAAK,IAAIE,KAAK,CAAd,EAAiBA,KAAK,EAAtB,EAA0BA,IAA1B,EAAgC;AAC9BF,YAAIxO,IAAI0O,EAAR,IAAcoB,KAAKpB,EAAL,CAAd;AACD;AACF;;AAED,WAAOF,OAAOK,QAAQiB,IAAR,CAAd;AACD;;AAED;AACA,MAAIxS,OAAO+B,EAAX;AACA/B,OAAK8R,EAAL,GAAUA,EAAV;AACA9R,OAAK+B,EAAL,GAAUA,EAAV;AACA/B,OAAKU,KAAL,GAAaA,KAAb;AACAV,OAAKuR,OAAL,GAAeA,OAAf;;AAEAlB,SAAOvQ,OAAP,GAAiBE,IAAjB,C;;;;;;;;;ACvNA;AACAF,UAAQH,IAAR,GAAe,mBAAAC,CAAQ,CAAR,CAAf;AACAE,UAAQ4S,OAAR,GAAkB,mBAAA9S,CAAQ,EAAR,CAAlB;;AAEA;AACAE,UAAQ6S,OAAR,GAAkB,mBAAA/S,CAAQ,EAAR,CAAlB;AACAE,UAAQ8S,QAAR,GAAmB,mBAAAhT,CAAQ,EAAR,CAAnB;AACAE,UAAQ+S,KAAR,GAAgB,mBAAAjT,CAAQ,EAAR,CAAhB;;AAEA;AACAE,UAAQgT,OAAR,GAAkB,mBAAAlT,CAAQ,EAAR,CAAlB;AACAE,UAAQiT,OAAR,GAAkB;AAChBC,YAAQ,mBAAApT,CAAQ,EAAR,CADQ;AAEhBqT,YAAQ,mBAAArT,CAAQ,GAAR,CAFQ;AAGhBsT,aAAS,mBAAAtT,CAAQ,EAAR,CAHO;AAIhBuT,aAAS,mBAAAvT,CAAQ,EAAR,CAJO;AAKhBwT,YAAQ,mBAAAxT,CAAQ,GAAR,CALQ;AAMhByT,gBAAY,mBAAAzT,CAAQ,GAAR;AANI,GAAlB;;AASA;AACAE,UAAQC,MAAR,GAAiB,mBAAAH,CAAQ,EAAR,CAAjB;AACAE,UAAQwT,MAAR,GAAiB,mBAAA1T,CAAQ,GAAR,CAAjB;AACAE,UAAQyT,QAAR,GAAmB,mBAAA3T,CAAQ,GAAR,CAAnB,C;;;;;;;;ACvBA;;AAEA;;;;;AAKAE,UAAQ0T,eAAR,GAA0B,UAASC,aAAT,EAAwB;AAChD;AACA,SAAK,IAAIC,WAAT,IAAwBD,aAAxB,EAAuC;AACrC,UAAIA,cAActR,cAAd,CAA6BuR,WAA7B,CAAJ,EAA+C;AAC7CD,sBAAcC,WAAd,EAA2BC,SAA3B,GAAuCF,cAAcC,WAAd,EAA2BE,IAAlE;AACAH,sBAAcC,WAAd,EAA2BE,IAA3B,GAAkC,EAAlC;AACD;AACF;AACF,GARD;;AAUA;;;;;;;AAOA9T,UAAQ+T,eAAR,GAA0B,UAASJ,aAAT,EAAwB;AAChD;AACA,SAAK,IAAIC,WAAT,IAAwBD,aAAxB,EAAuC;AACrC,UAAIA,cAActR,cAAd,CAA6BuR,WAA7B,CAAJ,EAA+C;AAC7C,YAAID,cAAcC,WAAd,EAA2BC,SAA/B,EAA0C;AACxC,eAAK,IAAIjR,IAAI,CAAb,EAAgBA,IAAI+Q,cAAcC,WAAd,EAA2BC,SAA3B,CAAqC/Q,MAAzD,EAAiEF,GAAjE,EAAsE;AACpE+Q,0BAAcC,WAAd,EAA2BC,SAA3B,CAAqCjR,CAArC,EAAwC8E,UAAxC,CAAmDzG,WAAnD,CAA+D0S,cAAcC,WAAd,EAA2BC,SAA3B,CAAqCjR,CAArC,CAA/D;AACD;AACD+Q,wBAAcC,WAAd,EAA2BC,SAA3B,GAAuC,EAAvC;AACD;AACF;AACF;AACF,GAZD;;AAcA;;;;AAIA7T,UAAQgU,aAAR,GAAwB,UAASL,aAAT,EAAwB;AAC9C3T,YAAQ0T,eAAR,CAAwBC,aAAxB;AACA3T,YAAQ+T,eAAR,CAAwBJ,aAAxB;AACA3T,YAAQ0T,eAAR,CAAwBC,aAAxB;AACD,GAJD;;AAMA;;;;;;;;;;AAUA3T,UAAQiU,aAAR,GAAwB,UAAUL,WAAV,EAAuBD,aAAvB,EAAsCO,YAAtC,EAAoD;AAC1E,QAAIzN,OAAJ;AACA;AACA,QAAIkN,cAActR,cAAd,CAA6BuR,WAA7B,CAAJ,EAA+C;AAAE;AAC/C;AACA,UAAID,cAAcC,WAAd,EAA2BC,SAA3B,CAAqC/Q,MAArC,GAA8C,CAAlD,EAAqD;AACnD2D,kBAAUkN,cAAcC,WAAd,EAA2BC,SAA3B,CAAqC,CAArC,CAAV;AACAF,sBAAcC,WAAd,EAA2BC,SAA3B,CAAqCM,KAArC;AACD,OAHD,MAIK;AACH;AACA1N,kBAAU2I,SAASgF,eAAT,CAAyB,4BAAzB,EAAuDR,WAAvD,CAAV;AACAM,qBAAatE,WAAb,CAAyBnJ,OAAzB;AACD;AACF,KAXD,MAYK;AACH;AACAA,gBAAU2I,SAASgF,eAAT,CAAyB,4BAAzB,EAAuDR,WAAvD,CAAV;AACAD,oBAAcC,WAAd,IAA6B,EAACE,MAAM,EAAP,EAAWD,WAAW,EAAtB,EAA7B;AACAK,mBAAatE,WAAb,CAAyBnJ,OAAzB;AACD;AACDkN,kBAAcC,WAAd,EAA2BE,IAA3B,CAAgCjQ,IAAhC,CAAqC4C,OAArC;AACA,WAAOA,OAAP;AACD,GAvBD;;AA0BA;;;;;;;;;;AAUAzG,UAAQqU,aAAR,GAAwB,UAAUT,WAAV,EAAuBD,aAAvB,EAAsCW,YAAtC,EAAoDC,YAApD,EAAkE;AACxF,QAAI9N,OAAJ;AACA;AACA,QAAIkN,cAActR,cAAd,CAA6BuR,WAA7B,CAAJ,EAA+C;AAAE;AAC/C;AACA,UAAID,cAAcC,WAAd,EAA2BC,SAA3B,CAAqC/Q,MAArC,GAA8C,CAAlD,EAAqD;AACnD2D,kBAAUkN,cAAcC,WAAd,EAA2BC,SAA3B,CAAqC,CAArC,CAAV;AACAF,sBAAcC,WAAd,EAA2BC,SAA3B,CAAqCM,KAArC;AACD,OAHD,MAIK;AACH;AACA1N,kBAAU2I,SAASC,aAAT,CAAuBuE,WAAvB,CAAV;AACA,YAAIW,iBAAiB7R,SAArB,EAAgC;AAC9B4R,uBAAaC,YAAb,CAA0B9N,OAA1B,EAAmC8N,YAAnC;AACD,SAFD,MAGK;AACHD,uBAAa1E,WAAb,CAAyBnJ,OAAzB;AACD;AACF;AACF,KAhBD,MAiBK;AACH;AACAA,gBAAU2I,SAASC,aAAT,CAAuBuE,WAAvB,CAAV;AACAD,oBAAcC,WAAd,IAA6B,EAACE,MAAM,EAAP,EAAWD,WAAW,EAAtB,EAA7B;AACA,UAAIU,iBAAiB7R,SAArB,EAAgC;AAC9B4R,qBAAaC,YAAb,CAA0B9N,OAA1B,EAAmC8N,YAAnC;AACD,OAFD,MAGK;AACHD,qBAAa1E,WAAb,CAAyBnJ,OAAzB;AACD;AACF;AACDkN,kBAAcC,WAAd,EAA2BE,IAA3B,CAAgCjQ,IAAhC,CAAqC4C,OAArC;AACA,WAAOA,OAAP;AACD,GAjCD;;AAsCA;;;;;;;;;;;;;AAaAzG,UAAQwU,SAAR,GAAoB,UAASC,CAAT,EAAYC,CAAZ,EAAeC,aAAf,EAA8BhB,aAA9B,EAA6CO,YAA7C,EAA2DU,QAA3D,EAAqE;AACvF,QAAIC,KAAJ;AACA,QAAIF,cAActJ,KAAd,IAAuB,QAA3B,EAAqC;AACnCwJ,cAAQ7U,QAAQiU,aAAR,CAAsB,QAAtB,EAAgCN,aAAhC,EAA+CO,YAA/C,CAAR;AACAW,YAAMC,cAAN,CAAqB,IAArB,EAA2B,IAA3B,EAAiCL,CAAjC;AACAI,YAAMC,cAAN,CAAqB,IAArB,EAA2B,IAA3B,EAAiCJ,CAAjC;AACAG,YAAMC,cAAN,CAAqB,IAArB,EAA2B,GAA3B,EAAgC,MAAMH,cAAcI,IAApD;AACD,KALD,MAMK;AACHF,cAAQ7U,QAAQiU,aAAR,CAAsB,MAAtB,EAA8BN,aAA9B,EAA6CO,YAA7C,CAAR;AACAW,YAAMC,cAAN,CAAqB,IAArB,EAA2B,GAA3B,EAAgCL,IAAI,MAAME,cAAcI,IAAxD;AACAF,YAAMC,cAAN,CAAqB,IAArB,EAA2B,GAA3B,EAAgCJ,IAAI,MAAMC,cAAcI,IAAxD;AACAF,YAAMC,cAAN,CAAqB,IAArB,EAA2B,OAA3B,EAAoCH,cAAcI,IAAlD;AACAF,YAAMC,cAAN,CAAqB,IAArB,EAA2B,QAA3B,EAAqCH,cAAcI,IAAnD;AACD;;AAED,QAAIJ,cAAcvJ,MAAd,KAAyB1I,SAA7B,EAAwC;AACtCmS,YAAMC,cAAN,CAAqB,IAArB,EAA2B,OAA3B,EAAoCH,cAAcvJ,MAAlD;AACD;AACDyJ,UAAMC,cAAN,CAAqB,IAArB,EAA2B,OAA3B,EAAoCH,cAAcpP,SAAd,GAA0B,YAA9D;AACA;;;AAGA,QAAIqP,QAAJ,EAAc;AACZ,UAAII,QAAQhV,QAAQiU,aAAR,CAAsB,MAAtB,EAA8BN,aAA9B,EAA6CO,YAA7C,CAAZ;AACA,UAAIU,SAASK,OAAb,EAAsB;AACpBR,YAAIA,IAAIG,SAASK,OAAjB;AACD;;AAED,UAAIL,SAASM,OAAb,EAAsB;AACpBR,YAAIA,IAAIE,SAASM,OAAjB;AACD;AACD,UAAIN,SAASO,OAAb,EAAsB;AACpBH,cAAMI,WAAN,GAAoBR,SAASO,OAA7B;AACD;;AAED,UAAIP,SAASrP,SAAb,EAAwB;AACtByP,cAAMF,cAAN,CAAqB,IAArB,EAA2B,OAA3B,EAAoCF,SAASrP,SAAT,GAAsB,YAA1D;AACD;AACDyP,YAAMF,cAAN,CAAqB,IAArB,EAA2B,GAA3B,EAAgCL,CAAhC;AACAO,YAAMF,cAAN,CAAqB,IAArB,EAA2B,GAA3B,EAAgCJ,CAAhC;AACD;;AAED,WAAOG,KAAP;AACD,GA5CD;;AA8CA;;;;;;;AAOA7U,UAAQqV,OAAR,GAAkB,UAAUZ,CAAV,EAAaC,CAAb,EAAgBpF,KAAhB,EAAuBC,MAAvB,EAA+BhK,SAA/B,EAA0CoO,aAA1C,EAAyDO,YAAzD,EAAuE7I,KAAvE,EAA8E;AAC9F,QAAIkE,UAAU,CAAd,EAAiB;AACf,UAAIA,SAAS,CAAb,EAAgB;AACdA,kBAAU,CAAC,CAAX;AACAmF,aAAKnF,MAAL;AACD;AACD,UAAI+F,OAAOtV,QAAQiU,aAAR,CAAsB,MAAtB,EAA6BN,aAA7B,EAA4CO,YAA5C,CAAX;AACAoB,WAAKR,cAAL,CAAoB,IAApB,EAA0B,GAA1B,EAA+BL,IAAI,MAAMnF,KAAzC;AACAgG,WAAKR,cAAL,CAAoB,IAApB,EAA0B,GAA1B,EAA+BJ,CAA/B;AACAY,WAAKR,cAAL,CAAoB,IAApB,EAA0B,OAA1B,EAAmCxF,KAAnC;AACAgG,WAAKR,cAAL,CAAoB,IAApB,EAA0B,QAA1B,EAAoCvF,MAApC;AACA+F,WAAKR,cAAL,CAAoB,IAApB,EAA0B,OAA1B,EAAmCvP,SAAnC;AACA,UAAI8F,KAAJ,EAAW;AACTiK,aAAKR,cAAL,CAAoB,IAApB,EAA0B,OAA1B,EAAmCzJ,KAAnC;AACD;AACF;AACF,GAhBD,C;;;;;;;;;;;;;;;;;;;;;;ACtMA,MAAIxL,OAAO,mBAAAC,CAAQ,CAAR,CAAX;AACA,MAAIiT,QAAQ,mBAAAjT,CAAQ,EAAR,CAAZ;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;AACA,WAAS+S,OAAT,CAAkB0C,IAAlB,EAAwBtI,OAAxB,EAAiC;AAC/B;AACA,QAAIsI,QAAQ,CAACrS,MAAMC,OAAN,CAAcoS,IAAd,CAAb,EAAkC;AAChCtI,gBAAUsI,IAAV;AACAA,aAAO,IAAP;AACD;;AAED,SAAKC,QAAL,GAAgBvI,WAAW,EAA3B;AACA,SAAKwI,KAAL,GAAa,EAAb,CAR+B,CAQkB;AACjD,SAAK3S,MAAL,GAAc,CAAd,CAT+B,CASkB;AACjD,SAAK4S,QAAL,GAAgB,KAAKF,QAAL,CAAcG,OAAd,IAAyB,IAAzC,CAV+B,CAUkB;AACjD,SAAKC,KAAL,GAAa,EAAb,CAX+B,CAWkB;;AAEjD;AACA;AACA,QAAI,KAAKJ,QAAL,CAAcvR,IAAlB,EAAwB;AACtB,UAAIsI,SAAS,uBAAY,KAAKiJ,QAAL,CAAcvR,IAA1B,CAAb;AACA,WAAK,IAAIrB,IAAI,CAAR,EAAWmB,MAAMwI,OAAOzJ,MAA7B,EAAqCF,IAAImB,GAAzC,EAA8CnB,GAA9C,EAAmD;AACjD,YAAI2K,QAAQhB,OAAO3J,CAAP,CAAZ;AACA,YAAInC,QAAQ,KAAK+U,QAAL,CAAcvR,IAAd,CAAmBsJ,KAAnB,CAAZ;AACA,YAAI9M,SAAS,MAAT,IAAmBA,SAAS,SAA5B,IAAyCA,SAAS,SAAtD,EAAiE;AAC/D,eAAKmV,KAAL,CAAWrI,KAAX,IAAoB,MAApB;AACD,SAFD,MAGK;AACH,eAAKqI,KAAL,CAAWrI,KAAX,IAAoB9M,KAApB;AACD;AACF;AACF;;AAED;AACA,QAAI,KAAK+U,QAAL,CAAcxR,OAAlB,EAA2B;AACzB,YAAM,IAAIZ,KAAJ,CAAU,qDAAV,CAAN;AACD;;AAED,SAAKyS,YAAL,GAAoB,EAApB,CAlC+B,CAkCN;;AAEzB;AACA,QAAIN,IAAJ,EAAU;AACR,WAAKO,GAAL,CAASP,IAAT;AACD;;AAED,SAAKQ,UAAL,CAAgB9I,OAAhB;AACD;;AAED;;;;;;;;;AASA4F,UAAQmD,SAAR,CAAkBD,UAAlB,GAA+B,UAAS9I,OAAT,EAAkB;AAC/C,QAAIA,WAAWA,QAAQgJ,KAAR,KAAkBvT,SAAjC,EAA4C;AAC1C,UAAIuK,QAAQgJ,KAAR,KAAkB,KAAtB,EAA6B;AAC3B;AACA,YAAI,KAAKC,MAAT,EAAiB;AACf,eAAKA,MAAL,CAAYC,OAAZ;AACA,iBAAO,KAAKD,MAAZ;AACD;AACF,OAND,MAOK;AACH;AACA,YAAI,CAAC,KAAKA,MAAV,EAAkB;AAChB,eAAKA,MAAL,GAAcnD,MAAMhT,MAAN,CAAa,IAAb,EAAmB;AAC/ByI,qBAAS,CAAC,KAAD,EAAQ,QAAR,EAAkB,QAAlB;AADsB,WAAnB,CAAd;AAGD;;AAED,YAAI,yBAAOyE,QAAQgJ,KAAf,MAAyB,QAA7B,EAAuC;AACrC,eAAKC,MAAL,CAAYH,UAAZ,CAAuB9I,QAAQgJ,KAA/B;AACD;AACF;AACF;AACF,GAtBD;;AAwBA;;;;;;;;;AASApD,UAAQmD,SAAR,CAAkBI,EAAlB,GAAuB,UAASjP,KAAT,EAAgBpB,QAAhB,EAA0B;AAC/C,QAAIsQ,cAAc,KAAKR,YAAL,CAAkB1O,KAAlB,CAAlB;AACA,QAAI,CAACkP,WAAL,EAAkB;AAChBA,oBAAc,EAAd;AACA,WAAKR,YAAL,CAAkB1O,KAAlB,IAA2BkP,WAA3B;AACD;;AAEDA,gBAAYxS,IAAZ,CAAiB;AACfkC,gBAAUA;AADK,KAAjB;AAGD,GAVD;;AAYA;AACA8M,UAAQmD,SAAR,CAAkBM,SAAlB,GAA8B,YAAY;AACxC,UAAM,IAAIlT,KAAJ,CAAU,0DAAV,CAAN;AACD,GAFD;;AAIA;;;;;AAKAyP,UAAQmD,SAAR,CAAkBO,GAAlB,GAAwB,UAASpP,KAAT,EAAgBpB,QAAhB,EAA0B;AAChD,QAAIsQ,cAAc,KAAKR,YAAL,CAAkB1O,KAAlB,CAAlB;AACA,QAAIkP,WAAJ,EAAiB;AACf,WAAKR,YAAL,CAAkB1O,KAAlB,IAA2BkP,YAAYG,MAAZ,CAAmB;AAAA,eAAY7P,SAASZ,QAAT,IAAqBA,QAAjC;AAAA,OAAnB,CAA3B;AACD;AACF,GALD;;AAOA;AACA8M,UAAQmD,SAAR,CAAkBS,WAAlB,GAAgC,YAAY;AAC1C,UAAM,IAAIrT,KAAJ,CAAU,6DAAV,CAAN;AACD,GAFD;;AAIA;;;;;;;AAOAyP,UAAQmD,SAAR,CAAkBU,QAAlB,GAA6B,UAAUvP,KAAV,EAAiBwP,MAAjB,EAAyBC,QAAzB,EAAmC;AAC9D,QAAIzP,SAAS,GAAb,EAAkB;AAChB,YAAM,IAAI/D,KAAJ,CAAU,wBAAV,CAAN;AACD;;AAED,QAAIiT,cAAc,EAAlB;AACA,QAAIlP,SAAS,KAAK0O,YAAlB,EAAgC;AAC9BQ,oBAAcA,YAAYQ,MAAZ,CAAmB,KAAKhB,YAAL,CAAkB1O,KAAlB,CAAnB,CAAd;AACD;AACD,QAAI,OAAO,KAAK0O,YAAhB,EAA8B;AAC5BQ,oBAAcA,YAAYQ,MAAZ,CAAmB,KAAKhB,YAAL,CAAkB,GAAlB,CAAnB,CAAd;AACD;;AAED,SAAK,IAAIjT,IAAI,CAAR,EAAWmB,MAAMsS,YAAYvT,MAAlC,EAA0CF,IAAImB,GAA9C,EAAmDnB,GAAnD,EAAwD;AACtD,UAAIkU,aAAaT,YAAYzT,CAAZ,CAAjB;AACA,UAAIkU,WAAW/Q,QAAf,EAAyB;AACvB+Q,mBAAW/Q,QAAX,CAAoBoB,KAApB,EAA2BwP,MAA3B,EAAmCC,YAAY,IAA/C;AACD;AACF;AACF,GAnBD;;AAqBA;;;;;;;AAOA/D,UAAQmD,SAAR,CAAkBF,GAAlB,GAAwB,UAAUP,IAAV,EAAgBqB,QAAhB,EAA0B;AAChD,QAAIG,WAAW,EAAf;AAAA,QACIC,EADJ;AAAA,QAEIC,KAAK,IAFT;;AAIA,QAAI/T,MAAMC,OAAN,CAAcoS,IAAd,CAAJ,EAAyB;AACvB;AACA,WAAK,IAAI3S,IAAI,CAAR,EAAWmB,MAAMwR,KAAKzS,MAA3B,EAAmCF,IAAImB,GAAvC,EAA4CnB,GAA5C,EAAiD;AAC/CoU,aAAKC,GAAGC,QAAH,CAAY3B,KAAK3S,CAAL,CAAZ,CAAL;AACAmU,iBAASlT,IAAT,CAAcmT,EAAd;AACD;AACF,KAND,MAOK,IAAIzB,gBAAgB9R,MAApB,EAA4B;AAC/B;AACAuT,WAAKC,GAAGC,QAAH,CAAY3B,IAAZ,CAAL;AACAwB,eAASlT,IAAT,CAAcmT,EAAd;AACD,KAJI,MAKA;AACH,YAAM,IAAI5T,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,QAAI2T,SAASjU,MAAb,EAAqB;AACnB,WAAK4T,QAAL,CAAc,KAAd,EAAqB,EAACS,OAAOJ,QAAR,EAArB,EAAwCH,QAAxC;AACD;;AAED,WAAOG,QAAP;AACD,GA1BD;;AA4BA;;;;;;AAMAlE,UAAQmD,SAAR,CAAkBoB,MAAlB,GAA2B,UAAU7B,IAAV,EAAgBqB,QAAhB,EAA0B;AACnD,QAAIG,WAAW,EAAf;AACA,QAAIM,aAAa,EAAjB;AACA,QAAIC,UAAU,EAAd;AACA,QAAIC,cAAc,EAAlB;AACA,QAAIN,KAAK,IAAT;AACA,QAAItB,UAAUsB,GAAGvB,QAAjB;;AAEA,QAAI8B,cAAc,SAAdA,WAAc,CAAU1J,IAAV,EAAgB;AAChC,UAAIkJ,KAAKlJ,KAAK6H,OAAL,CAAT;AACA,UAAIsB,GAAGxB,KAAH,CAASuB,EAAT,CAAJ,EAAkB;AAChB,YAAIS,UAAU5X,KAAKE,MAAL,CAAY,EAAZ,EAAgBkX,GAAGxB,KAAH,CAASuB,EAAT,CAAhB,CAAd;AACA;AACAA,aAAKC,GAAGS,WAAH,CAAe5J,IAAf,CAAL;AACAuJ,mBAAWxT,IAAX,CAAgBmT,EAAhB;AACAO,oBAAY1T,IAAZ,CAAiBiK,IAAjB;AACAwJ,gBAAQzT,IAAR,CAAa4T,OAAb;AACD,OAPD,MAQK;AACH;AACAT,aAAKC,GAAGC,QAAH,CAAYpJ,IAAZ,CAAL;AACAiJ,iBAASlT,IAAT,CAAcmT,EAAd;AACD;AACF,KAfD;;AAiBA,QAAI9T,MAAMC,OAAN,CAAcoS,IAAd,CAAJ,EAAyB;AACvB;AACA,WAAK,IAAI3S,IAAI,CAAR,EAAWmB,MAAMwR,KAAKzS,MAA3B,EAAmCF,IAAImB,GAAvC,EAA4CnB,GAA5C,EAAiD;AAC/C,YAAI2S,KAAK3S,CAAL,aAAmBa,MAAvB,EAA8B;AAC5B+T,sBAAYjC,KAAK3S,CAAL,CAAZ;AACD,SAFD,MAEO;AACL+U,kBAAQC,IAAR,CAAa,0DAA0DhV,CAAvE;AACD;AACF;AACF,KATD,MAUK,IAAI2S,gBAAgB9R,MAApB,EAA4B;AAC/B;AACA+T,kBAAYjC,IAAZ;AACD,KAHI,MAIA;AACH,YAAM,IAAInS,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,QAAI2T,SAASjU,MAAb,EAAqB;AACnB,WAAK4T,QAAL,CAAc,KAAd,EAAqB,EAACS,OAAOJ,QAAR,EAArB,EAAwCH,QAAxC;AACD;AACD,QAAIS,WAAWvU,MAAf,EAAuB;AACrB,UAAIG,QAAQ,EAAEkU,OAAOE,UAAT,EAAqBC,SAASA,OAA9B,EAAuC/B,MAAMgC,WAA7C,EAAZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAKb,QAAL,CAAc,QAAd,EAAwBzT,KAAxB,EAA+B2T,QAA/B;AACD;;AAED,WAAOG,SAASF,MAAT,CAAgBQ,UAAhB,CAAP;AACD,GA3DD;;AA6DA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BAxE,UAAQmD,SAAR,CAAkB6B,GAAlB,GAAwB,UAAUC,IAAV,EAAgB;AACtC,QAAIb,KAAK,IAAT;;AAEA;AACA,QAAID,EAAJ,EAAQe,GAAR,EAAa9K,OAAb;AACA,QAAI+K,YAAYnY,KAAKyE,OAAL,CAAazB,UAAU,CAAV,CAAb,CAAhB;AACA,QAAImV,aAAa,QAAb,IAAyBA,aAAa,QAA1C,EAAoD;AAClD;AACAhB,WAAKnU,UAAU,CAAV,CAAL;AACAoK,gBAAUpK,UAAU,CAAV,CAAV;AACD,KAJD,MAKK,IAAImV,aAAa,OAAjB,EAA0B;AAC7B;AACAD,YAAMlV,UAAU,CAAV,CAAN;AACAoK,gBAAUpK,UAAU,CAAV,CAAV;AACD,KAJI,MAKA;AACH;AACAoK,gBAAUpK,UAAU,CAAV,CAAV;AACD;;AAED;AACA,QAAIoV,UAAJ;AACA,QAAIhL,WAAWA,QAAQgL,UAAvB,EAAmC;AACjC,UAAIC,gBAAgB,CAAC,OAAD,EAAU,QAAV,CAApB;AACAD,mBAAaC,cAActU,OAAd,CAAsBqJ,QAAQgL,UAA9B,KAA6C,CAAC,CAA9C,GAAkD,OAAlD,GAA4DhL,QAAQgL,UAAjF;AACD,KAHD,MAIK;AACHA,mBAAa,OAAb;AACD;;AAED;AACA,QAAIhU,OAAOgJ,WAAWA,QAAQhJ,IAAnB,IAA2B,KAAKuR,QAAL,CAAcvR,IAApD;AACA,QAAIuS,SAASvJ,WAAWA,QAAQuJ,MAAhC;AACA,QAAIW,QAAQ,EAAZ;AAAA,QAAgBrJ,IAAhB;AAAA,QAAsBqK,OAAtB;AAAA,QAA+BC,MAA/B;AAAA,QAAuCxV,CAAvC;AAAA,QAA0CmB,GAA1C;;AAEA;AACA,QAAIiT,MAAMtU,SAAV,EAAqB;AACnB;AACAoL,aAAOmJ,GAAGoB,QAAH,CAAYrB,EAAZ,EAAgB/S,IAAhB,CAAP;AACA,UAAI6J,QAAQ0I,MAAR,IAAkB,CAACA,OAAO1I,IAAP,CAAvB,EAAqC;AACnCA,eAAO,IAAP;AACD;AACF,KAND,MAOK,IAAIiK,OAAOrV,SAAX,EAAsB;AACzB;AACA,WAAKE,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CkL,eAAOmJ,GAAGoB,QAAH,CAAYN,IAAInV,CAAJ,CAAZ,EAAoBqB,IAApB,CAAP;AACA,YAAI,CAACuS,MAAD,IAAWA,OAAO1I,IAAP,CAAf,EAA6B;AAC3BqJ,gBAAMtT,IAAN,CAAWiK,IAAX;AACD;AACF;AACF,KARI,MASA;AACH;AACAqK,gBAAU,uBAAY,KAAK1C,KAAjB,CAAV;AACA,WAAK7S,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CwV,iBAASD,QAAQvV,CAAR,CAAT;AACAkL,eAAOmJ,GAAGoB,QAAH,CAAYD,MAAZ,EAAoBnU,IAApB,CAAP;AACA,YAAI,CAACuS,MAAD,IAAWA,OAAO1I,IAAP,CAAf,EAA6B;AAC3BqJ,gBAAMtT,IAAN,CAAWiK,IAAX;AACD;AACF;AACF;;AAED;AACA,QAAIb,WAAWA,QAAQqL,KAAnB,IAA4BtB,MAAMtU,SAAtC,EAAiD;AAC/C,WAAK6V,KAAL,CAAWpB,KAAX,EAAkBlK,QAAQqL,KAA1B;AACD;;AAED;AACA,QAAIrL,WAAWA,QAAQV,MAAvB,EAA+B;AAC7B,UAAIA,SAASU,QAAQV,MAArB;AACA,UAAIyK,MAAMtU,SAAV,EAAqB;AACnBoL,eAAO,KAAK0K,aAAL,CAAmB1K,IAAnB,EAAyBvB,MAAzB,CAAP;AACD,OAFD,MAGK;AACH,aAAK3J,IAAI,CAAJ,EAAOmB,MAAMoT,MAAMrU,MAAxB,EAAgCF,IAAImB,GAApC,EAAyCnB,GAAzC,EAA8C;AAC5CuU,gBAAMvU,CAAN,IAAW,KAAK4V,aAAL,CAAmBrB,MAAMvU,CAAN,CAAnB,EAA6B2J,MAA7B,CAAX;AACD;AACF;AACF;;AAED;AACA,QAAI0L,cAAc,QAAlB,EAA4B;AAC1B,UAAIrP,SAAS,EAAb;AAAA,UACI6P,SADJ;AAEA,WAAK7V,IAAI,CAAJ,EAAOmB,MAAMoT,MAAMrU,MAAxB,EAAgCF,IAAImB,GAApC,EAAyCnB,GAAzC,EAA8C;AAC5C6V,oBAAYtB,MAAMvU,CAAN,CAAZ;AACAgG,eAAO6P,UAAUzB,EAAjB,IAAuByB,SAAvB;AACD;AACD,aAAO7P,MAAP;AACD,KARD,MASK;AACH,UAAIoO,MAAMtU,SAAV,EAAqB;AACnB;AACA,eAAOoL,IAAP;AACD,OAHD,MAIK;AACH;AACA,eAAOqJ,KAAP;AACD;AACF;AACF,GAvGD;;AAyGA;;;;;;;;AAQAtE,UAAQmD,SAAR,CAAkB0C,MAAlB,GAA2B,UAAUzL,OAAV,EAAmB;AAC5C,QAAIsI,OAAO,KAAKE,KAAhB;AAAA,QACIe,SAASvJ,WAAWA,QAAQuJ,MADhC;AAAA,QAEI8B,QAAQrL,WAAWA,QAAQqL,KAF/B;AAAA,QAGIrU,OAAOgJ,WAAWA,QAAQhJ,IAAnB,IAA2B,KAAKuR,QAAL,CAAcvR,IAHpD;AAAA,QAIIkU,UAAU,uBAAY5C,IAAZ,CAJd;AAAA,QAKI3S,CALJ;AAAA,QAMImB,GANJ;AAAA,QAOIiT,EAPJ;AAAA,QAQIlJ,IARJ;AAAA,QASIqJ,KATJ;AAAA,QAUIY,MAAM,EAVV;;AAYA,QAAIvB,MAAJ,EAAY;AACV;AACA,UAAI8B,KAAJ,EAAW;AACT;AACAnB,gBAAQ,EAAR;AACA,aAAKvU,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,eAAKmB,QAAQvV,CAAR,CAAL;AACAkL,iBAAO,KAAKuK,QAAL,CAAcrB,EAAd,EAAkB/S,IAAlB,CAAP;AACA,cAAIuS,OAAO1I,IAAP,CAAJ,EAAkB;AAChBqJ,kBAAMtT,IAAN,CAAWiK,IAAX;AACD;AACF;;AAED,aAAKyK,KAAL,CAAWpB,KAAX,EAAkBmB,KAAlB;;AAEA,aAAK1V,IAAI,CAAJ,EAAOmB,MAAMoT,MAAMrU,MAAxB,EAAgCF,IAAImB,GAApC,EAAyCnB,GAAzC,EAA8C;AAC5CmV,cAAIlU,IAAJ,CAASsT,MAAMvU,CAAN,EAAS,KAAK8S,QAAd,CAAT;AACD;AACF,OAhBD,MAiBK;AACH;AACA,aAAK9S,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,eAAKmB,QAAQvV,CAAR,CAAL;AACAkL,iBAAO,KAAKuK,QAAL,CAAcrB,EAAd,EAAkB/S,IAAlB,CAAP;AACA,cAAIuS,OAAO1I,IAAP,CAAJ,EAAkB;AAChBiK,gBAAIlU,IAAJ,CAASiK,KAAK,KAAK4H,QAAV,CAAT;AACD;AACF;AACF;AACF,KA7BD,MA8BK;AACH;AACA,UAAI4C,KAAJ,EAAW;AACT;AACAnB,gBAAQ,EAAR;AACA,aAAKvU,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,eAAKmB,QAAQvV,CAAR,CAAL;AACAuU,gBAAMtT,IAAN,CAAW0R,KAAKyB,EAAL,CAAX;AACD;;AAED,aAAKuB,KAAL,CAAWpB,KAAX,EAAkBmB,KAAlB;;AAEA,aAAK1V,IAAI,CAAJ,EAAOmB,MAAMoT,MAAMrU,MAAxB,EAAgCF,IAAImB,GAApC,EAAyCnB,GAAzC,EAA8C;AAC5CmV,cAAIlU,IAAJ,CAASsT,MAAMvU,CAAN,EAAS,KAAK8S,QAAd,CAAT;AACD;AACF,OAbD,MAcK;AACH;AACA,aAAK9S,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,eAAKmB,QAAQvV,CAAR,CAAL;AACAkL,iBAAOyH,KAAKyB,EAAL,CAAP;AACAe,cAAIlU,IAAJ,CAASiK,KAAK,KAAK4H,QAAV,CAAT;AACD;AACF;AACF;;AAED,WAAOqC,GAAP;AACD,GAtED;;AAwEA;;;;AAIAlF,UAAQmD,SAAR,CAAkB2C,UAAlB,GAA+B,YAAY;AACzC,WAAO,IAAP;AACD,GAFD;;AAIA;;;;;;;;;;AAUA9F,UAAQmD,SAAR,CAAkBlQ,OAAlB,GAA4B,UAAUC,QAAV,EAAoBkH,OAApB,EAA6B;AACvD,QAAIuJ,SAASvJ,WAAWA,QAAQuJ,MAAhC;AAAA,QACIvS,OAAOgJ,WAAWA,QAAQhJ,IAAnB,IAA2B,KAAKuR,QAAL,CAAcvR,IADpD;AAAA,QAEIsR,OAAO,KAAKE,KAFhB;AAAA,QAGI0C,UAAU,uBAAY5C,IAAZ,CAHd;AAAA,QAII3S,CAJJ;AAAA,QAKImB,GALJ;AAAA,QAMI+J,IANJ;AAAA,QAOIkJ,EAPJ;;AASA,QAAI/J,WAAWA,QAAQqL,KAAvB,EAA8B;AAC5B;AACA,UAAInB,QAAQ,KAAKU,GAAL,CAAS5K,OAAT,CAAZ;;AAEA,WAAKrK,IAAI,CAAJ,EAAOmB,MAAMoT,MAAMrU,MAAxB,EAAgCF,IAAImB,GAApC,EAAyCnB,GAAzC,EAA8C;AAC5CkL,eAAOqJ,MAAMvU,CAAN,CAAP;AACAoU,aAAKlJ,KAAK,KAAK4H,QAAV,CAAL;AACA3P,iBAAS+H,IAAT,EAAekJ,EAAf;AACD;AACF,KATD,MAUK;AACH;AACA,WAAKpU,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,aAAKmB,QAAQvV,CAAR,CAAL;AACAkL,eAAO,KAAKuK,QAAL,CAAcrB,EAAd,EAAkB/S,IAAlB,CAAP;AACA,YAAI,CAACuS,MAAD,IAAWA,OAAO1I,IAAP,CAAf,EAA6B;AAC3B/H,mBAAS+H,IAAT,EAAekJ,EAAf;AACD;AACF;AACF;AACF,GA9BD;;AAgCA;;;;;;;;;;;AAWAnE,UAAQmD,SAAR,CAAkBpM,GAAlB,GAAwB,UAAU7D,QAAV,EAAoBkH,OAApB,EAA6B;AACnD,QAAIuJ,SAASvJ,WAAWA,QAAQuJ,MAAhC;AAAA,QACIvS,OAAOgJ,WAAWA,QAAQhJ,IAAnB,IAA2B,KAAKuR,QAAL,CAAcvR,IADpD;AAAA,QAEI2U,cAAc,EAFlB;AAAA,QAGIrD,OAAO,KAAKE,KAHhB;AAAA,QAII0C,UAAU,uBAAY5C,IAAZ,CAJd;AAAA,QAKI3S,CALJ;AAAA,QAMImB,GANJ;AAAA,QAOIiT,EAPJ;AAAA,QAQIlJ,IARJ;;AAUA;AACA,SAAKlL,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9CoU,WAAKmB,QAAQvV,CAAR,CAAL;AACAkL,aAAO,KAAKuK,QAAL,CAAcrB,EAAd,EAAkB/S,IAAlB,CAAP;AACA,UAAI,CAACuS,MAAD,IAAWA,OAAO1I,IAAP,CAAf,EAA6B;AAC3B8K,oBAAY/U,IAAZ,CAAiBkC,SAAS+H,IAAT,EAAekJ,EAAf,CAAjB;AACD;AACF;;AAED;AACA,QAAI/J,WAAWA,QAAQqL,KAAvB,EAA8B;AAC5B,WAAKC,KAAL,CAAWK,WAAX,EAAwB3L,QAAQqL,KAAhC;AACD;;AAED,WAAOM,WAAP;AACD,GA1BD;;AA4BA;;;;;;;AAOA/F,UAAQmD,SAAR,CAAkBwC,aAAlB,GAAkC,UAAU1K,IAAV,EAAgBvB,MAAhB,EAAwB;AACxD,QAAI,CAACuB,IAAL,EAAW;AAAE;AACX,aAAOA,IAAP;AACD;;AAED,QAAI+K,eAAe,EAAnB;AAAA,QACIC,aAAa,uBAAYhL,IAAZ,CADjB;AAAA,QAEI/J,MAAM+U,WAAWhW,MAFrB;AAAA,QAGIF,CAHJ;AAAA,QAII2K,KAJJ;;AAMA,QAAGrK,MAAMC,OAAN,CAAcoJ,MAAd,CAAH,EAAyB;AACvB,WAAK3J,IAAI,CAAT,EAAYA,IAAImB,GAAhB,EAAqBnB,GAArB,EAA0B;AACxB2K,gBAAQuL,WAAWlW,CAAX,CAAR;AACA,YAAI2J,OAAO3I,OAAP,CAAe2J,KAAf,KAAyB,CAAC,CAA9B,EAAiC;AAC/BsL,uBAAatL,KAAb,IAAsBO,KAAKP,KAAL,CAAtB;AACD;AACF;AACF,KAPD,MAOK;AACH,WAAK3K,IAAI,CAAT,EAAYA,IAAImB,GAAhB,EAAqBnB,GAArB,EAA0B;AACxB2K,gBAAQuL,WAAWlW,CAAX,CAAR;AACA,YAAI2J,OAAOlK,cAAP,CAAsBkL,KAAtB,CAAJ,EAAkC;AAChCsL,uBAAatM,OAAOgB,KAAP,CAAb,IAA8BO,KAAKP,KAAL,CAA9B;AACD;AACF;AACF;;AAED,WAAOsL,YAAP;AACD,GA5BD;;AA8BA;;;;;;AAMAhG,UAAQmD,SAAR,CAAkBuC,KAAlB,GAA0B,UAAUpB,KAAV,EAAiBmB,KAAjB,EAAwB;AAChD,QAAIzY,KAAK2B,QAAL,CAAc8W,KAAd,CAAJ,EAA0B;AACxB;AACA,UAAIS,OAAOT,KAAX,CAFwB,CAEN;AAClBnB,YAAM6B,IAAN,CAAW,UAAUzW,CAAV,EAAaC,CAAb,EAAgB;AACzB,YAAIyW,KAAK1W,EAAEwW,IAAF,CAAT;AACA,YAAIG,KAAK1W,EAAEuW,IAAF,CAAT;AACA,eAAQE,KAAKC,EAAN,GAAY,CAAZ,GAAkBD,KAAKC,EAAN,GAAY,CAAC,CAAb,GAAiB,CAAzC;AACD,OAJD;AAKD,KARD,MASK,IAAI,OAAOZ,KAAP,KAAiB,UAArB,EAAiC;AACpC;AACAnB,YAAM6B,IAAN,CAAWV,KAAX;AACD;AACD;AACA;AALK,SAMA;AACH,cAAM,IAAI/U,SAAJ,CAAc,sCAAd,CAAN;AACD;AACF,GAnBD;;AAqBA;;;;;;;AAOAsP,UAAQmD,SAAR,CAAkBmD,MAAlB,GAA2B,UAAUnC,EAAV,EAAcJ,QAAd,EAAwB;AACjD,QAAIwC,aAAa,EAAjB;AAAA,QACIC,eAAe,EADnB;AAAA,QAEItB,MAAM,EAFV;AAAA,QAGInV,CAHJ;AAAA,QAGOmB,GAHP;AAAA,QAGYqU,MAHZ;AAAA,QAGoBtK,IAHpB;;AAKA;AACAiK,UAAM7U,MAAMC,OAAN,CAAc6T,EAAd,IAAoBA,EAApB,GAAyB,CAACA,EAAD,CAA/B;;AAEA,SAAKpU,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CkL,aAAO,KAAKwL,OAAL,CAAavB,IAAInV,CAAJ,CAAb,CAAP;AACA,UAAIkL,IAAJ,EAAU;AACRsK,iBAAStK,KAAK,KAAK4H,QAAV,CAAT;AACA,YAAI0C,UAAU1V,SAAd,EAAyB;AACvB0W,qBAAWvV,IAAX,CAAgBuU,MAAhB;AACAiB,uBAAaxV,IAAb,CAAkBiK,IAAlB;AACD;AACF;AACF;;AAED,QAAIsL,WAAWtW,MAAf,EAAuB;AACrB,WAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOiC,UAAR,EAAoB9B,SAAS+B,YAA7B,EAAxB,EAAoEzC,QAApE;AACD;;AAED,WAAOwC,UAAP;AACD,GAzBD;;AA2BA;;;;;;AAMAvG,UAAQmD,SAAR,CAAkBsD,OAAlB,GAA4B,UAAUtC,EAAV,EAAc;AACxC,QAAIlJ,IAAJ,EACIyL,KADJ;;AAGA;AACA,QAAI1Z,KAAKM,QAAL,CAAc6W,EAAd,KAAqBnX,KAAK2B,QAAL,CAAcwV,EAAd,CAAzB,EAA4C;AAC1CuC,cAAQvC,EAAR;AACD,KAFD,MAGK,IAAIA,cAAcvT,MAAlB,EAA0B;AAC7B8V,cAAQvC,GAAG,KAAKtB,QAAR,CAAR,CAD6B,CACF;AAC5B;;AAED;AACA,QAAI6D,UAAU7W,SAAV,IAAuB,KAAK+S,KAAL,CAAW8D,KAAX,CAA3B,EAA8C;AAC5CzL,aAAO,KAAK2H,KAAL,CAAW8D,KAAX,CAAP;AACA,aAAO,KAAK9D,KAAL,CAAW8D,KAAX,CAAP;AACA,WAAKzW,MAAL;AACA,aAAOgL,IAAP;AACD;AACD,WAAO,IAAP;AACD,GApBD;;AAsBA;;;;;AAKA+E,UAAQmD,SAAR,CAAkBwD,KAAlB,GAA0B,UAAU5C,QAAV,EAAoB;AAC5C,QAAIhU,CAAJ,EAAOmB,GAAP;AACA,QAAIgU,MAAM,uBAAY,KAAKtC,KAAjB,CAAV;AACA,QAAI0B,QAAQ,EAAZ;;AAEA,SAAKvU,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CuU,YAAMtT,IAAN,CAAW,KAAK4R,KAAL,CAAWsC,IAAInV,CAAJ,CAAX,CAAX;AACD;;AAED,SAAK6S,KAAL,GAAa,EAAb;AACA,SAAK3S,MAAL,GAAc,CAAd;;AAEA,SAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOY,GAAR,EAAaT,SAASH,KAAtB,EAAxB,EAAsDP,QAAtD;;AAEA,WAAOmB,GAAP;AACD,GAfD;;AAiBA;;;;;AAKAlF,UAAQmD,SAAR,CAAkB5U,GAAlB,GAAwB,UAAUmM,KAAV,EAAiB;AACvC,QAAIgI,OAAO,KAAKE,KAAhB;AAAA,QACI0C,UAAU,uBAAY5C,IAAZ,CADd;AAAA,QAEInU,MAAM,IAFV;AAAA,QAGIqY,WAAW,IAHf;AAAA,QAII7W,CAJJ;AAAA,QAKImB,GALJ;;AAOA,SAAKnB,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9C,UAAIoU,KAAKmB,QAAQvV,CAAR,CAAT;AACA,UAAIkL,OAAOyH,KAAKyB,EAAL,CAAX;AACA,UAAI0C,YAAY5L,KAAKP,KAAL,CAAhB;AACA,UAAImM,aAAa,IAAb,KAAsB,CAACtY,GAAD,IAAQsY,YAAYD,QAA1C,CAAJ,EAAyD;AACvDrY,cAAM0M,IAAN;AACA2L,mBAAWC,SAAX;AACD;AACF;;AAED,WAAOtY,GAAP;AACD,GAnBD;;AAqBA;;;;;AAKAyR,UAAQmD,SAAR,CAAkB7U,GAAlB,GAAwB,UAAUoM,KAAV,EAAiB;AACvC,QAAIgI,OAAO,KAAKE,KAAhB;AAAA,QACI0C,UAAU,uBAAY5C,IAAZ,CADd;AAAA,QAEIpU,MAAM,IAFV;AAAA,QAGIwY,WAAW,IAHf;AAAA,QAII/W,CAJJ;AAAA,QAKImB,GALJ;;AAOA,SAAKnB,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9C,UAAIoU,KAAKmB,QAAQvV,CAAR,CAAT;AACA,UAAIkL,OAAOyH,KAAKyB,EAAL,CAAX;AACA,UAAI0C,YAAY5L,KAAKP,KAAL,CAAhB;AACA,UAAImM,aAAa,IAAb,KAAsB,CAACvY,GAAD,IAAQuY,YAAYC,QAA1C,CAAJ,EAAyD;AACvDxY,cAAM2M,IAAN;AACA6L,mBAAWD,SAAX;AACD;AACF;;AAED,WAAOvY,GAAP;AACD,GAnBD;;AAqBA;;;;;;;AAOA0R,UAAQmD,SAAR,CAAkB4D,QAAlB,GAA6B,UAAUrM,KAAV,EAAiB;AAC5C,QAAIgI,OAAO,KAAKE,KAAhB;AACA,QAAI0C,UAAU,uBAAY5C,IAAZ,CAAd;AACA,QAAIsE,SAAS,EAAb;AACA,QAAIC,YAAY,KAAKtE,QAAL,CAAcvR,IAAd,IAAsB,KAAKuR,QAAL,CAAcvR,IAAd,CAAmBsJ,KAAnB,CAAtB,IAAmD,IAAnE;AACA,QAAIwM,QAAQ,CAAZ;AACA,QAAInX,CAAJ,EACIkK,CADJ,EAEI/I,GAFJ;;AAIA,SAAKnB,IAAI,CAAJ,EAAOmB,MAAMoU,QAAQrV,MAA1B,EAAkCF,IAAImB,GAAtC,EAA2CnB,GAA3C,EAAgD;AAC9C,UAAIoU,KAAKmB,QAAQvV,CAAR,CAAT;AACA,UAAIkL,OAAOyH,KAAKyB,EAAL,CAAX;AACA,UAAIvW,QAAQqN,KAAKP,KAAL,CAAZ;AACA,UAAIyM,SAAS,KAAb;AACA,WAAKlN,IAAI,CAAT,EAAYA,IAAIiN,KAAhB,EAAuBjN,GAAvB,EAA4B;AAC1B,YAAI+M,OAAO/M,CAAP,KAAarM,KAAjB,EAAwB;AACtBuZ,mBAAS,IAAT;AACA;AACD;AACF;AACD,UAAI,CAACA,MAAD,IAAYvZ,UAAUiC,SAA1B,EAAsC;AACpCmX,eAAOE,KAAP,IAAgBtZ,KAAhB;AACAsZ;AACD;AACF;;AAED,QAAID,SAAJ,EAAe;AACb,WAAKlX,IAAI,CAAJ,EAAOmB,MAAM8V,OAAO/W,MAAzB,EAAiCF,IAAImB,GAArC,EAA0CnB,GAA1C,EAA+C;AAC7CiX,eAAOjX,CAAP,IAAY/C,KAAKmE,OAAL,CAAa6V,OAAOjX,CAAP,CAAb,EAAwBkX,SAAxB,CAAZ;AACD;AACF;;AAED,WAAOD,MAAP;AACD,GAlCD;;AAoCA;;;;;;AAMAhH,UAAQmD,SAAR,CAAkBkB,QAAlB,GAA6B,UAAUpJ,IAAV,EAAgB;AAC3C,QAAIkJ,KAAKlJ,KAAK,KAAK4H,QAAV,CAAT;;AAEA,QAAIsB,MAAMtU,SAAV,EAAqB;AACnB;AACA,UAAI,KAAK+S,KAAL,CAAWuB,EAAX,CAAJ,EAAoB;AAClB;AACA,cAAM,IAAI5T,KAAJ,CAAU,mCAAmC4T,EAAnC,GAAwC,iBAAlD,CAAN;AACD;AACF,KAND,MAOK;AACH;AACAA,WAAKnX,KAAKmC,UAAL,EAAL;AACA8L,WAAK,KAAK4H,QAAV,IAAsBsB,EAAtB;AACD;;AAED,QAAIjM,IAAI,EAAR;AAAA,QACIwB,SAAS,uBAAYuB,IAAZ,CADb;AAAA,QAEIlL,CAFJ;AAAA,QAGImB,GAHJ;AAIA,SAAKnB,IAAI,CAAJ,EAAOmB,MAAMwI,OAAOzJ,MAAzB,EAAiCF,IAAImB,GAArC,EAA0CnB,GAA1C,EAA+C;AAC7C,UAAI2K,QAAQhB,OAAO3J,CAAP,CAAZ;AACA,UAAIkX,YAAY,KAAKlE,KAAL,CAAWrI,KAAX,CAAhB,CAF6C,CAET;AACpCxC,QAAEwC,KAAF,IAAW1N,KAAKmE,OAAL,CAAa8J,KAAKP,KAAL,CAAb,EAA0BuM,SAA1B,CAAX;AACD;AACD,SAAKrE,KAAL,CAAWuB,EAAX,IAAiBjM,CAAjB;AACA,SAAKjI,MAAL;;AAEA,WAAOkU,EAAP;AACD,GA7BD;;AA+BA;;;;;;;AAOAnE,UAAQmD,SAAR,CAAkBqC,QAAlB,GAA6B,UAAUrB,EAAV,EAAciD,KAAd,EAAqB;AAChD,QAAI1M,KAAJ,EAAW9M,KAAX,EAAkBmC,CAAlB,EAAqBmB,GAArB;;AAEA;AACA,QAAImW,MAAM,KAAKzE,KAAL,CAAWuB,EAAX,CAAV;AACA,QAAI,CAACkD,GAAL,EAAU;AACR,aAAO,IAAP;AACD;;AAED;AACA,QAAIC,YAAY,EAAhB;AAAA,QACI5N,SAAS,uBAAY2N,GAAZ,CADb;;AAGA,QAAID,KAAJ,EAAW;AACT,WAAKrX,IAAI,CAAJ,EAAOmB,MAAMwI,OAAOzJ,MAAzB,EAAiCF,IAAImB,GAArC,EAA0CnB,GAA1C,EAA+C;AAC7C2K,gBAAQhB,OAAO3J,CAAP,CAAR;AACAnC,gBAAQyZ,IAAI3M,KAAJ,CAAR;AACA4M,kBAAU5M,KAAV,IAAmB1N,KAAKmE,OAAL,CAAavD,KAAb,EAAoBwZ,MAAM1M,KAAN,CAApB,CAAnB;AACD;AACF,KAND,MAOK;AACH;AACA,WAAK3K,IAAI,CAAJ,EAAOmB,MAAMwI,OAAOzJ,MAAzB,EAAiCF,IAAImB,GAArC,EAA0CnB,GAA1C,EAA+C;AAC7C2K,gBAAQhB,OAAO3J,CAAP,CAAR;AACAnC,gBAAQyZ,IAAI3M,KAAJ,CAAR;AACA4M,kBAAU5M,KAAV,IAAmB9M,KAAnB;AACD;AACF;;AAED,QAAI,CAAC0Z,UAAU,KAAKzE,QAAf,CAAL,EAA+B;AAC7ByE,gBAAU,KAAKzE,QAAf,IAA2BwE,IAAIlD,EAA/B;AACD;;AAED,WAAOmD,SAAP;AACD,GAlCD;;AAoCA;;;;;;;;AAQAtH,UAAQmD,SAAR,CAAkB0B,WAAlB,GAAgC,UAAU5J,IAAV,EAAgB;AAC9C,QAAIkJ,KAAKlJ,KAAK,KAAK4H,QAAV,CAAT;AACA,QAAIsB,MAAMtU,SAAV,EAAqB;AACnB,YAAM,IAAIU,KAAJ,CAAU,+CAA+C,4BAAe0K,IAAf,CAA/C,GAAsE,GAAhF,CAAN;AACD;AACD,QAAI/C,IAAI,KAAK0K,KAAL,CAAWuB,EAAX,CAAR;AACA,QAAI,CAACjM,CAAL,EAAQ;AACN;AACA,YAAM,IAAI3H,KAAJ,CAAU,yCAAyC4T,EAAzC,GAA8C,QAAxD,CAAN;AACD;;AAED;AACA,QAAIzK,SAAS,uBAAYuB,IAAZ,CAAb;AACA,SAAK,IAAIlL,IAAI,CAAR,EAAWmB,MAAMwI,OAAOzJ,MAA7B,EAAqCF,IAAImB,GAAzC,EAA8CnB,GAA9C,EAAmD;AACjD,UAAI2K,QAAQhB,OAAO3J,CAAP,CAAZ;AACA,UAAIkX,YAAY,KAAKlE,KAAL,CAAWrI,KAAX,CAAhB,CAFiD,CAEb;AACpCxC,QAAEwC,KAAF,IAAW1N,KAAKmE,OAAL,CAAa8J,KAAKP,KAAL,CAAb,EAA0BuM,SAA1B,CAAX;AACD;;AAED,WAAO9C,EAAP;AACD,GApBD;;AAsBAzG,SAAOvQ,OAAP,GAAiB6S,OAAjB,C;;;;;;;;ACt7BA;;;;;;;;;;;;;AAaA,WAASE,KAAT,CAAe9F,OAAf,EAAwB;AACtB;AACA,SAAKmN,KAAL,GAAa,IAAb;AACA,SAAKhZ,GAAL,GAAWiZ,QAAX;;AAEA;AACA,SAAKnE,MAAL,GAAc,EAAd;AACA,SAAKoE,QAAL,GAAgB,IAAhB;AACA,SAAKC,SAAL,GAAiB,IAAjB;;AAEA,SAAKxE,UAAL,CAAgB9I,OAAhB;AACD;;AAED;;;;;;;;;;;;;AAaA8F,QAAMiD,SAAN,CAAgBD,UAAhB,GAA6B,UAAU9I,OAAV,EAAmB;AAC9C,QAAIA,WAAW,OAAOA,QAAQmN,KAAf,KAAyB,WAAxC,EAAqD;AACnD,WAAKA,KAAL,GAAanN,QAAQmN,KAArB;AACD;AACD,QAAInN,WAAW,OAAOA,QAAQ7L,GAAf,KAAuB,WAAtC,EAAmD;AACjD,WAAKA,GAAL,GAAW6L,QAAQ7L,GAAnB;AACD;;AAED,SAAKoZ,cAAL;AACD,GATD;;AAWA;;;;;;;;;;;;;;;;;;;AAmBAzH,QAAMhT,MAAN,GAAe,UAAUK,MAAV,EAAkB6M,OAAlB,EAA2B;AACxC,QAAIgJ,QAAQ,IAAIlD,KAAJ,CAAU9F,OAAV,CAAZ;;AAEA,QAAI7M,OAAOqa,KAAP,KAAiB/X,SAArB,EAAgC;AAC9B,YAAM,IAAIU,KAAJ,CAAU,4CAAV,CAAN;AACD;AACDhD,WAAOqa,KAAP,GAAe,YAAY;AACzBxE,YAAMwE,KAAN;AACD,KAFD;;AAIA,QAAIC,UAAU,CAAC;AACb3B,YAAM,OADO;AAEb4B,gBAAUjY;AAFG,KAAD,CAAd;;AAKA,QAAIuK,WAAWA,QAAQzE,OAAvB,EAAgC;AAC9B,WAAK,IAAI5F,IAAI,CAAb,EAAgBA,IAAIqK,QAAQzE,OAAR,CAAgB1F,MAApC,EAA4CF,GAA5C,EAAiD;AAC/C,YAAImW,OAAO9L,QAAQzE,OAAR,CAAgB5F,CAAhB,CAAX;AACA8X,gBAAQ7W,IAAR,CAAa;AACXkV,gBAAMA,IADK;AAEX4B,oBAAUva,OAAO2Y,IAAP;AAFC,SAAb;AAIA9C,cAAMzN,OAAN,CAAcpI,MAAd,EAAsB2Y,IAAtB;AACD;AACF;;AAED9C,UAAMsE,SAAN,GAAkB;AAChBna,cAAQA,MADQ;AAEhBsa,eAASA;AAFO,KAAlB;;AAKA,WAAOzE,KAAP;AACD,GAhCD;;AAkCA;;;;AAIAlD,QAAMiD,SAAN,CAAgBG,OAAhB,GAA0B,YAAY;AACpC,SAAKsE,KAAL;;AAEA,QAAI,KAAKF,SAAT,EAAoB;AAClB,UAAIna,SAAS,KAAKma,SAAL,CAAena,MAA5B;AACA,UAAIsa,UAAU,KAAKH,SAAL,CAAeG,OAA7B;AACA,WAAK,IAAI9X,IAAI,CAAb,EAAgBA,IAAI8X,QAAQ5X,MAA5B,EAAoCF,GAApC,EAAyC;AACvC,YAAIgY,SAASF,QAAQ9X,CAAR,CAAb;AACA,YAAIgY,OAAOD,QAAX,EAAqB;AACnBva,iBAAOwa,OAAO7B,IAAd,IAAsB6B,OAAOD,QAA7B;AACD,SAFD,MAGK;AACH,iBAAOva,OAAOwa,OAAO7B,IAAd,CAAP;AACD;AACF;AACD,WAAKwB,SAAL,GAAiB,IAAjB;AACD;AACF,GAjBD;;AAmBA;;;;;AAKAxH,QAAMiD,SAAN,CAAgBxN,OAAhB,GAA0B,UAASpI,MAAT,EAAiBwa,MAAjB,EAAyB;AACjD,QAAI3D,KAAK,IAAT;AACA,QAAI0D,WAAWva,OAAOwa,MAAP,CAAf;AACA,QAAI,CAACD,QAAL,EAAe;AACb,YAAM,IAAIvX,KAAJ,CAAU,YAAYwX,MAAZ,GAAqB,YAA/B,CAAN;AACD;;AAEDxa,WAAOwa,MAAP,IAAiB,YAAY;AAC3B;AACA,UAAI9C,OAAO,EAAX;AACA,WAAK,IAAIlV,IAAI,CAAb,EAAgBA,IAAIC,UAAUC,MAA9B,EAAsCF,GAAtC,EAA2C;AACzCkV,aAAKlV,CAAL,IAAUC,UAAUD,CAAV,CAAV;AACD;;AAED;AACAqU,SAAGhB,KAAH,CAAS;AACP6B,cAAMA,IADC;AAEP1R,YAAIuU,QAFG;AAGPE,iBAAS;AAHF,OAAT;AAKD,KAbD;AAcD,GArBD;;AAuBA;;;;AAIA9H,QAAMiD,SAAN,CAAgBC,KAAhB,GAAwB,UAAS6E,KAAT,EAAgB;AACtC,QAAI,OAAOA,KAAP,KAAiB,UAArB,EAAiC;AAC/B,WAAK5E,MAAL,CAAYrS,IAAZ,CAAiB,EAACuC,IAAI0U,KAAL,EAAjB;AACD,KAFD,MAGK;AACH,WAAK5E,MAAL,CAAYrS,IAAZ,CAAiBiX,KAAjB;AACD;;AAED,SAAKN,cAAL;AACD,GATD;;AAWA;;;;AAIAzH,QAAMiD,SAAN,CAAgBwE,cAAhB,GAAiC,YAAY;AAC3C;AACA,QAAI,KAAKtE,MAAL,CAAYpT,MAAZ,GAAqB,KAAK1B,GAA9B,EAAmC;AACjC,WAAKqZ,KAAL;AACD;;AAED;AACAM,iBAAa,KAAKT,QAAlB;AACA,QAAI,KAAKrE,KAAL,CAAWnT,MAAX,GAAoB,CAApB,IAAyB,OAAO,KAAKsX,KAAZ,KAAsB,QAAnD,EAA6D;AAC3D,UAAInD,KAAK,IAAT;AACA,WAAKqD,QAAL,GAAgBU,WAAW,YAAY;AACrC/D,WAAGwD,KAAH;AACD,OAFe,EAEb,KAAKL,KAFQ,CAAhB;AAGD;AACF,GAdD;;AAgBA;;;AAGArH,QAAMiD,SAAN,CAAgByE,KAAhB,GAAwB,YAAY;AAClC,WAAO,KAAKvE,MAAL,CAAYpT,MAAZ,GAAqB,CAA5B,EAA+B;AAC7B,UAAIgY,QAAQ,KAAK5E,MAAL,CAAY/B,KAAZ,EAAZ;AACA2G,YAAM1U,EAAN,CAAS6U,KAAT,CAAeH,MAAMD,OAAN,IAAiBC,MAAM1U,EAAtC,EAA0C0U,MAAMhD,IAAN,IAAc,EAAxD;AACD;AACF,GALD;;AAOAvH,SAAOvQ,OAAP,GAAiB+S,KAAjB,C;;;;;;;;;;;;;;ACvMA,MAAIlT,OAAO,mBAAAC,CAAQ,CAAR,CAAX;AACA,MAAI+S,UAAU,mBAAA/S,CAAQ,EAAR,CAAd;;AAEA;;;;;;;;;;AAUA,WAASgT,QAAT,CAAmByC,IAAnB,EAAyBtI,OAAzB,EAAkC;AAChC,SAAKwI,KAAL,GAAa,IAAb;AACA,SAAKyF,IAAL,GAAY,EAAZ,CAFgC,CAEhB;AAChB,SAAKpY,MAAL,GAAc,CAAd,CAHgC,CAGf;AACjB,SAAK0S,QAAL,GAAgBvI,WAAW,EAA3B;AACA,SAAKyI,QAAL,GAAgB,IAAhB,CALgC,CAKV;AACtB,SAAKG,YAAL,GAAoB,EAApB,CANgC,CAMR;;AAExB,QAAIoB,KAAK,IAAT;AACA,SAAKtQ,QAAL,GAAgB,YAAY;AAC1BsQ,SAAGkE,QAAH,CAAYF,KAAZ,CAAkBhE,EAAlB,EAAsBpU,SAAtB;AACD,KAFD;;AAIA,SAAKuY,OAAL,CAAa7F,IAAb;AACD;;AAED;AACA;;AAEA;;;;AAIAzC,WAASkD,SAAT,CAAmBoF,OAAnB,GAA6B,UAAU7F,IAAV,EAAgB;AAC3C,QAAIwC,GAAJ,EAASf,EAAT,EAAapU,CAAb,EAAgBmB,GAAhB,EAAqBoT,KAArB;;AAEA,QAAI,KAAK1B,KAAT,EAAgB;AACd;AACA,UAAI,KAAKA,KAAL,CAAWc,GAAf,EAAoB;AAClB,aAAKd,KAAL,CAAWc,GAAX,CAAe,GAAf,EAAoB,KAAK5P,QAAzB;AACD;;AAED;AACAoR,YAAM,KAAKtC,KAAL,CAAWiD,MAAX,CAAkB,EAAClC,QAAQ,KAAKhB,QAAL,IAAiB,KAAKA,QAAL,CAAcgB,MAAxC,EAAlB,CAAN;AACAW,cAAQ,EAAR;;AAEA,WAAKvU,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CuU,cAAMtT,IAAN,CAAW,KAAK4R,KAAL,CAAWA,KAAX,CAAiBsC,IAAInV,CAAJ,CAAjB,CAAX;AACD;;AAED,WAAKsY,IAAL,GAAY,EAAZ;AACA,WAAKpY,MAAL,GAAc,CAAd;AACA,WAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOY,GAAR,EAAaT,SAASH,KAAtB,EAAxB;AACD;;AAED,SAAK1B,KAAL,GAAaF,IAAb;;AAEA,QAAI,KAAKE,KAAT,EAAgB;AACd;AACA,WAAKC,QAAL,GAAgB,KAAKF,QAAL,CAAcG,OAAd,IACX,KAAKF,KAAL,IAAc,KAAKA,KAAL,CAAWxI,OAAzB,IAAoC,KAAKwI,KAAL,CAAWxI,OAAX,CAAmB0I,OAD5C,IAEZ,IAFJ;;AAIA;AACAoC,YAAM,KAAKtC,KAAL,CAAWiD,MAAX,CAAkB,EAAClC,QAAQ,KAAKhB,QAAL,IAAiB,KAAKA,QAAL,CAAcgB,MAAxC,EAAlB,CAAN;AACA,WAAK5T,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CoU,aAAKe,IAAInV,CAAJ,CAAL;AACA,aAAKsY,IAAL,CAAUlE,EAAV,IAAgB,IAAhB;AACD;AACD,WAAKlU,MAAL,GAAciV,IAAIjV,MAAlB;AACA,WAAK4T,QAAL,CAAc,KAAd,EAAqB,EAACS,OAAOY,GAAR,EAArB;;AAEA;AACA,UAAI,KAAKtC,KAAL,CAAWW,EAAf,EAAmB;AACjB,aAAKX,KAAL,CAAWW,EAAX,CAAc,GAAd,EAAmB,KAAKzP,QAAxB;AACD;AACF;AACF,GA5CD;;AA8CA;;;;AAIAmM,WAASkD,SAAT,CAAmBqF,OAAnB,GAA6B,YAAY;AACvC,QAAIrE,EAAJ,EAAQpU,CAAR,EAAWmB,GAAX;AACA,QAAIgU,MAAM,KAAKtC,KAAL,CAAWiD,MAAX,CAAkB,EAAClC,QAAQ,KAAKhB,QAAL,IAAiB,KAAKA,QAAL,CAAcgB,MAAxC,EAAlB,CAAV;AAAA,QACI8E,SAAS,uBAAY,KAAKJ,IAAjB,CADb;AAAA,QAEIK,SAAS,EAFb;AAAA,QAGIxE,WAAW,EAHf;AAAA,QAIIqC,aAAa,EAJjB;AAAA,QAKIC,eAAe,EALnB;;AAOA;AACA,SAAKzW,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CoU,WAAKe,IAAInV,CAAJ,CAAL;AACA2Y,aAAOvE,EAAP,IAAa,IAAb;AACA,UAAI,CAAC,KAAKkE,IAAL,CAAUlE,EAAV,CAAL,EAAoB;AAClBD,iBAASlT,IAAT,CAAcmT,EAAd;AACA,aAAKkE,IAAL,CAAUlE,EAAV,IAAgB,IAAhB;AACD;AACF;;AAED;AACA,SAAKpU,IAAI,CAAJ,EAAOmB,MAAMuX,OAAOxY,MAAzB,EAAiCF,IAAImB,GAArC,EAA0CnB,GAA1C,EAA+C;AAC7CoU,WAAKsE,OAAO1Y,CAAP,CAAL;AACA,UAAI,CAAC2Y,OAAOvE,EAAP,CAAL,EAAiB;AACfoC,mBAAWvV,IAAX,CAAgBmT,EAAhB;AACAqC,qBAAaxV,IAAb,CAAkB,KAAK4R,KAAL,CAAWA,KAAX,CAAiBuB,EAAjB,CAAlB;AACA,eAAO,KAAKkE,IAAL,CAAUlE,EAAV,CAAP;AACD;AACF;;AAED,SAAKlU,MAAL,IAAeiU,SAASjU,MAAT,GAAkBsW,WAAWtW,MAA5C;;AAEA;AACA,QAAIiU,SAASjU,MAAb,EAAqB;AACnB,WAAK4T,QAAL,CAAc,KAAd,EAAqB,EAACS,OAAOJ,QAAR,EAArB;AACD;AACD,QAAIqC,WAAWtW,MAAf,EAAuB;AACrB,WAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOiC,UAAR,EAAoB9B,SAAS+B,YAA7B,EAAxB;AACD;AACF,GAtCD;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCAvG,WAASkD,SAAT,CAAmB6B,GAAnB,GAAyB,UAAUC,IAAV,EAAgB;AACvC,QAAIb,KAAK,IAAT;;AAEA;AACA,QAAIc,GAAJ,EAAS9K,OAAT,EAAkBsI,IAAlB;AACA,QAAIyC,YAAYnY,KAAKyE,OAAL,CAAazB,UAAU,CAAV,CAAb,CAAhB;AACA,QAAImV,aAAa,QAAb,IAAyBA,aAAa,QAAtC,IAAkDA,aAAa,OAAnE,EAA4E;AAC1E;AACAD,YAAMlV,UAAU,CAAV,CAAN,CAF0E,CAErD;AACrBoK,gBAAUpK,UAAU,CAAV,CAAV;AACA0S,aAAO1S,UAAU,CAAV,CAAP;AACD,KALD,MAMK;AACH;AACAoK,gBAAUpK,UAAU,CAAV,CAAV;AACA0S,aAAO1S,UAAU,CAAV,CAAP;AACD;;AAED;AACA,QAAI2Y,cAAc3b,KAAKE,MAAL,CAAY,EAAZ,EAAgB,KAAKyV,QAArB,EAA+BvI,OAA/B,CAAlB;;AAEA;AACA,QAAI,KAAKuI,QAAL,CAAcgB,MAAd,IAAwBvJ,OAAxB,IAAmCA,QAAQuJ,MAA/C,EAAuD;AACrDgF,kBAAYhF,MAAZ,GAAqB,UAAU1I,IAAV,EAAgB;AACnC,eAAOmJ,GAAGzB,QAAH,CAAYgB,MAAZ,CAAmB1I,IAAnB,KAA4Bb,QAAQuJ,MAAR,CAAe1I,IAAf,CAAnC;AACD,OAFD;AAGD;;AAED;AACA,QAAI2N,eAAe,EAAnB;AACA,QAAI1D,OAAOrV,SAAX,EAAsB;AACpB+Y,mBAAa5X,IAAb,CAAkBkU,GAAlB;AACD;AACD0D,iBAAa5X,IAAb,CAAkB2X,WAAlB;AACAC,iBAAa5X,IAAb,CAAkB0R,IAAlB;;AAEA,WAAO,KAAKE,KAAL,IAAc,KAAKA,KAAL,CAAWoC,GAAX,CAAeoD,KAAf,CAAqB,KAAKxF,KAA1B,EAAiCgG,YAAjC,CAArB;AACD,GArCD;;AAuCA;;;;;;;;AAQA3I,WAASkD,SAAT,CAAmB0C,MAAnB,GAA4B,UAAUzL,OAAV,EAAmB;AAC7C,QAAI8K,GAAJ;;AAEA,QAAI,KAAKtC,KAAT,EAAgB;AACd,UAAIiG,gBAAgB,KAAKlG,QAAL,CAAcgB,MAAlC;AACA,UAAIA,MAAJ;;AAEA,UAAIvJ,WAAWA,QAAQuJ,MAAvB,EAA+B;AAC7B,YAAIkF,aAAJ,EAAmB;AACjBlF,mBAAS,gBAAU1I,IAAV,EAAgB;AACvB,mBAAO4N,cAAc5N,IAAd,KAAuBb,QAAQuJ,MAAR,CAAe1I,IAAf,CAA9B;AACD,WAFD;AAGD,SAJD,MAKK;AACH0I,mBAASvJ,QAAQuJ,MAAjB;AACD;AACF,OATD,MAUK;AACHA,iBAASkF,aAAT;AACD;;AAED3D,YAAM,KAAKtC,KAAL,CAAWiD,MAAX,CAAkB;AACtBlC,gBAAQA,MADc;AAEtB8B,eAAOrL,WAAWA,QAAQqL;AAFJ,OAAlB,CAAN;AAID,KAtBD,MAuBK;AACHP,YAAM,EAAN;AACD;;AAED,WAAOA,GAAP;AACD,GA/BD;;AAiCA;;;;;;;;;;;AAWAjF,WAASkD,SAAT,CAAmBpM,GAAnB,GAAyB,UAAU7D,QAAV,EAAmBkH,OAAnB,EAA4B;AACnD,QAAI2L,cAAc,EAAlB;AACA,QAAI,KAAKnD,KAAT,EAAgB;AACd,UAAIiG,gBAAgB,KAAKlG,QAAL,CAAcgB,MAAlC;AACA,UAAIA,MAAJ;;AAEA,UAAIvJ,WAAWA,QAAQuJ,MAAvB,EAA+B;AAC7B,YAAIkF,aAAJ,EAAmB;AACjBlF,mBAAS,gBAAU1I,IAAV,EAAgB;AACvB,mBAAO4N,cAAc5N,IAAd,KAAuBb,QAAQuJ,MAAR,CAAe1I,IAAf,CAA9B;AACD,WAFD;AAGD,SAJD,MAKK;AACH0I,mBAASvJ,QAAQuJ,MAAjB;AACD;AACF,OATD,MAUK;AACHA,iBAASkF,aAAT;AACD;;AAED9C,oBAAc,KAAKnD,KAAL,CAAW7L,GAAX,CAAe7D,QAAf,EAAwB;AACpCyQ,gBAAQA,MAD4B;AAEpC8B,eAAOrL,WAAWA,QAAQqL;AAFU,OAAxB,CAAd;AAID,KAtBD,MAuBK;AACHM,oBAAc,EAAd;AACD;;AAED,WAAOA,WAAP;AACD,GA9BD;;AAgCA;;;;;AAKA9F,WAASkD,SAAT,CAAmB2C,UAAnB,GAAgC,YAAY;AAC1C,QAAIgD,UAAU,IAAd;AACA,WAAOA,mBAAmB7I,QAA1B,EAAoC;AAClC6I,gBAAUA,QAAQlG,KAAlB;AACD;AACD,WAAOkG,WAAW,IAAlB;AACD,GAND;;AAQA;;;;;;;;;AASA7I,WAASkD,SAAT,CAAmBmF,QAAnB,GAA8B,UAAUhU,KAAV,EAAiBwP,MAAjB,EAAyBC,QAAzB,EAAmC;AAC/D,QAAIhU,CAAJ,EAAOmB,GAAP,EAAYiT,EAAZ,EAAgBlJ,IAAhB;AACA,QAAIiK,MAAMpB,UAAUA,OAAOQ,KAA3B;AACA,QAAIJ,WAAW,EAAf;AAAA,QACIM,aAAa,EADjB;AAAA,QAEI+B,aAAa,EAFjB;AAAA,QAGIwC,WAAW,EAHf;AAAA,QAIIC,eAAe,EAJnB;AAAA,QAKIxC,eAAe,EALnB;;AAOA,QAAItB,OAAO,KAAKtC,KAAhB,EAAuB;AACrB,cAAQtO,KAAR;AACE,aAAK,KAAL;AACE;AACA,eAAKvE,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CoU,iBAAKe,IAAInV,CAAJ,CAAL;AACAkL,mBAAO,KAAK+J,GAAL,CAASb,EAAT,CAAP;AACA,gBAAIlJ,IAAJ,EAAU;AACR,mBAAKoN,IAAL,CAAUlE,EAAV,IAAgB,IAAhB;AACAD,uBAASlT,IAAT,CAAcmT,EAAd;AACD;AACF;;AAED;;AAEF,aAAK,QAAL;AACE;AACA;AACA,eAAKpU,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CoU,iBAAKe,IAAInV,CAAJ,CAAL;AACAkL,mBAAO,KAAK+J,GAAL,CAASb,EAAT,CAAP;;AAEA,gBAAIlJ,IAAJ,EAAU;AACR,kBAAI,KAAKoN,IAAL,CAAUlE,EAAV,CAAJ,EAAmB;AACjBK,2BAAWxT,IAAX,CAAgBmT,EAAhB;AACA6E,6BAAahY,IAAb,CAAkB8S,OAAOpB,IAAP,CAAY3S,CAAZ,CAAlB;AACAgZ,yBAAS/X,IAAT,CAAc8S,OAAOW,OAAP,CAAe1U,CAAf,CAAd;AACD,eAJD,MAKK;AACH,qBAAKsY,IAAL,CAAUlE,EAAV,IAAgB,IAAhB;AACAD,yBAASlT,IAAT,CAAcmT,EAAd;AACD;AACF,aAVD,MAWK;AACH,kBAAI,KAAKkE,IAAL,CAAUlE,EAAV,CAAJ,EAAmB;AACjB,uBAAO,KAAKkE,IAAL,CAAUlE,EAAV,CAAP;AACAoC,2BAAWvV,IAAX,CAAgBmT,EAAhB;AACAqC,6BAAaxV,IAAb,CAAkB8S,OAAOW,OAAP,CAAe1U,CAAf,CAAlB;AACD,eAJD,MAKK;AACH;AACD;AACF;AACF;;AAED;;AAEF,aAAK,QAAL;AACE;AACA,eAAKA,IAAI,CAAJ,EAAOmB,MAAMgU,IAAIjV,MAAtB,EAA8BF,IAAImB,GAAlC,EAAuCnB,GAAvC,EAA4C;AAC1CoU,iBAAKe,IAAInV,CAAJ,CAAL;AACA,gBAAI,KAAKsY,IAAL,CAAUlE,EAAV,CAAJ,EAAmB;AACjB,qBAAO,KAAKkE,IAAL,CAAUlE,EAAV,CAAP;AACAoC,yBAAWvV,IAAX,CAAgBmT,EAAhB;AACAqC,2BAAaxV,IAAb,CAAkB8S,OAAOW,OAAP,CAAe1U,CAAf,CAAlB;AACD;AACF;;AAED;AAzDJ;;AA4DA,WAAKE,MAAL,IAAeiU,SAASjU,MAAT,GAAkBsW,WAAWtW,MAA5C;;AAEA,UAAIiU,SAASjU,MAAb,EAAqB;AACnB,aAAK4T,QAAL,CAAc,KAAd,EAAqB,EAACS,OAAOJ,QAAR,EAArB,EAAwCH,QAAxC;AACD;AACD,UAAIS,WAAWvU,MAAf,EAAuB;AACrB,aAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOE,UAAR,EAAoBC,SAASsE,QAA7B,EAAuCrG,MAAMsG,YAA7C,EAAxB,EAAoFjF,QAApF;AACD;AACD,UAAIwC,WAAWtW,MAAf,EAAuB;AACrB,aAAK4T,QAAL,CAAc,QAAd,EAAwB,EAACS,OAAOiC,UAAR,EAAoB9B,SAAS+B,YAA7B,EAAxB,EAAoEzC,QAApE;AACD;AACF;AACF,GAnFD;;AAqFA;AACA9D,WAASkD,SAAT,CAAmBI,EAAnB,GAAwBvD,QAAQmD,SAAR,CAAkBI,EAA1C;AACAtD,WAASkD,SAAT,CAAmBO,GAAnB,GAAyB1D,QAAQmD,SAAR,CAAkBO,GAA3C;AACAzD,WAASkD,SAAT,CAAmBU,QAAnB,GAA8B7D,QAAQmD,SAAR,CAAkBU,QAAhD;;AAEA;AACA5D,WAASkD,SAAT,CAAmBM,SAAnB,GAA+BxD,SAASkD,SAAT,CAAmBI,EAAlD;AACAtD,WAASkD,SAAT,CAAmBS,WAAnB,GAAiC3D,SAASkD,SAAT,CAAmBO,GAApD;;AAEAhG,SAAOvQ,OAAP,GAAiB8S,QAAjB,C;;;;;;;;AC/YA,MAAIgJ,UAAU,mBAAAhc,CAAQ,EAAR,CAAd,CAA4C,IAAI+S,UAAU,mBAAA/S,CAAQ,EAAR,CAAd;AAC5C,MAAIgT,WAAW,mBAAAhT,CAAQ,EAAR,CAAf;AACA,MAAID,OAAO,mBAAAC,CAAQ,CAAR,CAAX;AACA,MAAIuT,UAAU,mBAAAvT,CAAQ,EAAR,CAAd;AACA,MAAIsT,UAAU,mBAAAtT,CAAQ,EAAR,CAAd;AACA,MAAIoT,SAAS,mBAAApT,CAAQ,EAAR,CAAb;AACA,MAAIqT,SAAS,mBAAArT,CAAQ,GAAR,CAAb;AACA,MAAIwT,SAAS,mBAAAxT,CAAQ,GAAR,CAAb;AACA,MAAIyT,aAAa,mBAAAzT,CAAQ,GAAR,CAAjB;AACA,MAAIic,QAAQ,mBAAAjc,CAAQ,GAAR,CAAZ;AACA,MAAIkc,WAAW,mBAAAlc,CAAQ,GAAR,CAAf;;AAGA;AACAkT,UAAQiJ,KAAR,GAAgBD,SAASC,KAAzB;;AAGA;;;;;;;AAOA,MAAIC,gBAAgBxZ,SAApB;;AAGA;;;;;;;;;AASA,MAAIyZ,WAAW;AACb7M,WAAmB,OADN;AAEbC,YAAmB,OAFN;AAGb6M,iBAAmB,MAHN;AAIbC,iBAAmB,OAJN;AAKbC,YAAmB,GALN;AAMbC,YAAmB,GANN;AAObC,YAAmB,GAPN;AAQbC,iBAAmB,qBAAStS,CAAT,EAAY;AAAE,aAAOA,CAAP;AAAW,KAR/B;AASbuS,iBAAmB,qBAASvS,CAAT,EAAY;AAAE,aAAOA,CAAP;AAAW,KAT/B;AAUbwS,iBAAmB,qBAASxS,CAAT,EAAY;AAAE,aAAOA,CAAP;AAAW,KAV/B;AAWbyS,cAAmB,IAXN;AAYbC,qBAAmB,IAZN;AAabC,gBAAmB,KAbN;AAcbC,qBAAmB,IAdN;AAebC,mBAAmB,GAfN,EAec;AAC3BC,kBAAmB,IAhBN,EAgBc;;AAE3BC,2BAAuBhB,aAlBV;AAmBbiB,uBAAuB,IAnBV,EAmBgB;AAC7BC,sBAAuB,KApBV;AAqBbC,wBAAuBnB,aArBV;;AAuBboB,eAAmB,SAvBN;AAwBbC,eAAmB,SAxBN;AAyBbC,aAAmB,KAzBN;AA0BbC,aAAmB,KA1BN;;AA4BbpS,WAAmB2H,QAAQiJ,KAAR,CAAcyB,GA5BpB;AA6BbC,aAAmB,KA7BN;AA8BbC,gBAAmB1B,aA9BN,EA8BqB;AAClC2B,qBAAmB3B,aA/BN;;AAiCb4B,eAAmB;AACjBC,YAAa,SADI;AAEjBC,cAAa,SAFI;AAGjBC,mBAAa,CAHI,CAGF;AAHE,KAjCN;;AAuCbC,oBAAmB;AAChBC,kBAAY,GADI;AAEhBC,gBAAY,GAFI;AAGhBC,gBAAY;AAHI,KAvCN;;AA6CbC,eAAYpC,aA7CC;AA8CbqC,eAAYrC,aA9CC;AA+CbsC,cAAYtC,aA/CC;AAgDbuC,cAAYvC,aAhDC;AAiDbwC,UAAYxC,aAjDC;AAkDbyC,UAAYzC,aAlDC;AAmDb0C,WAAY1C,aAnDC;AAoDb2C,UAAY3C,aApDC;AAqDb4C,UAAY5C,aArDC;AAsDb6C,WAAY7C,aAtDC;AAuDb8C,UAAY9C,aAvDC;AAwDb+C,UAAY/C,aAxDC;AAyDbgD,WAAYhD;AAzDC,GAAf;;AA6DA;AACA;AACA;;;AAGA;;;;;;;;;;;AAWA,WAASlJ,OAAT,CAAiBmM,SAAjB,EAA4B5J,IAA5B,EAAkCtI,OAAlC,EAA2C;AACzC,QAAI,EAAE,gBAAgB+F,OAAlB,CAAJ,EAAgC;AAC9B,YAAM,IAAIoM,WAAJ,CAAgB,kDAAhB,CAAN;AACD;;AAED;AACA,SAAKC,gBAAL,GAAwBF,SAAxB;;AAEA,SAAKG,SAAL,GAAiB,IAAjB,CARyC,CAQjB;AACxB,SAAKC,UAAL,GAAkB,IAAlB,CATyC,CASjB;;AAExB;AACA,SAAKC,MAAL;;AAEAxD,aAASyD,WAAT,CAAqBtD,QAArB,EAA+B,IAA/B;;AAEA;AACA,SAAKuD,IAAL,GAAYhd,SAAZ;AACA,SAAKid,IAAL,GAAYjd,SAAZ;AACA,SAAKkd,IAAL,GAAYld,SAAZ;AACA,SAAKmd,QAAL,GAAgBnd,SAAhB;AACA,SAAKod,SAAL,GAAiBpd,SAAjB;;AAEA;;AAEA;AACA,SAAKqT,UAAL,CAAgB9I,OAAhB;;AAEA;AACA,QAAIsI,IAAJ,EAAU;AACR,WAAK6F,OAAL,CAAa7F,IAAb;AACD;AACF;;AAED;AACAuG,UAAQ9I,QAAQgD,SAAhB;;AAEA;;;AAGAhD,UAAQgD,SAAR,CAAkB+J,SAAlB,GAA8B,YAAW;AACvC,SAAKze,KAAL,GAAa,IAAI+R,OAAJ,CACX,IAAI,KAAK2M,MAAL,CAAYC,KAAZ,EADO,EAEX,IAAI,KAAKC,MAAL,CAAYD,KAAZ,EAFO,EAGX,IAAI,KAAKE,MAAL,CAAYF,KAAZ,EAHO,CAAb;;AAMA;AACA,QAAI,KAAKlD,eAAT,EAA0B;AACxB,UAAI,KAAKzb,KAAL,CAAWmT,CAAX,GAAe,KAAKnT,KAAL,CAAWoT,CAA9B,EAAiC;AAC/B;AACA,aAAKpT,KAAL,CAAWoT,CAAX,GAAe,KAAKpT,KAAL,CAAWmT,CAA1B;AACD,OAHD,MAIK;AACH;AACA,aAAKnT,KAAL,CAAWmT,CAAX,GAAe,KAAKnT,KAAL,CAAWoT,CAA1B;AACD;AACF;;AAED;AACA,SAAKpT,KAAL,CAAW8e,CAAX,IAAgB,KAAKpD,aAArB;AACA;;AAEA;AACA,QAAI,KAAKqD,UAAL,KAAoB3d,SAAxB,EAAmC;AACjC,WAAKpB,KAAL,CAAWb,KAAX,GAAmB,IAAI,KAAK4f,UAAL,CAAgBJ,KAAhB,EAAvB;AACD;;AAED;AACA,QAAIzC,UAAU,KAAKwC,MAAL,CAAYM,MAAZ,KAAuB,KAAKhf,KAAL,CAAWmT,CAAhD;AACA,QAAIgJ,UAAU,KAAKyC,MAAL,CAAYI,MAAZ,KAAuB,KAAKhf,KAAL,CAAWoT,CAAhD;AACA,QAAI6L,UAAU,KAAKJ,MAAL,CAAYG,MAAZ,KAAuB,KAAKhf,KAAL,CAAW8e,CAAhD;AACA,SAAKI,MAAL,CAAYC,cAAZ,CAA2BjD,OAA3B,EAAoCC,OAApC,EAA6C8C,OAA7C;AACD,GAjCD;;AAoCA;;;;;;;AAOAvN,UAAQgD,SAAR,CAAkB0K,cAAlB,GAAmC,UAASC,OAAT,EAAkB;AACnD,QAAIC,cAAc,KAAKC,0BAAL,CAAgCF,OAAhC,CAAlB;AACA,WAAO,KAAKG,2BAAL,CAAiCF,WAAjC,CAAP;AACD,GAHD;;AAKA;;;;;;;;;AASA5N,UAAQgD,SAAR,CAAkB6K,0BAAlB,GAA+C,UAASF,OAAT,EAAkB;AAC/D,QAAII,iBAAiB,KAAKP,MAAL,CAAYQ,iBAAZ,EAArB;AAAA,QACEC,iBAAiB,KAAKT,MAAL,CAAYU,iBAAZ,EADnB;AAAA,QAEEC,KAAKR,QAAQlM,CAAR,GAAY,KAAKnT,KAAL,CAAWmT,CAF9B;AAAA,QAGE2M,KAAKT,QAAQjM,CAAR,GAAY,KAAKpT,KAAL,CAAWoT,CAH9B;AAAA,QAIE2M,KAAKV,QAAQP,CAAR,GAAY,KAAK9e,KAAL,CAAW8e,CAJ9B;AAAA,QAMEkB,KAAKP,eAAetM,CANtB;AAAA,QAOE8M,KAAKR,eAAerM,CAPtB;AAAA,QAQE8M,KAAKT,eAAeX,CARtB;;;AAUA;AACEqB,YAAQlgB,KAAKmgB,GAAL,CAAST,eAAexM,CAAxB,CAXV;AAAA,QAYEkN,QAAQpgB,KAAKqgB,GAAL,CAASX,eAAexM,CAAxB,CAZV;AAAA,QAaEoN,QAAQtgB,KAAKmgB,GAAL,CAAST,eAAevM,CAAxB,CAbV;AAAA,QAcEoN,QAAQvgB,KAAKqgB,GAAL,CAASX,eAAevM,CAAxB,CAdV;AAAA,QAeEqN,QAAQxgB,KAAKmgB,GAAL,CAAST,eAAeb,CAAxB,CAfV;AAAA,QAgBE4B,QAAQzgB,KAAKqgB,GAAL,CAASX,eAAeb,CAAxB,CAhBV;;;AAkBA;AACE6B,SAAKH,SAASC,SAASX,KAAKG,EAAd,IAAoBS,SAASb,KAAKG,EAAd,CAA7B,IAAkDO,SAASR,KAAKG,EAAd,CAnBzD;AAAA,QAoBEU,KAAKT,SAASK,SAAST,KAAKG,EAAd,IAAoBK,SAASE,SAASX,KAAKG,EAAd,IAAoBS,SAASb,KAAKG,EAAd,CAA7B,CAA7B,IAAgFK,SAASK,SAASZ,KAAKG,EAAd,IAAoBQ,SAASZ,KAAGG,EAAZ,CAA7B,CApBvF;AAAA,QAqBEa,KAAKR,SAASG,SAAST,KAAKG,EAAd,IAAoBK,SAASE,SAASX,KAAKG,EAAd,IAAoBS,SAASb,KAAKG,EAAd,CAA7B,CAA7B,IAAgFG,SAASO,SAASZ,KAAKG,EAAd,IAAoBQ,SAASZ,KAAGG,EAAZ,CAA7B,CArBvF;;AAuBA,WAAO,IAAIjO,OAAJ,CAAY4O,EAAZ,EAAgBC,EAAhB,EAAoBC,EAApB,CAAP;AACD,GAzBD;;AA2BA;;;;;;;;AAQAnP,UAAQgD,SAAR,CAAkB8K,2BAAlB,GAAgD,UAASF,WAAT,EAAsB;AACpE,QAAIwB,KAAK,KAAKC,GAAL,CAAS5N,CAAlB;AAAA,QACE6N,KAAK,KAAKD,GAAL,CAAS3N,CADhB;AAAA,QAEE6N,KAAK,KAAKF,GAAL,CAASjC,CAFhB;AAAA,QAGE6B,KAAKrB,YAAYnM,CAHnB;AAAA,QAIEyN,KAAKtB,YAAYlM,CAJnB;AAAA,QAKEyN,KAAKvB,YAAYR,CALnB;;AAOA;AACA,QAAIoC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAI,KAAK5F,eAAT,EAA0B;AACxB2F,WAAK,CAACP,KAAKG,EAAN,KAAaG,KAAKJ,EAAlB,CAAL;AACAM,WAAK,CAACP,KAAKI,EAAN,KAAaC,KAAKJ,EAAlB,CAAL;AACD,KAHD,MAIK;AACHK,WAAKP,KAAK,EAAEM,KAAK,KAAK/B,MAAL,CAAYkC,YAAZ,EAAP,CAAV;AACAD,WAAKP,KAAK,EAAEK,KAAK,KAAK/B,MAAL,CAAYkC,YAAZ,EAAP,CAAV;AACD;;AAED;AACA;AACA,WAAO,IAAItP,OAAJ,CACL,KAAKuP,cAAL,GAAsBH,KAAK,KAAKI,KAAL,CAAWC,MAAX,CAAkB5S,WADxC,EAEL,KAAK6S,cAAL,GAAsBL,KAAK,KAAKG,KAAL,CAAWC,MAAX,CAAkB5S,WAFxC,CAAP;AAGD,GAzBD;;AA4BA;;;AAGA+C,UAAQgD,SAAR,CAAkB+M,iBAAlB,GAAsC,UAASC,MAAT,EAAiBhK,IAAjB,EAAuB;AAC3D,QAAIA,SAAStW,SAAb,EAAwB;AACtBsW,aAAO,IAAP;AACD;;AAED,SAAK,IAAIpW,IAAI,CAAb,EAAgBA,IAAIogB,OAAOlgB,MAA3B,EAAmCF,GAAnC,EAAwC;AACtC,UAAIiS,QAAWmO,OAAOpgB,CAAP,CAAf;AACAiS,YAAMoO,KAAN,GAAe,KAAKpC,0BAAL,CAAgChM,MAAMA,KAAtC,CAAf;AACAA,YAAMqO,MAAN,GAAe,KAAKpC,2BAAL,CAAiCjM,MAAMoO,KAAvC,CAAf;;AAEA;AACA,UAAIE,cAAc,KAAKtC,0BAAL,CAAgChM,MAAMuO,MAAtC,CAAlB;AACAvO,YAAMwO,IAAN,GAAa,KAAKxG,eAAL,GAAuBsG,YAAYrgB,MAAZ,EAAvB,GAA8C,CAACqgB,YAAY/C,CAAxE;AACD;;AAED,QAAI,CAACpH,IAAL,EAAW;AACT;AACD;;AAED;AACA,QAAIsK,YAAY,SAAZA,SAAY,CAAU/gB,CAAV,EAAaC,CAAb,EAAgB;AAC9B,aAAOA,EAAE6gB,IAAF,GAAS9gB,EAAE8gB,IAAlB;AACD,KAFD;AAGAL,WAAOhK,IAAP,CAAYsK,SAAZ;AACD,GAxBD;;AA2BAtQ,UAAQgD,SAAR,CAAkBuN,eAAlB,GAAoC,UAAShO,IAAT,EAAe;AACjD,WAAOA,KAAKzS,MAAZ;AACD,GAFD;;AAKAkQ,UAAQgD,SAAR,CAAkBwN,kBAAlB,GAAuC,UAASjO,IAAT,EAAe;AACpD,QAAIkO,UAAU,CAAd;AACA,SAAK,IAAIC,MAAT,IAAmBnO,KAAK,CAAL,CAAnB,EAA4B;AAC1B,UAAIA,KAAK,CAAL,EAAQlT,cAAR,CAAuBqhB,MAAvB,CAAJ,EAAoC;AAClCD;AACD;AACF;AACD,WAAOA,OAAP;AACD,GARD;;AAWAzQ,UAAQgD,SAAR,CAAkB2N,iBAAlB,GAAsC,UAASpO,IAAT,EAAemO,MAAf,EAAuB;AAC3D,QAAIE,iBAAiB,EAArB;AACA,SAAK,IAAIhhB,IAAI,CAAb,EAAgBA,IAAI2S,KAAKzS,MAAzB,EAAiCF,GAAjC,EAAsC;AACpC,UAAIghB,eAAehgB,OAAf,CAAuB2R,KAAK3S,CAAL,EAAQ8gB,MAAR,CAAvB,KAA2C,CAAC,CAAhD,EAAmD;AACjDE,uBAAe/f,IAAf,CAAoB0R,KAAK3S,CAAL,EAAQ8gB,MAAR,CAApB;AACD;AACF;AACD,WAAOE,cAAP;AACD,GARD;;AAWA;;;;;AAKA5Q,UAAQgD,SAAR,CAAkB6N,cAAlB,GAAmC,UAAStO,IAAT,EAAcmO,MAAd,EAAsB;AACvD,QAAIzD,QAAS,IAAIlE,KAAJ,EAAb;;AAEA;AACA,SAAK,IAAInZ,IAAI,CAAb,EAAgBA,IAAI2S,KAAKzS,MAAzB,EAAiCF,GAAjC,EAAsC;AACpC,UAAIkL,OAAOyH,KAAK3S,CAAL,EAAQ8gB,MAAR,CAAX;AACAzD,YAAM6D,MAAN,CAAahW,IAAb;AACD;;AAED,WAAOmS,KAAP;AACD,GAVD;;AAaA;;;;;AAKAjN,UAAQgD,SAAR,CAAkB+N,gBAAlB,GAAqC,UAAUxO,IAAV,EAAgB;;AAEnD,QAAIyO,gBAAgB,KAAK3Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcgI,QAA7B,IACA,KAAK5Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OAD7B,IAEA,KAAK7Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAckI,QAF7B,IAGA,KAAK9Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcmI,OAHjD;;AAKA,QAAI,CAACJ,aAAL,EAAoB;AAClB,aADkB,CACR;AACX;;AAED;AACA,QAAI,KAAKnE,QAAL,KAAkBnd,SAAtB,EAAiC;AAC/B,YAAM,IAAIU,KAAJ,CAAU,2BACZ,mBADY,GAEZ,qBAFY,GAEY,KAAKiI,KAFjB,GAEyB,IAFnC,CAAN;AAID;;AAED;AACA;AACA,QAAIkK,KAAK,CAAL,EAAQ,KAAKsK,QAAb,MAA2Bnd,SAA/B,EAA0C;AACxC,YAAM,IAAIU,KAAJ,CAAU,2BACZ,WADY,GACE,KAAKyc,QADP,GACkB,KADlB,GAEZ,qBAFY,GAEY,KAAKxU,KAFjB,GAEyB,IAFnC,CAAN;AAID;AACF,GA3BD;;AA8BA;;;;;;;;;AASA2H,UAAQgD,SAAR,CAAkBqO,iBAAlB,GAAsC,UAAUpE,KAAV,EAAiBqE,UAAjB,EAA6BC,UAA7B,EAAyC;AAC7E,QAAID,eAAe5hB,SAAnB,EAA8B;AAC5Bud,YAAM9e,GAAN,GAAYmjB,UAAZ;AACD;;AAED,QAAIC,eAAe7hB,SAAnB,EAA8B;AAC5Bud,YAAM7e,GAAN,GAAYmjB,UAAZ;AACD;;AAED;AACA;AACA;AACA,QAAItE,MAAM7e,GAAN,IAAa6e,MAAM9e,GAAvB,EAA4B8e,MAAM7e,GAAN,GAAY6e,MAAM9e,GAAN,GAAY,CAAxB;AAC7B,GAbD;;AAgBA;;;;;;;AAOA6R,UAAQgD,SAAR,CAAkBwO,eAAlB,GAAoC,UAAUC,OAAV,EAAmBpZ,KAAnB,EAA0B;AAC5D,QAAI4L,KAAK,IAAT;;AAEA;AACA,QAAI,KAAK0E,OAAT,EAAkB;AAChB,WAAKA,OAAL,CAAapF,GAAb,CAAiB,GAAjB,EAAsB,KAAKmO,SAA3B;AACD;;AAED,QAAID,YAAY/hB,SAAhB,EACE;;AAEF,QAAIQ,MAAMC,OAAN,CAAcshB,OAAd,CAAJ,EAA4B;AAC1BA,gBAAU,IAAI5R,OAAJ,CAAY4R,OAAZ,CAAV;AACD;;AAED,QAAIlP,IAAJ;AACA,QAAIkP,mBAAmB5R,OAAnB,IAA8B4R,mBAAmB3R,QAArD,EAA+D;AAC7DyC,aAAOkP,QAAQ5M,GAAR,EAAP;AACD,KAFD,MAGK;AACH,YAAM,IAAIzU,KAAJ,CAAU,sCAAV,CAAN;AACD;;AAED,QAAImS,KAAKzS,MAAL,IAAe,CAAnB,EACE;;AAEF,SAAK6Y,OAAL,GAAe8I,OAAf;AACA,SAAKnF,SAAL,GAAiB/J,IAAjB;;AAEA;AACA,SAAKmP,SAAL,GAAiB,YAAY;AAC3BzN,SAAGmE,OAAH,CAAWnE,GAAG0E,OAAd;AACD,KAFD;AAGA,SAAKA,OAAL,CAAavF,EAAb,CAAgB,GAAhB,EAAqB,KAAKsO,SAA1B;;AAEA;AACA,SAAKhF,IAAL,GAAY,GAAZ;AACA,SAAKC,IAAL,GAAY,GAAZ;AACA,SAAKC,IAAL,GAAY,GAAZ;;AAGA,QAAI+E,WAAW,KAAKtZ,KAAL,IAAc2H,QAAQiJ,KAAR,CAAc2I,GAA5B,IACb,KAAKvZ,KAAL,IAAc2H,QAAQiJ,KAAR,CAAcgI,QADf,IAEb,KAAK5Y,KAAL,IAAc2H,QAAQiJ,KAAR,CAAciI,OAF9B;;AAIA;AACA,QAAIS,QAAJ,EAAc;AACZ,UAAI,KAAKE,gBAAL,KAA0BniB,SAA9B,EAAyC;AACvC,aAAK4b,SAAL,GAAiB,KAAKuG,gBAAtB;AACD,OAFD,MAGK;AACH,YAAIC,QAAQ,KAAKnB,iBAAL,CAAuBpO,IAAvB,EAA4B,KAAKmK,IAAjC,CAAZ;AACA,aAAKpB,SAAL,GAAkBwG,MAAM,CAAN,IAAWA,MAAM,CAAN,CAAZ,IAAyB,CAA1C;AACD;;AAED,UAAI,KAAKC,gBAAL,KAA0BriB,SAA9B,EAAyC;AACvC,aAAK6b,SAAL,GAAiB,KAAKwG,gBAAtB;AACD,OAFD,MAGK;AACH,YAAIC,QAAQ,KAAKrB,iBAAL,CAAuBpO,IAAvB,EAA4B,KAAKoK,IAAjC,CAAZ;AACA,aAAKpB,SAAL,GAAkByG,MAAM,CAAN,IAAWA,MAAM,CAAN,CAAZ,IAAyB,CAA1C;AACD;AACF;;AAED;AACA,QAAIC,WAAW,CAAf;;AAEA,QAAIjF,SAAS,KAAK6D,cAAL,CAAoBtO,IAApB,EAA0B,KAAKmK,IAA/B,CAAb;AACA,QAAIiF,QAAJ,EAAc;AACZ3E,aAAOkF,MAAP,CAAc,KAAK5G,SAAL,GAAiB,CAA/B;AACD;AACD,SAAK+F,iBAAL,CAAuBrE,MAAvB,EAA+B,KAAKmF,WAApC,EAAiD,KAAKC,WAAtD;AACA,SAAKpF,MAAL,GAAcA,MAAd;AACA,SAAKpB,KAAL,GAAc,KAAKyG,YAAL,KAAsB3iB,SAAvB,GAAoC,KAAK2iB,YAAzC,GAAwDrF,OAAOC,KAAP,KAAegF,QAApF;;AAEA,QAAI/E,SAAS,KAAK2D,cAAL,CAAoBtO,IAApB,EAA0B,KAAKoK,IAA/B,CAAb;AACA,QAAIgF,QAAJ,EAAc;AACZzE,aAAOgF,MAAP,CAAc,KAAK3G,SAAL,GAAiB,CAA/B;AACD;AACD,SAAK8F,iBAAL,CAAuBnE,MAAvB,EAA+B,KAAKoF,WAApC,EAAiD,KAAKC,WAAtD;AACA,SAAKrF,MAAL,GAAcA,MAAd;AACA,SAAKnB,KAAL,GAAc,KAAKyG,YAAL,KAAsB9iB,SAAvB,GAAoC,KAAK8iB,YAAzC,GAAwDtF,OAAOD,KAAP,KAAegF,QAApF;;AAEA,QAAI9E,SAAS,KAAK0D,cAAL,CAAoBtO,IAApB,EAA0B,KAAKqK,IAA/B,CAAb;AACA,SAAKyE,iBAAL,CAAuBlE,MAAvB,EAA+B,KAAKsF,WAApC,EAAiD,KAAKC,WAAtD;AACA,SAAKvF,MAAL,GAAcA,MAAd;AACA,SAAKjB,KAAL,GAAc,KAAKyG,YAAL,KAAsBjjB,SAAvB,GAAoC,KAAKijB,YAAzC,GAAwDxF,OAAOF,KAAP,KAAegF,QAApF;;AAEA,QAAI1P,KAAK,CAAL,EAAQlT,cAAR,CAAuB,OAAvB,CAAJ,EAAqC;AACnC,WAAKwd,QAAL,GAAgB,OAAhB;AACA,UAAIQ,aAAa,KAAKwD,cAAL,CAAoBtO,IAApB,EAAyB,KAAKsK,QAA9B,CAAjB;AACA,WAAKwE,iBAAL,CAAuBhE,UAAvB,EAAmC,KAAKuF,eAAxC,EAAyD,KAAKC,eAA9D;AACA,WAAKxF,UAAL,GAAkBA,UAAlB;AACD;;AAGD;AACA;AACA,QAAI9K,KAAK,CAAL,EAAQlT,cAAR,CAAuB,QAAvB,CAAJ,EAAsC;AACpC;AACA,WAAKyd,SAAL,GAAiB,QAAjB;;AAEA,UAAI,KAAKgG,UAAL,KAAoBpjB,SAAxB,EAAmC;AACjC,aAAKojB,UAAL,GAAkB,IAAI3S,MAAJ,CAAWsR,OAAX,EAAoB,KAAK3E,SAAzB,EAAoC,IAApC,CAAlB;AACA,aAAKgG,UAAL,CAAgBC,iBAAhB,CAAkC,YAAW;AAAC9O,aAAG+O,MAAH;AAAa,SAA3D;AACD;AACF;;AAGD;AACA,SAAKjG,SAAL;AACD,GA/GD;;AAmHA;;;;;;;AAOA/M,UAAQgD,SAAR,CAAkBiQ,cAAlB,GAAmC,UAAU1Q,IAAV,EAAgB;AACjD;AACA;AACA,QAAId,CAAJ,EAAOC,CAAP,EAAU9R,CAAV,EAAawd,CAAb,EAAgBje,GAAhB,EAAqB0S,KAArB;;AAEA,QAAI0K,aAAa,EAAjB;;AAEA,QAAI,KAAKlU,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciK,IAA7B,IACF,KAAK7a,KAAL,KAAe2H,QAAQiJ,KAAR,CAAckK,OAD/B,EACwC;AACtC;AACA;;AAEA;AACA,UAAIrB,QAAQ,EAAZ;AACA,UAAIE,QAAQ,EAAZ;AACA,WAAKpiB,IAAI,CAAT,EAAYA,IAAI,KAAK2gB,eAAL,CAAqBhO,IAArB,CAAhB,EAA4C3S,GAA5C,EAAiD;AAC/C6R,YAAIc,KAAK3S,CAAL,EAAQ,KAAK8c,IAAb,KAAsB,CAA1B;AACAhL,YAAIa,KAAK3S,CAAL,EAAQ,KAAK+c,IAAb,KAAsB,CAA1B;;AAEA,YAAImF,MAAMlhB,OAAN,CAAc6Q,CAAd,MAAqB,CAAC,CAA1B,EAA6B;AAC3BqQ,gBAAMjhB,IAAN,CAAW4Q,CAAX;AACD;AACD,YAAIuQ,MAAMphB,OAAN,CAAc8Q,CAAd,MAAqB,CAAC,CAA1B,EAA6B;AAC3BsQ,gBAAMnhB,IAAN,CAAW6Q,CAAX;AACD;AACF;;AAED,UAAI0R,aAAa,SAAbA,UAAa,CAAU7jB,CAAV,EAAaC,CAAb,EAAgB;AAC/B,eAAOD,IAAIC,CAAX;AACD,OAFD;AAGAsiB,YAAM9L,IAAN,CAAWoN,UAAX;AACApB,YAAMhM,IAAN,CAAWoN,UAAX;;AAEA;AACA,UAAIC,aAAa,EAAjB,CA1BsC,CA0Bf;AACvB,WAAKzjB,IAAI,CAAT,EAAYA,IAAI2S,KAAKzS,MAArB,EAA6BF,GAA7B,EAAkC;AAChC6R,YAAIc,KAAK3S,CAAL,EAAQ,KAAK8c,IAAb,KAAsB,CAA1B;AACAhL,YAAIa,KAAK3S,CAAL,EAAQ,KAAK+c,IAAb,KAAsB,CAA1B;AACAS,YAAI7K,KAAK3S,CAAL,EAAQ,KAAKgd,IAAb,KAAsB,CAA1B;;AAEA;AACA,YAAI0G,SAASxB,MAAMlhB,OAAN,CAAc6Q,CAAd,CAAb;AACA,YAAI8R,SAASvB,MAAMphB,OAAN,CAAc8Q,CAAd,CAAb;;AAEA,YAAI2R,WAAWC,MAAX,MAAuB5jB,SAA3B,EAAsC;AACpC2jB,qBAAWC,MAAX,IAAqB,EAArB;AACD;;AAED,YAAI3F,UAAU,IAAItN,OAAJ,EAAd;AACAsN,gBAAQlM,CAAR,GAAYA,CAAZ;AACAkM,gBAAQjM,CAAR,GAAYA,CAAZ;AACAiM,gBAAQP,CAAR,GAAYA,CAAZ;AACAO,gBAAQpL,IAAR,GAAeA,KAAK3S,CAAL,CAAf;;AAEAT,cAAM,EAAN;AACAA,YAAI0S,KAAJ,GAAY8L,OAAZ;AACAxe,YAAI8gB,KAAJ,GAAYvgB,SAAZ;AACAP,YAAI+gB,MAAJ,GAAaxgB,SAAb;AACAP,YAAIihB,MAAJ,GAAa,IAAI/P,OAAJ,CAAYoB,CAAZ,EAAeC,CAAf,EAAkB,KAAKyL,MAAL,CAAYhf,GAA9B,CAAb;;AAEAklB,mBAAWC,MAAX,EAAmBC,MAAnB,IAA6BpkB,GAA7B;;AAEAod,mBAAW1b,IAAX,CAAgB1B,GAAhB;AACD;;AAED;AACA,WAAKsS,IAAI,CAAT,EAAYA,IAAI4R,WAAWvjB,MAA3B,EAAmC2R,GAAnC,EAAwC;AACtC,aAAKC,IAAI,CAAT,EAAYA,IAAI2R,WAAW5R,CAAX,EAAc3R,MAA9B,EAAsC4R,GAAtC,EAA2C;AACzC,cAAI2R,WAAW5R,CAAX,EAAcC,CAAd,CAAJ,EAAsB;AACpB2R,uBAAW5R,CAAX,EAAcC,CAAd,EAAiB8R,UAAjB,GAA+B/R,IAAI4R,WAAWvjB,MAAX,GAAkB,CAAvB,GAA4BujB,WAAW5R,IAAE,CAAb,EAAgBC,CAAhB,CAA5B,GAAiDhS,SAA/E;AACA2jB,uBAAW5R,CAAX,EAAcC,CAAd,EAAiB+R,QAAjB,GAA+B/R,IAAI2R,WAAW5R,CAAX,EAAc3R,MAAd,GAAqB,CAA1B,GAA+BujB,WAAW5R,CAAX,EAAcC,IAAE,CAAhB,CAA/B,GAAoDhS,SAAlF;AACA2jB,uBAAW5R,CAAX,EAAcC,CAAd,EAAiBgS,UAAjB,GACGjS,IAAI4R,WAAWvjB,MAAX,GAAkB,CAAtB,IAA2B4R,IAAI2R,WAAW5R,CAAX,EAAc3R,MAAd,GAAqB,CAArD,GACEujB,WAAW5R,IAAE,CAAb,EAAgBC,IAAE,CAAlB,CADF,GAEEhS,SAHJ;AAID;AACF;AACF;AACF,KAvED,MAwEK;AAAG;AACN,WAAKqhB,gBAAL,CAAsBxO,IAAtB;;AAEA;AACA,WAAK3S,IAAI,CAAT,EAAYA,IAAI2S,KAAKzS,MAArB,EAA6BF,GAA7B,EAAkC;AAChCiS,gBAAQ,IAAIxB,OAAJ,EAAR;AACAwB,cAAMJ,CAAN,GAAUc,KAAK3S,CAAL,EAAQ,KAAK8c,IAAb,KAAsB,CAAhC;AACA7K,cAAMH,CAAN,GAAUa,KAAK3S,CAAL,EAAQ,KAAK+c,IAAb,KAAsB,CAAhC;AACA9K,cAAMuL,CAAN,GAAU7K,KAAK3S,CAAL,EAAQ,KAAKgd,IAAb,KAAsB,CAAhC;AACA/K,cAAMU,IAAN,GAAaA,KAAK3S,CAAL,CAAb;;AAEA,YAAI,KAAKid,QAAL,KAAkBnd,SAAtB,EAAiC;AAC/BmS,gBAAMpU,KAAN,GAAc8U,KAAK3S,CAAL,EAAQ,KAAKid,QAAb,KAA0B,CAAxC;AACD;;AAED1d,cAAM,EAAN;AACAA,YAAI0S,KAAJ,GAAYA,KAAZ;AACA1S,YAAIihB,MAAJ,GAAa,IAAI/P,OAAJ,CAAYwB,MAAMJ,CAAlB,EAAqBI,MAAMH,CAA3B,EAA8B,KAAKyL,MAAL,CAAYhf,GAA1C,CAAb;AACAgB,YAAI8gB,KAAJ,GAAYvgB,SAAZ;AACAP,YAAI+gB,MAAJ,GAAaxgB,SAAb;;AAEA,YAAI,KAAK2I,KAAL,KAAe2H,QAAQiJ,KAAR,CAAc0K,IAAjC,EAAuC;AACrC,cAAI/jB,IAAI,CAAR,EAAW;AACT;AACA2c,uBAAW3c,IAAI,CAAf,EAAkBgkB,SAAlB,GAA8BzkB,GAA9B;AACD;AACF;;AAEDod,mBAAW1b,IAAX,CAAgB1B,GAAhB;AACD;AACF;;AAED,WAAOod,UAAP;AACD,GAhHD;;AAkHA;;;;;;;AAOAvM,UAAQgD,SAAR,CAAkBwJ,MAAlB,GAA2B,YAAY;AACrC;AACA,WAAO,KAAKH,gBAAL,CAAsBte,aAAtB,EAAP,EAA8C;AAC5C,WAAKse,gBAAL,CAAsBpe,WAAtB,CAAkC,KAAKoe,gBAAL,CAAsBre,UAAxD;AACD;;AAED,SAAK4hB,KAAL,GAAaxT,SAASC,aAAT,CAAuB,KAAvB,CAAb;AACA,SAAKuT,KAAL,CAAWvX,KAAX,CAAiBoE,QAAjB,GAA4B,UAA5B;AACA,SAAKmT,KAAL,CAAWvX,KAAX,CAAiBsE,QAAjB,GAA4B,QAA5B;;AAEA;AACA,SAAKiT,KAAL,CAAWC,MAAX,GAAoBzT,SAASC,aAAT,CAAwB,QAAxB,CAApB;AACA,SAAKuT,KAAL,CAAWC,MAAX,CAAkBxX,KAAlB,CAAwBoE,QAAxB,GAAmC,UAAnC;AACA,SAAKmT,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWC,MAAlC;AACA;AACA;AACE,UAAIgE,WAAWzX,SAASC,aAAT,CAAwB,KAAxB,CAAf;AACAwX,eAASxb,KAAT,CAAetC,KAAf,GAAuB,KAAvB;AACA8d,eAASxb,KAAT,CAAeyb,UAAf,GAA6B,MAA7B;AACAD,eAASxb,KAAT,CAAe0b,OAAf,GAA0B,MAA1B;AACAF,eAASG,SAAT,GAAsB,kDAAtB;AACA,WAAKpE,KAAL,CAAWC,MAAX,CAAkBjT,WAAlB,CAA8BiX,QAA9B;AACD;;AAED,SAAKjE,KAAL,CAAWpM,MAAX,GAAoBpH,SAASC,aAAT,CAAwB,KAAxB,CAApB;AACA,SAAKuT,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwBoE,QAAxB,GAAmC,UAAnC;AACA,SAAKmT,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwB+X,MAAxB,GAAiC,KAAjC;AACA,SAAKR,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwBpG,IAAxB,GAA+B,KAA/B;AACA,SAAK2d,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwBiE,KAAxB,GAAgC,MAAhC;AACA,SAAKsT,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWpM,MAAlC;;AAEA;AACA,QAAIS,KAAK,IAAT;AACA,QAAIgQ,cAAc,SAAdA,WAAc,CAAU9f,KAAV,EAAiB;AAAC8P,SAAGiQ,YAAH,CAAgB/f,KAAhB;AAAwB,KAA5D;AACA,QAAIggB,eAAe,SAAfA,YAAe,CAAUhgB,KAAV,EAAiB;AAAC8P,SAAGmQ,aAAH,CAAiBjgB,KAAjB;AAAyB,KAA9D;AACA,QAAIkgB,eAAe,SAAfA,YAAe,CAAUlgB,KAAV,EAAiB;AAAC8P,SAAGqQ,QAAH,CAAYngB,KAAZ;AAAoB,KAAzD;AACA,QAAIogB,YAAY,SAAZA,SAAY,CAAUpgB,KAAV,EAAiB;AAAC8P,SAAGuQ,UAAH,CAAcrgB,KAAd;AAAsB,KAAxD;AACA,QAAIsgB,UAAU,SAAVA,OAAU,CAAStgB,KAAT,EAAgB;AAAC8P,SAAGyQ,QAAH,CAAYvgB,KAAZ;AAAoB,KAAnD;AACA;;AAEAtH,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,SAAzC,EAAoD8E,SAApD;AACA9nB,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,WAAzC,EAAsDoE,WAAtD;AACApnB,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,YAAzC,EAAuDsE,YAAvD;AACAtnB,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,YAAzC,EAAuDwE,YAAvD;AACAxnB,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,WAAzC,EAAsD0E,SAAtD;AACA1nB,SAAK2G,gBAAL,CAAsB,KAAKoc,KAAL,CAAWC,MAAjC,EAAyC,OAAzC,EAAkD4E,OAAlD;;AAEA;AACA,SAAKpI,gBAAL,CAAsBzP,WAAtB,CAAkC,KAAKgT,KAAvC;AACD,GAjDD;;AAoDA;;;AAGA5P,UAAQgD,SAAR,CAAkB4R,QAAlB,GAA6B,UAAStY,KAAT,EAAgBC,MAAhB,EAAwB;AACnD,SAAKqT,KAAL,CAAWvX,KAAX,CAAiBiE,KAAjB,GAAyBA,KAAzB;AACA,SAAKsT,KAAL,CAAWvX,KAAX,CAAiBkE,MAAjB,GAA0BA,MAA1B;;AAEA,SAAKsY,aAAL;AACD,GALD;;AAQA;;;AAGA7U,UAAQgD,SAAR,CAAkB6R,aAAlB,GAAkC,YAAW;AAC3C,SAAKjF,KAAL,CAAWC,MAAX,CAAkBxX,KAAlB,CAAwBiE,KAAxB,GAAgC,MAAhC;AACA,SAAKsT,KAAL,CAAWC,MAAX,CAAkBxX,KAAlB,CAAwBkE,MAAxB,GAAiC,MAAjC;;AAEA,SAAKqT,KAAL,CAAWC,MAAX,CAAkBvT,KAAlB,GAA0B,KAAKsT,KAAL,CAAWC,MAAX,CAAkB5S,WAA5C;AACA,SAAK2S,KAAL,CAAWC,MAAX,CAAkBtT,MAAlB,GAA2B,KAAKqT,KAAL,CAAWC,MAAX,CAAkBiF,YAA7C;;AAEA;AACA,SAAKlF,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwBiE,KAAxB,GAAiC,KAAKsT,KAAL,CAAWC,MAAX,CAAkB5S,WAAlB,GAAgC,IAAI,EAArC,GAA2C,IAA3E;AACD,GATD;;AAWA;;;AAGA+C,UAAQgD,SAAR,CAAkB+R,cAAlB,GAAmC,YAAW;AAC5C,QAAI,CAAC,KAAKnF,KAAL,CAAWpM,MAAZ,IAAsB,CAAC,KAAKoM,KAAL,CAAWpM,MAAX,CAAkBwR,MAA7C,EACE,MAAM,IAAI5kB,KAAJ,CAAU,wBAAV,CAAN;;AAEF,SAAKwf,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,CAAyBC,IAAzB;AACD,GALD;;AAQA;;;AAGAjV,UAAQgD,SAAR,CAAkBkS,aAAlB,GAAkC,YAAW;AAC3C,QAAI,CAAC,KAAKtF,KAAL,CAAWpM,MAAZ,IAAsB,CAAC,KAAKoM,KAAL,CAAWpM,MAAX,CAAkBwR,MAA7C,EAAqD;;AAErD,SAAKpF,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,CAAyBG,IAAzB;AACD,GAJD;;AAOA;;;;;;AAMAnV,UAAQgD,SAAR,CAAkBoS,aAAlB,GAAkC,YAAW;AAC3C;AACA,QAAI,KAAK5K,OAAL,CAAa6K,MAAb,CAAoB,KAAK7K,OAAL,CAAa1a,MAAb,GAAoB,CAAxC,MAA+C,GAAnD,EAAwD;AACtD,WAAK6f,cAAL,GACE2F,WAAW,KAAK9K,OAAhB,IAA2B,GAA3B,GACE,KAAKoF,KAAL,CAAWC,MAAX,CAAkB5S,WAFtB;AAGD,KAJD,MAKK;AACH,WAAK0S,cAAL,GAAsB2F,WAAW,KAAK9K,OAAhB,CAAtB,CADG,CAC6C;AACjD;;AAED;AACA,QAAI,KAAKC,OAAL,CAAa4K,MAAb,CAAoB,KAAK5K,OAAL,CAAa3a,MAAb,GAAoB,CAAxC,MAA+C,GAAnD,EAAwD;AACtD,WAAKggB,cAAL,GACEwF,WAAW,KAAK7K,OAAhB,IAA2B,GAA3B,IACG,KAAKmF,KAAL,CAAWC,MAAX,CAAkBiF,YAAlB,GAAiC,KAAKlF,KAAL,CAAWpM,MAAX,CAAkBsR,YADtD,CADF;AAGD,KAJD,MAKK;AACH,WAAKhF,cAAL,GAAsBwF,WAAW,KAAK7K,OAAhB,CAAtB,CADG,CAC6C;AACjD;AACF,GApBD;;AAwBA;;;;;;AAMAzK,UAAQgD,SAAR,CAAkBuS,iBAAlB,GAAsC,YAAW;AAC/C,QAAIC,MAAM,KAAKhI,MAAL,CAAYiI,cAAZ,EAAV;AACAD,QAAInK,QAAJ,GAAe,KAAKmC,MAAL,CAAYkC,YAAZ,EAAf;AACA,WAAO8F,GAAP;AACD,GAJD;;AAMA;;;AAGAxV,UAAQgD,SAAR,CAAkB0S,SAAlB,GAA8B,UAASnT,IAAT,EAAe;AAC3C;AACA,SAAKiP,eAAL,CAAqBjP,IAArB,EAA2B,KAAKlK,KAAhC;;AAGA,QAAI,KAAKya,UAAT,EAAqB;AACnB;AACA,WAAKvG,UAAL,GAAkB,KAAKuG,UAAL,CAAgBG,cAAhB,EAAlB;AACD,KAHD,MAIK;AACH;AACA,WAAK1G,UAAL,GAAkB,KAAK0G,cAAL,CAAoB,KAAK3G,SAAzB,CAAlB;AACD;;AAED;AACA,SAAKqJ,aAAL;AACD,GAhBD;;AAkBA;;;;;AAKA3V,UAAQgD,SAAR,CAAkBoF,OAAlB,GAA4B,UAAU7F,IAAV,EAAgB;AAC1C,SAAKmT,SAAL,CAAenT,IAAf;AACA,SAAKyQ,MAAL;;AAEA;AACA,QAAI,KAAK3I,kBAAL,IAA2B,KAAKyI,UAApC,EAAgD;AAC9C,WAAKiC,cAAL;AACD;AACF,GARD;;AAUA;;;;;AAKA/U,UAAQgD,SAAR,CAAkBD,UAAlB,GAA+B,UAAU9I,OAAV,EAAmB;AAChD,QAAIiR,iBAAiBxb,SAArB;;AAEA,SAAKwlB,aAAL;;AAEAlM,aAASjG,UAAT,CAAoB9I,OAApB,EAA6B,IAA7B;;AAEA,SAAK2b,qBAAL;AACA,SAAKhB,QAAL,CAAc,KAAKtY,KAAnB,EAA0B,KAAKC,MAA/B;;AAEA;AACA,QAAI,KAAK+P,SAAT,EAAoB;AAClB,WAAKlE,OAAL,CAAa,KAAKkE,SAAlB;AACD;;AAED;AACA,QAAI,KAAKjC,kBAAL,IAA2B,KAAKyI,UAApC,EAAgD;AAC9C,WAAKiC,cAAL;AACD;AACF,GAnBD;;AAsBA;;;AAGA/U,UAAQgD,SAAR,CAAkB4S,qBAAlB,GAA0C,YAAW;AACnD,QAAIhO,SAASlY,SAAb;;AAEA,YAAQ,KAAK2I,KAAb;AACE,WAAK2H,QAAQiJ,KAAR,CAAc2I,GAAnB;AACEhK,iBAAS5H,QAAQgD,SAAR,CAAkB6S,oBAA3B;AACA;AACF,WAAK7V,QAAQiJ,KAAR,CAAcgI,QAAnB;AACErJ,iBAAS5H,QAAQgD,SAAR,CAAkB8S,yBAA3B;AACA;AACF,WAAK9V,QAAQiJ,KAAR,CAAciI,OAAnB;AACEtJ,iBAAS5H,QAAQgD,SAAR,CAAkB+S,wBAA3B;AACA;AACF,WAAK/V,QAAQiJ,KAAR,CAAcyB,GAAnB;AACE9C,iBAAS5H,QAAQgD,SAAR,CAAkBgT,oBAA3B;AACA;AACF,WAAKhW,QAAQiJ,KAAR,CAAcgN,OAAnB;AACErO,iBAAS5H,QAAQgD,SAAR,CAAkBkT,wBAA3B;AACA;AACF,WAAKlW,QAAQiJ,KAAR,CAAckI,QAAnB;AACEvJ,iBAAS5H,QAAQgD,SAAR,CAAkBmT,yBAA3B;AACA;AACF,WAAKnW,QAAQiJ,KAAR,CAAcmI,OAAnB;AACExJ,iBAAS5H,QAAQgD,SAAR,CAAkBoT,wBAA3B;AACA;AACF,WAAKpW,QAAQiJ,KAAR,CAAckK,OAAnB;AACEvL,iBAAS5H,QAAQgD,SAAR,CAAkBqT,wBAA3B;AACA;AACF,WAAKrW,QAAQiJ,KAAR,CAAciK,IAAnB;AACEtL,iBAAS5H,QAAQgD,SAAR,CAAkBsT,qBAA3B;AACA;AACF,WAAKtW,QAAQiJ,KAAR,CAAc0K,IAAnB;AACE/L,iBAAS5H,QAAQgD,SAAR,CAAkBuT,qBAA3B;AACA;AACF;AACE,cAAM,IAAInmB,KAAJ,CAAU,4CACA,oBADA,GACuB,KAAKiI,KAD5B,GACoC,IAD9C,CAAN;AAEA;AAlCJ;;AAqCA,SAAKme,mBAAL,GAA2B5O,MAA3B;AACD,GAzCD;;AA4CA;;;AAGA5H,UAAQgD,SAAR,CAAkBgQ,MAAlB,GAA2B,YAAW;AACpC,QAAI,KAAKzG,UAAL,KAAoB7c,SAAxB,EAAmC;AACjC,YAAM,IAAIU,KAAJ,CAAU,4BAAV,CAAN;AACD;;AAED,SAAKykB,aAAL;AACA,SAAKO,aAAL;AACA,SAAKqB,aAAL;AACA,SAAKC,YAAL;AACA,SAAKC,WAAL;;AAEA,SAAKC,gBAAL;;AAEA,SAAKC,WAAL;AACA,SAAKC,aAAL;AACD,GAfD;;AAkBA;;;AAGA9W,UAAQgD,SAAR,CAAkB+T,WAAlB,GAAgC,YAAW;AACzC,QAAIlH,SAAS,KAAKD,KAAL,CAAWC,MAAxB;AACA,QAAImH,MAAMnH,OAAOoH,UAAP,CAAkB,IAAlB,CAAV;;AAEAD,QAAIE,QAAJ,GAAe,OAAf;AACAF,QAAIG,OAAJ,GAAe,OAAf;;AAEA,WAAOH,GAAP;AACD,GARD;;AAWA;;;AAGAhX,UAAQgD,SAAR,CAAkB0T,YAAlB,GAAiC,YAAW;AAC1C,QAAI7G,SAAS,KAAKD,KAAL,CAAWC,MAAxB;AACA,QAAImH,MAAMnH,OAAOoH,UAAP,CAAkB,IAAlB,CAAV;;AAEAD,QAAII,SAAJ,CAAc,CAAd,EAAiB,CAAjB,EAAoBvH,OAAOvT,KAA3B,EAAkCuT,OAAOtT,MAAzC;AACD,GALD;;AAQAyD,UAAQgD,SAAR,CAAkBqU,QAAlB,GAA6B,YAAW;AACtC,WAAO,KAAKzH,KAAL,CAAW3S,WAAX,GAAyB,KAAKgN,YAArC;AACD,GAFD;;AAKA;;;AAGAjK,UAAQgD,SAAR,CAAkBsU,eAAlB,GAAoC,YAAW;AAC7C,QAAIhb,KAAJ;;AAEA,QAAI,KAAKjE,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcmI,OAAjC,EAA0C;AACxC,UAAImG,UAAU,KAAKF,QAAL,EAAd;AACA/a,cAASib,UAAU,CAAV,GAAcA,UAAU,CAAjC;AACD,KAHD,MAGO,IAAI,KAAKlf,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OAAjC,EAA0C;AAC/C5U,cAAQ,KAAKgP,SAAb;AACD,KAFM,MAEA;AACLhP,cAAQ,EAAR;AACD;AACD,WAAOA,KAAP;AACD,GAZD;;AAeA;;;AAGA0D,UAAQgD,SAAR,CAAkB8T,aAAlB,GAAkC,YAAW;;AAE3C;AACA,QAAI,KAAKlM,UAAL,KAAoB,IAAxB,EAA8B;AAC5B;AACD;;AAED;AACA,QAAI,KAAKvS,KAAL,KAAe2H,QAAQiJ,KAAR,CAAc0K,IAA7B,IACA,KAAKtb,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OADjC,CACyC;AADzC,MAEC;AACC;AACD;;AAED;AACA,QAAIsG,eAAgB,KAAKnf,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OAA7B,IACA,KAAK7Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcmI,OADjD;;AAGA;AACA,QAAIqG,gBAAiB,KAAKpf,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcmI,OAA7B,IACF,KAAK/Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAckI,QAD3B,IAEF,KAAK9Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcgI,QAFhD;;AAIA,QAAI1U,SAAShO,KAAKH,GAAL,CAAS,KAAKwhB,KAAL,CAAWkF,YAAX,GAA0B,IAAnC,EAAyC,GAAzC,CAAb;AACA,QAAIziB,MAAS,KAAKqlB,MAAlB;AACA,QAAIpb,QAAS,KAAKgb,eAAL,EAAb,CAzB2C,CAyBL;AACtC,QAAInlB,QAAS,KAAKyd,KAAL,CAAW3S,WAAX,GAAyB,KAAKya,MAA3C;AACA,QAAIzlB,OAASE,QAAQmK,KAArB;AACA,QAAI8T,SAAS/d,MAAMkK,MAAnB;;AAEA,QAAIya,MAAM,KAAKD,WAAL,EAAV;AACAC,QAAIW,SAAJ,GAAgB,CAAhB;AACAX,QAAIY,IAAJ,GAAW,YAAX,CAhC2C,CAgClB;;AAEzB,QAAIJ,iBAAiB,KAArB,EAA4B;AAC1B;AACA,UAAIK,OAAO,CAAX;AACA,UAAIC,OAAOvb,MAAX,CAH0B,CAGP;AACnB,UAAImF,CAAJ;;AAEA,WAAKA,IAAImW,IAAT,EAAenW,IAAIoW,IAAnB,EAAyBpW,GAAzB,EAA8B;AAC5B,YAAI3I,IAAI,CAAC2I,IAAImW,IAAL,KAAcC,OAAOD,IAArB,CAAR;AACA,YAAI7f,MAAMe,IAAI,GAAd;AACA,YAAIhD,QAAQ,KAAKgiB,QAAL,CAAc/f,GAAd,EAAmB,CAAnB,EAAsB,CAAtB,CAAZ;;AAEAgf,YAAIgB,WAAJ,GAAkBjiB,KAAlB;AACAihB,YAAIiB,SAAJ;AACAjB,YAAIkB,MAAJ,CAAWjmB,IAAX,EAAiBI,MAAMqP,CAAvB;AACAsV,YAAImB,MAAJ,CAAWhmB,KAAX,EAAkBE,MAAMqP,CAAxB;AACAsV,YAAIhM,MAAJ;AACD;AACDgM,UAAIgB,WAAJ,GAAmB,KAAK1N,SAAxB;AACA0M,UAAIoB,UAAJ,CAAenmB,IAAf,EAAqBI,GAArB,EAA0BiK,KAA1B,EAAiCC,MAAjC;AAED,KApBD,MAoBO;;AAEL;AACA,UAAK8b,QAAL;AACA,UAAI,KAAKhgB,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcmI,OAAjC,EAA0C;AACxC,YAAImG,UAAU,KAAKF,QAAL,EAAd;AACAgB,mBAAWd,UAAU,CAArB,CAFwC,CAEhB;AACzB,OAHD,MAGO,IAAI,KAAKlf,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OAAjC,EAA0C;AAC/C;AACD;AACD8F,UAAIgB,WAAJ,GAAmB,KAAK1N,SAAxB;AACA0M,UAAIsB,SAAJ,GAAiB,KAAKxN,SAAL,CAAeC,IAAhC;AACAiM,UAAIiB,SAAJ;AACAjB,UAAIkB,MAAJ,CAAWjmB,IAAX,EAAiBI,GAAjB;AACA2kB,UAAImB,MAAJ,CAAWhmB,KAAX,EAAkBE,GAAlB;AACA2kB,UAAImB,MAAJ,CAAWhmB,QAAQmK,KAAR,GAAgB+b,QAA3B,EAAqCjI,MAArC;AACA4G,UAAImB,MAAJ,CAAWlmB,IAAX,EAAiBme,MAAjB;AACA4G,UAAIuB,SAAJ;AACAvB,UAAIjM,IAAJ;AACAiM,UAAIhM,MAAJ;AACD;;AAED;AACA,QAAIwN,cAAc,CAAlB,CA7E2C,CA6EtB;;AAErB,QAAIC,YAAYhB,gBAAgB,KAAKpK,UAAL,CAAgBlf,GAAhC,GAAuC,KAAKgf,MAAL,CAAYhf,GAAnE;AACA,QAAIuqB,YAAYjB,gBAAgB,KAAKpK,UAAL,CAAgBjf,GAAhC,GAAuC,KAAK+e,MAAL,CAAY/e,GAAnE;AACA,QAAIuqB,OAAO,IAAIpY,UAAJ,CAAekY,SAAf,EAA0BC,SAA1B,EAAqC,CAACA,YAAUD,SAAX,IAAsB,CAA3D,EAA8D,IAA9D,CAAX;AACAE,SAAKC,KAAL,CAAW,IAAX;;AAEA,QAAIlX,CAAJ;AACA,QAAImX,IAAJ;AACA,QAAIC,EAAJ;AACA,WAAO,CAACH,KAAKI,GAAL,EAAR,EAAoB;AAClBrX,UAAI0O,SAAS,CAACuI,KAAKK,UAAL,KAAoBP,SAArB,KAAmCC,YAAYD,SAA/C,IAA4Dlc,MAAzE;AACAsc,aAAQ,IAAIzY,OAAJ,CAAYnO,OAAOumB,WAAnB,EAAgC9W,CAAhC,CAAR;AACAoX,WAAQ,IAAI1Y,OAAJ,CAAYnO,IAAZ,EAAkByP,CAAlB,CAAR;AACA,WAAKuX,KAAL,CAAWjC,GAAX,EAAgB6B,IAAhB,EAAsBC,EAAtB;;AAEA9B,UAAIkC,SAAJ,GAAgB,OAAhB;AACAlC,UAAImC,YAAJ,GAAmB,QAAnB;AACAnC,UAAIsB,SAAJ,GAAgB,KAAKhO,SAArB;AACA0M,UAAIoC,QAAJ,CAAaT,KAAKK,UAAL,EAAb,EAAgC/mB,OAAO,IAAIumB,WAA3C,EAAwD9W,CAAxD;;AAEAiX,WAAKU,IAAL;AACD;;AAEDrC,QAAIkC,SAAJ,GAAgB,OAAhB;AACAlC,QAAImC,YAAJ,GAAmB,KAAnB;AACA,QAAInX,QAAQ,KAAKqH,WAAjB;AACA2N,QAAIoC,QAAJ,CAAapX,KAAb,EAAoB7P,KAApB,EAA2Bie,SAAS,KAAKsH,MAAzC;AACD,GAzGD;;AA2GA;;;AAGA1X,UAAQgD,SAAR,CAAkB2S,aAAlB,GAAkC,YAAW;AAC3C,SAAK/F,KAAL,CAAWpM,MAAX,CAAkBwQ,SAAlB,GAA8B,EAA9B;;AAEA,QAAI,KAAKlB,UAAT,EAAqB;AACnB,UAAI7Y,UAAU;AACZ,mBAAW,KAAKiQ;AADJ,OAAd;AAGA,UAAI8K,SAAS,IAAI1U,MAAJ,CAAW,KAAKsP,KAAL,CAAWpM,MAAtB,EAA8BvJ,OAA9B,CAAb;AACA,WAAK2V,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,GAA2BA,MAA3B;;AAEA;AACA,WAAKpF,KAAL,CAAWpM,MAAX,CAAkBnL,KAAlB,CAAwB0b,OAAxB,GAAkC,MAAlC;AACA;;AAEAiB,aAAOsE,SAAP,CAAiB,KAAKxG,UAAL,CAAgBjM,MAAjC;AACAmO,aAAOuE,eAAP,CAAuB,KAAKpP,iBAA5B;;AAEA;AACA,UAAIlG,KAAK,IAAT;AACA,UAAIuV,WAAW,SAAXA,QAAW,GAAY;AACzB,YAAI5mB,QAAQoiB,OAAOyE,QAAP,EAAZ;;AAEAxV,WAAG6O,UAAH,CAAc4G,WAAd,CAA0B9mB,KAA1B;AACAqR,WAAGsI,UAAH,GAAgBtI,GAAG6O,UAAH,CAAcG,cAAd,EAAhB;;AAEAhP,WAAG+O,MAAH;AACD,OAPD;AAQAgC,aAAO2E,mBAAP,CAA2BH,QAA3B;AACD,KAzBD,MA0BK;AACH,WAAK5J,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,GAA2BtlB,SAA3B;AACD;AACF,GAhCD;;AAkCA;;;AAGAsQ,UAAQgD,SAAR,CAAkByT,aAAlB,GAAkC,YAAW;AAC3C,QAAK,KAAK7G,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,KAA6BtlB,SAAlC,EAA6C;AAC3C,WAAKkgB,KAAL,CAAWpM,MAAX,CAAkBwR,MAAlB,CAAyBhC,MAAzB;AACD;AACF,GAJD;;AAOA;;;AAGAhT,UAAQgD,SAAR,CAAkB6T,WAAlB,GAAgC,YAAW;AACzC,QAAI,KAAK/D,UAAT,EAAqB;AACnB,UAAIkE,MAAM,KAAKD,WAAL,EAAV;;AAEAC,UAAIY,IAAJ,GAAW,YAAX,CAHmB,CAGM;AACzBZ,UAAI4C,SAAJ,GAAgB,MAAhB;AACA5C,UAAIsB,SAAJ,GAAgB,MAAhB;AACAtB,UAAIkC,SAAJ,GAAgB,MAAhB;AACAlC,UAAImC,YAAJ,GAAmB,KAAnB;;AAEA,UAAI1X,IAAI,KAAKiW,MAAb;AACA,UAAIhW,IAAI,KAAKgW,MAAb;AACAV,UAAIoC,QAAJ,CAAa,KAAKtG,UAAL,CAAgB+G,QAAhB,KAA6B,IAA7B,GAAoC,KAAK/G,UAAL,CAAgBgH,gBAAhB,EAAjD,EAAqFrY,CAArF,EAAwFC,CAAxF;AACD;AACF,GAdD;;AAiBA;;;;;AAKA1B,UAAQgD,SAAR,CAAkBiW,KAAlB,GAA0B,UAASjC,GAAT,EAAc6B,IAAd,EAAoBC,EAApB,EAAwBd,WAAxB,EAAqC;AAC7D,QAAIA,gBAAgBtoB,SAApB,EAA+B;AAC7BsnB,UAAIgB,WAAJ,GAAkBA,WAAlB;AACD;;AAEDhB,QAAIiB,SAAJ;AACAjB,QAAIkB,MAAJ,CAAWW,KAAKpX,CAAhB,EAAmBoX,KAAKnX,CAAxB;AACAsV,QAAImB,MAAJ,CAAWW,GAAGrX,CAAd,EAAmBqX,GAAGpX,CAAtB;AACAsV,QAAIhM,MAAJ;AACD,GATD;;AAYAhL,UAAQgD,SAAR,CAAkB+W,cAAlB,GAAmC,UAAS/C,GAAT,EAAcrJ,OAAd,EAAuBqM,IAAvB,EAA6BC,QAA7B,EAAuCC,OAAvC,EAAgD;AACjF,QAAIA,YAAYxqB,SAAhB,EAA2B;AACzBwqB,gBAAU,CAAV;AACD;;AAED,QAAIC,UAAU,KAAKzM,cAAL,CAAoBC,OAApB,CAAd;;AAEA,QAAIpf,KAAKqgB,GAAL,CAASqL,WAAW,CAApB,IAAyB,CAA7B,EAAgC;AAC9BjD,UAAIkC,SAAJ,GAAgB,QAAhB;AACAlC,UAAImC,YAAJ,GAAmB,KAAnB;AACAgB,cAAQzY,CAAR,IAAawY,OAAb;AACD,KAJD,MAKK,IAAI3rB,KAAKmgB,GAAL,CAASuL,WAAW,CAApB,IAAyB,CAA7B,EAA+B;AAClCjD,UAAIkC,SAAJ,GAAgB,OAAhB;AACAlC,UAAImC,YAAJ,GAAmB,QAAnB;AACD,KAHI,MAIA;AACHnC,UAAIkC,SAAJ,GAAgB,MAAhB;AACAlC,UAAImC,YAAJ,GAAmB,QAAnB;AACD;;AAEDnC,QAAIsB,SAAJ,GAAgB,KAAKhO,SAArB;AACA0M,QAAIoC,QAAJ,CAAaY,IAAb,EAAmBG,QAAQ1Y,CAA3B,EAA8B0Y,QAAQzY,CAAtC;AACD,GAvBD;;AA0BA1B,UAAQgD,SAAR,CAAkBoX,cAAlB,GAAmC,UAASpD,GAAT,EAAcrJ,OAAd,EAAuBqM,IAAvB,EAA6BC,QAA7B,EAAuCC,OAAvC,EAAgD;AACjF,QAAIA,YAAYxqB,SAAhB,EAA2B;AACzBwqB,gBAAU,CAAV;AACD;;AAED,QAAIC,UAAU,KAAKzM,cAAL,CAAoBC,OAApB,CAAd;;AAEA,QAAIpf,KAAKqgB,GAAL,CAASqL,WAAW,CAApB,IAAyB,CAA7B,EAAgC;AAC9BjD,UAAIkC,SAAJ,GAAgB,QAAhB;AACAlC,UAAImC,YAAJ,GAAmB,KAAnB;AACAgB,cAAQzY,CAAR,IAAawY,OAAb;AACD,KAJD,MAKK,IAAI3rB,KAAKmgB,GAAL,CAASuL,WAAW,CAApB,IAAyB,CAA7B,EAA+B;AAClCjD,UAAIkC,SAAJ,GAAgB,OAAhB;AACAlC,UAAImC,YAAJ,GAAmB,QAAnB;AACD,KAHI,MAIA;AACHnC,UAAIkC,SAAJ,GAAgB,MAAhB;AACAlC,UAAImC,YAAJ,GAAmB,QAAnB;AACD;;AAEDnC,QAAIsB,SAAJ,GAAgB,KAAKhO,SAArB;AACA0M,QAAIoC,QAAJ,CAAaY,IAAb,EAAmBG,QAAQ1Y,CAA3B,EAA8B0Y,QAAQzY,CAAtC;AACD,GAvBD;;AA0BA1B,UAAQgD,SAAR,CAAkBqX,cAAlB,GAAmC,UAASrD,GAAT,EAAcrJ,OAAd,EAAuBqM,IAAvB,EAA6B3b,MAA7B,EAAqC;AACtE,QAAIA,WAAW3O,SAAf,EAA0B;AACxB2O,eAAS,CAAT;AACD;;AAED,QAAI8b,UAAU,KAAKzM,cAAL,CAAoBC,OAApB,CAAd;AACAqJ,QAAIkC,SAAJ,GAAgB,OAAhB;AACAlC,QAAImC,YAAJ,GAAmB,QAAnB;AACAnC,QAAIsB,SAAJ,GAAgB,KAAKhO,SAArB;AACA0M,QAAIoC,QAAJ,CAAaY,IAAb,EAAmBG,QAAQ1Y,CAAR,GAAYpD,MAA/B,EAAuC8b,QAAQzY,CAA/C;AACD,GAVD;;AAaA;;;;;;;;AAQA1B,UAAQgD,SAAR,CAAkBsX,OAAlB,GAA4B,UAAStD,GAAT,EAAc6B,IAAd,EAAoBC,EAApB,EAAwBd,WAAxB,EAAqC;AAC/D,QAAIuC,SAAS,KAAK7M,cAAL,CAAoBmL,IAApB,CAAb;AACA,QAAI2B,OAAS,KAAK9M,cAAL,CAAoBoL,EAApB,CAAb;;AAEA,SAAKG,KAAL,CAAWjC,GAAX,EAAgBuD,MAAhB,EAAwBC,IAAxB,EAA8BxC,WAA9B;AACD,GALD;;AAQA;;;AAGAhY,UAAQgD,SAAR,CAAkB2T,WAAlB,GAAgC,YAAW;AACzC,QAAIK,MAAM,KAAKD,WAAL,EAAV;AAAA,QACE8B,IADF;AAAA,QACQC,EADR;AAAA,QACYH,IADZ;AAAA,QACkB8B,UADlB;AAAA,QAEET,IAFF;AAAA,QAEQU,KAFR;AAAA,QAEeC,KAFf;AAAA,QAEsBC,KAFtB;AAAA,QAGEvc,MAHF;AAAA,QAGU4D,OAHV;AAAA,QAGmBC,OAHnB;;AAKA;AACA;AACA8U,QAAIY,IAAJ,GAAW,KAAK,KAAKpK,MAAL,CAAYkC,YAAZ,EAAL,GAAkC,UAA7C;;AAEA;AACA,QAAImL,WAAa,QAAQ,KAAKvsB,KAAL,CAAWmT,CAApC;AACA,QAAIqZ,WAAa,QAAQ,KAAKxsB,KAAL,CAAWoT,CAApC;AACA,QAAIqZ,aAAa,IAAI,KAAKvN,MAAL,CAAYkC,YAAZ,EAArB,CAbyC,CAaQ;AACjD,QAAIuK,WAAa,KAAKzM,MAAL,CAAYiI,cAAZ,GAA6BtK,UAA9C;AACA,QAAI6P,YAAa,IAAI5a,OAAJ,CAAY7R,KAAKqgB,GAAL,CAASqL,QAAT,CAAZ,EAAgC1rB,KAAKmgB,GAAL,CAASuL,QAAT,CAAhC,CAAjB;;AAEA,QAAIjN,SAAS,KAAKA,MAAlB;AACA,QAAIE,SAAS,KAAKA,MAAlB;AACA,QAAIC,SAAS,KAAKA,MAAlB;;AAEA;AACA6J,QAAIW,SAAJ,GAAgB,CAAhB;AACA8C,iBAAc,KAAKpI,YAAL,KAAsB3iB,SAApC;AACAipB,WAAO,IAAIpY,UAAJ,CAAeyM,OAAO7e,GAAtB,EAA2B6e,OAAO5e,GAAlC,EAAuC,KAAKwd,KAA5C,EAAmD6O,UAAnD,CAAP;AACA9B,SAAKC,KAAL,CAAW,IAAX;;AAEA,WAAO,CAACD,KAAKI,GAAL,EAAR,EAAoB;AAClB,UAAItX,IAAIkX,KAAKK,UAAL,EAAR;;AAEA,UAAI,KAAKpP,QAAT,EAAmB;AACjBiP,eAAO,IAAIxY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO/e,GAAtB,EAA2Bgf,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO9e,GAAtB,EAA2B+e,OAAOhf,GAAlC,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKvO,SAAjC;AACD,OAJD,MAKK;AACHsO,eAAO,IAAIxY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO/e,GAAtB,EAA2Bgf,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO/e,GAAP,GAAW0sB,QAA1B,EAAoC1N,OAAOhf,GAA3C,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;;AAEAuO,eAAO,IAAIxY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO9e,GAAtB,EAA2B+e,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAYoB,CAAZ,EAAeyL,OAAO9e,GAAP,GAAWysB,QAA1B,EAAoC1N,OAAOhf,GAA3C,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;AACD;;AAEDqQ,cAAeK,UAAUvZ,CAAV,GAAc,CAAf,GAAoByL,OAAO/e,GAA3B,GAAiC+e,OAAO9e,GAAtD;AACA,UAAIuf,UAAU,IAAItN,OAAJ,CAAYoB,CAAZ,EAAekZ,KAAf,EAAsBxN,OAAOhf,GAA7B,CAAd;AACA,UAAI8sB,MAAU,OAAO,KAAKxR,WAAL,CAAiBhI,CAAjB,CAAP,GAA6B,IAA3C;AACA,WAAKsY,cAAL,CAAoB/C,GAApB,EAAyBrJ,OAAzB,EAAkCsN,GAAlC,EAAuChB,QAAvC,EAAiDc,UAAjD;;AAEApC,WAAKU,IAAL;AACD;;AAED;AACArC,QAAIW,SAAJ,GAAgB,CAAhB;AACA8C,iBAAc,KAAKjI,YAAL,KAAsB9iB,SAApC;AACAipB,WAAO,IAAIpY,UAAJ,CAAe2M,OAAO/e,GAAtB,EAA2B+e,OAAO9e,GAAlC,EAAuC,KAAK2d,KAA5C,EAAmD0O,UAAnD,CAAP;AACA9B,SAAKC,KAAL,CAAW,IAAX;;AAEA,WAAO,CAACD,KAAKI,GAAL,EAAR,EAAoB;AAClB,UAAIrX,IAAIiX,KAAKK,UAAL,EAAR;;AAEA,UAAI,KAAKpP,QAAT,EAAmB;AACjBiP,eAAO,IAAIxY,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwBuT,CAAxB,EAA2ByL,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwBsT,CAAxB,EAA2ByL,OAAOhf,GAAlC,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKvO,SAAjC;AACD,OAJD,MAKK;AACHsO,eAAO,IAAIxY,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwBuT,CAAxB,EAA2ByL,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAY2M,OAAO7e,GAAP,GAAW2sB,QAAvB,EAAiCpZ,CAAjC,EAAoCyL,OAAOhf,GAA3C,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;;AAEAuO,eAAO,IAAIxY,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwBsT,CAAxB,EAA2ByL,OAAOhf,GAAlC,CAAP;AACA2qB,aAAO,IAAIzY,OAAJ,CAAY2M,OAAO5e,GAAP,GAAW0sB,QAAvB,EAAiCpZ,CAAjC,EAAoCyL,OAAOhf,GAA3C,CAAP;AACA,aAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;AACD;;AAEDoQ,cAAWM,UAAUtZ,CAAV,GAAc,CAAf,GAAoBsL,OAAO7e,GAA3B,GAAiC6e,OAAO5e,GAAlD;AACAuf,gBAAU,IAAItN,OAAJ,CAAYqa,KAAZ,EAAmBhZ,CAAnB,EAAsByL,OAAOhf,GAA7B,CAAV;AACA,UAAI8sB,MAAM,OAAO,KAAKvR,WAAL,CAAiBhI,CAAjB,CAAP,GAA6B,IAAvC;AACA,WAAK0Y,cAAL,CAAoBpD,GAApB,EAAyBrJ,OAAzB,EAAkCsN,GAAlC,EAAuChB,QAAvC,EAAiDc,UAAjD;;AAEApC,WAAKU,IAAL;AACD;;AAED;AACArC,QAAIW,SAAJ,GAAgB,CAAhB;AACA8C,iBAAc,KAAK9H,YAAL,KAAsBjjB,SAApC;AACAipB,WAAO,IAAIpY,UAAJ,CAAe4M,OAAOhf,GAAtB,EAA2Bgf,OAAO/e,GAAlC,EAAuC,KAAK8d,KAA5C,EAAmDuO,UAAnD,CAAP;AACA9B,SAAKC,KAAL,CAAW,IAAX;;AAEA8B,YAASM,UAAUvZ,CAAV,GAAc,CAAf,GAAoBuL,OAAO7e,GAA3B,GAAiC6e,OAAO5e,GAAhD;AACAusB,YAASK,UAAUtZ,CAAV,GAAc,CAAf,GAAoBwL,OAAO/e,GAA3B,GAAiC+e,OAAO9e,GAAhD;;AAEA,WAAO,CAACuqB,KAAKI,GAAL,EAAR,EAAoB;AAClB,UAAI3L,IAAIuL,KAAKK,UAAL,EAAR;;AAEA;AACA,UAAIkC,SAAS,IAAI7a,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BvN,CAA1B,CAAb;AACA,UAAImN,SAAS,KAAK7M,cAAL,CAAoBwN,MAApB,CAAb;AACApC,WAAK,IAAI1Y,OAAJ,CAAYma,OAAO9Y,CAAP,GAAWsZ,UAAvB,EAAmCR,OAAO7Y,CAA1C,CAAL;AACA,WAAKuX,KAAL,CAAWjC,GAAX,EAAgBuD,MAAhB,EAAwBzB,EAAxB,EAA4B,KAAKxO,SAAjC;;AAEA,UAAI2Q,MAAM,KAAKtR,WAAL,CAAiByD,CAAjB,IAAsB,GAAhC;AACA,WAAKiN,cAAL,CAAoBrD,GAApB,EAAyBkE,MAAzB,EAAiCD,GAAjC,EAAsC,CAAtC;;AAEAtC,WAAKU,IAAL;AACD;;AAEDrC,QAAIW,SAAJ,GAAgB,CAAhB;AACAkB,WAAO,IAAIxY,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BxN,OAAOhf,GAAjC,CAAP;AACA2qB,SAAO,IAAIzY,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BxN,OAAO/e,GAAjC,CAAP;AACA,SAAKksB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;;AAEA;AACA,QAAI6Q,MAAJ;AACA,QAAIC,MAAJ;AACApE,QAAIW,SAAJ,GAAgB,CAAhB;;AAEA;AACAwD,aAAS,IAAI9a,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwB+e,OAAO/e,GAA/B,EAAoCgf,OAAOhf,GAA3C,CAAT;AACAitB,aAAS,IAAI/a,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwB8e,OAAO/e,GAA/B,EAAoCgf,OAAOhf,GAA3C,CAAT;AACA,SAAKmsB,OAAL,CAAatD,GAAb,EAAkBmE,MAAlB,EAA0BC,MAA1B,EAAkC,KAAK9Q,SAAvC;AACA;AACA6Q,aAAS,IAAI9a,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwB+e,OAAO9e,GAA/B,EAAoC+e,OAAOhf,GAA3C,CAAT;AACAitB,aAAS,IAAI/a,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwB8e,OAAO9e,GAA/B,EAAoC+e,OAAOhf,GAA3C,CAAT;AACA,SAAKmsB,OAAL,CAAatD,GAAb,EAAkBmE,MAAlB,EAA0BC,MAA1B,EAAkC,KAAK9Q,SAAvC;;AAEA;AACA0M,QAAIW,SAAJ,GAAgB,CAAhB;AACA;AACAkB,WAAO,IAAIxY,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwB+e,OAAO/e,GAA/B,EAAoCgf,OAAOhf,GAA3C,CAAP;AACA2qB,SAAO,IAAIzY,OAAJ,CAAY2M,OAAO7e,GAAnB,EAAwB+e,OAAO9e,GAA/B,EAAoC+e,OAAOhf,GAA3C,CAAP;AACA,SAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;AACA;AACAuO,WAAO,IAAIxY,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwB8e,OAAO/e,GAA/B,EAAoCgf,OAAOhf,GAA3C,CAAP;AACA2qB,SAAO,IAAIzY,OAAJ,CAAY2M,OAAO5e,GAAnB,EAAwB8e,OAAO9e,GAA/B,EAAoC+e,OAAOhf,GAA3C,CAAP;AACA,SAAKmsB,OAAL,CAAatD,GAAb,EAAkB6B,IAAlB,EAAwBC,EAAxB,EAA4B,KAAKxO,SAAjC;;AAEA;AACA,QAAIhB,SAAS,KAAKA,MAAlB;AACA,QAAIA,OAAOxZ,MAAP,GAAgB,CAApB,EAAuB;AACrBoS,gBAAU,MAAM,KAAK5T,KAAL,CAAWoT,CAA3B;AACAgZ,cAAU,CAAC1N,OAAO5e,GAAP,GAAa,IAAE4e,OAAO7e,GAAvB,IAA4B,CAAtC;AACAwsB,cAAWK,UAAUvZ,CAAV,GAAc,CAAf,GAAoByL,OAAO/e,GAAP,GAAa+T,OAAjC,GAA0CgL,OAAO9e,GAAP,GAAa8T,OAAjE;AACA8X,aAAU,IAAI3Z,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BxN,OAAOhf,GAAjC,CAAV;AACA,WAAK4rB,cAAL,CAAoB/C,GAApB,EAAyBgD,IAAzB,EAA+B1Q,MAA/B,EAAuC2Q,QAAvC;AACD;;AAED;AACA,QAAI1Q,SAAS,KAAKA,MAAlB;AACA,QAAIA,OAAOzZ,MAAP,GAAgB,CAApB,EAAuB;AACrBmS,gBAAU,MAAM,KAAK3T,KAAL,CAAWmT,CAA3B;AACAiZ,cAAWM,UAAUtZ,CAAV,GAAc,CAAf,GAAoBsL,OAAO7e,GAAP,GAAa8T,OAAjC,GAA2C+K,OAAO5e,GAAP,GAAa6T,OAAlE;AACA0Y,cAAU,CAACzN,OAAO9e,GAAP,GAAa,IAAE8e,OAAO/e,GAAvB,IAA4B,CAAtC;AACA6rB,aAAU,IAAI3Z,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BxN,OAAOhf,GAAjC,CAAV;;AAEA,WAAKisB,cAAL,CAAoBpD,GAApB,EAAyBgD,IAAzB,EAA+BzQ,MAA/B,EAAuC0Q,QAAvC;AACD;;AAED;AACA,QAAIzQ,SAAS,KAAKA,MAAlB;AACA,QAAIA,OAAO1Z,MAAP,GAAgB,CAApB,EAAuB;AACrBuO,eAAS,EAAT,CADqB,CACP;AACdqc,cAAUM,UAAUvZ,CAAV,GAAc,CAAf,GAAoBuL,OAAO7e,GAA3B,GAAiC6e,OAAO5e,GAAjD;AACAusB,cAAUK,UAAUtZ,CAAV,GAAc,CAAf,GAAoBwL,OAAO/e,GAA3B,GAAiC+e,OAAO9e,GAAjD;AACAwsB,cAAS,CAACzN,OAAO/e,GAAP,GAAa,IAAE+e,OAAOhf,GAAvB,IAA4B,CAArC;AACA6rB,aAAS,IAAI3Z,OAAJ,CAAYqa,KAAZ,EAAmBC,KAAnB,EAA0BC,KAA1B,CAAT;;AAEA,WAAKP,cAAL,CAAoBrD,GAApB,EAAyBgD,IAAzB,EAA+BxQ,MAA/B,EAAuCnL,MAAvC;AACD;AACF,GA3KD;;AA6KA;;;;;;AAMA2B,UAAQgD,SAAR,CAAkB+U,QAAlB,GAA6B,UAASsD,CAAT,EAAYC,CAAZ,EAAeC,CAAf,EAAkB;AAC7C,QAAIC,CAAJ,EAAOC,CAAP,EAAUC,CAAV,EAAaC,CAAb,EAAgBC,EAAhB,EAAoBC,CAApB;;AAEAF,QAAIJ,IAAID,CAAR;AACAM,SAAKrtB,KAAKuK,KAAL,CAAWuiB,IAAE,EAAb,CAAL,CAJ6C,CAIrB;AACxBQ,QAAIF,KAAK,IAAIptB,KAAKutB,GAAL,CAAWT,IAAE,EAAH,GAAS,CAAV,GAAe,CAAxB,CAAT,CAAJ;;AAEA,YAAQO,EAAR;AACE,WAAK,CAAL;AAAQJ,YAAIG,CAAJ,CAAOF,IAAII,CAAJ,CAAOH,IAAI,CAAJ,CAAO;AAC7B,WAAK,CAAL;AAAQF,YAAIK,CAAJ,CAAOJ,IAAIE,CAAJ,CAAOD,IAAI,CAAJ,CAAO;AAC7B,WAAK,CAAL;AAAQF,YAAI,CAAJ,CAAOC,IAAIE,CAAJ,CAAOD,IAAIG,CAAJ,CAAO;AAC7B,WAAK,CAAL;AAAQL,YAAI,CAAJ,CAAOC,IAAII,CAAJ,CAAOH,IAAIC,CAAJ,CAAO;AAC7B,WAAK,CAAL;AAAQH,YAAIK,CAAJ,CAAOJ,IAAI,CAAJ,CAAOC,IAAIC,CAAJ,CAAO;AAC7B,WAAK,CAAL;AAAQH,YAAIG,CAAJ,CAAOF,IAAI,CAAJ,CAAOC,IAAIG,CAAJ,CAAO;;AAE7B;AAASL,YAAI,CAAJ,CAAOC,IAAI,CAAJ,CAAOC,IAAI,CAAJ,CAAO;AARhC;;AAWA,WAAO,SAAS7lB,SAAS2lB,IAAE,GAAX,CAAT,GAA2B,GAA3B,GAAiC3lB,SAAS4lB,IAAE,GAAX,CAAjC,GAAmD,GAAnD,GAAyD5lB,SAAS6lB,IAAE,GAAX,CAAzD,GAA2E,GAAlF;AACD,GAnBD;;AAsBA1b,UAAQgD,SAAR,CAAkB+Y,eAAlB,GAAoC,UAASla,KAAT,EAAgB;AAClD,QAAIA,UAAUnS,SAAd,EAAyB;AACvB,UAAI,KAAKma,eAAT,EAA0B;AACxB,eAAO,IAAI,CAAChI,MAAMoO,KAAN,CAAY7C,CAAjB,GAAqB,KAAKtC,SAAL,CAAeG,WAA3C;AACD,OAFD,MAGK;AACH,eAAO,EAAE,KAAKoE,GAAL,CAASjC,CAAT,GAAa,KAAKI,MAAL,CAAYkC,YAAZ,EAAf,IAA6C,KAAK5E,SAAL,CAAeG,WAAnE;AACD;AACF;;AAED,WAAO,KAAKH,SAAL,CAAeG,WAAtB;AACD,GAXD;;AAcA;AACA;AACA;;;AAGA;;;AAGAjL,UAAQgD,SAAR,CAAkBgZ,UAAlB,GAA+B,UAAShF,GAAT,EAAcnV,KAAd,EAAqBoa,MAArB,EAA6BC,MAA7B,EAAqCnmB,KAArC,EAA4ComB,WAA5C,EAAyD;AACtF,QAAIvsB,CAAJ,EAAOkK,CAAP,EAAUsiB,OAAV;;AAEA;AACA,QAAInY,KAAK,IAAT;AACA,QAAI0J,UAAU9L,MAAMA,KAApB;AACA,QAAImK,OAAO,KAAKmB,MAAL,CAAYhf,GAAvB;AACA,QAAIkE,MAAM,CACR,EAACwP,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDvO,QAAQP,CAA5D,CAAR,EADQ,EAER,EAACvL,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDvO,QAAQP,CAA5D,CAAR,EAFQ,EAGR,EAACvL,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDvO,QAAQP,CAA5D,CAAR,EAHQ,EAIR,EAACvL,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDvO,QAAQP,CAA5D,CAAR,EAJQ,CAAV;AAMA,QAAIgD,SAAS,CACX,EAACvO,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDlQ,IAApD,CAAR,EADW,EAEX,EAACnK,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDlQ,IAApD,CAAR,EAFW,EAGX,EAACnK,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDlQ,IAApD,CAAR,EAHW,EAIX,EAACnK,OAAO,IAAIxB,OAAJ,CAAYsN,QAAQlM,CAAR,GAAYwa,MAAxB,EAAgCtO,QAAQjM,CAAR,GAAYwa,MAA5C,EAAoDlQ,IAApD,CAAR,EAJW,CAAb;;AAOA;AACA3Z,QAAIS,OAAJ,CAAY,UAAU3D,GAAV,EAAe;AACzBA,UAAI+gB,MAAJ,GAAajM,GAAGyJ,cAAH,CAAkBve,IAAI0S,KAAtB,CAAb;AACD,KAFD;AAGAuO,WAAOtd,OAAP,CAAe,UAAU3D,GAAV,EAAe;AAC5BA,UAAI+gB,MAAJ,GAAajM,GAAGyJ,cAAH,CAAkBve,IAAI0S,KAAtB,CAAb;AACD,KAFD;;AAIA;AACA,QAAIwa,WAAW,CACb,EAACC,SAASjqB,GAAV,EAAeib,QAAQjN,QAAQkc,GAAR,CAAYnM,OAAO,CAAP,EAAUvO,KAAtB,EAA6BuO,OAAO,CAAP,EAAUvO,KAAvC,CAAvB,EADa,EAEb,EAACya,SAAS,CAACjqB,IAAI,CAAJ,CAAD,EAASA,IAAI,CAAJ,CAAT,EAAiB+d,OAAO,CAAP,CAAjB,EAA4BA,OAAO,CAAP,CAA5B,CAAV,EAAkD9C,QAAQjN,QAAQkc,GAAR,CAAYnM,OAAO,CAAP,EAAUvO,KAAtB,EAA6BuO,OAAO,CAAP,EAAUvO,KAAvC,CAA1D,EAFa,EAGb,EAACya,SAAS,CAACjqB,IAAI,CAAJ,CAAD,EAASA,IAAI,CAAJ,CAAT,EAAiB+d,OAAO,CAAP,CAAjB,EAA4BA,OAAO,CAAP,CAA5B,CAAV,EAAkD9C,QAAQjN,QAAQkc,GAAR,CAAYnM,OAAO,CAAP,EAAUvO,KAAtB,EAA6BuO,OAAO,CAAP,EAAUvO,KAAvC,CAA1D,EAHa,EAIb,EAACya,SAAS,CAACjqB,IAAI,CAAJ,CAAD,EAASA,IAAI,CAAJ,CAAT,EAAiB+d,OAAO,CAAP,CAAjB,EAA4BA,OAAO,CAAP,CAA5B,CAAV,EAAkD9C,QAAQjN,QAAQkc,GAAR,CAAYnM,OAAO,CAAP,EAAUvO,KAAtB,EAA6BuO,OAAO,CAAP,EAAUvO,KAAvC,CAA1D,EAJa,EAKb,EAACya,SAAS,CAACjqB,IAAI,CAAJ,CAAD,EAASA,IAAI,CAAJ,CAAT,EAAiB+d,OAAO,CAAP,CAAjB,EAA4BA,OAAO,CAAP,CAA5B,CAAV,EAAkD9C,QAAQjN,QAAQkc,GAAR,CAAYnM,OAAO,CAAP,EAAUvO,KAAtB,EAA6BuO,OAAO,CAAP,EAAUvO,KAAvC,CAA1D,EALa,CAAf;AAOAA,UAAMwa,QAAN,GAAiBA,QAAjB;;AAEA;AACA,SAAKviB,IAAI,CAAT,EAAYA,IAAIuiB,SAASvsB,MAAzB,EAAiCgK,GAAjC,EAAsC;AACpCsiB,gBAAUC,SAASviB,CAAT,CAAV;AACA,UAAI0iB,cAAc,KAAK3O,0BAAL,CAAgCuO,QAAQ9O,MAAxC,CAAlB;AACA8O,cAAQ/L,IAAR,GAAe,KAAKxG,eAAL,GAAuB2S,YAAY1sB,MAAZ,EAAvB,GAA8C,CAAC0sB,YAAYpP,CAA1E;AACA;AACA;AACA;AACD;;AAED;AACAiP,aAASrW,IAAT,CAAc,UAAUzW,CAAV,EAAaC,CAAb,EAAgB;AAC5B,UAAIitB,OAAOjtB,EAAE6gB,IAAF,GAAS9gB,EAAE8gB,IAAtB;AACA,UAAIoM,IAAJ,EAAU,OAAOA,IAAP;;AAEV;AACA,UAAIltB,EAAE+sB,OAAF,KAAcjqB,GAAlB,EAAuB,OAAO,CAAP;AACvB,UAAI7C,EAAE8sB,OAAF,KAAcjqB,GAAlB,EAAuB,OAAO,CAAC,CAAR;;AAEvB;AACA,aAAO,CAAP;AACD,KAVD;;AAYA;AACA2kB,QAAIW,SAAJ,GAAgB,KAAKoE,eAAL,CAAqBla,KAArB,CAAhB;AACAmV,QAAIgB,WAAJ,GAAkBmE,WAAlB;AACAnF,QAAIsB,SAAJ,GAAgBviB,KAAhB;AACA;AACA,SAAK+D,IAAI,CAAT,EAAYA,IAAIuiB,SAASvsB,MAAzB,EAAiCgK,GAAjC,EAAsC;AACpCsiB,gBAAUC,SAASviB,CAAT,CAAV;AACA,WAAK4iB,QAAL,CAAc1F,GAAd,EAAmBoF,QAAQE,OAA3B;AACD;AACF,GAtED;;AAyEA;;;;;;;AAOAtc,UAAQgD,SAAR,CAAkB0Z,QAAlB,GAA6B,UAAS1F,GAAT,EAAchH,MAAd,EAAsBsI,SAAtB,EAAiCN,WAAjC,EAA8C;AACzE,QAAIhI,OAAOlgB,MAAP,GAAgB,CAApB,EAAuB;AACrB;AACD;;AAED,QAAIwoB,cAAc5oB,SAAlB,EAA6B;AAC3BsnB,UAAIsB,SAAJ,GAAkBA,SAAlB;AACD;AACD,QAAIN,gBAAgBtoB,SAApB,EAA+B;AAC7BsnB,UAAIgB,WAAJ,GAAkBA,WAAlB;AACD;AACDhB,QAAIiB,SAAJ;AACAjB,QAAIkB,MAAJ,CAAWlI,OAAO,CAAP,EAAUE,MAAV,CAAiBzO,CAA5B,EAA+BuO,OAAO,CAAP,EAAUE,MAAV,CAAiBxO,CAAhD;;AAEA,SAAK,IAAI9R,IAAI,CAAb,EAAgBA,IAAIogB,OAAOlgB,MAA3B,EAAmC,EAAEF,CAArC,EAAwC;AACtC,UAAIiS,QAAQmO,OAAOpgB,CAAP,CAAZ;AACAonB,UAAImB,MAAJ,CAAWtW,MAAMqO,MAAN,CAAazO,CAAxB,EAA2BI,MAAMqO,MAAN,CAAaxO,CAAxC;AACD;;AAEDsV,QAAIuB,SAAJ;AACAvB,QAAIjM,IAAJ;AACAiM,QAAIhM,MAAJ,GArByE,CAqB3D;AACf,GAtBD;;AAyBA;;;AAGAhL,UAAQgD,SAAR,CAAkB2Z,WAAlB,GAAgC,UAAS3F,GAAT,EAAcnV,KAAd,EAAqB9L,KAArB,EAA4BomB,WAA5B,EAAyCpa,IAAzC,EAA+C;AAC7E,QAAI6a,SAAS,KAAKC,WAAL,CAAiBhb,KAAjB,EAAwBE,IAAxB,CAAb;;AAEAiV,QAAIW,SAAJ,GAAkB,KAAKoE,eAAL,CAAqBla,KAArB,CAAlB;AACAmV,QAAIgB,WAAJ,GAAkBmE,WAAlB;AACAnF,QAAIsB,SAAJ,GAAkBviB,KAAlB;AACAihB,QAAIiB,SAAJ;AACAjB,QAAI8F,GAAJ,CAAQjb,MAAMqO,MAAN,CAAazO,CAArB,EAAwBI,MAAMqO,MAAN,CAAaxO,CAArC,EAAwCkb,MAAxC,EAAgD,CAAhD,EAAmDruB,KAAKwuB,EAAL,GAAQ,CAA3D,EAA8D,IAA9D;AACA/F,QAAIjM,IAAJ;AACAiM,QAAIhM,MAAJ;AACD,GAVD;;AAaA;;;AAGAhL,UAAQgD,SAAR,CAAkBga,iBAAlB,GAAsC,UAASnb,KAAT,EAAgB;AACpD;AACA,QAAI7J,MAAc,CAAC,IAAI,CAAC6J,MAAMA,KAAN,CAAYuL,CAAZ,GAAgB,KAAKD,MAAL,CAAYhf,GAA7B,IAAoC,KAAKG,KAAL,CAAW8e,CAA/C,GAAoD,KAAKpD,aAA9D,IAA+E,GAAjG;AACA,QAAIjU,QAAc,KAAKgiB,QAAL,CAAc/f,GAAd,EAAmB,CAAnB,EAAsB,CAAtB,CAAlB;AACA,QAAImkB,cAAc,KAAKpE,QAAL,CAAc/f,GAAd,EAAmB,CAAnB,EAAsB,GAAtB,CAAlB;;AAEA,WAAO;AACL+S,YAAQhV,KADH;AAEL0B,cAAQ0kB;AAFH,KAAP;AAID,GAVD;;AAaA;;;;;;;;;AASAnc,UAAQgD,SAAR,CAAkBia,eAAlB,GAAoC,UAASpb,KAAT,EAAgB;AAClD;AACA,QAAI9L,KAAJ,EAAWomB,WAAX;;AAEA,QAAI,OAAOta,MAAMA,KAAN,CAAYpU,KAAnB,KAA6B,QAAjC,EAA2C;AACzCsI,cAAQ8L,MAAMA,KAAN,CAAYpU,KAApB;AACA0uB,oBAActa,MAAMA,KAAN,CAAYpU,KAA1B;AACD,KAHD,MAIK;AACH,UAAIuK,MAAU,CAAC,IAAI,CAAC6J,MAAMA,KAAN,CAAYpU,KAAZ,GAAoB,KAAK4f,UAAL,CAAgBlf,GAArC,IAA4C,KAAKG,KAAL,CAAWb,KAA5D,IAAqE,GAAnF;AACAsI,cAAc,KAAKgiB,QAAL,CAAc/f,GAAd,EAAmB,CAAnB,EAAsB,CAAtB,CAAd;AACAmkB,oBAAc,KAAKpE,QAAL,CAAc/f,GAAd,EAAmB,CAAnB,EAAsB,GAAtB,CAAd;AACD;AACD,WAAO;AACL+S,YAAShV,KADJ;AAEL0B,cAAS0kB;AAFJ,KAAP;AAID,GAjBD;;AAoBA;;;;AAIAnc,UAAQgD,SAAR,CAAkBka,cAAlB,GAAmC,YAAW;AAC5C,WAAO;AACLnS,YAAS,KAAKD,SAAL,CAAeC,IADnB;AAELtT,cAAS,KAAKqT,SAAL,CAAeE;AAFnB,KAAP;AAID,GALD;;AAQA;;;;;;;AAOAhL,UAAQgD,SAAR,CAAkB6Z,WAAlB,GAAgC,UAAShb,KAAT,EAAgBE,IAAhB,EAAsB;AACpD,QAAIA,SAASrS,SAAb,EAAwB;AACtBqS,aAAO,KAAKsV,QAAL,EAAP;AACD;;AAED,QAAIuF,MAAJ;AACA,QAAI,KAAK/S,eAAT,EAA0B;AACxB+S,eAAS7a,OAAO,CAACF,MAAMoO,KAAN,CAAY7C,CAA7B;AACD,KAFD,MAGK;AACHwP,eAAS7a,OAAO,EAAE,KAAKsN,GAAL,CAASjC,CAAT,GAAa,KAAKI,MAAL,CAAYkC,YAAZ,EAAf,CAAhB;AACD;AACD,QAAIkN,SAAS,CAAb,EAAgB;AACdA,eAAS,CAAT;AACD;;AAED,WAAOA,MAAP;AACD,GAjBD;;AAoBA;AACA;AACA;;;AAGA;;;AAGA5c,UAAQgD,SAAR,CAAkB6S,oBAAlB,GAAyC,UAASmB,GAAT,EAAcnV,KAAd,EAAqB;AAC5D,QAAIoa,SAAS,KAAK3Q,SAAL,GAAiB,CAA9B;AACA,QAAI4Q,SAAS,KAAK3Q,SAAL,GAAiB,CAA9B;AACA,QAAI4R,SAAS,KAAKH,iBAAL,CAAuBnb,KAAvB,CAAb;;AAEA,SAAKma,UAAL,CAAgBhF,GAAhB,EAAqBnV,KAArB,EAA4Boa,MAA5B,EAAoCC,MAApC,EAA4CiB,OAAOpS,IAAnD,EAAyDoS,OAAO1lB,MAAhE;AACD,GAND;;AASA;;;AAGAuI,UAAQgD,SAAR,CAAkB8S,yBAAlB,GAA8C,UAASkB,GAAT,EAAcnV,KAAd,EAAqB;AACjE,QAAIoa,SAAS,KAAK3Q,SAAL,GAAiB,CAA9B;AACA,QAAI4Q,SAAS,KAAK3Q,SAAL,GAAiB,CAA9B;AACA,QAAI4R,SAAS,KAAKF,eAAL,CAAqBpb,KAArB,CAAb;;AAEA,SAAKma,UAAL,CAAgBhF,GAAhB,EAAqBnV,KAArB,EAA4Boa,MAA5B,EAAoCC,MAApC,EAA4CiB,OAAOpS,IAAnD,EAAyDoS,OAAO1lB,MAAhE;AACD,GAND;;AASA;;;AAGAuI,UAAQgD,SAAR,CAAkB+S,wBAAlB,GAA6C,UAASiB,GAAT,EAAcnV,KAAd,EAAqB;AAChE;AACA,QAAIub,WAAW,CAACvb,MAAMA,KAAN,CAAYpU,KAAZ,GAAoB,KAAK4f,UAAL,CAAgBlf,GAArC,IAA4C,KAAKkf,UAAL,CAAgBJ,KAAhB,EAA3D;AACA,QAAIgP,SAAY,KAAK3Q,SAAL,GAAiB,CAAlB,IAAwB8R,WAAW,GAAX,GAAiB,GAAzC,CAAf;AACA,QAAIlB,SAAY,KAAK3Q,SAAL,GAAiB,CAAlB,IAAwB6R,WAAW,GAAX,GAAiB,GAAzC,CAAf;;AAEA,QAAID,SAAW,KAAKD,cAAL,EAAf;;AAEA,SAAKlB,UAAL,CAAgBhF,GAAhB,EAAqBnV,KAArB,EAA4Boa,MAA5B,EAAoCC,MAApC,EAA4CiB,OAAOpS,IAAnD,EAAyDoS,OAAO1lB,MAAhE;AACD,GATD;;AAYA;;;AAGAuI,UAAQgD,SAAR,CAAkBgT,oBAAlB,GAAyC,UAASgB,GAAT,EAAcnV,KAAd,EAAqB;AAC5D,QAAIsb,SAAS,KAAKH,iBAAL,CAAuBnb,KAAvB,CAAb;;AAEA,SAAK8a,WAAL,CAAiB3F,GAAjB,EAAsBnV,KAAtB,EAA6Bsb,OAAOpS,IAApC,EAA0CoS,OAAO1lB,MAAjD;AACD,GAJD;;AAOA;;;AAGAuI,UAAQgD,SAAR,CAAkBkT,wBAAlB,GAA6C,UAASc,GAAT,EAAcnV,KAAd,EAAqB;AAChE;AACA,QAAIgX,OAAO,KAAKnL,cAAL,CAAoB7L,MAAMuO,MAA1B,CAAX;AACA4G,QAAIW,SAAJ,GAAgB,CAAhB;AACA,SAAKsB,KAAL,CAAWjC,GAAX,EAAgB6B,IAAhB,EAAsBhX,MAAMqO,MAA5B,EAAoC,KAAK3F,SAAzC;;AAEA,SAAKyL,oBAAL,CAA0BgB,GAA1B,EAA+BnV,KAA/B;AACD,GAPD;;AAUA;;;AAGA7B,UAAQgD,SAAR,CAAkBmT,yBAAlB,GAA8C,UAASa,GAAT,EAAcnV,KAAd,EAAqB;AACjE,QAAIsb,SAAS,KAAKF,eAAL,CAAqBpb,KAArB,CAAb;;AAEA,SAAK8a,WAAL,CAAiB3F,GAAjB,EAAsBnV,KAAtB,EAA6Bsb,OAAOpS,IAApC,EAA0CoS,OAAO1lB,MAAjD;AACD,GAJD;;AAOA;;;AAGAuI,UAAQgD,SAAR,CAAkBoT,wBAAlB,GAA6C,UAASY,GAAT,EAAcnV,KAAd,EAAqB;AAChE,QAAI0V,UAAW,KAAKF,QAAL,EAAf;AACA,QAAI+F,WAAW,CAACvb,MAAMA,KAAN,CAAYpU,KAAZ,GAAoB,KAAK4f,UAAL,CAAgBlf,GAArC,IAA4C,KAAKkf,UAAL,CAAgBJ,KAAhB,EAA3D;AACA,QAAIlL,OAAWwV,UAAQ,CAAR,GAAY,IAAEA,OAAF,GAAY6F,QAAvC;AACA,QAAID,SAAW,KAAKD,cAAL,EAAf;;AAEA,SAAKP,WAAL,CAAiB3F,GAAjB,EAAsBnV,KAAtB,EAA6Bsb,OAAOpS,IAApC,EAA0CoS,OAAO1lB,MAAjD,EAAyDsK,IAAzD;AACD,GAPD;;AAUA;;;AAGA/B,UAAQgD,SAAR,CAAkBqT,wBAAlB,GAA6C,UAASW,GAAT,EAAcnV,KAAd,EAAqB;AAChE,QAAI1P,QAAQ0P,MAAM2R,UAAlB;AACA,QAAInhB,MAAQwP,MAAM4R,QAAlB;AACA,QAAI4J,QAAQxb,MAAM6R,UAAlB;;AAEA,QAAI7R,UAAUnS,SAAV,IAAuByC,UAAUzC,SAAjC,IAA8C2C,QAAQ3C,SAAtD,IAAmE2tB,UAAU3tB,SAAjF,EAA4F;AAC1F;AACD;;AAED,QAAI4tB,iBAAiB,IAArB;AACA,QAAIhF,SAAJ;AACA,QAAIN,WAAJ;AACA,QAAIL,SAAJ;;AAEA,QAAI,KAAK4F,cAAL,IAAuB,KAAKzT,UAAhC,EAA4C;AAC1C;AACA;AACA;AACA;AACA,UAAI0T,QAAQnd,QAAQod,QAAR,CAAiBJ,MAAMpN,KAAvB,EAA8BpO,MAAMoO,KAApC,CAAZ;AACA,UAAIyN,QAAQrd,QAAQod,QAAR,CAAiBprB,IAAI4d,KAArB,EAA4B9d,MAAM8d,KAAlC,CAAZ;AACA,UAAI0N,eAAetd,QAAQud,YAAR,CAAqBJ,KAArB,EAA4BE,KAA5B,CAAnB;AACA,UAAI3sB,MAAM4sB,aAAa7tB,MAAb,EAAV;AACA;;AAEAwtB,uBAAkBK,aAAavQ,CAAb,GAAiB,CAAnC;AACD;;AAED,QAAIkQ,cAAJ,EAAoB;;AAElB;AACA,UAAIO,OAAO,CAAChc,MAAMA,KAAN,CAAYuL,CAAZ,GAAgBjb,MAAM0P,KAAN,CAAYuL,CAA5B,GAAgC/a,IAAIwP,KAAJ,CAAUuL,CAA1C,GAA8CiQ,MAAMxb,KAAN,CAAYuL,CAA3D,IAAgE,CAA3E;AACA,UAAInW,IAAO,CAAC,IAAI,CAAC4mB,OAAO,KAAK1Q,MAAL,CAAYhf,GAApB,IAA2B,KAAKG,KAAL,CAAW8e,CAAtC,GAA2C,KAAKpD,aAArD,IAAsE,GAAjF;AACA,UAAI9S,IAAO,CAAX,CALkB,CAKJ;AACd,UAAIC,CAAJ;;AAEA,UAAI,KAAK2S,UAAT,EAAqB;AACnB3S,YAAI5I,KAAKJ,GAAL,CAAS,IAAKwvB,aAAalc,CAAb,GAAiB1Q,GAAlB,GAAyB,CAAtC,EAAyC,CAAzC,CAAJ,CADmB,CAC+B;AAClDunB,oBAAY,KAAKP,QAAL,CAAc9gB,CAAd,EAAiBC,CAAjB,EAAoBC,CAApB,CAAZ;AACA6gB,sBAAcM,SAAd;AACD,OAJD,MAKM;AACJnhB,YAAI,CAAJ;AACAmhB,oBAAY,KAAKP,QAAL,CAAc9gB,CAAd,EAAiBC,CAAjB,EAAoBC,CAApB,CAAZ;AACA6gB,sBAAc,KAAK1N,SAAnB,CAHI,CAG0B;AAC/B;AACF,KAlBD,MAmBK;AACHgO,kBAAY,MAAZ;AACAN,oBAAc,KAAK1N,SAAnB;AACD;;AAED0M,QAAIW,SAAJ,GAAgB,KAAKoE,eAAL,CAAqBla,KAArB,CAAhB;AACA;;AAEA,QAAImO,SAAS,CAACnO,KAAD,EAAQ1P,KAAR,EAAekrB,KAAf,EAAsBhrB,GAAtB,CAAb;AACA,SAAKqqB,QAAL,CAAc1F,GAAd,EAAmBhH,MAAnB,EAA2BsI,SAA3B,EAAsCN,WAAtC;AACD,GAzDD;;AA4DA;;;AAGAhY,UAAQgD,SAAR,CAAkB8a,aAAlB,GAAkC,UAAS9G,GAAT,EAAc6B,IAAd,EAAoBC,EAApB,EAAwB;AACxD,QAAID,SAASnpB,SAAT,IAAsBopB,OAAOppB,SAAjC,EAA4C;AACzC;AACF;;AAED;AACA,QAAImuB,OAAO,CAAChF,KAAKhX,KAAL,CAAWuL,CAAX,GAAe0L,GAAGjX,KAAH,CAASuL,CAAzB,IAA8B,CAAzC;AACA,QAAInW,IAAO,CAAC,IAAI,CAAC4mB,OAAO,KAAK1Q,MAAL,CAAYhf,GAApB,IAA2B,KAAKG,KAAL,CAAW8e,CAAtC,GAA2C,KAAKpD,aAArD,IAAsE,GAAjF;;AAEAgN,QAAIW,SAAJ,GAAkB,KAAKoE,eAAL,CAAqBlD,IAArB,IAA6B,CAA/C;AACA7B,QAAIgB,WAAJ,GAAkB,KAAKD,QAAL,CAAc9gB,CAAd,EAAiB,CAAjB,EAAoB,CAApB,CAAlB;AACA,SAAKgiB,KAAL,CAAWjC,GAAX,EAAgB6B,KAAK3I,MAArB,EAA6B4I,GAAG5I,MAAhC;AACD,GAZD;;AAeA;;;AAGAlQ,UAAQgD,SAAR,CAAkBsT,qBAAlB,GAA0C,UAASU,GAAT,EAAcnV,KAAd,EAAqB;AAC7D,SAAKic,aAAL,CAAmB9G,GAAnB,EAAwBnV,KAAxB,EAA+BA,MAAM2R,UAArC;AACA,SAAKsK,aAAL,CAAmB9G,GAAnB,EAAwBnV,KAAxB,EAA+BA,MAAM4R,QAArC;AACD,GAHD;;AAMA;;;AAGAzT,UAAQgD,SAAR,CAAkBuT,qBAAlB,GAA0C,UAASS,GAAT,EAAcnV,KAAd,EAAqB;AAC7D,QAAIA,MAAM+R,SAAN,KAAoBlkB,SAAxB,EAAmC;AACjC;AACD;;AAEDsnB,QAAIW,SAAJ,GAAkB,KAAKoE,eAAL,CAAqBla,KAArB,CAAlB;AACAmV,QAAIgB,WAAJ,GAAkB,KAAKlN,SAAL,CAAeE,MAAjC;;AAEA,SAAKiO,KAAL,CAAWjC,GAAX,EAAgBnV,MAAMqO,MAAtB,EAA8BrO,MAAM+R,SAAN,CAAgB1D,MAA9C;AACD,GATD;;AAYA;;;;AAIAlQ,UAAQgD,SAAR,CAAkB4T,gBAAlB,GAAqC,YAAW;AAC9C,QAAII,MAAM,KAAKD,WAAL,EAAV;AACA,QAAInnB,CAAJ;;AAEA,QAAI,KAAK2c,UAAL,KAAoB7c,SAApB,IAAiC,KAAK6c,UAAL,CAAgBzc,MAAhB,IAA0B,CAA/D,EACE,OAL4C,CAKnC;;AAEX,SAAKigB,iBAAL,CAAuB,KAAKxD,UAA5B;;AAEA,SAAK3c,IAAI,CAAT,EAAYA,IAAI,KAAK2c,UAAL,CAAgBzc,MAAhC,EAAwCF,GAAxC,EAA6C;AAC3C,UAAIiS,QAAQ,KAAK0K,UAAL,CAAgB3c,CAAhB,CAAZ;;AAEA;AACA,WAAK4mB,mBAAL,CAAyBuH,IAAzB,CAA8B,IAA9B,EAAoC/G,GAApC,EAAyCnV,KAAzC;AACD;AACF,GAfD;;AAkBA;AACA;AACA;;AAEA;;;;;AAKA7B,UAAQgD,SAAR,CAAkBgb,mBAAlB,GAAwC,UAAS7pB,KAAT,EAAgB;AACtD;AACA,SAAK8pB,WAAL,GAAmBC,UAAU/pB,KAAV,CAAnB;AACA,SAAKgqB,WAAL,GAAmBC,UAAUjqB,KAAV,CAAnB;;AAEA,SAAKkqB,kBAAL,GAA0B,KAAK7Q,MAAL,CAAY8Q,SAAZ,EAA1B;AACD,GAND;;AASA;;;;;AAKAte,UAAQgD,SAAR,CAAkBkR,YAAlB,GAAiC,UAAS/f,KAAT,EAAgB;AAC/CA,YAAQA,SAASC,OAAOD,KAAxB;;AAEA;AACA;AACA,QAAI,KAAKoqB,cAAT,EAAyB;AACvB,WAAKC,UAAL,CAAgBrqB,KAAhB;AACD;;AAED;AACA,SAAKoqB,cAAL,GAAsBpqB,MAAMsqB,KAAN,GAAetqB,MAAMsqB,KAAN,KAAgB,CAA/B,GAAqCtqB,MAAMuqB,MAAN,KAAiB,CAA5E;AACA,QAAI,CAAC,KAAKH,cAAN,IAAwB,CAAC,KAAKI,SAAlC,EAA6C;;AAE7C,SAAKX,mBAAL,CAAyB7pB,KAAzB;;AAEA,SAAKyqB,UAAL,GAAkB,IAAIjwB,IAAJ,CAAS,KAAKiqB,KAAd,CAAlB;AACA,SAAKiG,QAAL,GAAgB,IAAIlwB,IAAJ,CAAS,KAAKoqB,GAAd,CAAhB;AACA,SAAK+F,gBAAL,GAAwB,KAAKtR,MAAL,CAAYiI,cAAZ,EAAxB;;AAEA,SAAK7F,KAAL,CAAWvX,KAAX,CAAiB0mB,MAAjB,GAA0B,MAA1B;;AAEA;AACA;AACA;AACA,QAAI9a,KAAK,IAAT;AACA,SAAK+a,WAAL,GAAmB,UAAU7qB,KAAV,EAAiB;AAAC8P,SAAGgb,YAAH,CAAgB9qB,KAAhB;AAAwB,KAA7D;AACA,SAAK+qB,SAAL,GAAmB,UAAU/qB,KAAV,EAAiB;AAAC8P,SAAGua,UAAH,CAAcrqB,KAAd;AAAsB,KAA3D;AACAtH,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,WAAhC,EAA6C6H,GAAG+a,WAAhD;AACAnyB,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,SAAhC,EAA2C6H,GAAGib,SAA9C;AACAryB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GA9BD;;AAiCA;;;;;AAKA6L,UAAQgD,SAAR,CAAkBic,YAAlB,GAAiC,UAAU9qB,KAAV,EAAiB;AAChD,SAAKgrB,MAAL,GAAc,IAAd;AACAhrB,YAAQA,SAASC,OAAOD,KAAxB;;AAEA;AACA,QAAIirB,QAAQ9J,WAAW4I,UAAU/pB,KAAV,CAAX,IAA+B,KAAK8pB,WAAhD;AACA,QAAIoB,QAAQ/J,WAAW8I,UAAUjqB,KAAV,CAAX,IAA+B,KAAKgqB,WAAhD;;AAEA;AACA,QAAIhqB,SAASA,MAAMmrB,OAAN,KAAkB,IAA/B,EAAqC;AACjC;AACA,UAAIC,SAAS,KAAK3P,KAAL,CAAW3S,WAAX,GAA0B,GAAvC;AACA,UAAIuiB,SAAS,KAAK5P,KAAL,CAAWkF,YAAX,GAA0B,GAAvC;;AAEA,UAAI2K,UAAU,CAAC,KAAKpB,kBAAL,CAAwB5c,CAAxB,IAA6B,CAA9B,IAAqC2d,QAAQG,MAAT,GAAmB,KAAK/R,MAAL,CAAYkS,SAAhC,GAA6C,GAA9F;AACA,UAAIC,UAAU,CAAC,KAAKtB,kBAAL,CAAwB3c,CAAxB,IAA6B,CAA9B,IAAqC2d,QAAQG,MAAT,GAAmB,KAAKhS,MAAL,CAAYkS,SAAhC,GAA6C,GAA9F;;AAEA,WAAKlS,MAAL,CAAYoS,SAAZ,CAAsBH,OAAtB,EAA+BE,OAA/B;AACA,WAAK3B,mBAAL,CAAyB7pB,KAAzB;AACD,KAVH,MAUS;AACL,UAAI0rB,gBAAgB,KAAKf,gBAAL,CAAsB3T,UAAtB,GAAmCiU,QAAQ,GAA/D;AACA,UAAIU,cAAgB,KAAKhB,gBAAL,CAAsB1T,QAAtB,GAAmCiU,QAAQ,GAA/D;;AAEA,UAAIU,YAAY,CAAhB,CAJK,CAIc;AACnB,UAAIC,YAAYzxB,KAAKmgB,GAAL,CAASqR,YAAY,GAAZ,GAAkB,CAAlB,GAAsBxxB,KAAKwuB,EAApC,CAAhB;;AAEA;AACA;AACA,UAAIxuB,KAAKutB,GAAL,CAASvtB,KAAKmgB,GAAL,CAASmR,aAAT,CAAT,IAAoCG,SAAxC,EAAmD;AAC/CH,wBAAgBtxB,KAAK0xB,KAAL,CAAWJ,gBAAgBtxB,KAAKwuB,EAAhC,IAAsCxuB,KAAKwuB,EAA3C,GAAgD,KAAhE;AACH;AACD,UAAIxuB,KAAKutB,GAAL,CAASvtB,KAAKqgB,GAAL,CAASiR,aAAT,CAAT,IAAoCG,SAAxC,EAAmD;AAC/CH,wBAAgB,CAACtxB,KAAK0xB,KAAL,CAAWJ,gBAAgBtxB,KAAKwuB,EAArB,GAA0B,GAArC,IAA4C,GAA7C,IAAoDxuB,KAAKwuB,EAAzD,GAA8D,KAA9E;AACH;;AAED;AACA,UAAIxuB,KAAKutB,GAAL,CAASvtB,KAAKmgB,GAAL,CAASoR,WAAT,CAAT,IAAkCE,SAAtC,EAAiD;AAC7CF,sBAAcvxB,KAAK0xB,KAAL,CAAWH,cAAcvxB,KAAKwuB,EAA9B,IAAoCxuB,KAAKwuB,EAAvD;AACH;AACD,UAAIxuB,KAAKutB,GAAL,CAASvtB,KAAKqgB,GAAL,CAASkR,WAAT,CAAT,IAAkCE,SAAtC,EAAiD;AAC7CF,sBAAc,CAACvxB,KAAK0xB,KAAL,CAAWH,cAAcvxB,KAAKwuB,EAAnB,GAAwB,GAAnC,IAA0C,GAA3C,IAAkDxuB,KAAKwuB,EAArE;AACH;AACD,WAAKvP,MAAL,CAAY0S,cAAZ,CAA2BL,aAA3B,EAA0CC,WAA1C;AACH;;AAED,SAAK9M,MAAL;;AAEA;AACA,QAAImN,aAAa,KAAK5K,iBAAL,EAAjB;AACA,SAAK6K,IAAL,CAAU,sBAAV,EAAkCD,UAAlC;;AAEAtzB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GApDD;;AAuDA;;;;;AAKA6L,UAAQgD,SAAR,CAAkBwb,UAAlB,GAA+B,UAAUrqB,KAAV,EAAiB;AAC9C,SAAKyb,KAAL,CAAWvX,KAAX,CAAiB0mB,MAAjB,GAA0B,MAA1B;AACA,SAAKR,cAAL,GAAsB,KAAtB;;AAEA;AACA1xB,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,WAAnC,EAAgD,KAAK4iB,WAArD;AACAnyB,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,SAAnC,EAAgD,KAAK8iB,SAArD;AACAryB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GARD;;AAUA;;;AAGA6L,UAAQgD,SAAR,CAAkB0R,QAAlB,GAA6B,UAAUvgB,KAAV,EAAiB;AAC5C,QAAI,CAAC,KAAKksB,gBAAV,EACE;AACF,QAAI,CAAC,KAAKlB,MAAV,EAAkB;AAChB,UAAImB,eAAe,KAAK1Q,KAAL,CAAW5d,qBAAX,EAAnB;AACA,UAAIuuB,SAASrC,UAAU/pB,KAAV,IAAmBmsB,aAAaruB,IAA7C;AACA,UAAIuuB,SAASpC,UAAUjqB,KAAV,IAAmBmsB,aAAajuB,GAA7C;AACA,UAAIouB,YAAY,KAAKC,gBAAL,CAAsBH,MAAtB,EAA8BC,MAA9B,CAAhB;AACA,UAAIC,SAAJ,EACI,KAAKJ,gBAAL,CAAsBI,UAAU5e,KAAV,CAAgBU,IAAtC;AACL,KAPD,MAQK;AAAE;AACL,WAAK4c,MAAL,GAAc,KAAd;AACD;AACDtyB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GAfD;;AAiBA;;;;AAIA6L,UAAQgD,SAAR,CAAkBwR,UAAlB,GAA+B,UAAUrgB,KAAV,EAAiB;AAC9C,QAAIiT,QAAQ,GAAZ,CAD8C,CAC7B;AACjB,QAAIkZ,eAAe,KAAK1Q,KAAL,CAAW5d,qBAAX,EAAnB;AACA,QAAIuuB,SAASrC,UAAU/pB,KAAV,IAAmBmsB,aAAaruB,IAA7C;AACA,QAAIuuB,SAASpC,UAAUjqB,KAAV,IAAmBmsB,aAAajuB,GAA7C;;AAEA,QAAI,CAAC,KAAKsuB,WAAV,EAAuB;AACrB;AACD;;AAED,QAAI,KAAKC,cAAT,EAAyB;AACvB7Y,mBAAa,KAAK6Y,cAAlB;AACD;;AAED;AACA,QAAI,KAAKrC,cAAT,EAAyB;AACvB,WAAKsC,YAAL;AACA;AACD;;AAED,QAAI,KAAKlW,OAAL,IAAgB,KAAKA,OAAL,CAAa8V,SAAjC,EAA4C;AAC1C;AACA,UAAIA,YAAY,KAAKC,gBAAL,CAAsBH,MAAtB,EAA8BC,MAA9B,CAAhB;AACA,UAAIC,cAAc,KAAK9V,OAAL,CAAa8V,SAA/B,EAA0C;AACxC;AACA,YAAIA,SAAJ,EAAe;AACb,eAAKK,YAAL,CAAkBL,SAAlB;AACD,SAFD,MAGK;AACH,eAAKI,YAAL;AACD;AACF;AACF,KAZD,MAaK;AACH;AACA,UAAI5c,KAAK,IAAT;AACA,WAAK2c,cAAL,GAAsB5Y,WAAW,YAAY;AAC3C/D,WAAG2c,cAAH,GAAoB,IAApB;;AAEA;AACA,YAAIH,YAAYxc,GAAGyc,gBAAH,CAAoBH,MAApB,EAA4BC,MAA5B,CAAhB;AACA,YAAIC,SAAJ,EAAe;AACbxc,aAAG6c,YAAH,CAAgBL,SAAhB;AACD;AACF,OARqB,EAQnBrZ,KARmB,CAAtB;AASD;AACF,GA9CD;;AAgDA;;;AAGApH,UAAQgD,SAAR,CAAkBoR,aAAlB,GAAkC,UAASjgB,KAAT,EAAgB;AAChD,SAAKwqB,SAAL,GAAiB,IAAjB;;AAEA,QAAI1a,KAAK,IAAT;AACA,SAAK8c,WAAL,GAAmB,UAAU5sB,KAAV,EAAiB;AAAC8P,SAAG+c,YAAH,CAAgB7sB,KAAhB;AAAwB,KAA7D;AACA,SAAK8sB,UAAL,GAAmB,UAAU9sB,KAAV,EAAiB;AAAC8P,SAAGid,WAAH,CAAe/sB,KAAf;AAAuB,KAA5D;AACAtH,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,WAAhC,EAA6C6H,GAAG8c,WAAhD;AACAl0B,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,UAAhC,EAA4C6H,GAAGgd,UAA/C;;AAEA,SAAK/M,YAAL,CAAkB/f,KAAlB;AACD,GAVD;;AAYA;;;AAGA6L,UAAQgD,SAAR,CAAkBge,YAAlB,GAAiC,UAAS7sB,KAAT,EAAgB;AAC/C,SAAK8qB,YAAL,CAAkB9qB,KAAlB;AACD,GAFD;;AAIA;;;AAGA6L,UAAQgD,SAAR,CAAkBke,WAAlB,GAAgC,UAAS/sB,KAAT,EAAgB;AAC9C,SAAKwqB,SAAL,GAAiB,KAAjB;;AAEA9xB,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,WAAnC,EAAgD,KAAK2kB,WAArD;AACAl0B,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,UAAnC,EAAiD,KAAK6kB,UAAtD;;AAEA,SAAKzC,UAAL,CAAgBrqB,KAAhB;AACD,GAPD;;AAUA;;;;;AAKA6L,UAAQgD,SAAR,CAAkBsR,QAAlB,GAA6B,UAASngB,KAAT,EAAgB;AAC3C,QAAI,CAACA,KAAL,EAAY;AACVA,cAAQC,OAAOD,KAAf;;AAEF;AACA,QAAIgtB,QAAQ,CAAZ;AACA,QAAIhtB,MAAMitB,UAAV,EAAsB;AAAE;AACtBD,cAAQhtB,MAAMitB,UAAN,GAAiB,GAAzB;AACD,KAFD,MAEO,IAAIjtB,MAAMktB,MAAV,EAAkB;AAAE;AACzB;AACA;AACAF,cAAQ,CAAChtB,MAAMktB,MAAP,GAAc,CAAtB;AACD;;AAED;AACA;AACA;AACA,QAAIF,KAAJ,EAAW;AACT,UAAIG,YAAY,KAAK9T,MAAL,CAAYkC,YAAZ,EAAhB;AACA,UAAI6R,YAAYD,aAAa,IAAIH,QAAQ,EAAzB,CAAhB;;AAEA,WAAK3T,MAAL,CAAYgU,YAAZ,CAAyBD,SAAzB;AACA,WAAKvO,MAAL;;AAEA,WAAK6N,YAAL;AACD;;AAED;AACA,QAAIV,aAAa,KAAK5K,iBAAL,EAAjB;AACA,SAAK6K,IAAL,CAAU,sBAAV,EAAkCD,UAAlC;;AAEA;AACA;AACA;AACAtzB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GAnCD;;AAqCA;;;;;;;;;AASA6L,UAAQgD,SAAR,CAAkBye,eAAlB,GAAoC,UAAU5f,KAAV,EAAiB6f,QAAjB,EAA2B;AAC7D,QAAInyB,IAAImyB,SAAS,CAAT,CAAR;AAAA,QACElyB,IAAIkyB,SAAS,CAAT,CADN;AAAA,QAEEhrB,IAAIgrB,SAAS,CAAT,CAFN;;AAIA,aAASC,IAAT,CAAelgB,CAAf,EAAkB;AAChB,aAAOA,IAAI,CAAJ,GAAQ,CAAR,GAAYA,IAAI,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAhC;AACD;;AAED,QAAImgB,KAAKD,KAAK,CAACnyB,EAAEiS,CAAF,GAAMlS,EAAEkS,CAAT,KAAeI,MAAMH,CAAN,GAAUnS,EAAEmS,CAA3B,IAAgC,CAAClS,EAAEkS,CAAF,GAAMnS,EAAEmS,CAAT,KAAeG,MAAMJ,CAAN,GAAUlS,EAAEkS,CAA3B,CAArC,CAAT;AACA,QAAIogB,KAAKF,KAAK,CAACjrB,EAAE+K,CAAF,GAAMjS,EAAEiS,CAAT,KAAeI,MAAMH,CAAN,GAAUlS,EAAEkS,CAA3B,IAAgC,CAAChL,EAAEgL,CAAF,GAAMlS,EAAEkS,CAAT,KAAeG,MAAMJ,CAAN,GAAUjS,EAAEiS,CAA3B,CAArC,CAAT;AACA,QAAIqgB,KAAKH,KAAK,CAACpyB,EAAEkS,CAAF,GAAM/K,EAAE+K,CAAT,KAAeI,MAAMH,CAAN,GAAUhL,EAAEgL,CAA3B,IAAgC,CAACnS,EAAEmS,CAAF,GAAMhL,EAAEgL,CAAT,KAAeG,MAAMJ,CAAN,GAAU/K,EAAE+K,CAA3B,CAArC,CAAT;;AAEA;AACA,WAAO,CAACmgB,MAAM,CAAN,IAAWC,MAAM,CAAjB,IAAsBD,MAAMC,EAA7B,MACJA,MAAM,CAAN,IAAWC,MAAM,CAAjB,IAAsBD,MAAMC,EADxB,MAEJF,MAAM,CAAN,IAAWE,MAAM,CAAjB,IAAsBF,MAAME,EAFxB,CAAP;AAGD,GAjBD;;AAmBA;;;;;;;;;AASA9hB,UAAQgD,SAAR,CAAkB0d,gBAAlB,GAAqC,UAAUjf,CAAV,EAAaC,CAAb,EAAgB;AACnD,QAAI9R,CAAJ;AAAA,QACEmyB,UAAU,GADZ;AAAA,QACiB;AACftB,gBAAY,IAFd;AAAA,QAGEuB,mBAAmB,IAHrB;AAAA,QAIEC,cAAc,IAJhB;AAAA,QAKE3U,SAAS,IAAIlN,OAAJ,CAAYqB,CAAZ,EAAeC,CAAf,CALX;;AAOA,QAAI,KAAKrJ,KAAL,KAAe2H,QAAQiJ,KAAR,CAAc2I,GAA7B,IACF,KAAKvZ,KAAL,KAAe2H,QAAQiJ,KAAR,CAAcgI,QAD3B,IAEF,KAAK5Y,KAAL,KAAe2H,QAAQiJ,KAAR,CAAciI,OAF/B,EAEwC;AACtC;AACA,WAAKthB,IAAI,KAAK2c,UAAL,CAAgBzc,MAAhB,GAAyB,CAAlC,EAAqCF,KAAK,CAA1C,EAA6CA,GAA7C,EAAkD;AAChD6wB,oBAAY,KAAKlU,UAAL,CAAgB3c,CAAhB,CAAZ;AACA,YAAIysB,WAAYoE,UAAUpE,QAA1B;AACA,YAAIA,QAAJ,EAAc;AACZ,eAAK,IAAInlB,IAAImlB,SAASvsB,MAAT,GAAkB,CAA/B,EAAkCoH,KAAK,CAAvC,EAA0CA,GAA1C,EAA+C;AAC7C;AACA,gBAAIklB,UAAUC,SAASnlB,CAAT,CAAd;AACA,gBAAIolB,UAAUF,QAAQE,OAAtB;AACA,gBAAI4F,YAAY,CAAC5F,QAAQ,CAAR,EAAWpM,MAAZ,EAAoBoM,QAAQ,CAAR,EAAWpM,MAA/B,EAAuCoM,QAAQ,CAAR,EAAWpM,MAAlD,CAAhB;AACA,gBAAIiS,YAAY,CAAC7F,QAAQ,CAAR,EAAWpM,MAAZ,EAAoBoM,QAAQ,CAAR,EAAWpM,MAA/B,EAAuCoM,QAAQ,CAAR,EAAWpM,MAAlD,CAAhB;AACA,gBAAI,KAAKuR,eAAL,CAAqBnU,MAArB,EAA6B4U,SAA7B,KACF,KAAKT,eAAL,CAAqBnU,MAArB,EAA6B6U,SAA7B,CADF,EAC2C;AACzC;AACA,qBAAO1B,SAAP;AACD;AACF;AACF;AACF;AACF,KAtBD,MAuBK;AACH;AACA,WAAK7wB,IAAI,CAAT,EAAYA,IAAI,KAAK2c,UAAL,CAAgBzc,MAAhC,EAAwCF,GAAxC,EAA6C;AAC3C6wB,oBAAY,KAAKlU,UAAL,CAAgB3c,CAAhB,CAAZ;AACA,YAAIiS,QAAQ4e,UAAUvQ,MAAtB;AACA,YAAIrO,KAAJ,EAAW;AACT,cAAIugB,QAAQ7zB,KAAKutB,GAAL,CAASra,IAAII,MAAMJ,CAAnB,CAAZ;AACA,cAAI4gB,QAAQ9zB,KAAKutB,GAAL,CAASpa,IAAIG,MAAMH,CAAnB,CAAZ;AACA,cAAI2O,OAAQ9hB,KAAK+zB,IAAL,CAAUF,QAAQA,KAAR,GAAgBC,QAAQA,KAAlC,CAAZ;;AAEA,cAAI,CAACJ,gBAAgB,IAAhB,IAAwB5R,OAAO4R,WAAhC,KAAgD5R,OAAO0R,OAA3D,EAAoE;AAClEE,0BAAc5R,IAAd;AACA2R,+BAAmBvB,SAAnB;AACD;AACF;AACF;AACF;;AAGD,WAAOuB,gBAAP;AACD,GAnDD;;AAqDA;;;;;AAKAhiB,UAAQgD,SAAR,CAAkB8d,YAAlB,GAAiC,UAAUL,SAAV,EAAqB;AACpD,QAAIte,OAAJ,EAAaogB,IAAb,EAAmBC,GAAnB;;AAEA,QAAI,CAAC,KAAK7X,OAAV,EAAmB;AACjBxI,gBAAU/F,SAASC,aAAT,CAAuB,KAAvB,CAAV;AACA8F,cAAQ9J,KAAR,CAAcoE,QAAd,GAAyB,UAAzB;AACA0F,cAAQ9J,KAAR,CAAc0b,OAAd,GAAwB,MAAxB;AACA5R,cAAQ9J,KAAR,CAAcZ,MAAd,GAAuB,mBAAvB;AACA0K,cAAQ9J,KAAR,CAActC,KAAd,GAAsB,SAAtB;AACAoM,cAAQ9J,KAAR,CAAcb,UAAd,GAA2B,uBAA3B;AACA2K,cAAQ9J,KAAR,CAAcoqB,YAAd,GAA6B,KAA7B;AACAtgB,cAAQ9J,KAAR,CAAcqqB,SAAd,GAA0B,oCAA1B;;AAEAH,aAAOnmB,SAASC,aAAT,CAAuB,KAAvB,CAAP;AACAkmB,WAAKlqB,KAAL,CAAWoE,QAAX,GAAsB,UAAtB;AACA8lB,WAAKlqB,KAAL,CAAWkE,MAAX,GAAoB,MAApB;AACAgmB,WAAKlqB,KAAL,CAAWiE,KAAX,GAAmB,GAAnB;AACAimB,WAAKlqB,KAAL,CAAWsqB,UAAX,GAAwB,mBAAxB;;AAEAH,YAAMpmB,SAASC,aAAT,CAAuB,KAAvB,CAAN;AACAmmB,UAAInqB,KAAJ,CAAUoE,QAAV,GAAqB,UAArB;AACA+lB,UAAInqB,KAAJ,CAAUkE,MAAV,GAAmB,GAAnB;AACAimB,UAAInqB,KAAJ,CAAUiE,KAAV,GAAkB,GAAlB;AACAkmB,UAAInqB,KAAJ,CAAUZ,MAAV,GAAmB,mBAAnB;AACA+qB,UAAInqB,KAAJ,CAAUoqB,YAAV,GAAyB,KAAzB;;AAEA,WAAK9X,OAAL,GAAe;AACb8V,mBAAW,IADE;AAEbmC,aAAK;AACHzgB,mBAASA,OADN;AAEHogB,gBAAMA,IAFH;AAGHC,eAAKA;AAHF;AAFQ,OAAf;AAQD,KA/BD,MAgCK;AACHrgB,gBAAU,KAAKwI,OAAL,CAAaiY,GAAb,CAAiBzgB,OAA3B;AACAogB,aAAQ,KAAK5X,OAAL,CAAaiY,GAAb,CAAiBL,IAAzB;AACAC,YAAQ,KAAK7X,OAAL,CAAaiY,GAAb,CAAiBJ,GAAzB;AACD;;AAED,SAAK3B,YAAL;;AAEA,SAAKlW,OAAL,CAAa8V,SAAb,GAAyBA,SAAzB;AACA,QAAI,OAAO,KAAKE,WAAZ,KAA4B,UAAhC,EAA4C;AAC1Cxe,cAAQ6R,SAAR,GAAoB,KAAK2M,WAAL,CAAiBF,UAAU5e,KAA3B,CAApB;AACD,KAFD,MAGK;AACHM,cAAQ6R,SAAR,GAAoB,YAClB,UADkB,GACL,KAAK1K,MADA,GACS,YADT,GACwBmX,UAAU5e,KAAV,CAAgBJ,CADxC,GAC4C,YAD5C,GAElB,UAFkB,GAEL,KAAK8H,MAFA,GAES,YAFT,GAEwBkX,UAAU5e,KAAV,CAAgBH,CAFxC,GAE4C,YAF5C,GAGlB,UAHkB,GAGL,KAAK8H,MAHA,GAGS,YAHT,GAGwBiX,UAAU5e,KAAV,CAAgBuL,CAHxC,GAG4C,YAH5C,GAIlB,UAJF;AAKD;;AAEDjL,YAAQ9J,KAAR,CAAcpG,IAAd,GAAsB,GAAtB;AACAkQ,YAAQ9J,KAAR,CAAchG,GAAd,GAAsB,GAAtB;AACA,SAAKud,KAAL,CAAWhT,WAAX,CAAuBuF,OAAvB;AACA,SAAKyN,KAAL,CAAWhT,WAAX,CAAuB2lB,IAAvB;AACA,SAAK3S,KAAL,CAAWhT,WAAX,CAAuB4lB,GAAvB;;AAEA;AACA,QAAIK,eAAgB1gB,QAAQpF,WAA5B;AACA,QAAI+lB,gBAAkB3gB,QAAQ4gB,YAA9B;AACA,QAAIC,aAAgBT,KAAKQ,YAAzB;AACA,QAAIE,WAAcT,IAAIzlB,WAAtB;AACA,QAAImmB,YAAgBV,IAAIO,YAAxB;;AAEA,QAAI9wB,OAAOwuB,UAAUvQ,MAAV,CAAiBzO,CAAjB,GAAqBohB,eAAe,CAA/C;AACA5wB,WAAO1D,KAAKJ,GAAL,CAASI,KAAKH,GAAL,CAAS6D,IAAT,EAAe,EAAf,CAAT,EAA6B,KAAK2d,KAAL,CAAW3S,WAAX,GAAyB,EAAzB,GAA8B4lB,YAA3D,CAAP;;AAEAN,SAAKlqB,KAAL,CAAWpG,IAAX,GAAoBwuB,UAAUvQ,MAAV,CAAiBzO,CAAjB,GAAqB,IAAzC;AACA8gB,SAAKlqB,KAAL,CAAWhG,GAAX,GAAqBouB,UAAUvQ,MAAV,CAAiBxO,CAAjB,GAAqBshB,UAAtB,GAAoC,IAAxD;AACA7gB,YAAQ9J,KAAR,CAAcpG,IAAd,GAAsBA,OAAO,IAA7B;AACAkQ,YAAQ9J,KAAR,CAAchG,GAAd,GAAuBouB,UAAUvQ,MAAV,CAAiBxO,CAAjB,GAAqBshB,UAArB,GAAkCF,aAAnC,GAAoD,IAA1E;AACAN,QAAInqB,KAAJ,CAAUpG,IAAV,GAAqBwuB,UAAUvQ,MAAV,CAAiBzO,CAAjB,GAAqBwhB,WAAW,CAAjC,GAAsC,IAA1D;AACAT,QAAInqB,KAAJ,CAAUhG,GAAV,GAAqBouB,UAAUvQ,MAAV,CAAiBxO,CAAjB,GAAqBwhB,YAAY,CAAlC,GAAuC,IAA3D;AACD,GA7ED;;AA+EA;;;;AAIAljB,UAAQgD,SAAR,CAAkB6d,YAAlB,GAAiC,YAAY;AAC3C,QAAI,KAAKlW,OAAT,EAAkB;AAChB,WAAKA,OAAL,CAAa8V,SAAb,GAAyB,IAAzB;;AAEA,WAAK,IAAIrxB,IAAT,IAAiB,KAAKub,OAAL,CAAaiY,GAA9B,EAAmC;AACjC,YAAI,KAAKjY,OAAL,CAAaiY,GAAb,CAAiBvzB,cAAjB,CAAgCD,IAAhC,CAAJ,EAA2C;AACzC,cAAI2C,OAAO,KAAK4Y,OAAL,CAAaiY,GAAb,CAAiBxzB,IAAjB,CAAX;AACA,cAAI2C,QAAQA,KAAK2C,UAAjB,EAA6B;AAC3B3C,iBAAK2C,UAAL,CAAgBzG,WAAhB,CAA4B8D,IAA5B;AACD;AACF;AACF;AACF;AACF,GAbD;;AAeA;;AAGA;;;;;;AAMA,WAASmsB,SAAT,CAAoB/pB,KAApB,EAA2B;AACzB,QAAI,aAAaA,KAAjB,EAAwB,OAAOA,MAAMgvB,OAAb;AACxB,WAAOhvB,MAAMivB,aAAN,CAAoB,CAApB,KAA0BjvB,MAAMivB,aAAN,CAAoB,CAApB,EAAuBD,OAAjD,IAA4D,CAAnE;AACD;;AAED;;;;;;AAMA,WAAS/E,SAAT,CAAoBjqB,KAApB,EAA2B;AACzB,QAAI,aAAaA,KAAjB,EAAwB,OAAOA,MAAMkvB,OAAb;AACxB,WAAOlvB,MAAMivB,aAAN,CAAoB,CAApB,KAA0BjvB,MAAMivB,aAAN,CAAoB,CAApB,EAAuBC,OAAjD,IAA4D,CAAnE;AACD;;AAGD;AACA;AACA;;AAEA;;;;;;;;;;;;;AAaArjB,UAAQgD,SAAR,CAAkBsgB,iBAAlB,GAAsC,UAAS9N,GAAT,EAAc;AAClDxM,aAASsa,iBAAT,CAA2B9N,GAA3B,EAAgC,IAAhC;AACA,SAAKxC,MAAL;AACD,GAHD;;AAMA;;;;;;;;AAQAhT,UAAQgD,SAAR,CAAkBugB,OAAlB,GAA4B,UAASjnB,KAAT,EAAgBC,MAAhB,EAAwB;AACnD,SAAKqY,QAAL,CAActY,KAAd,EAAqBC,MAArB;AACA,SAAKyW,MAAL;AACA,GAHD;;AAKA;AACA;AACA;;;AAGAzV,SAAOvQ,OAAP,GAAiBgT,OAAjB,C;;;;;;;ACv4EA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,MAAM;AACjB,cAAY;AACZ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA2C,SAAS;AACpD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,cAAY;AACZ;AACA;;AAEA;AACA;AACA;;;;;;;;;ACnKA;;;;;;AAMA,WAASK,OAAT,CAAiBoB,CAAjB,EAAoBC,CAApB,EAAuB0L,CAAvB,EAA0B;AACxB,SAAK3L,CAAL,GAASA,MAAM/R,SAAN,GAAkB+R,CAAlB,GAAsB,CAA/B;AACA,SAAKC,CAAL,GAASA,MAAMhS,SAAN,GAAkBgS,CAAlB,GAAsB,CAA/B;AACA,SAAK0L,CAAL,GAASA,MAAM1d,SAAN,GAAkB0d,CAAlB,GAAsB,CAA/B;AACD;;AAED;;;;;;AAMA/M,UAAQod,QAAR,GAAmB,UAASluB,CAAT,EAAYC,CAAZ,EAAe;AAChC,QAAIg0B,MAAM,IAAInjB,OAAJ,EAAV;AACAmjB,QAAI/hB,CAAJ,GAAQlS,EAAEkS,CAAF,GAAMjS,EAAEiS,CAAhB;AACA+hB,QAAI9hB,CAAJ,GAAQnS,EAAEmS,CAAF,GAAMlS,EAAEkS,CAAhB;AACA8hB,QAAIpW,CAAJ,GAAQ7d,EAAE6d,CAAF,GAAM5d,EAAE4d,CAAhB;AACA,WAAOoW,GAAP;AACD,GAND;;AAQA;;;;;;AAMAnjB,UAAQyC,GAAR,GAAc,UAASvT,CAAT,EAAYC,CAAZ,EAAe;AAC3B,QAAIi0B,MAAM,IAAIpjB,OAAJ,EAAV;AACAojB,QAAIhiB,CAAJ,GAAQlS,EAAEkS,CAAF,GAAMjS,EAAEiS,CAAhB;AACAgiB,QAAI/hB,CAAJ,GAAQnS,EAAEmS,CAAF,GAAMlS,EAAEkS,CAAhB;AACA+hB,QAAIrW,CAAJ,GAAQ7d,EAAE6d,CAAF,GAAM5d,EAAE4d,CAAhB;AACA,WAAOqW,GAAP;AACD,GAND;;AAQA;;;;;;AAMApjB,UAAQkc,GAAR,GAAc,UAAShtB,CAAT,EAAYC,CAAZ,EAAe;AAC3B,WAAO,IAAI6Q,OAAJ,CACC,CAAC9Q,EAAEkS,CAAF,GAAMjS,EAAEiS,CAAT,IAAc,CADf,EAEC,CAAClS,EAAEmS,CAAF,GAAMlS,EAAEkS,CAAT,IAAc,CAFf,EAGC,CAACnS,EAAE6d,CAAF,GAAM5d,EAAE4d,CAAT,IAAc,CAHf,CAAP;AAKD,GAND;;AAQA;;;;;;;AAOA/M,UAAQud,YAAR,GAAuB,UAASruB,CAAT,EAAYC,CAAZ,EAAe;AACpC,QAAImuB,eAAe,IAAItd,OAAJ,EAAnB;;AAEAsd,iBAAalc,CAAb,GAAiBlS,EAAEmS,CAAF,GAAMlS,EAAE4d,CAAR,GAAY7d,EAAE6d,CAAF,GAAM5d,EAAEkS,CAArC;AACAic,iBAAajc,CAAb,GAAiBnS,EAAE6d,CAAF,GAAM5d,EAAEiS,CAAR,GAAYlS,EAAEkS,CAAF,GAAMjS,EAAE4d,CAArC;AACAuQ,iBAAavQ,CAAb,GAAiB7d,EAAEkS,CAAF,GAAMjS,EAAEkS,CAAR,GAAYnS,EAAEmS,CAAF,GAAMlS,EAAEiS,CAArC;;AAEA,WAAOkc,YAAP;AACD,GARD;;AAWA;;;;AAIAtd,UAAQ2C,SAAR,CAAkBlT,MAAlB,GAA2B,YAAW;AACpC,WAAOvB,KAAK+zB,IAAL,CACC,KAAK7gB,CAAL,GAAS,KAAKA,CAAd,GACA,KAAKC,CAAL,GAAS,KAAKA,CADd,GAEA,KAAK0L,CAAL,GAAS,KAAKA,CAHf,CAAP;AAKD,GAND;;AAQA7P,SAAOvQ,OAAP,GAAiBqT,OAAjB,C;;;;;;;;ACpFA;;;;;AAKA,WAASD,OAAT,CAAkBqB,CAAlB,EAAqBC,CAArB,EAAwB;AACtB,SAAKD,CAAL,GAASA,MAAM/R,SAAN,GAAkB+R,CAAlB,GAAsB,CAA/B;AACA,SAAKC,CAAL,GAASA,MAAMhS,SAAN,GAAkBgS,CAAlB,GAAsB,CAA/B;AACD;;AAEDnE,SAAOvQ,OAAP,GAAiBoT,OAAjB,C;;;;;;;;;;;;;;ACVA,MAAIC,UAAU,mBAAAvT,CAAQ,EAAR,CAAd;;AAEA;;;;;;;;;;AAUA,WAASoT,MAAT,GAAkB;AAChB,SAAKwjB,WAAL,GAAmB,IAAIrjB,OAAJ,EAAnB;AACA,SAAKsjB,WAAL,GAAmB,EAAnB;AACA,SAAKA,WAAL,CAAiBxY,UAAjB,GAA8B,CAA9B;AACA,SAAKwY,WAAL,CAAiBvY,QAAjB,GAA4B,CAA5B;AACA,SAAKsU,SAAL,GAAiB,GAAjB;AACA,SAAKkE,YAAL,GAAoB,IAAIvjB,OAAJ,EAApB;AACA,SAAKwjB,gBAAL,GAAwB,GAAxB;;AAEA,SAAK9V,cAAL,GAAsB,IAAI1N,OAAJ,EAAtB;AACA,SAAK4N,cAAL,GAAuB,IAAI5N,OAAJ,CAAY,MAAI9R,KAAKwuB,EAArB,EAAyB,CAAzB,EAA4B,CAA5B,CAAvB;;AAEA,SAAK+G,0BAAL;AACD;;AAED;;;;;AAKA5jB,SAAO8C,SAAP,CAAiB4c,SAAjB,GAA6B,UAASne,CAAT,EAAYC,CAAZ,EAAe;AAC1C,QAAIoa,MAAMvtB,KAAKutB,GAAf;AAAA,QACI6F,wBADJ;AAAA,QAEIoC,MAAM,KAAKF,gBAFf;AAAA,QAGIpsB,SAAS,KAAKioB,SAAL,GAAiBqE,GAH9B;;AAKA,QAAIjI,IAAIra,CAAJ,IAAShK,MAAb,EAAqB;AACjBgK,UAAIkgB,KAAKlgB,CAAL,IAAUhK,MAAd;AACH;AACD,QAAIqkB,IAAIpa,CAAJ,IAASjK,MAAb,EAAqB;AACjBiK,UAAIigB,KAAKjgB,CAAL,IAAUjK,MAAd;AACH;AACD,SAAKmsB,YAAL,CAAkBniB,CAAlB,GAAsBA,CAAtB;AACA,SAAKmiB,YAAL,CAAkBliB,CAAlB,GAAsBA,CAAtB;AACA,SAAKoiB,0BAAL;AACD,GAfD;;AAiBA;;;;AAIA5jB,SAAO8C,SAAP,CAAiBsb,SAAjB,GAA6B,UAAS7c,CAAT,EAAYC,CAAZ,EAAe;AAC1C,WAAO,KAAKkiB,YAAZ;AACD,GAFD;;AAIA;;;;;;AAMA1jB,SAAO8C,SAAP,CAAiByK,cAAjB,GAAkC,UAAShM,CAAT,EAAYC,CAAZ,EAAe0L,CAAf,EAAkB;AAClD,SAAKsW,WAAL,CAAiBjiB,CAAjB,GAAqBA,CAArB;AACA,SAAKiiB,WAAL,CAAiBhiB,CAAjB,GAAqBA,CAArB;AACA,SAAKgiB,WAAL,CAAiBtW,CAAjB,GAAqBA,CAArB;;AAEA,SAAK0W,0BAAL;AACD,GAND;;AAQA;;;;;;;;AAQA5jB,SAAO8C,SAAP,CAAiBkd,cAAjB,GAAkC,UAAS/U,UAAT,EAAqBC,QAArB,EAA+B;AAC/D,QAAID,eAAezb,SAAnB,EAA8B;AAC5B,WAAKi0B,WAAL,CAAiBxY,UAAjB,GAA8BA,UAA9B;AACD;;AAED,QAAIC,aAAa1b,SAAjB,EAA4B;AAC1B,WAAKi0B,WAAL,CAAiBvY,QAAjB,GAA4BA,QAA5B;AACA,UAAI,KAAKuY,WAAL,CAAiBvY,QAAjB,GAA4B,CAAhC,EAAmC,KAAKuY,WAAL,CAAiBvY,QAAjB,GAA4B,CAA5B;AACnC,UAAI,KAAKuY,WAAL,CAAiBvY,QAAjB,GAA4B,MAAI7c,KAAKwuB,EAAzC,EAA6C,KAAK4G,WAAL,CAAiBvY,QAAjB,GAA4B,MAAI7c,KAAKwuB,EAArC;AAC9C;;AAED,QAAI5R,eAAezb,SAAf,IAA4B0b,aAAa1b,SAA7C,EAAwD;AACtD,WAAKo0B,0BAAL;AACD;AACF,GAdD;;AAgBA;;;;AAIA5jB,SAAO8C,SAAP,CAAiByS,cAAjB,GAAkC,YAAW;AAC3C,QAAIuO,MAAM,EAAV;AACAA,QAAI7Y,UAAJ,GAAiB,KAAKwY,WAAL,CAAiBxY,UAAlC;AACA6Y,QAAI5Y,QAAJ,GAAe,KAAKuY,WAAL,CAAiBvY,QAAhC;;AAEA,WAAO4Y,GAAP;AACD,GAND;;AAQA;;;;AAIA9jB,SAAO8C,SAAP,CAAiBwe,YAAjB,GAAgC,UAAS1xB,MAAT,EAAiB;AAC/C,QAAIA,WAAWJ,SAAf,EACE;;AAEF,SAAKgwB,SAAL,GAAiB5vB,MAAjB;;AAEA;AACA;AACA;AACA,QAAI,KAAK4vB,SAAL,GAAiB,IAArB,EAA2B,KAAKA,SAAL,GAAiB,IAAjB;AAC3B,QAAI,KAAKA,SAAL,GAAiB,GAArB,EAA0B,KAAKA,SAAL,GAAiB,GAAjB;;AAE1B,SAAKE,SAAL,CAAe,KAAKgE,YAAL,CAAkBniB,CAAjC,EAAoC,KAAKmiB,YAAL,CAAkBliB,CAAtD;AACA,SAAKoiB,0BAAL;AACD,GAdD;;AAgBA;;;;AAIA5jB,SAAO8C,SAAP,CAAiB0M,YAAjB,GAAgC,YAAW;AACzC,WAAO,KAAKgQ,SAAZ;AACD,GAFD;;AAIA;;;;AAIAxf,SAAO8C,SAAP,CAAiBgL,iBAAjB,GAAqC,YAAW;AAC9C,WAAO,KAAKD,cAAZ;AACD,GAFD;;AAIA;;;;AAIA7N,SAAO8C,SAAP,CAAiBkL,iBAAjB,GAAqC,YAAW;AAC9C,WAAO,KAAKD,cAAZ;AACD,GAFD;;AAIA;;;;AAIA/N,SAAO8C,SAAP,CAAiB8gB,0BAAjB,GAA8C,YAAW;AACvD;AACA,SAAK/V,cAAL,CAAoBtM,CAApB,GAAwB,KAAKiiB,WAAL,CAAiBjiB,CAAjB,GAAqB,KAAKie,SAAL,GAAiBnxB,KAAKmgB,GAAL,CAAS,KAAKiV,WAAL,CAAiBxY,UAA1B,CAAjB,GAAyD5c,KAAKqgB,GAAL,CAAS,KAAK+U,WAAL,CAAiBvY,QAA1B,CAAtG;AACA,SAAK2C,cAAL,CAAoBrM,CAApB,GAAwB,KAAKgiB,WAAL,CAAiBhiB,CAAjB,GAAqB,KAAKge,SAAL,GAAiBnxB,KAAKqgB,GAAL,CAAS,KAAK+U,WAAL,CAAiBxY,UAA1B,CAAjB,GAAyD5c,KAAKqgB,GAAL,CAAS,KAAK+U,WAAL,CAAiBvY,QAA1B,CAAtG;AACA,SAAK2C,cAAL,CAAoBX,CAApB,GAAwB,KAAKsW,WAAL,CAAiBtW,CAAjB,GAAqB,KAAKsS,SAAL,GAAiBnxB,KAAKmgB,GAAL,CAAS,KAAKiV,WAAL,CAAiBvY,QAA1B,CAA9D;;AAEA;AACA,SAAK6C,cAAL,CAAoBxM,CAApB,GAAwBlT,KAAKwuB,EAAL,GAAQ,CAAR,GAAY,KAAK4G,WAAL,CAAiBvY,QAArD;AACA,SAAK6C,cAAL,CAAoBvM,CAApB,GAAwB,CAAxB;AACA,SAAKuM,cAAL,CAAoBb,CAApB,GAAwB,CAAC,KAAKuW,WAAL,CAAiBxY,UAA1C;;AAEA,QAAI8Y,KAAK,KAAKhW,cAAL,CAAoBxM,CAA7B;AACA,QAAIyiB,KAAK,KAAKjW,cAAL,CAAoBvM,CAA7B;AACA,QAAIyiB,KAAK,KAAKlW,cAAL,CAAoBb,CAA7B;AACA,QAAI6B,KAAK,KAAK2U,YAAL,CAAkBniB,CAA3B;AACA,QAAIyN,KAAK,KAAK0U,YAAL,CAAkBliB,CAA3B;AACA,QAAIgN,MAAMngB,KAAKmgB,GAAf;AAAA,QAAoBE,MAAMrgB,KAAKqgB,GAA/B;;AAEA,SAAKb,cAAL,CAAoBtM,CAApB,GAAwB,KAAKsM,cAAL,CAAoBtM,CAApB,GAAwBwN,KAAKL,IAAIuV,EAAJ,CAA7B,GAAuCjV,KAAK,CAAER,IAAIyV,EAAJ,CAAP,GAAiBvV,IAAIqV,EAAJ,CAAhF;AACA,SAAKlW,cAAL,CAAoBrM,CAApB,GAAwB,KAAKqM,cAAL,CAAoBrM,CAApB,GAAwBuN,KAAKP,IAAIyV,EAAJ,CAA7B,GAAuCjV,KAAKN,IAAIuV,EAAJ,CAAL,GAAevV,IAAIqV,EAAJ,CAA9E;AACA,SAAKlW,cAAL,CAAoBX,CAApB,GAAwB,KAAKW,cAAL,CAAoBX,CAApB,GAAwB8B,KAAKR,IAAIuV,EAAJ,CAArD;AACD,GArBD;;AAuBA1mB,SAAOvQ,OAAP,GAAiBkT,MAAjB,C;;;;;;AClLA,oBAAkB,yD;;;;;;ACAlB;AACA,qD;;;;;;ACDA;AACA;;AAEA,8BAA4B,+BAA8B,E;;;;;;ACH1D;AACA;AACA;AACA,I;;;;;;;;ACHA,MAAIJ,WAAW,mBAAAhT,CAAQ,EAAR,CAAf;;AAEA;;;;;;;AAOA,WAASqT,MAAT,CAAiBoC,IAAjB,EAAuBmO,MAAvB,EAA+B0T,KAA/B,EAAsC;AACpC,SAAK7hB,IAAL,GAAYA,IAAZ;AACA,SAAKmO,MAAL,GAAcA,MAAd;AACA,SAAK0T,KAAL,GAAaA,KAAb,CAHoC,CAGhB;;AAEpB,SAAKxxB,KAAL,GAAalD,SAAb;AACA,SAAKjC,KAAL,GAAaiC,SAAb;;AAEA;AACA,SAAKmX,MAAL,GAAcud,MAAMzT,iBAAN,CAAwBpO,KAAKsC,GAAL,EAAxB,EAAoC,KAAK6L,MAAzC,CAAd;;AAEA;AACA,SAAK7J,MAAL,CAAYb,IAAZ,CAAiB,UAAUzW,CAAV,EAAaC,CAAb,EAAgB;AAC/B,aAAOD,IAAIC,CAAJ,GAAQ,CAAR,GAAYD,IAAIC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAhC;AACD,KAFD;;AAIA,QAAI,KAAKqX,MAAL,CAAY/W,MAAZ,GAAqB,CAAzB,EAA4B;AAC1B,WAAK4pB,WAAL,CAAiB,CAAjB;AACD;;AAED;AACA,SAAKnN,UAAL,GAAkB,EAAlB;;AAEA,SAAK8X,MAAL,GAAc,KAAd;AACA,SAAKC,cAAL,GAAsB50B,SAAtB;;AAEA,QAAI00B,MAAMha,gBAAV,EAA4B;AAC1B,WAAKia,MAAL,GAAc,KAAd;AACA,WAAKE,gBAAL;AACD,KAHD,MAIK;AACH,WAAKF,MAAL,GAAc,IAAd;AACD;AACF;;AAGD;;;;AAIAlkB,SAAO6C,SAAP,CAAiBwhB,QAAjB,GAA4B,YAAW;AACrC,WAAO,KAAKH,MAAZ;AACD,GAFD;;AAKA;;;;AAIAlkB,SAAO6C,SAAP,CAAiByhB,iBAAjB,GAAqC,YAAW;AAC9C,QAAI1zB,MAAM,KAAK8V,MAAL,CAAY/W,MAAtB;;AAEA,QAAIF,IAAI,CAAR;AACA,WAAO,KAAK2c,UAAL,CAAgB3c,CAAhB,CAAP,EAA2B;AACzBA;AACD;;AAED,WAAOrB,KAAK0xB,KAAL,CAAWrwB,IAAImB,GAAJ,GAAU,GAArB,CAAP;AACD,GATD;;AAYA;;;;AAIAoP,SAAO6C,SAAP,CAAiB6W,QAAjB,GAA4B,YAAW;AACrC,WAAO,KAAKuK,KAAL,CAAWhb,WAAlB;AACD,GAFD;;AAKA;;;;AAIAjJ,SAAO6C,SAAP,CAAiB0hB,SAAjB,GAA6B,YAAW;AACtC,WAAO,KAAKhU,MAAZ;AACD,GAFD;;AAIA;;;;AAIAvQ,SAAO6C,SAAP,CAAiB8W,gBAAjB,GAAoC,YAAW;AAC7C,QAAI,KAAKlnB,KAAL,KAAelD,SAAnB,EACE,OAAOA,SAAP;;AAEF,WAAO,KAAKmX,MAAL,CAAY,KAAKjU,KAAjB,CAAP;AACD,GALD;;AAOA;;;;AAIAuN,SAAO6C,SAAP,CAAiB2hB,SAAjB,GAA6B,YAAW;AACtC,WAAO,KAAK9d,MAAZ;AACD,GAFD;;AAIA;;;;;AAKA1G,SAAO6C,SAAP,CAAiB4hB,QAAjB,GAA4B,UAAShyB,KAAT,EAAgB;AAC1C,QAAIA,SAAS,KAAKiU,MAAL,CAAY/W,MAAzB,EACE,MAAM,IAAIM,KAAJ,CAAU,oBAAV,CAAN;;AAEF,WAAO,KAAKyW,MAAL,CAAYjU,KAAZ,CAAP;AACD,GALD;;AAQA;;;;;AAKAuN,SAAO6C,SAAP,CAAiBiQ,cAAjB,GAAkC,UAASrgB,KAAT,EAAgB;AAChD,QAAIA,UAAUlD,SAAd,EACEkD,QAAQ,KAAKA,KAAb;;AAEF,QAAIA,UAAUlD,SAAd,EACE,OAAO,EAAP;;AAEF,QAAI6c,UAAJ;AACA,QAAI,KAAKA,UAAL,CAAgB3Z,KAAhB,CAAJ,EAA4B;AAC1B2Z,mBAAa,KAAKA,UAAL,CAAgB3Z,KAAhB,CAAb;AACD,KAFD,MAGK;AACH,UAAImG,IAAI,EAAR;AACAA,QAAE2X,MAAF,GAAW,KAAKA,MAAhB;AACA3X,QAAEtL,KAAF,GAAU,KAAKoZ,MAAL,CAAYjU,KAAZ,CAAV;;AAEA,UAAIiyB,WAAW,IAAI/kB,QAAJ,CAAa,KAAKyC,IAAlB,EAAuB,EAACiB,QAAQ,gBAAU1I,IAAV,EAAgB;AAAC,iBAAQA,KAAK/B,EAAE2X,MAAP,KAAkB3X,EAAEtL,KAA5B;AAAoC,SAA9D,EAAvB,EAAwFoX,GAAxF,EAAf;AACA0H,mBAAa,KAAK6X,KAAL,CAAWnR,cAAX,CAA0B4R,QAA1B,CAAb;;AAEA,WAAKtY,UAAL,CAAgB3Z,KAAhB,IAAyB2Z,UAAzB;AACD;;AAED,WAAOA,UAAP;AACD,GAvBD;;AA2BA;;;AAGApM,SAAO6C,SAAP,CAAiB+P,iBAAjB,GAAqC,UAAShgB,QAAT,EAAmB;AACtD,SAAKuxB,cAAL,GAAsBvxB,QAAtB;AACD,GAFD;;AAKA;;;;;AAKAoN,SAAO6C,SAAP,CAAiB0W,WAAjB,GAA+B,UAAS9mB,KAAT,EAAgB;AAC7C,QAAIA,SAAS,KAAKiU,MAAL,CAAY/W,MAAzB,EACE,MAAM,IAAIM,KAAJ,CAAU,oBAAV,CAAN;;AAEF,SAAKwC,KAAL,GAAaA,KAAb;AACA,SAAKnF,KAAL,GAAa,KAAKoZ,MAAL,CAAYjU,KAAZ,CAAb;AACD,GAND;;AAQA;;;;AAIAuN,SAAO6C,SAAP,CAAiBuhB,gBAAjB,GAAoC,UAAS3xB,KAAT,EAAgB;AAClD,QAAIA,UAAUlD,SAAd,EACEkD,QAAQ,CAAR;;AAEF,QAAIgd,QAAQ,KAAKwU,KAAL,CAAWxU,KAAvB;;AAEA,QAAIhd,QAAQ,KAAKiU,MAAL,CAAY/W,MAAxB,EAAgC;AAC9B,UAAIg1B,iBAAiB,KAAK7R,cAAL,CAAoBrgB,KAApB,CAArB;AACA;;AAEA;AACA,UAAIgd,MAAMmV,QAAN,KAAmBr1B,SAAvB,EAAkC;AAChCkgB,cAAMmV,QAAN,GAAiB3oB,SAASC,aAAT,CAAuB,KAAvB,CAAjB;AACAuT,cAAMmV,QAAN,CAAe1sB,KAAf,CAAqBoE,QAArB,GAAgC,UAAhC;AACAmT,cAAMmV,QAAN,CAAe1sB,KAAf,CAAqBtC,KAArB,GAA6B,MAA7B;AACA6Z,cAAMhT,WAAN,CAAkBgT,MAAMmV,QAAxB;AACD;AACD,UAAIA,WAAW,KAAKN,iBAAL,EAAf;AACA7U,YAAMmV,QAAN,CAAe/Q,SAAf,GAA2B,0BAA0B+Q,QAA1B,GAAqC,GAAhE;AACA;AACAnV,YAAMmV,QAAN,CAAe1sB,KAAf,CAAqB+X,MAArB,GAA8B,KAAK,IAAnC,CAd8B,CAcW;AACzCR,YAAMmV,QAAN,CAAe1sB,KAAf,CAAqBpG,IAArB,GAA4B,KAAK,IAAjC;;AAEA,UAAIgS,KAAK,IAAT;AACA+D,iBAAW,YAAW;AAAC/D,WAAGsgB,gBAAH,CAAoB3xB,QAAM,CAA1B;AAA8B,OAArD,EAAuD,EAAvD;AACA,WAAKyxB,MAAL,GAAc,KAAd;AACD,KApBD,MAqBK;AACH,WAAKA,MAAL,GAAc,IAAd;;AAEA;AACA,UAAIzU,MAAMmV,QAAN,KAAmBr1B,SAAvB,EAAkC;AAChCkgB,cAAM3hB,WAAN,CAAkB2hB,MAAMmV,QAAxB;AACAnV,cAAMmV,QAAN,GAAiBr1B,SAAjB;AACD;;AAED,UAAI,KAAK40B,cAAT,EACE,KAAKA,cAAL;AACH;AACF,GAvCD;;AAyCA/mB,SAAOvQ,OAAP,GAAiBmT,MAAjB,C;;;;;;;;ACzNA,MAAItT,OAAO,mBAAAC,CAAQ,CAAR,CAAX;;AAEA;;;;;;;;;AASA,WAASwT,MAAT,CAAgB6L,SAAhB,EAA2BlS,OAA3B,EAAoC;AAClC,QAAIkS,cAAczc,SAAlB,EAA6B;AAC3B,YAAM,IAAIU,KAAJ,CAAU,8BAAV,CAAN;AACD;AACD,SAAK+b,SAAL,GAAiBA,SAAjB;AACA,SAAK6Y,OAAL,GAAgB/qB,WAAWA,QAAQ+qB,OAAR,IAAmBt1B,SAA/B,GAA4CuK,QAAQ+qB,OAApD,GAA8D,IAA7E;;AAEA,QAAI,KAAKA,OAAT,EAAkB;AAChB,WAAKpV,KAAL,GAAaxT,SAASC,aAAT,CAAuB,KAAvB,CAAb;AACA;AACA,WAAKuT,KAAL,CAAWvX,KAAX,CAAiBiE,KAAjB,GAAyB,MAAzB;AACA,WAAKsT,KAAL,CAAWvX,KAAX,CAAiBoE,QAAjB,GAA4B,UAA5B;AACA,WAAK0P,SAAL,CAAevP,WAAf,CAA2B,KAAKgT,KAAhC;;AAEA,WAAKA,KAAL,CAAWqV,IAAX,GAAkB7oB,SAASC,aAAT,CAAuB,OAAvB,CAAlB;AACA,WAAKuT,KAAL,CAAWqV,IAAX,CAAgBh0B,IAAhB,GAAuB,QAAvB;AACA,WAAK2e,KAAL,CAAWqV,IAAX,CAAgBx3B,KAAhB,GAAwB,MAAxB;AACA,WAAKmiB,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWqV,IAAlC;;AAEA,WAAKrV,KAAL,CAAWqF,IAAX,GAAkB7Y,SAASC,aAAT,CAAuB,OAAvB,CAAlB;AACA,WAAKuT,KAAL,CAAWqF,IAAX,CAAgBhkB,IAAhB,GAAuB,QAAvB;AACA,WAAK2e,KAAL,CAAWqF,IAAX,CAAgBxnB,KAAhB,GAAwB,MAAxB;AACA,WAAKmiB,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWqF,IAAlC;;AAEA,WAAKrF,KAAL,CAAWyJ,IAAX,GAAkBjd,SAASC,aAAT,CAAuB,OAAvB,CAAlB;AACA,WAAKuT,KAAL,CAAWyJ,IAAX,CAAgBpoB,IAAhB,GAAuB,QAAvB;AACA,WAAK2e,KAAL,CAAWyJ,IAAX,CAAgB5rB,KAAhB,GAAwB,MAAxB;AACA,WAAKmiB,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWyJ,IAAlC;;AAEA,WAAKzJ,KAAL,CAAWsV,GAAX,GAAiB9oB,SAASC,aAAT,CAAuB,OAAvB,CAAjB;AACA,WAAKuT,KAAL,CAAWsV,GAAX,CAAej0B,IAAf,GAAsB,QAAtB;AACA,WAAK2e,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBoE,QAArB,GAAgC,UAAhC;AACA,WAAKmT,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBZ,MAArB,GAA8B,eAA9B;AACA,WAAKmY,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBiE,KAArB,GAA6B,OAA7B;AACA,WAAKsT,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBkE,MAArB,GAA8B,KAA9B;AACA,WAAKqT,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBoqB,YAArB,GAAoC,KAApC;AACA,WAAK7S,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqB8sB,eAArB,GAAuC,KAAvC;AACA,WAAKvV,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBZ,MAArB,GAA8B,mBAA9B;AACA,WAAKmY,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBwS,eAArB,GAAuC,SAAvC;AACA,WAAK+E,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWsV,GAAlC;;AAEA,WAAKtV,KAAL,CAAWwV,KAAX,GAAmBhpB,SAASC,aAAT,CAAuB,OAAvB,CAAnB;AACA,WAAKuT,KAAL,CAAWwV,KAAX,CAAiBn0B,IAAjB,GAAwB,QAAxB;AACA,WAAK2e,KAAL,CAAWwV,KAAX,CAAiB/sB,KAAjB,CAAuBqf,MAAvB,GAAgC,KAAhC;AACA,WAAK9H,KAAL,CAAWwV,KAAX,CAAiB33B,KAAjB,GAAyB,GAAzB;AACA,WAAKmiB,KAAL,CAAWwV,KAAX,CAAiB/sB,KAAjB,CAAuBoE,QAAvB,GAAkC,UAAlC;AACA,WAAKmT,KAAL,CAAWwV,KAAX,CAAiB/sB,KAAjB,CAAuBpG,IAAvB,GAA8B,QAA9B;AACA,WAAK2d,KAAL,CAAWhT,WAAX,CAAuB,KAAKgT,KAAL,CAAWwV,KAAlC;;AAEA;AACA,UAAInhB,KAAK,IAAT;AACA,WAAK2L,KAAL,CAAWwV,KAAX,CAAiBnR,WAAjB,GAA+B,UAAU9f,KAAV,EAAiB;AAAC8P,WAAGiQ,YAAH,CAAgB/f,KAAhB;AAAwB,OAAzE;AACA,WAAKyb,KAAL,CAAWqV,IAAX,CAAgBxQ,OAAhB,GAA0B,UAAUtgB,KAAV,EAAiB;AAAC8P,WAAGghB,IAAH,CAAQ9wB,KAAR;AAAgB,OAA5D;AACA,WAAKyb,KAAL,CAAWqF,IAAX,CAAgBR,OAAhB,GAA0B,UAAUtgB,KAAV,EAAiB;AAAC8P,WAAGohB,UAAH,CAAclxB,KAAd;AAAsB,OAAlE;AACA,WAAKyb,KAAL,CAAWyJ,IAAX,CAAgB5E,OAAhB,GAA0B,UAAUtgB,KAAV,EAAiB;AAAC8P,WAAGoV,IAAH,CAAQllB,KAAR;AAAgB,OAA5D;AACD;;AAED,SAAKmxB,gBAAL,GAAwB51B,SAAxB;;AAEA,SAAKmX,MAAL,GAAc,EAAd;AACA,SAAKjU,KAAL,GAAalD,SAAb;;AAEA,SAAK61B,WAAL,GAAmB71B,SAAnB;AACA,SAAK81B,YAAL,GAAoB,IAApB,CA/DkC,CA+DR;AAC1B,SAAKC,QAAL,GAAgB,IAAhB;AACD;;AAED;;;AAGAnlB,SAAO0C,SAAP,CAAiBiiB,IAAjB,GAAwB,YAAW;AACjC,QAAIryB,QAAQ,KAAK6mB,QAAL,EAAZ;AACA,QAAI7mB,QAAQ,CAAZ,EAAe;AACbA;AACA,WAAK8yB,QAAL,CAAc9yB,KAAd;AACD;AACF,GAND;;AAQA;;;AAGA0N,SAAO0C,SAAP,CAAiBqW,IAAjB,GAAwB,YAAW;AACjC,QAAIzmB,QAAQ,KAAK6mB,QAAL,EAAZ;AACA,QAAI7mB,QAAQ,KAAKiU,MAAL,CAAY/W,MAAZ,GAAqB,CAAjC,EAAoC;AAClC8C;AACA,WAAK8yB,QAAL,CAAc9yB,KAAd;AACD;AACF,GAND;;AAQA;;;AAGA0N,SAAO0C,SAAP,CAAiB2iB,QAAjB,GAA4B,YAAW;AACrC,QAAI/M,QAAQ,IAAIjqB,IAAJ,EAAZ;;AAEA,QAAIiE,QAAQ,KAAK6mB,QAAL,EAAZ;AACA,QAAI7mB,QAAQ,KAAKiU,MAAL,CAAY/W,MAAZ,GAAqB,CAAjC,EAAoC;AAClC8C;AACA,WAAK8yB,QAAL,CAAc9yB,KAAd;AACD,KAHD,MAIK,IAAI,KAAK6yB,QAAT,EAAmB;AACtB;AACA7yB,cAAQ,CAAR;AACA,WAAK8yB,QAAL,CAAc9yB,KAAd;AACD;;AAED,QAAImmB,MAAM,IAAIpqB,IAAJ,EAAV;AACA,QAAI8tB,OAAQ1D,MAAMH,KAAlB;;AAEA;AACA;AACA,QAAIgN,WAAWr3B,KAAKH,GAAL,CAAS,KAAKo3B,YAAL,GAAoB/I,IAA7B,EAAmC,CAAnC,CAAf;AACA;;AAEA,QAAIxY,KAAK,IAAT;AACA,SAAKshB,WAAL,GAAmBvd,WAAW,YAAW;AAAC/D,SAAG0hB,QAAH;AAAe,KAAtC,EAAwCC,QAAxC,CAAnB;AACD,GAxBD;;AA0BA;;;AAGAtlB,SAAO0C,SAAP,CAAiBqiB,UAAjB,GAA8B,YAAW;AACvC,QAAI,KAAKE,WAAL,KAAqB71B,SAAzB,EAAoC;AAClC,WAAKulB,IAAL;AACD,KAFD,MAEO;AACL,WAAKE,IAAL;AACD;AACF,GAND;;AAQA;;;AAGA7U,SAAO0C,SAAP,CAAiBiS,IAAjB,GAAwB,YAAW;AACjC;AACA,QAAI,KAAKsQ,WAAT,EAAsB;;AAEtB,SAAKI,QAAL;;AAEA,QAAI,KAAK/V,KAAT,EAAgB;AACd,WAAKA,KAAL,CAAWqF,IAAX,CAAgBxnB,KAAhB,GAAwB,MAAxB;AACD;AACF,GATD;;AAWA;;;AAGA6S,SAAO0C,SAAP,CAAiBmS,IAAjB,GAAwB,YAAW;AACjC0Q,kBAAc,KAAKN,WAAnB;AACA,SAAKA,WAAL,GAAmB71B,SAAnB;;AAEA,QAAI,KAAKkgB,KAAT,EAAgB;AACd,WAAKA,KAAL,CAAWqF,IAAX,CAAgBxnB,KAAhB,GAAwB,MAAxB;AACD;AACF,GAPD;;AASA;;;;AAIA6S,SAAO0C,SAAP,CAAiB2W,mBAAjB,GAAuC,UAAS5mB,QAAT,EAAmB;AACxD,SAAKuyB,gBAAL,GAAwBvyB,QAAxB;AACD,GAFD;;AAIA;;;;AAIAuN,SAAO0C,SAAP,CAAiBuW,eAAjB,GAAmC,UAASqM,QAAT,EAAmB;AACpD,SAAKJ,YAAL,GAAoBI,QAApB;AACD,GAFD;;AAIA;;;;AAIAtlB,SAAO0C,SAAP,CAAiB8iB,eAAjB,GAAmC,UAASF,QAAT,EAAmB;AACpD,WAAO,KAAKJ,YAAZ;AACD,GAFD;;AAIA;;;;;;AAMAllB,SAAO0C,SAAP,CAAiB+iB,WAAjB,GAA+B,UAASC,MAAT,EAAiB;AAC9C,SAAKP,QAAL,GAAgBO,MAAhB;AACD,GAFD;;AAKA;;;AAGA1lB,SAAO0C,SAAP,CAAiBijB,QAAjB,GAA4B,YAAW;AACrC,QAAI,KAAKX,gBAAL,KAA0B51B,SAA9B,EAAyC;AACvC,WAAK41B,gBAAL;AACD;AACF,GAJD;;AAMA;;;AAGAhlB,SAAO0C,SAAP,CAAiBgQ,MAAjB,GAA0B,YAAW;AACnC,QAAI,KAAKpD,KAAT,EAAgB;AACd;AACA,WAAKA,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBhG,GAArB,GAA4B,KAAKud,KAAL,CAAWkF,YAAX,GAAwB,CAAxB,GACxB,KAAKlF,KAAL,CAAWsV,GAAX,CAAenC,YAAf,GAA4B,CADL,GACU,IADrC;AAEA,WAAKnT,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBiE,KAArB,GAA8B,KAAKsT,KAAL,CAAW3S,WAAX,GAC1B,KAAK2S,KAAL,CAAWqV,IAAX,CAAgBhoB,WADU,GAE1B,KAAK2S,KAAL,CAAWqF,IAAX,CAAgBhY,WAFU,GAG1B,KAAK2S,KAAL,CAAWyJ,IAAX,CAAgBpc,WAHU,GAGI,EAHL,GAGY,IAHzC;;AAKA;AACA,UAAIhL,OAAO,KAAKi0B,WAAL,CAAiB,KAAKtzB,KAAtB,CAAX;AACA,WAAKgd,KAAL,CAAWwV,KAAX,CAAiB/sB,KAAjB,CAAuBpG,IAAvB,GAA+BA,IAAD,GAAS,IAAvC;AACD;AACF,GAdD;;AAiBA;;;;AAIAqO,SAAO0C,SAAP,CAAiBsW,SAAjB,GAA6B,UAASzS,MAAT,EAAiB;AAC5C,SAAKA,MAAL,GAAcA,MAAd;;AAEA,QAAI,KAAKA,MAAL,CAAY/W,MAAZ,GAAqB,CAAzB,EACE,KAAK41B,QAAL,CAAc,CAAd,EADF,KAGE,KAAK9yB,KAAL,GAAalD,SAAb;AACH,GAPD;;AASA;;;;AAIA4Q,SAAO0C,SAAP,CAAiB0iB,QAAjB,GAA4B,UAAS9yB,KAAT,EAAgB;AAC1C,QAAIA,QAAQ,KAAKiU,MAAL,CAAY/W,MAAxB,EAAgC;AAC9B,WAAK8C,KAAL,GAAaA,KAAb;;AAEA,WAAKogB,MAAL;AACA,WAAKiT,QAAL;AACD,KALD,MAMK;AACH,YAAM,IAAI71B,KAAJ,CAAU,oBAAV,CAAN;AACD;AACF,GAVD;;AAYA;;;;AAIAkQ,SAAO0C,SAAP,CAAiByW,QAAjB,GAA4B,YAAW;AACrC,WAAO,KAAK7mB,KAAZ;AACD,GAFD;;AAKA;;;;AAIA0N,SAAO0C,SAAP,CAAiB6B,GAAjB,GAAuB,YAAW;AAChC,WAAO,KAAKgC,MAAL,CAAY,KAAKjU,KAAjB,CAAP;AACD,GAFD;;AAKA0N,SAAO0C,SAAP,CAAiBkR,YAAjB,GAAgC,UAAS/f,KAAT,EAAgB;AAC9C;AACA,QAAIoqB,iBAAiBpqB,MAAMsqB,KAAN,GAAetqB,MAAMsqB,KAAN,KAAgB,CAA/B,GAAqCtqB,MAAMuqB,MAAN,KAAiB,CAA3E;AACA,QAAI,CAACH,cAAL,EAAqB;;AAErB,SAAK4H,YAAL,GAAoBhyB,MAAMgvB,OAA1B;AACA,SAAKiD,WAAL,GAAmB9Q,WAAW,KAAK1F,KAAL,CAAWwV,KAAX,CAAiB/sB,KAAjB,CAAuBpG,IAAlC,CAAnB;;AAEA,SAAK2d,KAAL,CAAWvX,KAAX,CAAiB0mB,MAAjB,GAA0B,MAA1B;;AAEA;AACA;AACA;AACA,QAAI9a,KAAK,IAAT;AACA,SAAK+a,WAAL,GAAmB,UAAU7qB,KAAV,EAAiB;AAAC8P,SAAGgb,YAAH,CAAgB9qB,KAAhB;AAAwB,KAA7D;AACA,SAAK+qB,SAAL,GAAmB,UAAU/qB,KAAV,EAAiB;AAAC8P,SAAGua,UAAH,CAAcrqB,KAAd;AAAsB,KAA3D;AACAtH,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,WAAhC,EAA6C,KAAK4iB,WAAlD;AACAnyB,SAAK2G,gBAAL,CAAsB4I,QAAtB,EAAgC,SAAhC,EAA6C,KAAK8iB,SAAlD;AACAryB,SAAKqH,cAAL,CAAoBC,KAApB;AACD,GAnBD;;AAsBAmM,SAAO0C,SAAP,CAAiBqjB,WAAjB,GAA+B,UAAUp0B,IAAV,EAAgB;AAC7C,QAAIqK,QAAQgZ,WAAW,KAAK1F,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBiE,KAAhC,IACR,KAAKsT,KAAL,CAAWwV,KAAX,CAAiBnoB,WADT,GACuB,EADnC;AAEA,QAAIwE,IAAIxP,OAAO,CAAf;;AAEA,QAAIW,QAAQrE,KAAK0xB,KAAL,CAAWxe,IAAInF,KAAJ,IAAa,KAAKuK,MAAL,CAAY/W,MAAZ,GAAmB,CAAhC,CAAX,CAAZ;AACA,QAAI8C,QAAQ,CAAZ,EAAeA,QAAQ,CAAR;AACf,QAAIA,QAAQ,KAAKiU,MAAL,CAAY/W,MAAZ,GAAmB,CAA/B,EAAkC8C,QAAQ,KAAKiU,MAAL,CAAY/W,MAAZ,GAAmB,CAA3B;;AAElC,WAAO8C,KAAP;AACD,GAVD;;AAYA0N,SAAO0C,SAAP,CAAiBkjB,WAAjB,GAA+B,UAAUtzB,KAAV,EAAiB;AAC9C,QAAI0J,QAAQgZ,WAAW,KAAK1F,KAAL,CAAWsV,GAAX,CAAe7sB,KAAf,CAAqBiE,KAAhC,IACR,KAAKsT,KAAL,CAAWwV,KAAX,CAAiBnoB,WADT,GACuB,EADnC;;AAGA,QAAIwE,IAAI7O,SAAS,KAAKiU,MAAL,CAAY/W,MAAZ,GAAmB,CAA5B,IAAiCwM,KAAzC;AACA,QAAIrK,OAAOwP,IAAI,CAAf;;AAEA,WAAOxP,IAAP;AACD,GARD;;AAYAqO,SAAO0C,SAAP,CAAiBic,YAAjB,GAAgC,UAAU9qB,KAAV,EAAiB;AAC/C,QAAIsoB,OAAOtoB,MAAMgvB,OAAN,GAAgB,KAAKgD,YAAhC;AACA,QAAI1kB,IAAI,KAAK2kB,WAAL,GAAmB3J,IAA3B;;AAEA,QAAI7pB,QAAQ,KAAKyzB,WAAL,CAAiB5kB,CAAjB,CAAZ;;AAEA,SAAKikB,QAAL,CAAc9yB,KAAd;;AAEA/F,SAAKqH,cAAL;AACD,GATD;;AAYAoM,SAAO0C,SAAP,CAAiBwb,UAAjB,GAA8B,UAAUrqB,KAAV,EAAiB;AAC7C,SAAKyb,KAAL,CAAWvX,KAAX,CAAiB0mB,MAAjB,GAA0B,MAA1B;;AAEA;AACAlyB,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,WAAnC,EAAgD,KAAK4iB,WAArD;AACAnyB,SAAKmH,mBAAL,CAAyBoI,QAAzB,EAAmC,SAAnC,EAA8C,KAAK8iB,SAAnD;;AAEAryB,SAAKqH,cAAL;AACD,GARD;;AAUAqJ,SAAOvQ,OAAP,GAAiBsT,MAAjB,C;;;;;;;;ACzVA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,WAASC,UAAT,CAAoBqY,KAApB,EAA2BG,GAA3B,EAAgCJ,IAAhC,EAAsC8B,UAAtC,EAAkD;AAChD;AACA,SAAK6L,MAAL,GAAc,CAAd;AACA,SAAKC,IAAL,GAAY,CAAZ;AACA,SAAKC,KAAL,GAAa,CAAb;AACA,SAAK/L,UAAL,GAAkB,IAAlB;AACA,SAAKgM,SAAL,GAAiB,CAAjB;;AAEA,SAAKC,QAAL,GAAgB,CAAhB;AACA,SAAKC,QAAL,CAAc/N,KAAd,EAAqBG,GAArB,EAA0BJ,IAA1B,EAAgC8B,UAAhC;AACD;;AAGD;;;;;AAKAla,aAAWyC,SAAX,CAAqB4jB,SAArB,GAAiC,UAASnnB,CAAT,EAAY;AAC3C,WAAO,CAAC1Q,MAAMumB,WAAW7V,CAAX,CAAN,CAAD,IAAyBonB,SAASpnB,CAAT,CAAhC;AACD,GAFD;;AAKA;;;;;;;;;AASAc,aAAWyC,SAAX,CAAqB2jB,QAArB,GAAgC,UAAS/N,KAAT,EAAgBG,GAAhB,EAAqBJ,IAArB,EAA2B8B,UAA3B,EAAuC;AACrE,QAAI,CAAC,KAAKmM,SAAL,CAAehO,KAAf,CAAL,EAA4B;AAC1B,YAAM,IAAIxoB,KAAJ,CAAU,gDAAgDwoB,KAA1D,CAAN;AACD;AACD,QAAI,CAAC,KAAKgO,SAAL,CAAe7N,GAAf,CAAL,EAA0B;AACxB,YAAM,IAAI3oB,KAAJ,CAAU,8CAA8CwoB,KAAxD,CAAN;AACD;AACD,QAAI,CAAC,KAAKgO,SAAL,CAAejO,IAAf,CAAL,EAA2B;AACzB,YAAM,IAAIvoB,KAAJ,CAAU,+CAA+CwoB,KAAzD,CAAN;AACD;;AAED,SAAK0N,MAAL,GAAc1N,QAAQA,KAAR,GAAgB,CAA9B;AACA,SAAK2N,IAAL,GAAYxN,MAAMA,GAAN,GAAY,CAAxB;;AAEA,SAAK+N,OAAL,CAAanO,IAAb,EAAmB8B,UAAnB;AACD,GAfD;;AAiBA;;;;;;AAMAla,aAAWyC,SAAX,CAAqB8jB,OAArB,GAA+B,UAASnO,IAAT,EAAe8B,UAAf,EAA2B;AACxD,QAAI9B,SAASjpB,SAAT,IAAsBipB,QAAQ,CAAlC,EACE;;AAEF,QAAI8B,eAAe/qB,SAAnB,EACE,KAAK+qB,UAAL,GAAkBA,UAAlB;;AAEF,QAAI,KAAKA,UAAL,KAAoB,IAAxB,EACE,KAAK+L,KAAL,GAAajmB,WAAWwmB,mBAAX,CAA+BpO,IAA/B,CAAb,CADF,KAGE,KAAK6N,KAAL,GAAa7N,IAAb;AACH,GAXD;;AAaA;;;;;;;AAOApY,aAAWwmB,mBAAX,GAAiC,UAAUpO,IAAV,EAAgB;AAC/C,QAAIqO,QAAQ,SAARA,KAAQ,CAAUvlB,CAAV,EAAa;AAAC,aAAOlT,KAAK04B,GAAL,CAASxlB,CAAT,IAAclT,KAAK24B,IAA1B;AAAgC,KAA1D;;AAEA;AACA,QAAIC,QAAQ54B,KAAK64B,GAAL,CAAS,EAAT,EAAa74B,KAAK0xB,KAAL,CAAW+G,MAAMrO,IAAN,CAAX,CAAb,CAAZ;AAAA,QACI0O,QAAQ,IAAI94B,KAAK64B,GAAL,CAAS,EAAT,EAAa74B,KAAK0xB,KAAL,CAAW+G,MAAMrO,OAAO,CAAb,CAAX,CAAb,CADhB;AAAA,QAEI2O,QAAQ,IAAI/4B,KAAK64B,GAAL,CAAS,EAAT,EAAa74B,KAAK0xB,KAAL,CAAW+G,MAAMrO,OAAO,CAAb,CAAX,CAAb,CAFhB;;AAIA;AACA,QAAI8B,aAAa0M,KAAjB;AACA,QAAI54B,KAAKutB,GAAL,CAASuL,QAAQ1O,IAAjB,KAA0BpqB,KAAKutB,GAAL,CAASrB,aAAa9B,IAAtB,CAA9B,EAA2D8B,aAAa4M,KAAb;AAC3D,QAAI94B,KAAKutB,GAAL,CAASwL,QAAQ3O,IAAjB,KAA0BpqB,KAAKutB,GAAL,CAASrB,aAAa9B,IAAtB,CAA9B,EAA2D8B,aAAa6M,KAAb;;AAE3D;AACA,QAAI7M,cAAc,CAAlB,EAAqB;AACnBA,mBAAa,CAAb;AACD;;AAED,WAAOA,UAAP;AACD,GAnBD;;AAqBA;;;;AAIAla,aAAWyC,SAAX,CAAqBgW,UAArB,GAAkC,YAAY;AAC5C,WAAO1D,WAAW,KAAKoR,QAAL,CAAca,WAAd,CAA0B,KAAKd,SAA/B,CAAX,CAAP;AACD,GAFD;;AAIA;;;;AAIAlmB,aAAWyC,SAAX,CAAqBwkB,OAArB,GAA+B,YAAY;AACzC,WAAO,KAAKhB,KAAZ;AACD,GAFD;;AAIA;;;;;;;;;AASAjmB,aAAWyC,SAAX,CAAqB4V,KAArB,GAA6B,UAAS6O,UAAT,EAAqB;AAChD,QAAIA,eAAe/3B,SAAnB,EAA8B;AAC5B+3B,mBAAa,KAAb;AACD;;AAED,SAAKf,QAAL,GAAgB,KAAKJ,MAAL,GAAc,KAAKA,MAAL,GAAc,KAAKE,KAAjD;;AAEA,QAAIiB,UAAJ,EAAgB;AACd,UAAI,KAAKzO,UAAL,KAAoB,KAAKsN,MAA7B,EAAqC;AACnC,aAAKjN,IAAL;AACD;AACF;AACF,GAZD;;AAeA;;;AAGA9Y,aAAWyC,SAAX,CAAqBqW,IAArB,GAA4B,YAAY;AACtC,SAAKqN,QAAL,IAAiB,KAAKF,KAAtB;AACD,GAFD;;AAIA;;;;AAIAjmB,aAAWyC,SAAX,CAAqB+V,GAArB,GAA2B,YAAY;AACrC,WAAQ,KAAK2N,QAAL,GAAgB,KAAKH,IAA7B;AACD,GAFD;;AAIAhpB,SAAOvQ,OAAP,GAAiBuT,UAAjB,C;;;;;;;;AChLA;;;;;;;;;AASA,WAASwI,KAAT,GAAiB;AACf,SAAK5a,GAAL,GAAWuB,SAAX;AACA,SAAKtB,GAAL,GAAWsB,SAAX;AACD;;AAGD;;;;;;;;AAQAqZ,QAAM/F,SAAN,CAAgB8N,MAAhB,GAAyB,UAASrjB,KAAT,EAAgB;AACvC,QAAIA,UAAUiC,SAAd,EAAyB;;AAEzB,QAAI,KAAKvB,GAAL,KAAauB,SAAb,IAA0B,KAAKvB,GAAL,GAAWV,KAAzC,EAAiD;AAC/C,WAAKU,GAAL,GAAWV,KAAX;AACD;;AAED,QAAI,KAAKW,GAAL,KAAasB,SAAb,IAA0B,KAAKtB,GAAL,GAAWX,KAAzC,EAAgD;AAC9C,WAAKW,GAAL,GAAWX,KAAX;AACD;AACF,GAVD;;AAaA;;;;;AAKAsb,QAAM/F,SAAN,CAAgB0kB,OAAhB,GAA0B,UAASza,KAAT,EAAgB;AACvC,SAAKnK,GAAL,CAASmK,MAAM9e,GAAf;AACA,SAAK2U,GAAL,CAASmK,MAAM7e,GAAf;AACF,GAHD;;AAMA;;;;;;;;;;AAUA2a,QAAM/F,SAAN,CAAgBkP,MAAhB,GAAyB,UAASyV,GAAT,EAAc;AACrC,QAAIA,QAAQj4B,SAAZ,EAAuB;AACrB;AACD;;AAED,QAAIk4B,SAAS,KAAKz5B,GAAL,GAAWw5B,GAAxB;AACA,QAAIE,SAAS,KAAKz5B,GAAL,GAAWu5B,GAAxB;;AAEA;AACA;AACA,QAAIC,SAASC,MAAb,EAAqB;AACnB,YAAM,IAAIz3B,KAAJ,CAAU,4CAAV,CAAN;AACD;;AAED,SAAKjC,GAAL,GAAWy5B,MAAX;AACA,SAAKx5B,GAAL,GAAWy5B,MAAX;AACD,GAhBD;;AAmBA;;;;;AAKA9e,QAAM/F,SAAN,CAAgBiK,KAAhB,GAAwB,YAAW;AACjC,WAAO,KAAK7e,GAAL,GAAW,KAAKD,GAAvB;AACD,GAFD;;AAKA;;;;;AAKA4a,QAAM/F,SAAN,CAAgBsK,MAAhB,GAAyB,YAAW;AACnC,WAAO,CAAC,KAAKnf,GAAL,GAAW,KAAKC,GAAjB,IAAwB,CAA/B;AACA,GAFD;;AAKAmP,SAAOvQ,OAAP,GAAiB+b,KAAjB,C;;;;;;;;;;;;;;AChGA;AACA;AACA;AACA;AACA,MAAI7I,SAAU,mBAAApT,CAAQ,EAAR,CAAd;AACA,MAAIuT,UAAU,mBAAAvT,CAAQ,EAAR,CAAd;;AAGA;AACA,MAAImc,QAAQ;AACV2I,SAAU,CADA;AAEVX,cAAU,CAFA;AAGVC,aAAU,CAHA;AAIVxG,SAAU,CAJA;AAKVuL,aAAU,CALA;AAMV9E,cAAU,CANA;AAOVC,aAAU,CAPA;AAQV8B,UAAU,CARA;AASVS,UAAU,CATA;AAUVR,aAAU;AAVA,GAAZ;;AAcA;AACA,MAAI2U,YAAY;AACd,WAAa7e,MAAMyB,GADL;AAEd,gBAAazB,MAAMgN,OAFL;AAGd,iBAAahN,MAAMkI,QAHL;AAId,gBAAalI,MAAMmI,OAJL;AAKd,YAAanI,MAAM0K,IALL;AAMd,YAAa1K,MAAMiK,IANL;AAOd,eAAajK,MAAMkK,OAPL;AAQd,WAAalK,MAAM2I,GARL;AASd,iBAAa3I,MAAMgI,QATL;AAUd,gBAAahI,MAAMiI;AAVL,GAAhB;;AAcA;;;;;;AAMA,MAAI6W,aAAa,CACf,OADe,EAEf,QAFe,EAGf,aAHe,EAIf,aAJe,EAKf,QALe,EAMf,QANe,EAOf,QAPe,EAQf,aARe,EASf,aATe,EAUf,aAVe,EAWf,UAXe,EAYf,iBAZe,EAaf,YAbe,EAcf,iBAde,EAef,eAfe,EAgBf,cAhBe,EAiBf,uBAjBe,EAkBf,mBAlBe,EAmBf,kBAnBe,EAoBf,oBApBe,EAqBf,WArBe,EAsBf,WAtBe,EAuBf,SAvBe,EAwBf,SAxBe,CAAjB;;AA4BA;;;;;;AAMA,MAAIC,qBAAqB,CACvB,WADuB,EAEvB,WAFuB,EAGvB,UAHuB,EAIvB,UAJuB,EAKvB,MALuB,EAMvB,MANuB,EAOvB,OAPuB,EAQvB,MARuB,EASvB,MATuB,EAUvB,OAVuB,EAWvB,MAXuB,EAYvB,MAZuB,EAavB,OAbuB,CAAzB;;AAiBA;AACA,MAAI7e,WAAWzZ,SAAf;;AAGA;;;;;AAKA,WAASu4B,OAAT,CAAiB94B,GAAjB,EAAsB;AACpB,SAAI,IAAIC,IAAR,IAAgBD,GAAhB,EAAqB;AACnB,UAAIA,IAAIE,cAAJ,CAAmBD,IAAnB,CAAJ,EACE,OAAO,KAAP;AACH;;AAED,WAAO,IAAP;AACD;;AAID;;;;;AAKA,WAAS84B,UAAT,CAAoBC,GAApB,EAAyB;AACvB,QAAIA,QAAQz4B,SAAR,IAAqBy4B,QAAQ,EAA7B,IAAmC,OAAOA,GAAP,IAAc,QAArD,EAA+D;AAC7D,aAAOA,GAAP;AACD;;AAED,WAAOA,IAAI9S,MAAJ,CAAW,CAAX,EAAc+S,WAAd,KAA8BD,IAAI3xB,KAAJ,CAAU,CAAV,CAArC;AACD;;AAGD;;;AAGA,WAAS6xB,eAAT,CAAyBC,MAAzB,EAAiCC,SAAjC,EAA4C;AAC1C,QAAID,WAAW54B,SAAX,IAAwB44B,WAAW,EAAvC,EAA2C;AACzC,aAAOC,SAAP;AACD;;AAED,WAAOD,SAASJ,WAAWK,SAAX,CAAhB;AACD;;AAGD;;;;;;;;;;;;;;AAcA,WAASC,SAAT,CAAmBC,GAAnB,EAAwBC,GAAxB,EAA6BnvB,MAA7B,EAAqC+uB,MAArC,EAA6C;AAC3C,QAAIK,MAAJ;AACA,QAAIC,MAAJ;;AAEA,SAAK,IAAIh5B,CAAT,IAAc2J,MAAd,EAAsB;AACpBovB,eAAUpvB,OAAO3J,CAAP,CAAV;AACAg5B,eAAUP,gBAAgBC,MAAhB,EAAwBK,MAAxB,CAAV;;AAEAD,UAAIE,MAAJ,IAAcH,IAAIE,MAAJ,CAAd;AACD;AACF;;AAGD;;;;;;;;;AASA,WAASE,QAAT,CAAkBJ,GAAlB,EAAuBC,GAAvB,EAA4BnvB,MAA5B,EAAoC+uB,MAApC,EAA4C;AAC1C,QAAIK,MAAJ;AACA,QAAIC,MAAJ;;AAEA,SAAK,IAAIh5B,CAAT,IAAc2J,MAAd,EAAsB;AACpBovB,eAAUpvB,OAAO3J,CAAP,CAAV;AACA,UAAI64B,IAAIE,MAAJ,MAAgBj5B,SAApB,EAA+B;;AAE/Bk5B,eAAUP,gBAAgBC,MAAhB,EAAwBK,MAAxB,CAAV;;AAEAD,UAAIE,MAAJ,IAAcH,IAAIE,MAAJ,CAAd;AACD;AACF;;AAGD;;;;;;;;;AASA,WAASlc,WAAT,CAAqBgc,GAArB,EAA0BC,GAA1B,EAA+B;AAC7B,QAAID,QAAQ/4B,SAAR,IAAqBu4B,QAAQQ,GAAR,CAAzB,EAAuC;AACrC,YAAM,IAAIr4B,KAAJ,CAAU,oBAAV,CAAN;AACD;AACD,QAAIs4B,QAAQh5B,SAAZ,EAAuB;AACrB,YAAM,IAAIU,KAAJ,CAAU,eAAV,CAAN;AACD;;AAED;AACA+Y,eAAWsf,GAAX;;AAEA;AACAD,cAAUC,GAAV,EAAeC,GAAf,EAAoBX,UAApB;AACAS,cAAUC,GAAV,EAAeC,GAAf,EAAoBV,kBAApB,EAAwC,SAAxC;;AAEA;AACAc,uBAAmBL,GAAnB,EAAwBC,GAAxB;;AAEA;AACAA,QAAIhR,MAAJ,GAAa,EAAb,CAnB6B,CAmBK;AAClCgR,QAAInL,cAAJ,GAAqB,KAArB,CApB6B,CAoBK;AAClCmL,QAAI/H,WAAJ,GAAkB,KAAlB;AACA+H,QAAIrI,gBAAJ,GAAuB,IAAvB;AACAqI,QAAIrZ,GAAJ,GAAU,IAAIhP,OAAJ,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAC,CAAnB,CAAV,CAvB6B,CAuBK;AACnC;;AAGD,WAAS0C,UAAT,CAAoB9I,OAApB,EAA6ByuB,GAA7B,EAAkC;AAChC,QAAIzuB,YAAYvK,SAAhB,EAA2B;AACzB;AACD;AACD,QAAIg5B,QAAQh5B,SAAZ,EAAuB;AACrB,YAAM,IAAIU,KAAJ,CAAU,eAAV,CAAN;AACD;;AAED,QAAI+Y,aAAazZ,SAAb,IAA0Bu4B,QAAQ9e,QAAR,CAA9B,EAAiD;AAC/C,YAAM,IAAI/Y,KAAJ,CAAU,sCAAV,CAAN;AACD;;AAGD;AACAy4B,aAAS5uB,OAAT,EAAkByuB,GAAlB,EAAuBX,UAAvB;AACAc,aAAS5uB,OAAT,EAAkByuB,GAAlB,EAAuBV,kBAAvB,EAA2C,SAA3C;;AAEA;AACAc,uBAAmB7uB,OAAnB,EAA4ByuB,GAA5B;AACD;;AAGD;;;;;AAKA,WAASI,kBAAT,CAA4BL,GAA5B,EAAiCC,GAAjC,EAAsC;AACpC,QAAID,IAAI5d,eAAJ,KAAwBnb,SAA5B,EAAuC;AACrCq5B,yBAAmBN,IAAI5d,eAAvB,EAAwC6d,GAAxC;AACD;;AAEDM,iBAAaP,IAAI3d,SAAjB,EAA4B4d,GAA5B;AACAO,aAASR,IAAIpwB,KAAb,EAAoBqwB,GAApB;AACAQ,kBAAcT,IAAI7d,UAAlB,EAA8B8d,GAA9B;AACApF,sBAAkBmF,IAAIvd,cAAtB,EAAsCwd,GAAtC;;AAEA;AACA;AACA,QAAID,IAAI9d,OAAJ,KAAgBjb,SAApB,EAA+B;AAC7Bg5B,UAAI/H,WAAJ,GAAkB8H,IAAI9d,OAAtB;AACD;AACD,QAAI8d,IAAIhU,OAAJ,IAAe/kB,SAAnB,EAA8B;AAC5Bg5B,UAAIrI,gBAAJ,GAAuBoI,IAAIhU,OAA3B;AACD;AACF;;AAGD;;;;;;AAMA,WAASyU,aAAT,CAAuBte,UAAvB,EAAmC8d,GAAnC,EAAwC;AACtC,QAAI9d,eAAelb,SAAnB,EAA8B;AAC5B;AACA,UAAIy5B,kBAAmBhgB,SAASyB,UAAT,KAAwBlb,SAA/C;;AAEA,UAAIy5B,eAAJ,EAAqB;AACnB;AACA,YAAIC,qBAAqBV,IAAIrwB,KAAJ,KAAc4Q,MAAMkI,QAApB,IACAuX,IAAIrwB,KAAJ,KAAc4Q,MAAMmI,OAD7C;;AAGAsX,YAAI9d,UAAJ,GAAiBwe,kBAAjB;AACD,OAND,MAMO;AACJ;AACF;AACF,KAbD,MAaO;AACLV,UAAI9d,UAAJ,GAAiBA,UAAjB;AACD;AACF;;AAGD;;;;;;AAMA,WAASye,oBAAT,CAA8BC,SAA9B,EAAyC;AACvC,QAAIC,SAASzB,UAAUwB,SAAV,CAAb;;AAEA,QAAIC,WAAW75B,SAAf,EAA0B;AACxB,aAAO,CAAC,CAAR;AACD;;AAED,WAAO65B,MAAP;AACD;;AAGD;;;;;AAKA,WAASC,gBAAT,CAA0BnxB,KAA1B,EAAiC;AAC/B,QAAIoxB,QAAQ,KAAZ;;AAEA,SAAK,IAAIhqB,CAAT,IAAcwJ,KAAd,EAAqB;AACnB,UAAIA,MAAMxJ,CAAN,MAAapH,KAAjB,EAAwB;AACtBoxB,gBAAQ,IAAR;AACA;AACD;AACF;;AAED,WAAOA,KAAP;AACD;;AAGD,WAASR,QAAT,CAAkB5wB,KAAlB,EAAyBqwB,GAAzB,EAA8B;AAC5B,QAAIrwB,UAAU3I,SAAd,EAAyB;AACvB,aADuB,CACb;AACX;;AAED,QAAIg6B,WAAJ;;AAEA,QAAI,OAAOrxB,KAAP,KAAiB,QAArB,EAA+B;AAC7BqxB,oBAAcL,qBAAqBhxB,KAArB,CAAd;;AAEA,UAAIqxB,gBAAgB,CAAC,CAArB,EAAyB;AACvB,cAAM,IAAIt5B,KAAJ,CAAU,aAAaiI,KAAb,GAAqB,eAA/B,CAAN;AACD;AACF,KAND,MAMO;AACL;AACA,UAAI,CAACmxB,iBAAiBnxB,KAAjB,CAAL,EAA8B;AAC5B,cAAM,IAAIjI,KAAJ,CAAU,aAAaiI,KAAb,GAAqB,eAA/B,CAAN;AACD;;AAEDqxB,oBAAcrxB,KAAd;AACD;;AAEDqwB,QAAIrwB,KAAJ,GAAYqxB,WAAZ;AACD;;AAGD;;;;AAIA,WAASX,kBAAT,CAA4Ble,eAA5B,EAA6C6d,GAA7C,EAAkD;AAChD,QAAI3d,OAAO,OAAX;AACA,QAAIC,SAAS,MAAb;AACA,QAAIC,cAAc,CAAlB;;AAEA,QAAI,OAAOJ,eAAP,KAA4B,QAAhC,EAA0C;AACxCE,aAAOF,eAAP;AACAG,eAAS,MAAT;AACAC,oBAAc,CAAd;AACD,KAJD,MAKK,IAAI,QAAOJ,eAAP,0DAAOA,eAAP,OAA4B,QAAhC,EAA0C;AAC7C,UAAIA,gBAAgBE,IAAhB,KAAyBrb,SAA7B,EAA2Cqb,OAAOF,gBAAgBE,IAAvB;AAC3C,UAAIF,gBAAgBG,MAAhB,KAA2Btb,SAA/B,EAA6Csb,SAASH,gBAAgBG,MAAzB;AAC7C,UAAIH,gBAAgBI,WAAhB,KAAgCvb,SAApC,EAA+Cub,cAAcJ,gBAAgBI,WAA9B;AAChD,KAJI,MAKA;AACH,YAAM,IAAI7a,KAAJ,CAAU,qCAAV,CAAN;AACD;;AAEDs4B,QAAI9Y,KAAJ,CAAUvX,KAAV,CAAgBwS,eAAhB,GAAkCE,IAAlC;AACA2d,QAAI9Y,KAAJ,CAAUvX,KAAV,CAAgB8jB,WAAhB,GAA8BnR,MAA9B;AACA0d,QAAI9Y,KAAJ,CAAUvX,KAAV,CAAgBsxB,WAAhB,GAA8B1e,cAAc,IAA5C;AACAyd,QAAI9Y,KAAJ,CAAUvX,KAAV,CAAgBuxB,WAAhB,GAA8B,OAA9B;AACD;;AAGD,WAASZ,YAAT,CAAsBle,SAAtB,EAAiC4d,GAAjC,EAAsC;AACpC,QAAI5d,cAAcpb,SAAlB,EAA6B;AAC3B,aAD2B,CAChB;AACZ;;AAED,QAAIg5B,IAAI5d,SAAJ,KAAkBpb,SAAtB,EAAiC;AAC/Bg5B,UAAI5d,SAAJ,GAAgB,EAAhB;AACD;;AAED,QAAI,OAAOA,SAAP,KAAqB,QAAzB,EAAmC;AACjC4d,UAAI5d,SAAJ,CAAcC,IAAd,GAAuBD,SAAvB;AACA4d,UAAI5d,SAAJ,CAAcE,MAAd,GAAuBF,SAAvB;AACD,KAHD,MAIK;AACH,UAAIA,UAAUC,IAAd,EAAoB;AAClB2d,YAAI5d,SAAJ,CAAcC,IAAd,GAAqBD,UAAUC,IAA/B;AACD;AACD,UAAID,UAAUE,MAAd,EAAsB;AACpB0d,YAAI5d,SAAJ,CAAcE,MAAd,GAAuBF,UAAUE,MAAjC;AACD;AACD,UAAIF,UAAUG,WAAV,KAA0Bvb,SAA9B,EAAyC;AACvCg5B,YAAI5d,SAAJ,CAAcG,WAAd,GAA4BH,UAAUG,WAAtC;AACD;AACF;AACF;;AAGD,WAASqY,iBAAT,CAA2BpY,cAA3B,EAA2Cwd,GAA3C,EAAgD;AAC9C,QAAImB,SAAS3e,cAAb;AACA,QAAI2e,WAAWn6B,SAAf,EAA0B;AACxB;AACD;;AAED,QAAIg5B,IAAIlb,MAAJ,KAAe9d,SAAnB,EAA8B;AAC5Bg5B,UAAIlb,MAAJ,GAAa,IAAItN,MAAJ,EAAb;AACD;;AAEDwoB,QAAIlb,MAAJ,CAAW0S,cAAX,CAA0B2J,OAAO1e,UAAjC,EAA6C0e,OAAOze,QAApD;AACAsd,QAAIlb,MAAJ,CAAWgU,YAAX,CAAwBqI,OAAOxe,QAA/B;AACD;;AAGD9N,SAAOvQ,OAAP,CAAeic,KAAf,GAAmCA,KAAnC;AACA1L,SAAOvQ,OAAP,CAAeyf,WAAf,GAAmCA,WAAnC;AACAlP,SAAOvQ,OAAP,CAAe+V,UAAf,GAAmCA,UAAnC;AACAxF,SAAOvQ,OAAP,CAAes2B,iBAAf,GAAmCA,iBAAnC,C;;;;;;;;ACvbA;AACA;AACA,MAAI,OAAOlvB,MAAP,KAAkB,WAAtB,EAAmC;AACjC,QAAI01B,cAAc,mBAAAh9B,CAAQ,GAAR,CAAlB;AACA,QAAI0T,SAASpM,OAAO,QAAP,KAAoB,mBAAAtH,CAAQ,GAAR,CAAjC;AACAyQ,WAAOvQ,OAAP,GAAiB88B,YAAYtpB,MAAZ,EAAoB;AACnCtM,sBAAgB;AADmB,KAApB,CAAjB;AAGD,GAND,MAOK;AACHqJ,WAAOvQ,OAAP,GAAiB,YAAY;AAC3B,YAAMoD,MAAM,2DAAN,CAAN;AACD,KAFD;AAGD,G;;;;;;ACbD;;AAEA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA,GAAC;AACD,4BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA4D,qBAAqB;AACjF;AACA,eAAa,eAAe;AAC5B,eAAa,OAAO;AACpB;AACA;AACA;AACA,gBAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL,iBAAe,kCAAkC;AACjD;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,SAAS;AACxB,mBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAO;;AAEP;AACA;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,SAAS;AACxB;AACA;AACA,mBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAO;;AAEP;AACA;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB,uBAAuB;AAC/C;AACA,2CAAyC,kCAAkC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAC;;;;;;;ACtOD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAW,SAAS;AACpB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAW,QAAQ;AACnB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB,aAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,SAAS;AACpB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAqD,UAAU;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,UAAU;AACrB,eAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6BAA2B,0BAA0B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;AACD;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,aAAW,QAAQ;AACnB,eAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,OAAO;AACpB;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA,aAAW,SAAS;AACpB,aAAW,SAAS;AACpB,aAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,SAAS;AACpB,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,iBAAiB;AAC5B,aAAW,MAAM;AACjB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,EAAE;AACb,aAAW,EAAE;AACb,eAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,YAAY;AACvB,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;AACA,aAAW,YAAY;AACvB,aAAW,OAAO;AAClB,aAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;AACA;AACA,aAAW,YAAY;AACvB,aAAW,YAAY;AACvB,cAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,eAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,MAAM;AACjB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,cAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,MAAM,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK;AAC3C,aAAW,OAAO;AAClB,aAAW,QAAQ;AACnB,eAAa,MAAM,GAAG,KAAK,EAAE,KAAK;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,eAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,iBAAiB;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,YAAY;AACvB,eAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAW,QAAQ;AACnB,aAAW,SAAS;AACpB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAAyB,EAAE;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,QAAQ;AACnB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,eAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,MAAM;AACjB,cAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,cAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,cAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO,KAAK;AACvB,aAAW,OAAO,KAAK;AACvB,aAAW,MAAM;AACjB,cAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,aAAW,MAAM;AACjB,cAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,MAAM;AACjB,aAAW,MAAM;AACjB,cAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,MAAM;AACjB,aAAW,MAAM;AACjB,cAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAAyB;;AAEzB;AACA;;AAEA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;;AAET;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,GAAC;;AAED;AACA,YAAU;AACV,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,gBAAgB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,GAAC;;AAED;AACA,YAAU;AACV,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB,eAAa,gBAAgB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,OAAO;AACtB,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAS;AACT;AACA;;AAEA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA,OAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA,2BAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAmB,6BAA6B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iDAA+C;AAC/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAW,QAAQ;AACnB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,mBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;AACL;AACA;;AAEA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAW,OAAO;AAClB;AACA;AACA,8BAA4B,8BAA8B;;AAE1D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAc;AACd;AACA,kBAAgB;;AAEhB;AACA;AACA,iBAAe,OAAO;AACtB,kBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,mBAAiB;AACjB;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB;AACjB;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAiC;;AAEjC,sCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,mBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,wCAAsC;;AAEtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA,iBAAe,OAAO;AACtB,mBAAiB,MAAM;AACvB;AACA,oCAAkC,EAAE;;AAEpC;AACA;AACA;AACA,mBAAiB;AACjB;AACA,kCAAgC,EAAE;;AAElC;AACA;AACA;AACA;AACA;AACA,yBAAuB;AACvB;;AAEA;AACA;AACA,aAAW,MAAM;AACjB,eAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,MAAM;AACjB,eAAa;AACb;AACA;AACA;AACA;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,kBAAkB;AAC7B,aAAW,WAAW;AACtB,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,iBAAe,OAAO;AACtB,mBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,iBAAe,OAAO;AACtB,mBAAiB,EAAE;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,OAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA,eAAa;AACb,WAAS;AACT;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAS;AACT;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA,WAAS;AACT;AACA,WAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAiB;AACjB;AACA;AACA;AACA,uBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,WAAS;AACT;AACA,OAAK;;AAEL;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA,aAAW,YAAY;AACvB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAc;AACd;AACA;AACA;;AAEA;AACA,gBAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,gBAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAc;AACd;AACA;AACA;AACA,8BAA4B,cAAc;AAC1C,6BAA2B,cAAc;AACzC,6BAA2B,gCAAgC;AAC3D,2BAAyB,gCAAgC;AACzD;AACA,2BAAyB,4BAA4B;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAkB;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAW,YAAY;AACvB,aAAW,OAAO;AAClB;AACA;AACA;AACA,8BAA4B,gCAAgC;;AAE5D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAK;AACL;;AAEA;AACA;AACA;AACA,iBAAe,OAAO;AACtB,mBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA,iBAAe,QAAQ;AACvB;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAkE;AAClE;AACA,eAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,kBAAkB;AACjC,mBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA,iBAAe,WAAW;AAC1B,mBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,kBAAkB;AACjC,mBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,SAAS;AACxB,mBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,SAAS;AACxB,mBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAa;AACb;AACA;AACA,WAAS;AACT;AACA,OAAK;;AAEL;AACA;AACA,iBAAe,OAAO;AACtB,iBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,QAAQ;AACnB,aAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAS;AACT;AACA;AACA,OAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAW,OAAO;AAClB,aAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAC;;AAED;AACA;AACA,qGAAmG,GAAG;AACtG;;AAEA;AACA;AACA;AACA,OAAK;AACL,GAAC;AACD;AACA,GAAC;AACD;AACA;;AAEA,GAAC;;;;;;;ACllFD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA;AACA,KAAG;AACH;AACA;AACA;AACA,GAAC;;AAED;AACA;;AAEA;;AAEA;AACA,oBAAkB,UAAU;AAC5B;AACA;;AAEA;AACA,kBAAgB,UAAU,OAAO,iCAAiC;AAClE;AACA,kBAAgB,SAAS,OAAO,iCAAiC;AACjE;AACA,iBAAe,SAAS,SAAS,iBAAiB;AAClD;AACA,iBAAe,UAAU,SAAS,kBAAkB;AACpD;AACA,iBAAe,SAAS,SAAS,oBAAoB;;AAErD;AACA,uBAAqB;AACrB,uBAAqB;AACrB,uBAAqB;AACrB,uBAAqB;AACrB,uBAAqB;AACrB;AACA,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;AACtB;AACA,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;AACtB,4BAA0B;AAC1B,4BAA0B;AAC1B,4BAA0B;AAC1B,4BAA0B;AAC1B,4BAA0B;AAC1B,4BAA0B;AAC1B,4BAA0B;AAC1B;AACA,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;AACtB,wBAAsB;;;;AAItB,kCAAgC;AAChC,gCAA8B;;AAE9B;AAC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","file":"vis.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vis\"] = factory();\n\telse\n\t\troot[\"vis\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap eca1787db4da1a54ed82","var util = require('./lib/util');\n\n// Graph3d\nutil.extend(exports, require('./index-graph3d'));\n\n// Timeline & Graph2d\nutil.extend(exports, require('./index-timeline-graph2d'));\n\n// Network\nutil.extend(exports, require('./index-network'));\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","// utility functions\n\n// first check if moment.js is already loaded in the browser window, if so,\n// use this instance. Else, load via commonjs.\n\n\nvar moment = require('./module/moment');\nvar uuid = require('./module/uuid');\n\n/**\n * Test whether given object is a number\n * @param {*} object\n * @return {Boolean} isNumber\n */\nexports.isNumber = function (object) {\n  return (object instanceof Number || typeof object == 'number');\n};\n\n/**\n * Censors object elements containing dom elements\n * @param {*} object\n * @return {Object} object without elements\n */\nexports.elementsCensor = function (object) {\n  if (!object) return;\n  var replacer = function(key, value) {\n    if (value instanceof Element) {\n      return \"DOM Element\";\n    } else {\n      return value;\n    }\n  }\n  return JSON.parse(JSON.stringify(object, replacer))\n}\n\n\n/**\n * Remove everything in the DOM object\n * @param DOMobject\n */\nexports.recursiveDOMDelete = function (DOMobject) {\n  if (DOMobject) {\n    while (DOMobject.hasChildNodes() === true) {\n      exports.recursiveDOMDelete(DOMobject.firstChild);\n      DOMobject.removeChild(DOMobject.firstChild);\n    }\n  }\n};\n\n/**\n * this function gives you a range between 0 and 1 based on the min and max values in the set, the total sum of all values and the current value.\n *\n * @param min\n * @param max\n * @param total\n * @param value\n * @returns {number}\n */\nexports.giveRange = function (min, max, total, value) {\n  if (max == min) {\n    return 0.5;\n  }\n  else {\n    var scale = 1 / (max - min);\n    return Math.max(0, (value - min) * scale);\n  }\n}\n\n/**\n * Test whether given object is a string\n * @param {*} object\n * @return {Boolean} isString\n */\nexports.isString = function (object) {\n  return (object instanceof String || typeof object == 'string');\n};\n\n/**\n * Test whether given object is a Date, or a String containing a Date\n * @param {Date | String} object\n * @return {Boolean} isDate\n */\nexports.isDate = function (object) {\n  if (object instanceof Date) {\n    return true;\n  }\n  else if (exports.isString(object)) {\n    // test whether this string contains a date\n    var match = ASPDateRegex.exec(object);\n    if (match) {\n      return true;\n    }\n    else if (!isNaN(Date.parse(object))) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\n/**\n * Create a semi UUID\n * source: http://stackoverflow.com/a/105074/1262753\n * @return {String} uuid\n */\nexports.randomUUID = function () {\n  return uuid.v4();\n};\n\n/**\n * assign all keys of an object that are not nested objects to a certain value (used for color objects).\n * @param obj\n * @param value\n */\nexports.assignAllKeys = function (obj, value) {\n  for (var prop in obj) {\n    if (obj.hasOwnProperty(prop)) {\n      if (typeof obj[prop] !== 'object') {\n        obj[prop] = value;\n      }\n    }\n  }\n}\n\n\n/**\n * Fill an object with a possibly partially defined other object. Only copies values if the a object has an object requiring values.\n * That means an object is not created on a property if only the b object has it.\n * @param obj\n * @param value\n */\nexports.fillIfDefined = function (a, b, allowDeletion = false) {\n  for (var prop in a) {\n    if (b[prop] !== undefined) {\n      if (typeof b[prop] !== 'object') {\n        if ((b[prop] === undefined || b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n          delete a[prop];\n        }\n        else {\n          a[prop] = b[prop];\n        }\n      }\n      else {\n        if (typeof a[prop] === 'object') {\n          exports.fillIfDefined(a[prop], b[prop], allowDeletion);\n        }\n      }\n    }\n  }\n}\n\n\n\n/**\n * Extend object a with the properties of object b or a series of objects\n * Only properties with defined values are copied\n * @param {Object} a\n * @param {... Object} b\n * @return {Object} a\n */\nexports.protoExtend = function (a, b) {\n  for (var i = 1; i < arguments.length; i++) {\n    var other = arguments[i];\n    for (var prop in other) {\n      a[prop] = other[prop];\n    }\n  }\n  return a;\n};\n\n/**\n * Extend object a with the properties of object b or a series of objects\n * Only properties with defined values are copied\n * @param {Object} a\n * @param {... Object} b\n * @return {Object} a\n */\nexports.extend = function (a, b) {\n  for (var i = 1; i < arguments.length; i++) {\n    var other = arguments[i];\n    for (var prop in other) {\n      if (other.hasOwnProperty(prop)) {\n        a[prop] = other[prop];\n      }\n    }\n  }\n  return a;\n};\n\n/**\n * Extend object a with selected properties of object b or a series of objects\n * Only properties with defined values are copied\n * @param {Array.<String>} props\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n */\nexports.selectiveExtend = function (props, a, b) {\n  if (!Array.isArray(props)) {\n    throw new Error('Array with property names expected as first argument');\n  }\n\n  for (var i = 2; i < arguments.length; i++) {\n    var other = arguments[i];\n\n    for (var p = 0; p < props.length; p++) {\n      var prop = props[p];\n      if (other.hasOwnProperty(prop)) {\n        a[prop] = other[prop];\n      }\n    }\n  }\n  return a;\n};\n\n/**\n * Extend object a with selected properties of object b or a series of objects\n * Only properties with defined values are copied\n * @param {Array.<String>} props\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n */\nexports.selectiveDeepExtend = function (props, a, b, allowDeletion = false) {\n  // TODO: add support for Arrays to deepExtend\n  if (Array.isArray(b)) {\n    throw new TypeError('Arrays are not supported by deepExtend');\n  }\n  for (var i = 2; i < arguments.length; i++) {\n    var other = arguments[i];\n    for (var p = 0; p < props.length; p++) {\n      var prop = props[p];\n      if (other.hasOwnProperty(prop)) {\n        if (b[prop] && b[prop].constructor === Object) {\n          if (a[prop] === undefined) {\n            a[prop] = {};\n          }\n          if (a[prop].constructor === Object) {\n            exports.deepExtend(a[prop], b[prop], false, allowDeletion);\n          }\n          else {\n            if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n              delete a[prop];\n            }\n            else {\n              a[prop] = b[prop];\n            }\n          }\n        } else if (Array.isArray(b[prop])) {\n          throw new TypeError('Arrays are not supported by deepExtend');\n        } else {\n          if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n            delete a[prop];\n          }\n          else {\n            a[prop] = b[prop];\n          }\n        }\n\n      }\n    }\n  }\n  return a;\n};\n\n/**\n * Extend object a with selected properties of object b or a series of objects\n * Only properties with defined values are copied\n * @param {Array.<String>} props\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n */\nexports.selectiveNotDeepExtend = function (props, a, b, allowDeletion = false) {\n  // TODO: add support for Arrays to deepExtend\n  if (Array.isArray(b)) {\n    throw new TypeError('Arrays are not supported by deepExtend');\n  }\n  for (var prop in b) {\n    if (b.hasOwnProperty(prop)) {\n      if (props.indexOf(prop) == -1) {\n        if (b[prop] && b[prop].constructor === Object) {\n          if (a[prop] === undefined) {\n            a[prop] = {};\n          }\n          if (a[prop].constructor === Object) {\n            exports.deepExtend(a[prop], b[prop]);\n          }\n          else {\n            if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n              delete a[prop];\n            }\n            else {\n              a[prop] = b[prop];\n            }\n          }\n        } else if (Array.isArray(b[prop])) {\n          a[prop] = [];\n          for (let i = 0; i < b[prop].length; i++) {\n            a[prop].push(b[prop][i]);\n          }\n        } else {\n          if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n            delete a[prop];\n          }\n          else {\n            a[prop] = b[prop];\n          }\n        }\n      }\n    }\n  }\n  return a;\n};\n\n/**\n * Deep extend an object a with the properties of object b\n * @param {Object} a\n * @param {Object} b\n * @param [Boolean] protoExtend --> optional parameter. If true, the prototype values will also be extended.\n *                                  (ie. the options objects that inherit from others will also get the inherited options)\n * @param [Boolean] global      --> optional parameter. If true, the values of fields that are null will not deleted\n * @returns {Object}\n */\nexports.deepExtend = function (a, b, protoExtend, allowDeletion) {\n  for (var prop in b) {\n    if (b.hasOwnProperty(prop) || protoExtend === true) {\n      if (b[prop] && b[prop].constructor === Object) {\n        if (a[prop] === undefined) {\n          a[prop] = {};\n        }\n        if (a[prop].constructor === Object) {\n          exports.deepExtend(a[prop], b[prop], protoExtend);\n        }\n        else {\n          if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n            delete a[prop];\n          }\n          else {\n            a[prop] = b[prop];\n          }\n        }\n      } else if (Array.isArray(b[prop])) {\n        a[prop] = [];\n        for (let i = 0; i < b[prop].length; i++) {\n          a[prop].push(b[prop][i]);\n        }\n      } else {\n        if ((b[prop] === null) && a[prop] !== undefined && allowDeletion === true) {\n          delete a[prop];\n        }\n        else {\n          a[prop] = b[prop];\n        }\n      }\n    }\n  }\n  return a;\n};\n\n/**\n * Test whether all elements in two arrays are equal.\n * @param {Array} a\n * @param {Array} b\n * @return {boolean} Returns true if both arrays have the same length and same\n *                   elements.\n */\nexports.equalArray = function (a, b) {\n  if (a.length != b.length) return false;\n\n  for (var i = 0, len = a.length; i < len; i++) {\n    if (a[i] != b[i]) return false;\n  }\n\n  return true;\n};\n\n/**\n * Convert an object to another type\n * @param {Boolean | Number | String | Date | Moment | Null | undefined} object\n * @param {String | undefined} type   Name of the type. Available types:\n *                                    'Boolean', 'Number', 'String',\n *                                    'Date', 'Moment', ISODate', 'ASPDate'.\n * @return {*} object\n * @throws Error\n */\nexports.convert = function (object, type) {\n  var match;\n\n  if (object === undefined) {\n    return undefined;\n  }\n  if (object === null) {\n    return null;\n  }\n\n  if (!type) {\n    return object;\n  }\n  if (!(typeof type === 'string') && !(type instanceof String)) {\n    throw new Error('Type must be a string');\n  }\n\n  //noinspection FallthroughInSwitchStatementJS\n  switch (type) {\n    case 'boolean':\n    case 'Boolean':\n      return Boolean(object);\n\n    case 'number':\n    case 'Number':\n      if (exports.isString(object) && !isNaN(Date.parse(object))) {\n        return moment(object).valueOf();\n      } else {\n        return Number(object.valueOf());\n      }\n    case 'string':\n    case 'String':\n      return String(object);\n\n    case 'Date':\n      if (exports.isNumber(object)) {\n        return new Date(object);\n      }\n      if (object instanceof Date) {\n        return new Date(object.valueOf());\n      }\n      else if (moment.isMoment(object)) {\n        return new Date(object.valueOf());\n      }\n      if (exports.isString(object)) {\n        match = ASPDateRegex.exec(object);\n        if (match) {\n          // object is an ASP date\n          return new Date(Number(match[1])); // parse number\n        }\n        else {\n          return moment(new Date(object)).toDate(); // parse string\n        }\n      }\n      else {\n        throw new Error(\n          'Cannot convert object of type ' + exports.getType(object) +\n          ' to type Date');\n      }\n\n    case 'Moment':\n      if (exports.isNumber(object)) {\n        return moment(object);\n      }\n      if (object instanceof Date) {\n        return moment(object.valueOf());\n      }\n      else if (moment.isMoment(object)) {\n        return moment(object);\n      }\n      if (exports.isString(object)) {\n        match = ASPDateRegex.exec(object);\n        if (match) {\n          // object is an ASP date\n          return moment(Number(match[1])); // parse number\n        }\n        else {\n          return moment(object); // parse string\n        }\n      }\n      else {\n        throw new Error(\n          'Cannot convert object of type ' + exports.getType(object) +\n          ' to type Date');\n      }\n\n    case 'ISODate':\n      if (exports.isNumber(object)) {\n        return new Date(object);\n      }\n      else if (object instanceof Date) {\n        return object.toISOString();\n      }\n      else if (moment.isMoment(object)) {\n        return object.toDate().toISOString();\n      }\n      else if (exports.isString(object)) {\n        match = ASPDateRegex.exec(object);\n        if (match) {\n          // object is an ASP date\n          return new Date(Number(match[1])).toISOString(); // parse number\n        }\n        else {\n          return moment(object).format(); // ISO 8601\n        }\n      }\n      else {\n        throw new Error(\n          'Cannot convert object of type ' + exports.getType(object) +\n          ' to type ISODate');\n      }\n\n    case 'ASPDate':\n      if (exports.isNumber(object)) {\n        return '/Date(' + object + ')/';\n      }\n      else if (object instanceof Date) {\n        return '/Date(' + object.valueOf() + ')/';\n      }\n      else if (exports.isString(object)) {\n        match = ASPDateRegex.exec(object);\n        var value;\n        if (match) {\n          // object is an ASP date\n          value = new Date(Number(match[1])).valueOf(); // parse number\n        }\n        else {\n          value = new Date(object).valueOf(); // parse string\n        }\n        return '/Date(' + value + ')/';\n      }\n      else {\n        throw new Error(\n          'Cannot convert object of type ' + exports.getType(object) +\n          ' to type ASPDate');\n      }\n\n    default:\n      throw new Error('Unknown type \"' + type + '\"');\n  }\n};\n\n// parse ASP.Net Date pattern,\n// for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/'\n// code from http://momentjs.com/\nvar ASPDateRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n/**\n * Get the type of an object, for example exports.getType([]) returns 'Array'\n * @param {*} object\n * @return {String} type\n */\nexports.getType = function (object) {\n  var type = typeof object;\n\n  if (type == 'object') {\n    if (object === null) {\n      return 'null';\n    }\n    if (object instanceof Boolean) {\n      return 'Boolean';\n    }\n    if (object instanceof Number) {\n      return 'Number';\n    }\n    if (object instanceof String) {\n      return 'String';\n    }\n    if (Array.isArray(object)) {\n      return 'Array';\n    }\n    if (object instanceof Date) {\n      return 'Date';\n    }\n    return 'Object';\n  }\n  else if (type == 'number') {\n    return 'Number';\n  }\n  else if (type == 'boolean') {\n    return 'Boolean';\n  }\n  else if (type == 'string') {\n    return 'String';\n  }\n  else if (type === undefined) {\n    return 'undefined';\n  }\n\n\n  return type;\n};\n\n\n/**\n * Used to extend an array and copy it. This is used to propagate paths recursively.\n *\n * @param arr\n * @param newValue\n * @returns {Array}\n */\nexports.copyAndExtendArray = function (arr, newValue) {\n  let newArr = [];\n  for (let i = 0; i < arr.length; i++) {\n    newArr.push(arr[i]);\n  }\n  newArr.push(newValue);\n  return newArr;\n}\n\n/**\n * Used to extend an array and copy it. This is used to propagate paths recursively.\n *\n * @param arr\n * @param newValue\n * @returns {Array}\n */\nexports.copyArray = function (arr) {\n  let newArr = [];\n  for (let i = 0; i < arr.length; i++) {\n    newArr.push(arr[i]);\n  }\n  return newArr;\n}\n\n/**\n * Retrieve the absolute left value of a DOM element\n * @param {Element} elem        A dom element, for example a div\n * @return {number} left        The absolute left position of this element\n *                              in the browser page.\n */\nexports.getAbsoluteLeft = function (elem) {\n  return elem.getBoundingClientRect().left;\n};\n\nexports.getAbsoluteRight = function (elem) {\n  return elem.getBoundingClientRect().right;\n};\n\n/**\n * Retrieve the absolute top value of a DOM element\n * @param {Element} elem        A dom element, for example a div\n * @return {number} top        The absolute top position of this element\n *                              in the browser page.\n */\nexports.getAbsoluteTop = function (elem) {\n  return elem.getBoundingClientRect().top;\n};\n\n/**\n * add a className to the given elements style\n * @param {Element} elem\n * @param {String} className\n */\nexports.addClassName = function (elem, className) {\n  var classes = elem.className.split(' ');\n  if (classes.indexOf(className) == -1) {\n    classes.push(className); // add the class to the array\n    elem.className = classes.join(' ');\n  }\n};\n\n/**\n * add a className to the given elements style\n * @param {Element} elem\n * @param {String} className\n */\nexports.removeClassName = function (elem, className) {\n  var classes = elem.className.split(' ');\n  var index = classes.indexOf(className);\n  if (index != -1) {\n    classes.splice(index, 1); // remove the class from the array\n    elem.className = classes.join(' ');\n  }\n};\n\n/**\n * For each method for both arrays and objects.\n * In case of an array, the built-in Array.forEach() is applied.\n * In case of an Object, the method loops over all properties of the object.\n * @param {Object | Array} object   An Object or Array\n * @param {function} callback       Callback method, called for each item in\n *                                  the object or array with three parameters:\n *                                  callback(value, index, object)\n */\nexports.forEach = function (object, callback) {\n  var i,\n    len;\n  if (Array.isArray(object)) {\n    // array\n    for (i = 0, len = object.length; i < len; i++) {\n      callback(object[i], i, object);\n    }\n  }\n  else {\n    // object\n    for (i in object) {\n      if (object.hasOwnProperty(i)) {\n        callback(object[i], i, object);\n      }\n    }\n  }\n};\n\n/**\n * Convert an object into an array: all objects properties are put into the\n * array. The resulting array is unordered.\n * @param {Object} object\n * @param {Array} array\n */\nexports.toArray = function (object) {\n  var array = [];\n\n  for (var prop in object) {\n    if (object.hasOwnProperty(prop)) array.push(object[prop]);\n  }\n\n  return array;\n};\n\n/**\n * Update a property in an object\n * @param {Object} object\n * @param {String} key\n * @param {*} value\n * @return {Boolean} changed\n */\nexports.updateProperty = function (object, key, value) {\n  if (object[key] !== value) {\n    object[key] = value;\n    return true;\n  }\n  else {\n    return false;\n  }\n};\n\n/**\n * Throttle the given function to be only executed once per animation frame\n * @param {function} fn\n * @returns {function} Returns the throttled function\n */\nexports.throttle = function (fn) {\n  var scheduled = false;\n\n  return function throttled () {\n    if (!scheduled) {\n      scheduled = true;\n      requestAnimationFrame(function () {\n        scheduled = false;\n        fn();\n      });\n    }\n  }\n};\n\n/**\n * Add and event listener. Works for all browsers\n * @param {Element}     element    An html element\n * @param {string}      action     The action, for example \"click\",\n *                                 without the prefix \"on\"\n * @param {function}    listener   The callback function to be executed\n * @param {boolean}     [useCapture]\n */\nexports.addEventListener = function (element, action, listener, useCapture) {\n  if (element.addEventListener) {\n    if (useCapture === undefined)\n      useCapture = false;\n\n    if (action === \"mousewheel\" && navigator.userAgent.indexOf(\"Firefox\") >= 0) {\n      action = \"DOMMouseScroll\";  // For Firefox\n    }\n\n    element.addEventListener(action, listener, useCapture);\n  } else {\n    element.attachEvent(\"on\" + action, listener);  // IE browsers\n  }\n};\n\n/**\n * Remove an event listener from an element\n * @param {Element}     element         An html dom element\n * @param {string}      action          The name of the event, for example \"mousedown\"\n * @param {function}    listener        The listener function\n * @param {boolean}     [useCapture]\n */\nexports.removeEventListener = function (element, action, listener, useCapture) {\n  if (element.removeEventListener) {\n    // non-IE browsers\n    if (useCapture === undefined)\n      useCapture = false;\n\n    if (action === \"mousewheel\" && navigator.userAgent.indexOf(\"Firefox\") >= 0) {\n      action = \"DOMMouseScroll\";  // For Firefox\n    }\n\n    element.removeEventListener(action, listener, useCapture);\n  } else {\n    // IE browsers\n    element.detachEvent(\"on\" + action, listener);\n  }\n};\n\n/**\n * Cancels the event if it is cancelable, without stopping further propagation of the event.\n */\nexports.preventDefault = function (event) {\n  if (!event)\n    event = window.event;\n\n  if (event.preventDefault) {\n    event.preventDefault();  // non-IE browsers\n  }\n  else {\n    event.returnValue = false;  // IE browsers\n  }\n};\n\n/**\n * Get HTML element which is the target of the event\n * @param {Event} event\n * @return {Element} target element\n */\nexports.getTarget = function (event) {\n  // code from http://www.quirksmode.org/js/events_properties.html\n  if (!event) {\n    event = window.event;\n  }\n\n  var target;\n\n  if (event.target) {\n    target = event.target;\n  }\n  else if (event.srcElement) {\n    target = event.srcElement;\n  }\n\n  if (target.nodeType != undefined && target.nodeType == 3) {\n    // defeat Safari bug\n    target = target.parentNode;\n  }\n\n  return target;\n};\n\n/**\n * Check if given element contains given parent somewhere in the DOM tree\n * @param {Element} element\n * @param {Element} parent\n */\nexports.hasParent = function (element, parent) {\n  var e = element;\n\n  while (e) {\n    if (e === parent) {\n      return true;\n    }\n    e = e.parentNode;\n  }\n\n  return false;\n};\n\nexports.option = {};\n\n/**\n * Convert a value into a boolean\n * @param {Boolean | function | undefined} value\n * @param {Boolean} [defaultValue]\n * @returns {Boolean} bool\n */\nexports.option.asBoolean = function (value, defaultValue) {\n  if (typeof value == 'function') {\n    value = value();\n  }\n\n  if (value != null) {\n    return (value != false);\n  }\n\n  return defaultValue || null;\n};\n\n/**\n * Convert a value into a number\n * @param {Boolean | function | undefined} value\n * @param {Number} [defaultValue]\n * @returns {Number} number\n */\nexports.option.asNumber = function (value, defaultValue) {\n  if (typeof value == 'function') {\n    value = value();\n  }\n\n  if (value != null) {\n    return Number(value) || defaultValue || null;\n  }\n\n  return defaultValue || null;\n};\n\n/**\n * Convert a value into a string\n * @param {String | function | undefined} value\n * @param {String} [defaultValue]\n * @returns {String} str\n */\nexports.option.asString = function (value, defaultValue) {\n  if (typeof value == 'function') {\n    value = value();\n  }\n\n  if (value != null) {\n    return String(value);\n  }\n\n  return defaultValue || null;\n};\n\n/**\n * Convert a size or location into a string with pixels or a percentage\n * @param {String | Number | function | undefined} value\n * @param {String} [defaultValue]\n * @returns {String} size\n */\nexports.option.asSize = function (value, defaultValue) {\n  if (typeof value == 'function') {\n    value = value();\n  }\n\n  if (exports.isString(value)) {\n    return value;\n  }\n  else if (exports.isNumber(value)) {\n    return value + 'px';\n  }\n  else {\n    return defaultValue || null;\n  }\n};\n\n/**\n * Convert a value into a DOM element\n * @param {HTMLElement | function | undefined} value\n * @param {HTMLElement} [defaultValue]\n * @returns {HTMLElement | null} dom\n */\nexports.option.asElement = function (value, defaultValue) {\n  if (typeof value == 'function') {\n    value = value();\n  }\n\n  return value || defaultValue || null;\n};\n\n/**\n * http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\n *\n * @param {String} hex\n * @returns {{r: *, g: *, b: *}} | 255 range\n */\nexports.hexToRGB = function (hex) {\n  // Expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\n  var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n  hex = hex.replace(shorthandRegex, function (m, r, g, b) {\n    return r + r + g + g + b + b;\n  });\n  var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result ? {\n    r: parseInt(result[1], 16),\n    g: parseInt(result[2], 16),\n    b: parseInt(result[3], 16)\n  } : null;\n};\n\n/**\n * This function takes color in hex format or rgb() or rgba() format and overrides the opacity. Returns rgba() string.\n * @param color\n * @param opacity\n * @returns {*}\n */\nexports.overrideOpacity = function (color, opacity) {\n  if (color.indexOf(\"rgba\") != -1) {\n    return color;\n  }\n  else if (color.indexOf(\"rgb\") != -1) {\n    var rgb = color.substr(color.indexOf(\"(\") + 1).replace(\")\", \"\").split(\",\");\n    return \"rgba(\" + rgb[0] + \",\" + rgb[1] + \",\" + rgb[2] + \",\" + opacity + \")\"\n  }\n  else {\n    var rgb = exports.hexToRGB(color);\n    if (rgb == null) {\n      return color;\n    }\n    else {\n      return \"rgba(\" + rgb.r + \",\" + rgb.g + \",\" + rgb.b + \",\" + opacity + \")\"\n    }\n  }\n}\n\n/**\n *\n * @param red     0 -- 255\n * @param green   0 -- 255\n * @param blue    0 -- 255\n * @returns {string}\n * @constructor\n */\nexports.RGBToHex = function (red, green, blue) {\n  return \"#\" + ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1);\n};\n\n/**\n * Parse a color property into an object with border, background, and\n * highlight colors\n * @param {Object | String} color\n * @return {Object} colorObject\n */\nexports.parseColor = function (color) {\n  var c;\n  if (exports.isString(color) === true) {\n    if (exports.isValidRGB(color) === true) {\n      var rgb = color.substr(4).substr(0, color.length - 5).split(',').map(function (value) { return parseInt(value) });\n      color = exports.RGBToHex(rgb[0], rgb[1], rgb[2]);\n    }\n    if (exports.isValidHex(color) === true) {\n      var hsv = exports.hexToHSV(color);\n      var lighterColorHSV = { h: hsv.h, s: hsv.s * 0.8, v: Math.min(1, hsv.v * 1.02) };\n      var darkerColorHSV = { h: hsv.h, s: Math.min(1, hsv.s * 1.25), v: hsv.v * 0.8 };\n      var darkerColorHex = exports.HSVToHex(darkerColorHSV.h, darkerColorHSV.s, darkerColorHSV.v);\n      var lighterColorHex = exports.HSVToHex(lighterColorHSV.h, lighterColorHSV.s, lighterColorHSV.v);\n      c = {\n        background: color,\n        border: darkerColorHex,\n        highlight: {\n          background: lighterColorHex,\n          border: darkerColorHex\n        },\n        hover: {\n          background: lighterColorHex,\n          border: darkerColorHex\n        }\n      };\n    }\n    else {\n      c = {\n        background: color,\n        border: color,\n        highlight: {\n          background: color,\n          border: color\n        },\n        hover: {\n          background: color,\n          border: color\n        }\n      };\n    }\n  }\n  else {\n    c = {};\n    c.background = color.background || undefined;\n    c.border = color.border || undefined;\n\n    if (exports.isString(color.highlight)) {\n      c.highlight = {\n        border: color.highlight,\n        background: color.highlight\n      }\n    }\n    else {\n      c.highlight = {};\n      c.highlight.background = color.highlight && color.highlight.background || undefined;\n      c.highlight.border = color.highlight && color.highlight.border || undefined;\n    }\n\n    if (exports.isString(color.hover)) {\n      c.hover = {\n        border: color.hover,\n        background: color.hover\n      }\n    }\n    else {\n      c.hover = {};\n      c.hover.background = color.hover && color.hover.background || undefined;\n      c.hover.border = color.hover && color.hover.border || undefined;\n    }\n  }\n\n  return c;\n};\n\n\n\n/**\n * http://www.javascripter.net/faq/rgb2hsv.htm\n *\n * @param red\n * @param green\n * @param blue\n * @returns {*}\n * @constructor\n */\nexports.RGBToHSV = function (red, green, blue) {\n  red = red / 255; green = green / 255; blue = blue / 255;\n  var minRGB = Math.min(red, Math.min(green, blue));\n  var maxRGB = Math.max(red, Math.max(green, blue));\n\n  // Black-gray-white\n  if (minRGB == maxRGB) {\n    return { h: 0, s: 0, v: minRGB };\n  }\n\n  // Colors other than black-gray-white:\n  var d = (red == minRGB) ? green - blue : ((blue == minRGB) ? red - green : blue - red);\n  var h = (red == minRGB) ? 3 : ((blue == minRGB) ? 1 : 5);\n  var hue = 60 * (h - d / (maxRGB - minRGB)) / 360;\n  var saturation = (maxRGB - minRGB) / maxRGB;\n  var value = maxRGB;\n  return { h: hue, s: saturation, v: value };\n};\n\nvar cssUtil = {\n  // split a string with css styles into an object with key/values\n  split: function (cssText) {\n    var styles = {};\n\n    cssText.split(';').forEach(function (style) {\n      if (style.trim() != '') {\n        var parts = style.split(':');\n        var key = parts[0].trim();\n        var value = parts[1].trim();\n        styles[key] = value;\n      }\n    });\n\n    return styles;\n  },\n\n  // build a css text string from an object with key/values\n  join: function (styles) {\n    return Object.keys(styles)\n      .map(function (key) {\n        return key + ': ' + styles[key];\n      })\n      .join('; ');\n  }\n};\n\n/**\n * Append a string with css styles to an element\n * @param {Element} element\n * @param {String} cssText\n */\nexports.addCssText = function (element, cssText) {\n  var currentStyles = cssUtil.split(element.style.cssText);\n  var newStyles = cssUtil.split(cssText);\n  var styles = exports.extend(currentStyles, newStyles);\n\n  element.style.cssText = cssUtil.join(styles);\n};\n\n/**\n * Remove a string with css styles from an element\n * @param {Element} element\n * @param {String} cssText\n */\nexports.removeCssText = function (element, cssText) {\n  var styles = cssUtil.split(element.style.cssText);\n  var removeStyles = cssUtil.split(cssText);\n\n  for (var key in removeStyles) {\n    if (removeStyles.hasOwnProperty(key)) {\n      delete styles[key];\n    }\n  }\n\n  element.style.cssText = cssUtil.join(styles);\n};\n\n/**\n * https://gist.github.com/mjijackson/5311256\n * @param h\n * @param s\n * @param v\n * @returns {{r: number, g: number, b: number}}\n * @constructor\n */\nexports.HSVToRGB = function (h, s, v) {\n  var r, g, b;\n\n  var i = Math.floor(h * 6);\n  var f = h * 6 - i;\n  var p = v * (1 - s);\n  var q = v * (1 - f * s);\n  var t = v * (1 - (1 - f) * s);\n\n  switch (i % 6) {\n    case 0: r = v, g = t, b = p; break;\n    case 1: r = q, g = v, b = p; break;\n    case 2: r = p, g = v, b = t; break;\n    case 3: r = p, g = q, b = v; break;\n    case 4: r = t, g = p, b = v; break;\n    case 5: r = v, g = p, b = q; break;\n  }\n\n  return { r: Math.floor(r * 255), g: Math.floor(g * 255), b: Math.floor(b * 255) };\n};\n\nexports.HSVToHex = function (h, s, v) {\n  var rgb = exports.HSVToRGB(h, s, v);\n  return exports.RGBToHex(rgb.r, rgb.g, rgb.b);\n};\n\nexports.hexToHSV = function (hex) {\n  var rgb = exports.hexToRGB(hex);\n  return exports.RGBToHSV(rgb.r, rgb.g, rgb.b);\n};\n\nexports.isValidHex = function (hex) {\n  var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex);\n  return isOk;\n};\n\nexports.isValidRGB = function (rgb) {\n  rgb = rgb.replace(\" \", \"\");\n  var isOk = /rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/i.test(rgb);\n  return isOk;\n}\nexports.isValidRGBA = function (rgba) {\n  rgba = rgba.replace(\" \", \"\");\n  var isOk = /rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(.{1,3})\\)/i.test(rgba);\n  return isOk;\n}\n\n/**\n * This recursively redirects the prototype of JSON objects to the referenceObject\n * This is used for default options.\n *\n * @param referenceObject\n * @returns {*}\n */\nexports.selectiveBridgeObject = function (fields, referenceObject) {\n  if (typeof referenceObject == \"object\") {\n    var objectTo = Object.create(referenceObject);\n    for (var i = 0; i < fields.length; i++) {\n      if (referenceObject.hasOwnProperty(fields[i])) {\n        if (typeof referenceObject[fields[i]] == \"object\") {\n          objectTo[fields[i]] = exports.bridgeObject(referenceObject[fields[i]]);\n        }\n      }\n    }\n    return objectTo;\n  }\n  else {\n    return null;\n  }\n};\n\n/**\n * This recursively redirects the prototype of JSON objects to the referenceObject\n * This is used for default options.\n *\n * @param referenceObject\n * @returns {*}\n */\nexports.bridgeObject = function (referenceObject) {\n  if (typeof referenceObject == \"object\") {\n    var objectTo = Object.create(referenceObject);\n    for (var i in referenceObject) {\n      if (referenceObject.hasOwnProperty(i)) {\n        if (typeof referenceObject[i] == \"object\") {\n          objectTo[i] = exports.bridgeObject(referenceObject[i]);\n        }\n      }\n    }\n    return objectTo;\n  }\n  else {\n    return null;\n  }\n};\n\n/**\n * This method provides a stable sort implementation, very fast for presorted data\n *\n * @param a the array\n * @param a order comparator\n * @returns {the array}\n */\nexports.insertSort = function (a,compare) {\n  for (var i = 0; i < a.length; i++) {\n    var k = a[i];\n    for (var j = i; j > 0 && compare(k,a[j - 1])<0; j--) {\n      a[j] = a[j - 1];\n    }\n    a[j] = k;\n  }\n  return a;\n}\n\n/**\n * this is used to set the options of subobjects in the options object. A requirement of these subobjects\n * is that they have an 'enabled' element which is optional for the user but mandatory for the program.\n *\n * @param [object] mergeTarget | this is either this.options or the options used for the groups.\n * @param [object] options     | options\n * @param [String] option      | this is the option key in the options argument\n */\nexports.mergeOptions = function (mergeTarget, options, option, allowDeletion = false, globalOptions = {}) {\n  if (options[option] === null) {\n    mergeTarget[option] = Object.create(globalOptions[option]);\n  }\n  else {\n    if (options[option] !== undefined) {\n      if (typeof options[option] === 'boolean') {\n        mergeTarget[option].enabled = options[option];\n      }\n      else {\n        if (options[option].enabled === undefined) {\n          mergeTarget[option].enabled = true;\n        }\n        for (var prop in options[option]) {\n          if (options[option].hasOwnProperty(prop)) {\n            mergeTarget[option][prop] = options[option][prop];\n          }\n        }\n      }\n    }\n  }\n}\n\n\n/**\n * This function does a binary search for a visible item in a sorted list. If we find a visible item, the code that uses\n * this function will then iterate in both directions over this sorted list to find all visible items.\n *\n * @param {Item[]} orderedItems       | Items ordered by start\n * @param {function} comparator       | -1 is lower, 0 is equal, 1 is higher\n * @param {String} field\n * @param {String} field2\n * @returns {number}\n * @private\n */\nexports.binarySearchCustom = function (orderedItems, comparator, field, field2) {\n  var maxIterations = 10000;\n  var iteration = 0;\n  var low = 0;\n  var high = orderedItems.length - 1;\n\n  while (low <= high && iteration < maxIterations) {\n    var middle = Math.floor((low + high) / 2);\n\n    var item = orderedItems[middle];\n    var value = (field2 === undefined) ? item[field] : item[field][field2];\n\n    var searchResult = comparator(value);\n    if (searchResult == 0) { // jihaa, found a visible item!\n      return middle;\n    }\n    else if (searchResult == -1) {  // it is too small --> increase low\n      low = middle + 1;\n    }\n    else {  // it is too big --> decrease high\n      high = middle - 1;\n    }\n\n    iteration++;\n  }\n\n  return -1;\n};\n\n/**\n * This function does a binary search for a specific value in a sorted array. If it does not exist but is in between of\n * two values, we return either the one before or the one after, depending on user input\n * If it is found, we return the index, else -1.\n *\n * @param {Array} orderedItems\n * @param {{start: number, end: number}} target\n * @param {String} field\n * @param {String} sidePreference   'before' or 'after'\n * @param {function} comparator an optional comparator, returning -1,0,1 for <,==,>.\n * @returns {number}\n * @private\n */\nexports.binarySearchValue = function (orderedItems, target, field, sidePreference, comparator) {\n  var maxIterations = 10000;\n  var iteration = 0;\n  var low = 0;\n  var high = orderedItems.length - 1;\n  var prevValue, value, nextValue, middle;\n\n  var comparator = comparator != undefined ? comparator : function (a, b) {\n    return a == b ? 0 : a < b ? -1 : 1\n  };\n\n  while (low <= high && iteration < maxIterations) {\n    // get a new guess\n    middle = Math.floor(0.5 * (high + low));\n    prevValue = orderedItems[Math.max(0, middle - 1)][field];\n    value = orderedItems[middle][field];\n    nextValue = orderedItems[Math.min(orderedItems.length - 1, middle + 1)][field];\n\n    if (comparator(value, target) == 0) { // we found the target\n      return middle;\n    }\n    else if (comparator(prevValue, target) < 0 && comparator(value, target) > 0) {  // target is in between of the previous and the current\n      return sidePreference == 'before' ? Math.max(0, middle - 1) : middle;\n    }\n    else if (comparator(value, target) < 0 && comparator(nextValue, target) > 0) { // target is in between of the current and the next\n      return sidePreference == 'before' ? middle : Math.min(orderedItems.length - 1, middle + 1);\n    }\n    else {  // didnt find the target, we need to change our boundaries.\n      if (comparator(value, target) < 0) { // it is too small --> increase low\n        low = middle + 1;\n      }\n      else {  // it is too big --> decrease high\n        high = middle - 1;\n      }\n    }\n    iteration++;\n  }\n\n  // didnt find anything. Return -1.\n  return -1;\n};\n\n/*\n * Easing Functions - inspired from http://gizma.com/easing/\n * only considering the t value for the range [0, 1] => [0, 1]\n * https://gist.github.com/gre/1650294\n */\nexports.easingFunctions = {\n  // no easing, no acceleration\n  linear: function (t) {\n    return t\n  },\n  // accelerating from zero velocity\n  easeInQuad: function (t) {\n    return t * t\n  },\n  // decelerating to zero velocity\n  easeOutQuad: function (t) {\n    return t * (2 - t)\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuad: function (t) {\n    return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n  },\n  // accelerating from zero velocity\n  easeInCubic: function (t) {\n    return t * t * t\n  },\n  // decelerating to zero velocity\n  easeOutCubic: function (t) {\n    return (--t) * t * t + 1\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutCubic: function (t) {\n    return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\n  },\n  // accelerating from zero velocity\n  easeInQuart: function (t) {\n    return t * t * t * t\n  },\n  // decelerating to zero velocity\n  easeOutQuart: function (t) {\n    return 1 - (--t) * t * t * t\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuart: function (t) {\n    return t < .5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t\n  },\n  // accelerating from zero velocity\n  easeInQuint: function (t) {\n    return t * t * t * t * t\n  },\n  // decelerating to zero velocity\n  easeOutQuint: function (t) {\n    return 1 + (--t) * t * t * t * t\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuint: function (t) {\n    return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t\n  }\n};\n\nexports.getScrollBarWidth = function () {\n  var inner = document.createElement('p');\n  inner.style.width = \"100%\";\n  inner.style.height = \"200px\";\n\n  var outer = document.createElement('div');\n  outer.style.position = \"absolute\";\n  outer.style.top = \"0px\";\n  outer.style.left = \"0px\";\n  outer.style.visibility = \"hidden\";\n  outer.style.width = \"200px\";\n  outer.style.height = \"150px\";\n  outer.style.overflow = \"hidden\";\n  outer.appendChild (inner);\n\n  document.body.appendChild (outer);\n  var w1 = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var w2 = inner.offsetWidth;\n  if (w1 == w2) w2 = outer.clientWidth;\n\n  document.body.removeChild (outer);\n\n  return (w1 - w2);\n};\n\nexports.topMost = function (pile, accessors) {\n  let candidate;\n  if (!Array.isArray(accessors)) {\n    accessors = [accessors];\n  }\n  for (const member of pile) {\n    if (member) {\n      candidate = member[accessors[0]];\n      for (let i = 1; i < accessors.length; i++){\n        if (candidate) {\n          candidate = candidate[accessors[i]]\n        } else {\n          continue;\n        }\n      }\n      if (typeof candidate != 'undefined') {\n        break;\n      }\n    }\n  }\n  return candidate;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/util.js","module.exports = { \"default\": require(\"core-js/library/fn/get-iterator\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/get-iterator.js\n// module id = 2\n// module chunks = 0","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/get-iterator.js\n// module id = 3\n// module chunks = 0","require('./es6.array.iterator');\nvar global        = require('./_global')\n  , hide          = require('./_hide')\n  , Iterators     = require('./_iterators')\n  , TO_STRING_TAG = require('./_wks')('toStringTag');\n\nfor(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){\n  var NAME       = collections[i]\n    , Collection = global[NAME]\n    , proto      = Collection && Collection.prototype;\n  if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);\n  Iterators[NAME] = Iterators.Array;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/web.dom.iterable.js\n// module id = 4\n// module chunks = 0","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables')\n  , step             = require('./_iter-step')\n  , Iterators        = require('./_iterators')\n  , toIObject        = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function(iterated, kind){\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , kind  = this._k\n    , index = this._i++;\n  if(!O || index >= O.length){\n    this._t = undefined;\n    return step(1);\n  }\n  if(kind == 'keys'  )return step(0, index);\n  if(kind == 'values')return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.array.iterator.js\n// module id = 5\n// module chunks = 0","module.exports = function(){ /* empty */ };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_add-to-unscopables.js\n// module id = 6\n// module chunks = 0","module.exports = function(done, value){\n  return {value: value, done: !!done};\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_iter-step.js\n// module id = 7\n// module chunks = 0","module.exports = {};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_iterators.js\n// module id = 8\n// module chunks = 0","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject')\n  , defined = require('./_defined');\nmodule.exports = function(it){\n  return IObject(defined(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-iobject.js\n// module id = 9\n// module chunks = 0","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_iobject.js\n// module id = 10\n// module chunks = 0","var toString = {}.toString;\n\nmodule.exports = function(it){\n  return toString.call(it).slice(8, -1);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_cof.js\n// module id = 11\n// module chunks = 0","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n  if(it == undefined)throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_defined.js\n// module id = 12\n// module chunks = 0","'use strict';\nvar LIBRARY        = require('./_library')\n  , $export        = require('./_export')\n  , redefine       = require('./_redefine')\n  , hide           = require('./_hide')\n  , has            = require('./_has')\n  , Iterators      = require('./_iterators')\n  , $iterCreate    = require('./_iter-create')\n  , setToStringTag = require('./_set-to-string-tag')\n  , getPrototypeOf = require('./_object-gpo')\n  , ITERATOR       = require('./_wks')('iterator')\n  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n  , FF_ITERATOR    = '@@iterator'\n  , KEYS           = 'keys'\n  , VALUES         = 'values';\n\nvar returnThis = function(){ return this; };\n\nmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function(kind){\n    if(!BUGGY && kind in proto)return proto[kind];\n    switch(kind){\n      case KEYS: return function keys(){ return new Constructor(this, kind); };\n      case VALUES: return function values(){ return new Constructor(this, kind); };\n    } return function entries(){ return new Constructor(this, kind); };\n  };\n  var TAG        = NAME + ' Iterator'\n    , DEF_VALUES = DEFAULT == VALUES\n    , VALUES_BUG = false\n    , proto      = Base.prototype\n    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n    , $default   = $native || getMethod(DEFAULT)\n    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined\n    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native\n    , methods, key, IteratorPrototype;\n  // Fix native\n  if($anyNative){\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base));\n    if(IteratorPrototype !== Object.prototype){\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if(DEF_VALUES && $native && $native.name !== VALUES){\n    VALUES_BUG = true;\n    $default = function values(){ return $native.call(this); };\n  }\n  // Define iterator\n  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG]  = returnThis;\n  if(DEFAULT){\n    methods = {\n      values:  DEF_VALUES ? $default : getMethod(VALUES),\n      keys:    IS_SET     ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if(FORCED)for(key in methods){\n      if(!(key in proto))redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_iter-define.js\n// module id = 13\n// module chunks = 0","module.exports = true;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_library.js\n// module id = 14\n// module chunks = 0","var global    = require('./_global')\n  , core      = require('./_core')\n  , ctx       = require('./_ctx')\n  , hide      = require('./_hide')\n  , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n  var IS_FORCED = type & $export.F\n    , IS_GLOBAL = type & $export.G\n    , IS_STATIC = type & $export.S\n    , IS_PROTO  = type & $export.P\n    , IS_BIND   = type & $export.B\n    , IS_WRAP   = type & $export.W\n    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})\n    , expProto  = exports[PROTOTYPE]\n    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n    , key, own, out;\n  if(IS_GLOBAL)source = name;\n  for(key in source){\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if(own && key in exports)continue;\n    // export native or passed\n    out = own ? target[key] : source[key];\n    // prevent global pollution for namespaces\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n    // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global)\n    // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? (function(C){\n      var F = function(a, b, c){\n        if(this instanceof C){\n          switch(arguments.length){\n            case 0: return new C;\n            case 1: return new C(a);\n            case 2: return new C(a, b);\n          } return new C(a, b, c);\n        } return C.apply(this, arguments);\n      };\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F;\n    // make static versions for prototype methods\n    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n    if(IS_PROTO){\n      (exports.virtual || (exports.virtual = {}))[key] = out;\n      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n      if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n    }\n  }\n};\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_export.js\n// module id = 15\n// module chunks = 0","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_global.js\n// module id = 16\n// module chunks = 0","var core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_core.js\n// module id = 17\n// module chunks = 0","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n  aFunction(fn);\n  if(that === undefined)return fn;\n  switch(length){\n    case 1: return function(a){\n      return fn.call(that, a);\n    };\n    case 2: return function(a, b){\n      return fn.call(that, a, b);\n    };\n    case 3: return function(a, b, c){\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function(/* ...args */){\n    return fn.apply(that, arguments);\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_ctx.js\n// module id = 18\n// module chunks = 0","module.exports = function(it){\n  if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_a-function.js\n// module id = 19\n// module chunks = 0","var dP         = require('./_object-dp')\n  , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n  return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n  object[key] = value;\n  return object;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_hide.js\n// module id = 20\n// module chunks = 0","var anObject       = require('./_an-object')\n  , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n  , toPrimitive    = require('./_to-primitive')\n  , dP             = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if(IE8_DOM_DEFINE)try {\n    return dP(O, P, Attributes);\n  } catch(e){ /* empty */ }\n  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n  if('value' in Attributes)O[P] = Attributes.value;\n  return O;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-dp.js\n// module id = 21\n// module chunks = 0","var isObject = require('./_is-object');\nmodule.exports = function(it){\n  if(!isObject(it))throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_an-object.js\n// module id = 22\n// module chunks = 0","module.exports = function(it){\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_is-object.js\n// module id = 23\n// module chunks = 0","module.exports = !require('./_descriptors') && !require('./_fails')(function(){\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_ie8-dom-define.js\n// module id = 24\n// module chunks = 0","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_descriptors.js\n// module id = 25\n// module chunks = 0","module.exports = function(exec){\n  try {\n    return !!exec();\n  } catch(e){\n    return true;\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_fails.js\n// module id = 26\n// module chunks = 0","var isObject = require('./_is-object')\n  , document = require('./_global').document\n  // in old IE typeof document.createElement is 'object'\n  , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n  return is ? document.createElement(it) : {};\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_dom-create.js\n// module id = 27\n// module chunks = 0","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n  if(!isObject(it))return it;\n  var fn, val;\n  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-primitive.js\n// module id = 28\n// module chunks = 0","module.exports = function(bitmap, value){\n  return {\n    enumerable  : !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable    : !(bitmap & 4),\n    value       : value\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_property-desc.js\n// module id = 29\n// module chunks = 0","module.exports = require('./_hide');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_redefine.js\n// module id = 30\n// module chunks = 0","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n  return hasOwnProperty.call(it, key);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_has.js\n// module id = 31\n// module chunks = 0","'use strict';\nvar create         = require('./_object-create')\n  , descriptor     = require('./_property-desc')\n  , setToStringTag = require('./_set-to-string-tag')\n  , IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function(){ return this; });\n\nmodule.exports = function(Constructor, NAME, next){\n  Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_iter-create.js\n// module id = 32\n// module chunks = 0","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject    = require('./_an-object')\n  , dPs         = require('./_object-dps')\n  , enumBugKeys = require('./_enum-bug-keys')\n  , IE_PROTO    = require('./_shared-key')('IE_PROTO')\n  , Empty       = function(){ /* empty */ }\n  , PROTOTYPE   = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function(){\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe')\n    , i      = enumBugKeys.length\n    , lt     = '<'\n    , gt     = '>'\n    , iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties){\n  var result;\n  if(O !== null){\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty;\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-create.js\n// module id = 33\n// module chunks = 0","var dP       = require('./_object-dp')\n  , anObject = require('./_an-object')\n  , getKeys  = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){\n  anObject(O);\n  var keys   = getKeys(Properties)\n    , length = keys.length\n    , i = 0\n    , P;\n  while(length > i)dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-dps.js\n// module id = 34\n// module chunks = 0","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys       = require('./_object-keys-internal')\n  , enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O){\n  return $keys(O, enumBugKeys);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-keys.js\n// module id = 35\n// module chunks = 0","var has          = require('./_has')\n  , toIObject    = require('./_to-iobject')\n  , arrayIndexOf = require('./_array-includes')(false)\n  , IE_PROTO     = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function(object, names){\n  var O      = toIObject(object)\n    , i      = 0\n    , result = []\n    , key;\n  for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while(names.length > i)if(has(O, key = names[i++])){\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-keys-internal.js\n// module id = 36\n// module chunks = 0","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject')\n  , toLength  = require('./_to-length')\n  , toIndex   = require('./_to-index');\nmodule.exports = function(IS_INCLUDES){\n  return function($this, el, fromIndex){\n    var O      = toIObject($this)\n      , length = toLength(O.length)\n      , index  = toIndex(fromIndex, length)\n      , value;\n    // Array#includes uses SameValueZero equality algorithm\n    if(IS_INCLUDES && el != el)while(length > index){\n      value = O[index++];\n      if(value != value)return true;\n    // Array#toIndex ignores holes, Array#includes - not\n    } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n      if(O[index] === el)return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_array-includes.js\n// module id = 37\n// module chunks = 0","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer')\n  , min       = Math.min;\nmodule.exports = function(it){\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-length.js\n// module id = 38\n// module chunks = 0","// 7.1.4 ToInteger\nvar ceil  = Math.ceil\n  , floor = Math.floor;\nmodule.exports = function(it){\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-integer.js\n// module id = 39\n// module chunks = 0","var toInteger = require('./_to-integer')\n  , max       = Math.max\n  , min       = Math.min;\nmodule.exports = function(index, length){\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-index.js\n// module id = 40\n// module chunks = 0","var shared = require('./_shared')('keys')\n  , uid    = require('./_uid');\nmodule.exports = function(key){\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_shared-key.js\n// module id = 41\n// module chunks = 0","var global = require('./_global')\n  , SHARED = '__core-js_shared__'\n  , store  = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n  return store[key] || (store[key] = {});\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_shared.js\n// module id = 42\n// module chunks = 0","var id = 0\n  , px = Math.random();\nmodule.exports = function(key){\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_uid.js\n// module id = 43\n// module chunks = 0","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_enum-bug-keys.js\n// module id = 44\n// module chunks = 0","module.exports = require('./_global').document && document.documentElement;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_html.js\n// module id = 45\n// module chunks = 0","var def = require('./_object-dp').f\n  , has = require('./_has')\n  , TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function(it, tag, stat){\n  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_set-to-string-tag.js\n// module id = 46\n// module chunks = 0","var store      = require('./_shared')('wks')\n  , uid        = require('./_uid')\n  , Symbol     = require('./_global').Symbol\n  , USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function(name){\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_wks.js\n// module id = 47\n// module chunks = 0","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has         = require('./_has')\n  , toObject    = require('./_to-object')\n  , IE_PROTO    = require('./_shared-key')('IE_PROTO')\n  , ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function(O){\n  O = toObject(O);\n  if(has(O, IE_PROTO))return O[IE_PROTO];\n  if(typeof O.constructor == 'function' && O instanceof O.constructor){\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-gpo.js\n// module id = 48\n// module chunks = 0","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function(it){\n  return Object(defined(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_to-object.js\n// module id = 49\n// module chunks = 0","'use strict';\nvar $at  = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function(iterated){\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , index = this._i\n    , point;\n  if(index >= O.length)return {value: undefined, done: true};\n  point = $at(O, index);\n  this._i += point.length;\n  return {value: point, done: false};\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.string.iterator.js\n// module id = 50\n// module chunks = 0","var toInteger = require('./_to-integer')\n  , defined   = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function(TO_STRING){\n  return function(that, pos){\n    var s = String(defined(that))\n      , i = toInteger(pos)\n      , l = s.length\n      , a, b;\n    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_string-at.js\n// module id = 51\n// module chunks = 0","var anObject = require('./_an-object')\n  , get      = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function(it){\n  var iterFn = get(it);\n  if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');\n  return anObject(iterFn.call(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/core.get-iterator.js\n// module id = 52\n// module chunks = 0","var classof   = require('./_classof')\n  , ITERATOR  = require('./_wks')('iterator')\n  , Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function(it){\n  if(it != undefined)return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/core.get-iterator-method.js\n// module id = 53\n// module chunks = 0","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof')\n  , TAG = require('./_wks')('toStringTag')\n  // ES3 wrong here\n  , ARG = cof(function(){ return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function(it, key){\n  try {\n    return it[key];\n  } catch(e){ /* empty */ }\n};\n\nmodule.exports = function(it){\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_classof.js\n// module id = 54\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/object/create\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/create.js\n// module id = 55\n// module chunks = 0","require('../../modules/es6.object.create');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function create(P, D){\n  return $Object.create(P, D);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/object/create.js\n// module id = 56\n// module chunks = 0","var $export = require('./_export')\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', {create: require('./_object-create')});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.object.create.js\n// module id = 57\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/object/keys\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/keys.js\n// module id = 58\n// module chunks = 0","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/object/keys.js\n// module id = 59\n// module chunks = 0","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object')\n  , $keys    = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function(){\n  return function keys(it){\n    return $keys(toObject(it));\n  };\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.object.keys.js\n// module id = 60\n// module chunks = 0","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export')\n  , core    = require('./_core')\n  , fails   = require('./_fails');\nmodule.exports = function(KEY, exec){\n  var fn  = (core.Object || {})[KEY] || Object[KEY]\n    , exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-sap.js\n// module id = 61\n// module chunks = 0","\"use strict\";\n\nexports.__esModule = true;\n\nvar _iterator = require(\"../core-js/symbol/iterator\");\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = require(\"../core-js/symbol\");\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n  return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n} : function (obj) {\n  return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/typeof.js\n// module id = 62\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/symbol/iterator\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/symbol/iterator.js\n// module id = 63\n// module chunks = 0","require('../../modules/es6.string.iterator');\nrequire('../../modules/web.dom.iterable');\nmodule.exports = require('../../modules/_wks-ext').f('iterator');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/symbol/iterator.js\n// module id = 64\n// module chunks = 0","exports.f = require('./_wks');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_wks-ext.js\n// module id = 65\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/symbol\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/symbol.js\n// module id = 66\n// module chunks = 0","require('../../modules/es6.symbol');\nrequire('../../modules/es6.object.to-string');\nrequire('../../modules/es7.symbol.async-iterator');\nrequire('../../modules/es7.symbol.observable');\nmodule.exports = require('../../modules/_core').Symbol;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/symbol/index.js\n// module id = 67\n// module chunks = 0","'use strict';\n// ECMAScript 6 symbols shim\nvar global         = require('./_global')\n  , has            = require('./_has')\n  , DESCRIPTORS    = require('./_descriptors')\n  , $export        = require('./_export')\n  , redefine       = require('./_redefine')\n  , META           = require('./_meta').KEY\n  , $fails         = require('./_fails')\n  , shared         = require('./_shared')\n  , setToStringTag = require('./_set-to-string-tag')\n  , uid            = require('./_uid')\n  , wks            = require('./_wks')\n  , wksExt         = require('./_wks-ext')\n  , wksDefine      = require('./_wks-define')\n  , keyOf          = require('./_keyof')\n  , enumKeys       = require('./_enum-keys')\n  , isArray        = require('./_is-array')\n  , anObject       = require('./_an-object')\n  , toIObject      = require('./_to-iobject')\n  , toPrimitive    = require('./_to-primitive')\n  , createDesc     = require('./_property-desc')\n  , _create        = require('./_object-create')\n  , gOPNExt        = require('./_object-gopn-ext')\n  , $GOPD          = require('./_object-gopd')\n  , $DP            = require('./_object-dp')\n  , $keys          = require('./_object-keys')\n  , gOPD           = $GOPD.f\n  , dP             = $DP.f\n  , gOPN           = gOPNExt.f\n  , $Symbol        = global.Symbol\n  , $JSON          = global.JSON\n  , _stringify     = $JSON && $JSON.stringify\n  , PROTOTYPE      = 'prototype'\n  , HIDDEN         = wks('_hidden')\n  , TO_PRIMITIVE   = wks('toPrimitive')\n  , isEnum         = {}.propertyIsEnumerable\n  , SymbolRegistry = shared('symbol-registry')\n  , AllSymbols     = shared('symbols')\n  , OPSymbols      = shared('op-symbols')\n  , ObjectProto    = Object[PROTOTYPE]\n  , USE_NATIVE     = typeof $Symbol == 'function'\n  , QObject        = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n  return _create(dP({}, 'a', {\n    get: function(){ return dP(this, 'a', {value: 7}).a; }\n  })).a != 7;\n}) ? function(it, key, D){\n  var protoDesc = gOPD(ObjectProto, key);\n  if(protoDesc)delete ObjectProto[key];\n  dP(it, key, D);\n  if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function(tag){\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n  return typeof it == 'symbol';\n} : function(it){\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D){\n  if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if(has(AllSymbols, key)){\n    if(!D.enumerable){\n      if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n      D = _create(D, {enumerable: createDesc(0, false)});\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P){\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P))\n    , i    = 0\n    , l = keys.length\n    , key;\n  while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P){\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n  it  = toIObject(it);\n  key = toPrimitive(key, true);\n  if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n  var D = gOPD(it, key);\n  if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n  var names  = gOPN(toIObject(it))\n    , result = []\n    , i      = 0\n    , key;\n  while(names.length > i){\n    if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n  var IS_OP  = it === ObjectProto\n    , names  = gOPN(IS_OP ? OPSymbols : toIObject(it))\n    , result = []\n    , i      = 0\n    , key;\n  while(names.length > i){\n    if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif(!USE_NATIVE){\n  $Symbol = function Symbol(){\n    if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function(value){\n      if(this === ObjectProto)$set.call(OPSymbols, value);\n      if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f   = $defineProperty;\n  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n  require('./_object-pie').f  = $propertyIsEnumerable;\n  require('./_object-gops').f = $getOwnPropertySymbols;\n\n  if(DESCRIPTORS && !require('./_library')){\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function(name){\n    return wrap(wks(name));\n  }\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\nfor(var symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\nfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function(key){\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(key){\n    if(isSymbol(key))return keyOf(SymbolRegistry, key);\n    throw TypeError(key + ' is not a symbol!');\n  },\n  useSetter: function(){ setter = true; },\n  useSimple: function(){ setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it){\n    if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n    var args = [it]\n      , i    = 1\n      , replacer, $replacer;\n    while(arguments.length > i)args.push(arguments[i++]);\n    replacer = args[1];\n    if(typeof replacer == 'function')$replacer = replacer;\n    if($replacer || !isArray(replacer))replacer = function(key, value){\n      if($replacer)value = $replacer.call(this, key, value);\n      if(!isSymbol(value))return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.symbol.js\n// module id = 68\n// module chunks = 0","var META     = require('./_uid')('meta')\n  , isObject = require('./_is-object')\n  , has      = require('./_has')\n  , setDesc  = require('./_object-dp').f\n  , id       = 0;\nvar isExtensible = Object.isExtensible || function(){\n  return true;\n};\nvar FREEZE = !require('./_fails')(function(){\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function(it){\n  setDesc(it, META, {value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  }});\n};\nvar fastKey = function(it, create){\n  // return primitive with prefix\n  if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if(!has(it, META)){\n    // can't set metadata to uncaught frozen object\n    if(!isExtensible(it))return 'F';\n    // not necessary to add metadata\n    if(!create)return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function(it, create){\n  if(!has(it, META)){\n    // can't set metadata to uncaught frozen object\n    if(!isExtensible(it))return true;\n    // not necessary to add metadata\n    if(!create)return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function(it){\n  if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY:      META,\n  NEED:     false,\n  fastKey:  fastKey,\n  getWeak:  getWeak,\n  onFreeze: onFreeze\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_meta.js\n// module id = 69\n// module chunks = 0","var global         = require('./_global')\n  , core           = require('./_core')\n  , LIBRARY        = require('./_library')\n  , wksExt         = require('./_wks-ext')\n  , defineProperty = require('./_object-dp').f;\nmodule.exports = function(name){\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_wks-define.js\n// module id = 70\n// module chunks = 0","var getKeys   = require('./_object-keys')\n  , toIObject = require('./_to-iobject');\nmodule.exports = function(object, el){\n  var O      = toIObject(object)\n    , keys   = getKeys(O)\n    , length = keys.length\n    , index  = 0\n    , key;\n  while(length > index)if(O[key = keys[index++]] === el)return key;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_keyof.js\n// module id = 71\n// module chunks = 0","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys')\n  , gOPS    = require('./_object-gops')\n  , pIE     = require('./_object-pie');\nmodule.exports = function(it){\n  var result     = getKeys(it)\n    , getSymbols = gOPS.f;\n  if(getSymbols){\n    var symbols = getSymbols(it)\n      , isEnum  = pIE.f\n      , i       = 0\n      , key;\n    while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n  } return result;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_enum-keys.js\n// module id = 72\n// module chunks = 0","exports.f = Object.getOwnPropertySymbols;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-gops.js\n// module id = 73\n// module chunks = 0","exports.f = {}.propertyIsEnumerable;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-pie.js\n// module id = 74\n// module chunks = 0","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg){\n  return cof(arg) == 'Array';\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_is-array.js\n// module id = 75\n// module chunks = 0","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject')\n  , gOPN      = require('./_object-gopn').f\n  , toString  = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function(it){\n  try {\n    return gOPN(it);\n  } catch(e){\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it){\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-gopn-ext.js\n// module id = 76\n// module chunks = 0","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys      = require('./_object-keys-internal')\n  , hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){\n  return $keys(O, hiddenKeys);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-gopn.js\n// module id = 77\n// module chunks = 0","var pIE            = require('./_object-pie')\n  , createDesc     = require('./_property-desc')\n  , toIObject      = require('./_to-iobject')\n  , toPrimitive    = require('./_to-primitive')\n  , has            = require('./_has')\n  , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n  , gOPD           = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P){\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if(IE8_DOM_DEFINE)try {\n    return gOPD(O, P);\n  } catch(e){ /* empty */ }\n  if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_object-gopd.js\n// module id = 78\n// module chunks = 0","require('./_wks-define')('asyncIterator');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es7.symbol.async-iterator.js\n// module id = 80\n// module chunks = 0","require('./_wks-define')('observable');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es7.symbol.observable.js\n// module id = 81\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/json/stringify\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/json/stringify.js\n// module id = 82\n// module chunks = 0","var core  = require('../../modules/_core')\n  , $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify});\nmodule.exports = function stringify(it){ // eslint-disable-line no-unused-vars\n  return $JSON.stringify.apply($JSON, arguments);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/json/stringify.js\n// module id = 83\n// module chunks = 0","// first check if moment.js is already loaded in the browser window, if so,\n// use this instance. Else, load via commonjs.\nmodule.exports = (typeof window !== 'undefined') && window['moment'] || require('moment');\n\n\n\n// WEBPACK FOOTER //\n// ./lib/module/moment.js","//! moment.js\n//! version : 2.17.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    var k;\n    for (k in obj) {\n        // even if its not own property I'd still call it non-empty\n        return false;\n    }\n    return true;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nvar some$1 = some;\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i in momentProperties) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _ordinalParseLenient.\n    this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar keys$1 = keys;\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid()) {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nvar indexOf$1 = indexOf;\n\nfunction daysInMonth(year, month) {\n    return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return this._months;\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return this._monthsShort;\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    //can't just apply() to create a date:\n    //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    //the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    //the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return this._weekdays;\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf$1.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    ordinalParse: defaultOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            require('./locale/' + name);\n            // because defineLocale currently also sets the global locale, we\n            // want to undo that for lazy loaded locales\n            getSetGlobalLocale(oldLocale);\n        } catch (e) { }\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, parentConfig = baseConfig;\n        // MERGE\n        if (locales[name] != null) {\n            parentConfig = locales[name]._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys$1(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n        hooks.createFromInputFallback(config);\n    }\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse)) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (input === undefined) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (typeof(input) === 'object') {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    if (units === 'year' || units === 'month' || units === 'quarter') {\n        output = monthDiff(this, that);\n        if (units === 'quarter') {\n            output = output / 3;\n        } else if (units === 'year') {\n            output = output / 12;\n        }\n    } else {\n        delta = this - that;\n        output = units === 'second' ? delta / 1e3 : // 1000\n            units === 'minute' ? delta / 6e4 : // 1000 * 60\n            units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n            units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n            units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n            delta;\n    }\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString () {\n    var m = this.clone().utc();\n    if (0 < m.year() && m.year() <= 9999) {\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            return this.toDate().toISOString();\n        } else {\n            return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    } else {\n        return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n    }\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$1 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0], 10);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$1;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this[units + 's']();\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this._data[name];\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    s: 45,  // seconds to minute\n    m: 45,  // minutes to hour\n    h: 22,  // hours to day\n    d: 26,  // days to month\n    M: 11   // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds < thresholds.s && ['s', seconds]  ||\n            minutes <= 1           && ['m']           ||\n            minutes < thresholds.m && ['mm', minutes] ||\n            hours   <= 1           && ['h']           ||\n            hours   < thresholds.h && ['hh', hours]   ||\n            days    <= 1           && ['d']           ||\n            days    < thresholds.d && ['dd', days]    ||\n            months  <= 1           && ['M']           ||\n            months  < thresholds.M && ['MM', months]  ||\n            years   <= 1           && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds;\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    return (total < 0 ? '-' : '') +\n        'P' +\n        (Y ? Y + 'Y' : '') +\n        (M ? M + 'M' : '') +\n        (D ? D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? h + 'H' : '') +\n        (m ? m + 'M' : '') +\n        (s ? s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.17.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\nreturn hooks;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/moment/moment.js\n// module id = 85\n// module chunks = 0","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 86\n// module chunks = 0","function webpackContext(req) {\n\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n}\nwebpackContext.keys = function() { return []; };\nwebpackContext.resolve = webpackContext;\nmodule.exports = webpackContext;\nwebpackContext.id = 87;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/moment/locale ^\\.\\/$^$\n// module id = 87\n// module chunks = 0","var _rng;\n\nvar globalVar = typeof window !== 'undefined'\n    ? window\n    : typeof global !== 'undefined' ? global : null;\n\nif (globalVar && globalVar.crypto && crypto.getRandomValues) {\n  // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n  // Moderately fast, high quality\n  var _rnds8 = new Uint8Array(16);\n  _rng = function whatwgRNG() {\n    crypto.getRandomValues(_rnds8);\n    return _rnds8;\n  };\n}\n\nif (!_rng) {\n  // Math.random()-based (RNG)\n  //\n  // If all else fails, use Math.random().  It's fast, but is of unspecified\n  // quality.\n  var _rnds = new Array(16);\n  _rng = function () {\n    for (var i = 0, r; i < 16; i++) {\n      if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n      _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n    }\n\n    return _rnds;\n  };\n}\n\n//     uuid.js\n//\n//     Copyright (c) 2010-2012 Robert Kieffer\n//     MIT License - http://opensource.org/licenses/mit-license.php\n\n// Unique ID creation requires a high quality random # generator.  We feature\n// detect to determine the best RNG source, normalizing to a function that\n// returns 128-bits of randomness, since that's what's usually required\n\n//var _rng = require('./rng');\n\n// Maps for number <-> hex string conversion\nvar _byteToHex = [];\nvar _hexToByte = {};\nfor (var i = 0; i < 256; i++) {\n  _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n  _hexToByte[_byteToHex[i]] = i;\n}\n\n// **`parse()` - Parse a UUID into it's component bytes**\nfunction parse(s, buf, offset) {\n  var i = (buf && offset) || 0, ii = 0;\n\n  buf = buf || [];\n  s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {\n    if (ii < 16) { // Don't overflow!\n      buf[i + ii++] = _hexToByte[oct];\n    }\n  });\n\n  // Zero out remaining bytes if string was short\n  while (ii < 16) {\n    buf[i + ii++] = 0;\n  }\n\n  return buf;\n}\n\n// **`unparse()` - Convert UUID byte array (ala parse()) into a string**\nfunction unparse(buf, offset) {\n  var i = offset || 0, bth = _byteToHex;\n  return bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]];\n}\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\n// random #'s we need to init node and clockseq\nvar _seedBytes = _rng();\n\n// Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\nvar _nodeId = [\n  _seedBytes[0] | 0x01,\n  _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]\n];\n\n// Per 4.2.2, randomize (14 bit) clockseq\nvar _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n// Previous uuid creation time\nvar _lastMSecs = 0, _lastNSecs = 0;\n\n// See https://github.com/broofa/node-uuid for API details\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || [];\n\n  options = options || {};\n\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n  // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n  var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n  // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n  // Time since last uuid creation (in msecs)\n  var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs) / 10000;\n\n  // Per 4.2.1.2, Bump clockseq on clock regression\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  }\n\n  // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  }\n\n  // Per 4.2.1.2 Throw error if too many uuids are requested\n  if (nsecs >= 10000) {\n    throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq;\n\n  // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n  msecs += 12219292800000;\n\n  // `time_low`\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff;\n\n  // `time_mid`\n  var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff;\n\n  // `time_high_and_version`\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n  b[i++] = tmh >>> 16 & 0xff;\n\n  // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n  b[i++] = clockseq >>> 8 | 0x80;\n\n  // `clock_seq_low`\n  b[i++] = clockseq & 0xff;\n\n  // `node`\n  var node = options.node || _nodeId;\n  for (var n = 0; n < 6; n++) {\n    b[i + n] = node[n];\n  }\n\n  return buf ? buf : unparse(b);\n}\n\n// **`v4()` - Generate random UUID**\n\n// See https://github.com/broofa/node-uuid for API details\nfunction v4(options, buf, offset) {\n  // Deprecated - 'format' argument, as supported in v1.2\n  var i = buf && offset || 0;\n\n  if (typeof(options) == 'string') {\n    buf = options == 'binary' ? new Array(16) : null;\n    options = null;\n  }\n  options = options || {};\n\n  var rnds = options.random || (options.rng || _rng)();\n\n  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n  rnds[6] = (rnds[6] & 0x0f) | 0x40;\n  rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n  // Copy bytes to buffer, if provided\n  if (buf) {\n    for (var ii = 0; ii < 16; ii++) {\n      buf[i + ii] = rnds[ii];\n    }\n  }\n\n  return buf || unparse(rnds);\n}\n\n// Export public API\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\nuuid.parse = parse;\nuuid.unparse = unparse;\n\nmodule.exports = uuid;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/module/uuid.js","// utils\nexports.util = require('./lib/util');\nexports.DOMutil = require('./lib/DOMutil');\n\n// data\nexports.DataSet = require('./lib/DataSet');\nexports.DataView = require('./lib/DataView');\nexports.Queue = require('./lib/Queue');\n\n// Graph3d\nexports.Graph3d = require('./lib/graph3d/Graph3d');\nexports.graph3d = {\n  Camera: require('./lib/graph3d/Camera'),\n  Filter: require('./lib/graph3d/Filter'),\n  Point2d: require('./lib/graph3d/Point2d'),\n  Point3d: require('./lib/graph3d/Point3d'),\n  Slider: require('./lib/graph3d/Slider'),\n  StepNumber: require('./lib/graph3d/StepNumber')\n};\n\n// bundled external libraries\nexports.moment = require('./lib/module/moment');\nexports.Hammer = require('./lib/module/hammer');\nexports.keycharm = require('keycharm');\n\n\n\n// WEBPACK FOOTER //\n// ./index-graph3d.js","// DOM utility methods\n\n/**\n * this prepares the JSON container for allocating SVG elements\n * @param JSONcontainer\n * @private\n */\nexports.prepareElements = function(JSONcontainer) {\n  // cleanup the redundant svgElements;\n  for (var elementType in JSONcontainer) {\n    if (JSONcontainer.hasOwnProperty(elementType)) {\n      JSONcontainer[elementType].redundant = JSONcontainer[elementType].used;\n      JSONcontainer[elementType].used = [];\n    }\n  }\n};\n\n/**\n * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from\n * which to remove the redundant elements.\n *\n * @param JSONcontainer\n * @private\n */\nexports.cleanupElements = function(JSONcontainer) {\n  // cleanup the redundant svgElements;\n  for (var elementType in JSONcontainer) {\n    if (JSONcontainer.hasOwnProperty(elementType)) {\n      if (JSONcontainer[elementType].redundant) {\n        for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) {\n          JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]);\n        }\n        JSONcontainer[elementType].redundant = [];\n      }\n    }\n  }\n};\n\n/**\n * Ensures that all elements are removed first up so they can be recreated cleanly\n * @param JSONcontainer\n */\nexports.resetElements = function(JSONcontainer) {\n  exports.prepareElements(JSONcontainer);\n  exports.cleanupElements(JSONcontainer);\n  exports.prepareElements(JSONcontainer);\n}\n\n/**\n * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer\n * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this.\n *\n * @param elementType\n * @param JSONcontainer\n * @param svgContainer\n * @returns {*}\n * @private\n */\nexports.getSVGElement = function (elementType, JSONcontainer, svgContainer) {\n  var element;\n  // allocate SVG element, if it doesnt yet exist, create one.\n  if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before\n    // check if there is an redundant element\n    if (JSONcontainer[elementType].redundant.length > 0) {\n      element = JSONcontainer[elementType].redundant[0];\n      JSONcontainer[elementType].redundant.shift();\n    }\n    else {\n      // create a new element and add it to the SVG\n      element = document.createElementNS('http://www.w3.org/2000/svg', elementType);\n      svgContainer.appendChild(element);\n    }\n  }\n  else {\n    // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it.\n    element = document.createElementNS('http://www.w3.org/2000/svg', elementType);\n    JSONcontainer[elementType] = {used: [], redundant: []};\n    svgContainer.appendChild(element);\n  }\n  JSONcontainer[elementType].used.push(element);\n  return element;\n};\n\n\n/**\n * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer\n * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this.\n *\n * @param elementType\n * @param JSONcontainer\n * @param DOMContainer\n * @returns {*}\n * @private\n */\nexports.getDOMElement = function (elementType, JSONcontainer, DOMContainer, insertBefore) {\n  var element;\n  // allocate DOM element, if it doesnt yet exist, create one.\n  if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before\n    // check if there is an redundant element\n    if (JSONcontainer[elementType].redundant.length > 0) {\n      element = JSONcontainer[elementType].redundant[0];\n      JSONcontainer[elementType].redundant.shift();\n    }\n    else {\n      // create a new element and add it to the SVG\n      element = document.createElement(elementType);\n      if (insertBefore !== undefined) {\n        DOMContainer.insertBefore(element, insertBefore);\n      }\n      else {\n        DOMContainer.appendChild(element);\n      }\n    }\n  }\n  else {\n    // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it.\n    element = document.createElement(elementType);\n    JSONcontainer[elementType] = {used: [], redundant: []};\n    if (insertBefore !== undefined) {\n      DOMContainer.insertBefore(element, insertBefore);\n    }\n    else {\n      DOMContainer.appendChild(element);\n    }\n  }\n  JSONcontainer[elementType].used.push(element);\n  return element;\n};\n\n\n\n\n/**\n * Draw a point object. This is a separate function because it can also be called by the legend.\n * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions\n * as well.\n *\n * @param x\n * @param y\n * @param groupTemplate: A template containing the necessary information to draw the datapoint e.g., {style: 'circle', size: 5, className: 'className' }\n * @param JSONcontainer\n * @param svgContainer\n * @param labelObj\n * @returns {*}\n */\nexports.drawPoint = function(x, y, groupTemplate, JSONcontainer, svgContainer, labelObj) {\n  var point;\n  if (groupTemplate.style == 'circle') {\n    point = exports.getSVGElement('circle', JSONcontainer, svgContainer);\n    point.setAttributeNS(null, \"cx\", x);\n    point.setAttributeNS(null, \"cy\", y);\n    point.setAttributeNS(null, \"r\", 0.5 * groupTemplate.size);\n  }\n  else {\n    point = exports.getSVGElement('rect', JSONcontainer, svgContainer);\n    point.setAttributeNS(null, \"x\", x - 0.5 * groupTemplate.size);\n    point.setAttributeNS(null, \"y\", y - 0.5 * groupTemplate.size);\n    point.setAttributeNS(null, \"width\", groupTemplate.size);\n    point.setAttributeNS(null, \"height\", groupTemplate.size);\n  }\n\n  if (groupTemplate.styles !== undefined) {\n    point.setAttributeNS(null, \"style\", groupTemplate.styles);\n  }\n  point.setAttributeNS(null, \"class\", groupTemplate.className + \" vis-point\");\n  //handle label\n\n\n  if (labelObj) {\n    var label = exports.getSVGElement('text', JSONcontainer, svgContainer);\n    if (labelObj.xOffset) {\n      x = x + labelObj.xOffset;\n    }\n\n    if (labelObj.yOffset) {\n      y = y + labelObj.yOffset;\n    }\n    if (labelObj.content) {\n      label.textContent = labelObj.content;\n    }\n\n    if (labelObj.className) {\n      label.setAttributeNS(null, \"class\", labelObj.className  + \" vis-label\");\n    }\n    label.setAttributeNS(null, \"x\", x);\n    label.setAttributeNS(null, \"y\", y);\n  }\n\n  return point;\n};\n\n/**\n * draw a bar SVG element centered on the X coordinate\n *\n * @param x\n * @param y\n * @param className\n */\nexports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer, style) {\n  if (height != 0) {\n    if (height < 0) {\n      height *= -1;\n      y -= height;\n    }\n    var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer);\n    rect.setAttributeNS(null, \"x\", x - 0.5 * width);\n    rect.setAttributeNS(null, \"y\", y);\n    rect.setAttributeNS(null, \"width\", width);\n    rect.setAttributeNS(null, \"height\", height);\n    rect.setAttributeNS(null, \"class\", className);\n    if (style) {\n      rect.setAttributeNS(null, \"style\", style);\n    }\n  }\n};\n\n\n// WEBPACK FOOTER //\n// ./lib/DOMutil.js","var util = require('./util');\nvar Queue = require('./Queue');\n\n/**\n * DataSet\n *\n * Usage:\n *     var dataSet = new DataSet({\n *         fieldId: '_id',\n *         type: {\n *             // ...\n *         }\n *     });\n *\n *     dataSet.add(item);\n *     dataSet.add(data);\n *     dataSet.update(item);\n *     dataSet.update(data);\n *     dataSet.remove(id);\n *     dataSet.remove(ids);\n *     var data = dataSet.get();\n *     var data = dataSet.get(id);\n *     var data = dataSet.get(ids);\n *     var data = dataSet.get(ids, options, data);\n *     dataSet.clear();\n *\n * A data set can:\n * - add/remove/update data\n * - gives triggers upon changes in the data\n * - can  import/export data in various data formats\n *\n * @param {Array} [data]    Optional array with initial data\n * @param {Object} [options]   Available options:\n *                             {String} fieldId Field name of the id in the\n *                                              items, 'id' by default.\n *                             {Object.<String, String} type\n *                                              A map with field names as key,\n *                                              and the field type as value.\n *                             {Object} queue   Queue changes to the DataSet,\n *                                              flush them all at once.\n *                                              Queue options:\n *                                              - {number} delay  Delay in ms, null by default\n *                                              - {number} max    Maximum number of entries in the queue, Infinity by default\n * @constructor DataSet\n */\n// TODO: add a DataSet constructor DataSet(data, options)\nfunction DataSet (data, options) {\n  // correctly read optional arguments\n  if (data && !Array.isArray(data)) {\n    options = data;\n    data = null;\n  }\n\n  this._options = options || {};\n  this._data = {};                                 // map with data indexed by id\n  this.length = 0;                                 // number of items in the DataSet\n  this._fieldId = this._options.fieldId || 'id';   // name of the field containing id\n  this._type = {};                                 // internal field types (NOTE: this can differ from this._options.type)\n\n  // all variants of a Date are internally stored as Date, so we can convert\n  // from everything to everything (also from ISODate to Number for example)\n  if (this._options.type) {\n    var fields = Object.keys(this._options.type);\n    for (var i = 0, len = fields.length; i < len; i++) {\n      var field = fields[i];\n      var value = this._options.type[field];\n      if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') {\n        this._type[field] = 'Date';\n      }\n      else {\n        this._type[field] = value;\n      }\n    }\n  }\n\n  // TODO: deprecated since version 1.1.1 (or 2.0.0?)\n  if (this._options.convert) {\n    throw new Error('Option \"convert\" is deprecated. Use \"type\" instead.');\n  }\n\n  this._subscribers = {};  // event subscribers\n\n  // add initial data when provided\n  if (data) {\n    this.add(data);\n  }\n\n  this.setOptions(options);\n}\n\n/**\n * @param {Object} [options]   Available options:\n *                             {Object} queue   Queue changes to the DataSet,\n *                                              flush them all at once.\n *                                              Queue options:\n *                                              - {number} delay  Delay in ms, null by default\n *                                              - {number} max    Maximum number of entries in the queue, Infinity by default\n * @param options\n */\nDataSet.prototype.setOptions = function(options) {\n  if (options && options.queue !== undefined) {\n    if (options.queue === false) {\n      // delete queue if loaded\n      if (this._queue) {\n        this._queue.destroy();\n        delete this._queue;\n      }\n    }\n    else {\n      // create queue and update its options\n      if (!this._queue) {\n        this._queue = Queue.extend(this, {\n          replace: ['add', 'update', 'remove']\n        });\n      }\n\n      if (typeof options.queue === 'object') {\n        this._queue.setOptions(options.queue);\n      }\n    }\n  }\n};\n\n/**\n * Subscribe to an event, add an event listener\n * @param {String} event        Event name. Available events: 'put', 'update',\n *                              'remove'\n * @param {function} callback   Callback method. Called with three parameters:\n *                                  {String} event\n *                                  {Object | null} params\n *                                  {String | Number} senderId\n */\nDataSet.prototype.on = function(event, callback) {\n  var subscribers = this._subscribers[event];\n  if (!subscribers) {\n    subscribers = [];\n    this._subscribers[event] = subscribers;\n  }\n\n  subscribers.push({\n    callback: callback\n  });\n};\n\n// TODO: remove this deprecated function some day (replaced with `on` since version 0.5, deprecated since v4.0)\nDataSet.prototype.subscribe = function () {\n  throw new Error('DataSet.subscribe is deprecated. Use DataSet.on instead.');\n};\n\n/**\n * Unsubscribe from an event, remove an event listener\n * @param {String} event\n * @param {function} callback\n */\nDataSet.prototype.off = function(event, callback) {\n  var subscribers = this._subscribers[event];\n  if (subscribers) {\n    this._subscribers[event] = subscribers.filter(listener => listener.callback != callback);\n  }\n};\n\n// TODO: remove this deprecated function some day (replaced with `on` since version 0.5, deprecated since v4.0)\nDataSet.prototype.unsubscribe = function () {\n  throw new Error('DataSet.unsubscribe is deprecated. Use DataSet.off instead.');\n};\n\n/**\n * Trigger an event\n * @param {String} event\n * @param {Object | null} params\n * @param {String} [senderId]       Optional id of the sender.\n * @private\n */\nDataSet.prototype._trigger = function (event, params, senderId) {\n  if (event == '*') {\n    throw new Error('Cannot trigger event *');\n  }\n\n  var subscribers = [];\n  if (event in this._subscribers) {\n    subscribers = subscribers.concat(this._subscribers[event]);\n  }\n  if ('*' in this._subscribers) {\n    subscribers = subscribers.concat(this._subscribers['*']);\n  }\n\n  for (var i = 0, len = subscribers.length; i < len; i++) {\n    var subscriber = subscribers[i];\n    if (subscriber.callback) {\n      subscriber.callback(event, params, senderId || null);\n    }\n  }\n};\n\n/**\n * Add data.\n * Adding an item will fail when there already is an item with the same id.\n * @param {Object | Array} data\n * @param {String} [senderId] Optional sender id\n * @return {Array} addedIds      Array with the ids of the added items\n */\nDataSet.prototype.add = function (data, senderId) {\n  var addedIds = [],\n      id,\n      me = this;\n\n  if (Array.isArray(data)) {\n    // Array\n    for (var i = 0, len = data.length; i < len; i++) {\n      id = me._addItem(data[i]);\n      addedIds.push(id);\n    }\n  }\n  else if (data instanceof Object) {\n    // Single item\n    id = me._addItem(data);\n    addedIds.push(id);\n  }\n  else {\n    throw new Error('Unknown dataType');\n  }\n\n  if (addedIds.length) {\n    this._trigger('add', {items: addedIds}, senderId);\n  }\n\n  return addedIds;\n};\n\n/**\n * Update existing items. When an item does not exist, it will be created\n * @param {Object | Array} data\n * @param {String} [senderId] Optional sender id\n * @return {Array} updatedIds     The ids of the added or updated items\n */\nDataSet.prototype.update = function (data, senderId) {\n  var addedIds = [];\n  var updatedIds = [];\n  var oldData = [];\n  var updatedData = [];\n  var me = this;\n  var fieldId = me._fieldId;\n\n  var addOrUpdate = function (item) {\n    var id = item[fieldId];\n    if (me._data[id]) {\n      var oldItem = util.extend({}, me._data[id]);\n      // update item\n      id = me._updateItem(item);\n      updatedIds.push(id);\n      updatedData.push(item);\n      oldData.push(oldItem);\n    }\n    else {\n      // add new item\n      id = me._addItem(item);\n      addedIds.push(id);\n    }\n  };\n\n  if (Array.isArray(data)) {\n    // Array\n    for (var i = 0, len = data.length; i < len; i++) {\n      if (data[i] instanceof Object){\n        addOrUpdate(data[i]);\n      } else {\n        console.warn('Ignoring input item, which is not an object at index ' + i);\n      }\n    }\n  }\n  else if (data instanceof Object) {\n    // Single item\n    addOrUpdate(data);\n  }\n  else {\n    throw new Error('Unknown dataType');\n  }\n\n  if (addedIds.length) {\n    this._trigger('add', {items: addedIds}, senderId);\n  }\n  if (updatedIds.length) {\n    var props = { items: updatedIds, oldData: oldData, data: updatedData };\n    // TODO: remove deprecated property 'data' some day\n    //Object.defineProperty(props, 'data', {\n    //  'get': (function() {\n    //    console.warn('Property data is deprecated. Use DataSet.get(ids) to retrieve the new data, use the oldData property on this object to get the old data');\n    //    return updatedData;\n    //  }).bind(this)\n    //});\n    this._trigger('update', props, senderId);\n  }\n\n  return addedIds.concat(updatedIds);\n};\n\n/**\n * Get a data item or multiple items.\n *\n * Usage:\n *\n *     get()\n *     get(options: Object)\n *\n *     get(id: Number | String)\n *     get(id: Number | String, options: Object)\n *\n *     get(ids: Number[] | String[])\n *     get(ids: Number[] | String[], options: Object)\n *\n * Where:\n *\n * {Number | String} id         The id of an item\n * {Number[] | String{}} ids    An array with ids of items\n * {Object} options             An Object with options. Available options:\n * {String} [returnType]        Type of data to be returned.\n *                              Can be 'Array' (default) or 'Object'.\n * {Object.<String, String>} [type]\n * {String[]} [fields]          field names to be returned\n * {function} [filter]          filter items\n * {String | function} [order]  Order the items by a field name or custom sort function.\n * @throws Error\n */\nDataSet.prototype.get = function (args) {\n  var me = this;\n\n  // parse the arguments\n  var id, ids, options;\n  var firstType = util.getType(arguments[0]);\n  if (firstType == 'String' || firstType == 'Number') {\n    // get(id [, options])\n    id = arguments[0];\n    options = arguments[1];\n  }\n  else if (firstType == 'Array') {\n    // get(ids [, options])\n    ids = arguments[0];\n    options = arguments[1];\n  }\n  else {\n    // get([, options])\n    options = arguments[0];\n  }\n\n  // determine the return type\n  var returnType;\n  if (options && options.returnType) {\n    var allowedValues = ['Array', 'Object'];\n    returnType = allowedValues.indexOf(options.returnType) == -1 ? 'Array' : options.returnType;\n  }\n  else {\n    returnType = 'Array';\n  }\n\n  // build options\n  var type = options && options.type || this._options.type;\n  var filter = options && options.filter;\n  var items = [], item, itemIds, itemId, i, len;\n\n  // convert items\n  if (id != undefined) {\n    // return a single item\n    item = me._getItem(id, type);\n    if (item && filter && !filter(item)) {\n      item = null;\n    }\n  }\n  else if (ids != undefined) {\n    // return a subset of items\n    for (i = 0, len = ids.length; i < len; i++) {\n      item = me._getItem(ids[i], type);\n      if (!filter || filter(item)) {\n        items.push(item);\n      }\n    }\n  }\n  else {\n    // return all items\n    itemIds = Object.keys(this._data);\n    for (i = 0, len = itemIds.length; i < len; i++) {\n      itemId = itemIds[i];\n      item = me._getItem(itemId, type);\n      if (!filter || filter(item)) {\n        items.push(item);\n      }\n    }\n  }\n\n  // order the results\n  if (options && options.order && id == undefined) {\n    this._sort(items, options.order);\n  }\n\n  // filter fields of the items\n  if (options && options.fields) {\n    var fields = options.fields;\n    if (id != undefined) {\n      item = this._filterFields(item, fields);\n    }\n    else {\n      for (i = 0, len = items.length; i < len; i++) {\n        items[i] = this._filterFields(items[i], fields);\n      }\n    }\n  }\n\n  // return the results\n  if (returnType == 'Object') {\n    var result = {},\n        resultant;\n    for (i = 0, len = items.length; i < len; i++) {\n      resultant = items[i];\n      result[resultant.id] = resultant;\n    }\n    return result;\n  }\n  else {\n    if (id != undefined) {\n      // a single item\n      return item;\n    }\n    else {\n      // just return our array\n      return items;\n    }\n  }\n};\n\n/**\n * Get ids of all items or from a filtered set of items.\n * @param {Object} [options]    An Object with options. Available options:\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n * @return {Array} ids\n */\nDataSet.prototype.getIds = function (options) {\n  var data = this._data,\n      filter = options && options.filter,\n      order = options && options.order,\n      type = options && options.type || this._options.type,\n      itemIds = Object.keys(data),\n      i,\n      len,\n      id,\n      item,\n      items,\n      ids = [];\n\n  if (filter) {\n    // get filtered items\n    if (order) {\n      // create ordered list\n      items = [];\n      for (i = 0, len = itemIds.length; i < len; i++) {\n        id = itemIds[i];\n        item = this._getItem(id, type);\n        if (filter(item)) {\n          items.push(item);\n        }\n      }\n\n      this._sort(items, order);\n\n      for (i = 0, len = items.length; i < len; i++) {\n        ids.push(items[i][this._fieldId]);\n      }\n    }\n    else {\n      // create unordered list\n      for (i = 0, len = itemIds.length; i < len; i++) {\n        id = itemIds[i];\n        item = this._getItem(id, type);\n        if (filter(item)) {\n          ids.push(item[this._fieldId]);\n        }\n      }\n    }\n  }\n  else {\n    // get all items\n    if (order) {\n      // create an ordered list\n      items = [];\n      for (i = 0, len = itemIds.length; i < len; i++) {\n        id = itemIds[i];\n        items.push(data[id]);\n      }\n\n      this._sort(items, order);\n\n      for (i = 0, len = items.length; i < len; i++) {\n        ids.push(items[i][this._fieldId]);\n      }\n    }\n    else {\n      // create unordered list\n      for (i = 0, len = itemIds.length; i < len; i++) {\n        id = itemIds[i];\n        item = data[id];\n        ids.push(item[this._fieldId]);\n      }\n    }\n  }\n\n  return ids;\n};\n\n/**\n * Returns the DataSet itself. Is overwritten for example by the DataView,\n * which returns the DataSet it is connected to instead.\n */\nDataSet.prototype.getDataSet = function () {\n  return this;\n};\n\n/**\n * Execute a callback function for every item in the dataset.\n * @param {function} callback\n * @param {Object} [options]    Available options:\n *                              {Object.<String, String>} [type]\n *                              {String[]} [fields] filter fields\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n */\nDataSet.prototype.forEach = function (callback, options) {\n  var filter = options && options.filter,\n      type = options && options.type || this._options.type,\n      data = this._data,\n      itemIds = Object.keys(data),\n      i,\n      len,\n      item,\n      id;\n\n  if (options && options.order) {\n    // execute forEach on ordered list\n    var items = this.get(options);\n\n    for (i = 0, len = items.length; i < len; i++) {\n      item = items[i];\n      id = item[this._fieldId];\n      callback(item, id);\n    }\n  }\n  else {\n    // unordered\n    for (i = 0, len = itemIds.length; i < len; i++) {\n      id = itemIds[i];\n      item = this._getItem(id, type);\n      if (!filter || filter(item)) {\n        callback(item, id);\n      }\n    }\n  }\n};\n\n/**\n * Map every item in the dataset.\n * @param {function} callback\n * @param {Object} [options]    Available options:\n *                              {Object.<String, String>} [type]\n *                              {String[]} [fields] filter fields\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n * @return {Object[]} mappedItems\n */\nDataSet.prototype.map = function (callback, options) {\n  var filter = options && options.filter,\n      type = options && options.type || this._options.type,\n      mappedItems = [],\n      data = this._data,\n      itemIds = Object.keys(data),\n      i,\n      len,\n      id,\n      item;\n\n  // convert and filter items\n  for (i = 0, len = itemIds.length; i < len; i++) {\n    id = itemIds[i];\n    item = this._getItem(id, type);\n    if (!filter || filter(item)) {\n      mappedItems.push(callback(item, id));\n    }\n  }\n\n  // order items\n  if (options && options.order) {\n    this._sort(mappedItems, options.order);\n  }\n\n  return mappedItems;\n};\n\n/**\n * Filter the fields of an item\n * @param {Object | null} item\n * @param {String[]} fields     Field names\n * @return {Object | null} filteredItem or null if no item is provided\n * @private\n */\nDataSet.prototype._filterFields = function (item, fields) {\n  if (!item) { // item is null\n    return item;\n  }\n\n  var filteredItem = {},\n      itemFields = Object.keys(item),\n      len = itemFields.length,\n      i,\n      field;\n\n  if(Array.isArray(fields)){\n    for (i = 0; i < len; i++) {\n      field = itemFields[i];\n      if (fields.indexOf(field) != -1) {\n        filteredItem[field] = item[field];\n      }\n    }\n  }else{\n    for (i = 0; i < len; i++) {\n      field = itemFields[i];\n      if (fields.hasOwnProperty(field)) {\n        filteredItem[fields[field]] = item[field];\n      }\n    }\n  }\n\n  return filteredItem;\n};\n\n/**\n * Sort the provided array with items\n * @param {Object[]} items\n * @param {String | function} order      A field name or custom sort function.\n * @private\n */\nDataSet.prototype._sort = function (items, order) {\n  if (util.isString(order)) {\n    // order by provided field name\n    var name = order; // field name\n    items.sort(function (a, b) {\n      var av = a[name];\n      var bv = b[name];\n      return (av > bv) ? 1 : ((av < bv) ? -1 : 0);\n    });\n  }\n  else if (typeof order === 'function') {\n    // order by sort function\n    items.sort(order);\n  }\n  // TODO: extend order by an Object {field:String, direction:String}\n  //       where direction can be 'asc' or 'desc'\n  else {\n    throw new TypeError('Order must be a function or a string');\n  }\n};\n\n/**\n * Remove an object by pointer or by id\n * @param {String | Number | Object | Array} id Object or id, or an array with\n *                                              objects or ids to be removed\n * @param {String} [senderId] Optional sender id\n * @return {Array} removedIds\n */\nDataSet.prototype.remove = function (id, senderId) {\n  var removedIds = [],\n      removedItems = [],\n      ids = [],\n      i, len, itemId, item;\n\n  // force everything to be an array for simplicity\n  ids = Array.isArray(id) ? id : [id];\n\n  for (i = 0, len = ids.length; i < len; i++) {\n    item = this._remove(ids[i]);\n    if (item) {\n      itemId = item[this._fieldId];\n      if (itemId != undefined) {\n        removedIds.push(itemId);\n        removedItems.push(item);\n      }\n    }\n  }\n\n  if (removedIds.length) {\n    this._trigger('remove', {items: removedIds, oldData: removedItems}, senderId);\n  }\n\n  return removedIds;\n};\n\n/**\n * Remove an item by its id\n * @param {Number | String | Object} id   id or item\n * @returns {Number | String | null} id\n * @private\n */\nDataSet.prototype._remove = function (id) {\n  var item,\n      ident;\n\n  // confirm the id to use based on the args type\n  if (util.isNumber(id) || util.isString(id)) {\n    ident = id;\n  }\n  else if (id instanceof Object) {\n    ident = id[this._fieldId]; // look for the identifier field using _fieldId\n  }\n\n  // do the remove if the item is found\n  if (ident !== undefined && this._data[ident]) {\n    item = this._data[ident];\n    delete this._data[ident];\n    this.length--;\n    return item;\n  }\n  return null;\n};\n\n/**\n * Clear the data\n * @param {String} [senderId] Optional sender id\n * @return {Array} removedIds    The ids of all removed items\n */\nDataSet.prototype.clear = function (senderId) {\n  var i, len;\n  var ids = Object.keys(this._data);\n  var items = [];\n\n  for (i = 0, len = ids.length; i < len; i++) {\n    items.push(this._data[ids[i]]);\n  }\n\n  this._data = {};\n  this.length = 0;\n\n  this._trigger('remove', {items: ids, oldData: items}, senderId);\n\n  return ids;\n};\n\n/**\n * Find the item with maximum value of a specified field\n * @param {String} field\n * @return {Object | null} item  Item containing max value, or null if no items\n */\nDataSet.prototype.max = function (field) {\n  var data = this._data,\n      itemIds = Object.keys(data),\n      max = null,\n      maxField = null,\n      i,\n      len;\n\n  for (i = 0, len = itemIds.length; i < len; i++) {\n    var id = itemIds[i];\n    var item = data[id];\n    var itemField = item[field];\n    if (itemField != null && (!max || itemField > maxField)) {\n      max = item;\n      maxField = itemField;\n    }\n  }\n\n  return max;\n};\n\n/**\n * Find the item with minimum value of a specified field\n * @param {String} field\n * @return {Object | null} item  Item containing max value, or null if no items\n */\nDataSet.prototype.min = function (field) {\n  var data = this._data,\n      itemIds = Object.keys(data),\n      min = null,\n      minField = null,\n      i,\n      len;\n\n  for (i = 0, len = itemIds.length; i < len; i++) {\n    var id = itemIds[i];\n    var item = data[id];\n    var itemField = item[field];\n    if (itemField != null && (!min || itemField < minField)) {\n      min = item;\n      minField = itemField;\n    }\n  }\n\n  return min;\n};\n\n/**\n * Find all distinct values of a specified field\n * @param {String} field\n * @return {Array} values  Array containing all distinct values. If data items\n *                         do not contain the specified field are ignored.\n *                         The returned array is unordered.\n */\nDataSet.prototype.distinct = function (field) {\n  var data = this._data;\n  var itemIds = Object.keys(data);\n  var values = [];\n  var fieldType = this._options.type && this._options.type[field] || null;\n  var count = 0;\n  var i,\n      j,\n      len;\n\n  for (i = 0, len = itemIds.length; i < len; i++) {\n    var id = itemIds[i];\n    var item = data[id];\n    var value = item[field];\n    var exists = false;\n    for (j = 0; j < count; j++) {\n      if (values[j] == value) {\n        exists = true;\n        break;\n      }\n    }\n    if (!exists && (value !== undefined)) {\n      values[count] = value;\n      count++;\n    }\n  }\n\n  if (fieldType) {\n    for (i = 0, len = values.length; i < len; i++) {\n      values[i] = util.convert(values[i], fieldType);\n    }\n  }\n\n  return values;\n};\n\n/**\n * Add a single item. Will fail when an item with the same id already exists.\n * @param {Object} item\n * @return {String} id\n * @private\n */\nDataSet.prototype._addItem = function (item) {\n  var id = item[this._fieldId];\n\n  if (id != undefined) {\n    // check whether this id is already taken\n    if (this._data[id]) {\n      // item already exists\n      throw new Error('Cannot add item: item with id ' + id + ' already exists');\n    }\n  }\n  else {\n    // generate an id\n    id = util.randomUUID();\n    item[this._fieldId] = id;\n  }\n\n  var d = {},\n      fields = Object.keys(item),\n      i,\n      len;\n  for (i = 0, len = fields.length; i < len; i++) {\n    var field = fields[i];\n    var fieldType = this._type[field];  // type may be undefined\n    d[field] = util.convert(item[field], fieldType);\n  }\n  this._data[id] = d;\n  this.length++;\n\n  return id;\n};\n\n/**\n * Get an item. Fields can be converted to a specific type\n * @param {String} id\n * @param {Object.<String, String>} [types]  field types to convert\n * @return {Object | null} item\n * @private\n */\nDataSet.prototype._getItem = function (id, types) {\n  var field, value, i, len;\n\n  // get the item from the dataset\n  var raw = this._data[id];\n  if (!raw) {\n    return null;\n  }\n\n  // convert the items field types\n  var converted = {},\n      fields = Object.keys(raw);\n\n  if (types) {\n    for (i = 0, len = fields.length; i < len; i++) {\n      field = fields[i];\n      value = raw[field];\n      converted[field] = util.convert(value, types[field]);\n    }\n  }\n  else {\n    // no field types specified, no converting needed\n    for (i = 0, len = fields.length; i < len; i++) {\n      field = fields[i];\n      value = raw[field];\n      converted[field] = value;\n    }\n  }\n\n  if (!converted[this._fieldId]) {\n    converted[this._fieldId] = raw.id;\n  }\n\n  return converted;\n};\n\n/**\n * Update a single item: merge with existing item.\n * Will fail when the item has no id, or when there does not exist an item\n * with the same id.\n * @param {Object} item\n * @return {String} id\n * @private\n */\nDataSet.prototype._updateItem = function (item) {\n  var id = item[this._fieldId];\n  if (id == undefined) {\n    throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')');\n  }\n  var d = this._data[id];\n  if (!d) {\n    // item doesn't exist\n    throw new Error('Cannot update item: no item with id ' + id + ' found');\n  }\n\n  // merge with current item\n  var fields = Object.keys(item);\n  for (var i = 0, len = fields.length; i < len; i++) {\n    var field = fields[i];\n    var fieldType = this._type[field];  // type may be undefined\n    d[field] = util.convert(item[field], fieldType);\n  }\n\n  return id;\n};\n\nmodule.exports = DataSet;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/DataSet.js","/**\n * A queue\n * @param {Object} options\n *            Available options:\n *            - delay: number    When provided, the queue will be flushed\n *                               automatically after an inactivity of this delay\n *                               in milliseconds.\n *                               Default value is null.\n *            - max: number      When the queue exceeds the given maximum number\n *                               of entries, the queue is flushed automatically.\n *                               Default value of max is Infinity.\n * @constructor\n */\nfunction Queue(options) {\n  // options\n  this.delay = null;\n  this.max = Infinity;\n\n  // properties\n  this._queue = [];\n  this._timeout = null;\n  this._extended = null;\n\n  this.setOptions(options);\n}\n\n/**\n * Update the configuration of the queue\n * @param {Object} options\n *            Available options:\n *            - delay: number    When provided, the queue will be flushed\n *                               automatically after an inactivity of this delay\n *                               in milliseconds.\n *                               Default value is null.\n *            - max: number      When the queue exceeds the given maximum number\n *                               of entries, the queue is flushed automatically.\n *                               Default value of max is Infinity.\n * @param options\n */\nQueue.prototype.setOptions = function (options) {\n  if (options && typeof options.delay !== 'undefined') {\n    this.delay = options.delay;\n  }\n  if (options && typeof options.max !== 'undefined') {\n    this.max = options.max;\n  }\n\n  this._flushIfNeeded();\n};\n\n/**\n * Extend an object with queuing functionality.\n * The object will be extended with a function flush, and the methods provided\n * in options.replace will be replaced with queued ones.\n * @param {Object} object\n * @param {Object} options\n *            Available options:\n *            - replace: Array.<string>\n *                               A list with method names of the methods\n *                               on the object to be replaced with queued ones.\n *            - delay: number    When provided, the queue will be flushed\n *                               automatically after an inactivity of this delay\n *                               in milliseconds.\n *                               Default value is null.\n *            - max: number      When the queue exceeds the given maximum number\n *                               of entries, the queue is flushed automatically.\n *                               Default value of max is Infinity.\n * @return {Queue} Returns the created queue\n */\nQueue.extend = function (object, options) {\n  var queue = new Queue(options);\n\n  if (object.flush !== undefined) {\n    throw new Error('Target object already has a property flush');\n  }\n  object.flush = function () {\n    queue.flush();\n  };\n\n  var methods = [{\n    name: 'flush',\n    original: undefined\n  }];\n\n  if (options && options.replace) {\n    for (var i = 0; i < options.replace.length; i++) {\n      var name = options.replace[i];\n      methods.push({\n        name: name,\n        original: object[name]\n      });\n      queue.replace(object, name);\n    }\n  }\n\n  queue._extended = {\n    object: object,\n    methods: methods\n  };\n\n  return queue;\n};\n\n/**\n * Destroy the queue. The queue will first flush all queued actions, and in\n * case it has extended an object, will restore the original object.\n */\nQueue.prototype.destroy = function () {\n  this.flush();\n\n  if (this._extended) {\n    var object = this._extended.object;\n    var methods = this._extended.methods;\n    for (var i = 0; i < methods.length; i++) {\n      var method = methods[i];\n      if (method.original) {\n        object[method.name] = method.original;\n      }\n      else {\n        delete object[method.name];\n      }\n    }\n    this._extended = null;\n  }\n};\n\n/**\n * Replace a method on an object with a queued version\n * @param {Object} object   Object having the method\n * @param {string} method   The method name\n */\nQueue.prototype.replace = function(object, method) {\n  var me = this;\n  var original = object[method];\n  if (!original) {\n    throw new Error('Method ' + method + ' undefined');\n  }\n\n  object[method] = function () {\n    // create an Array with the arguments\n    var args = [];\n    for (var i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    // add this call to the queue\n    me.queue({\n      args: args,\n      fn: original,\n      context: this\n    });\n  };\n};\n\n/**\n * Queue a call\n * @param {function | {fn: function, args: Array} | {fn: function, args: Array, context: Object}} entry\n */\nQueue.prototype.queue = function(entry) {\n  if (typeof entry === 'function') {\n    this._queue.push({fn: entry});\n  }\n  else {\n    this._queue.push(entry);\n  }\n\n  this._flushIfNeeded();\n};\n\n/**\n * Check whether the queue needs to be flushed\n * @private\n */\nQueue.prototype._flushIfNeeded = function () {\n  // flush when the maximum is exceeded.\n  if (this._queue.length > this.max) {\n    this.flush();\n  }\n\n  // flush after a period of inactivity when a delay is configured\n  clearTimeout(this._timeout);\n  if (this.queue.length > 0 && typeof this.delay === 'number') {\n    var me = this;\n    this._timeout = setTimeout(function () {\n      me.flush();\n    }, this.delay);\n  }\n};\n\n/**\n * Flush all queued calls\n */\nQueue.prototype.flush = function () {\n  while (this._queue.length > 0) {\n    var entry = this._queue.shift();\n    entry.fn.apply(entry.context || entry.fn, entry.args || []);\n  }\n};\n\nmodule.exports = Queue;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/Queue.js","var util = require('./util');\nvar DataSet = require('./DataSet');\n\n/**\n * DataView\n *\n * a dataview offers a filtered view on a dataset or an other dataview.\n *\n * @param {DataSet | DataView} data\n * @param {Object} [options]   Available options: see method get\n *\n * @constructor DataView\n */\nfunction DataView (data, options) {\n  this._data = null;\n  this._ids = {}; // ids of the items currently in memory (just contains a boolean true)\n  this.length = 0; // number of items in the DataView\n  this._options = options || {};\n  this._fieldId = 'id'; // name of the field containing id\n  this._subscribers = {}; // event subscribers\n\n  var me = this;\n  this.listener = function () {\n    me._onEvent.apply(me, arguments);\n  };\n\n  this.setData(data);\n}\n\n// TODO: implement a function .config() to dynamically update things like configured filter\n// and trigger changes accordingly\n\n/**\n * Set a data source for the view\n * @param {DataSet | DataView} data\n */\nDataView.prototype.setData = function (data) {\n  var ids, id, i, len, items;\n\n  if (this._data) {\n    // unsubscribe from current dataset\n    if (this._data.off) {\n      this._data.off('*', this.listener);\n    }\n\n    // trigger a remove of all items in memory\n    ids = this._data.getIds({filter: this._options && this._options.filter});\n    items = [];\n\n    for (i = 0, len = ids.length; i < len; i++) {\n      items.push(this._data._data[ids[i]]);\n    }\n\n    this._ids = {};\n    this.length = 0;\n    this._trigger('remove', {items: ids, oldData: items});\n  }\n\n  this._data = data;\n\n  if (this._data) {\n    // update fieldId\n    this._fieldId = this._options.fieldId ||\n        (this._data && this._data.options && this._data.options.fieldId) ||\n        'id';\n\n    // trigger an add of all added items\n    ids = this._data.getIds({filter: this._options && this._options.filter});\n    for (i = 0, len = ids.length; i < len; i++) {\n      id = ids[i];\n      this._ids[id] = true;\n    }\n    this.length = ids.length;\n    this._trigger('add', {items: ids});\n\n    // subscribe to new dataset\n    if (this._data.on) {\n      this._data.on('*', this.listener);\n    }\n  }\n};\n\n/**\n * Refresh the DataView. Useful when the DataView has a filter function\n * containing a variable parameter.\n */\nDataView.prototype.refresh = function () {\n  var id, i, len;\n  var ids = this._data.getIds({filter: this._options && this._options.filter}),\n      oldIds = Object.keys(this._ids),\n      newIds = {},\n      addedIds = [],\n      removedIds = [],\n      removedItems = [];\n\n  // check for additions\n  for (i = 0, len = ids.length; i < len; i++) {\n    id = ids[i];\n    newIds[id] = true;\n    if (!this._ids[id]) {\n      addedIds.push(id);\n      this._ids[id] = true;\n    }\n  }\n\n  // check for removals\n  for (i = 0, len = oldIds.length; i < len; i++) {\n    id = oldIds[i];\n    if (!newIds[id]) {\n      removedIds.push(id);\n      removedItems.push(this._data._data[id]);\n      delete this._ids[id];\n    }\n  }\n\n  this.length += addedIds.length - removedIds.length;\n\n  // trigger events\n  if (addedIds.length) {\n    this._trigger('add', {items: addedIds});\n  }\n  if (removedIds.length) {\n    this._trigger('remove', {items: removedIds, oldData: removedItems});\n  }\n};\n\n/**\n * Get data from the data view\n *\n * Usage:\n *\n *     get()\n *     get(options: Object)\n *     get(options: Object, data: Array | DataTable)\n *\n *     get(id: Number)\n *     get(id: Number, options: Object)\n *     get(id: Number, options: Object, data: Array | DataTable)\n *\n *     get(ids: Number[])\n *     get(ids: Number[], options: Object)\n *     get(ids: Number[], options: Object, data: Array | DataTable)\n *\n * Where:\n *\n * {Number | String} id         The id of an item\n * {Number[] | String{}} ids    An array with ids of items\n * {Object} options             An Object with options. Available options:\n *                              {String} [type] Type of data to be returned. Can\n *                                              be 'DataTable' or 'Array' (default)\n *                              {Object.<String, String>} [convert]\n *                              {String[]} [fields] field names to be returned\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n * {Array | DataTable} [data]   If provided, items will be appended to this\n *                              array or table. Required in case of Google\n *                              DataTable.\n * @param args\n */\nDataView.prototype.get = function (args) {\n  var me = this;\n\n  // parse the arguments\n  var ids, options, data;\n  var firstType = util.getType(arguments[0]);\n  if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') {\n    // get(id(s) [, options] [, data])\n    ids = arguments[0];  // can be a single id or an array with ids\n    options = arguments[1];\n    data = arguments[2];\n  }\n  else {\n    // get([, options] [, data])\n    options = arguments[0];\n    data = arguments[1];\n  }\n\n  // extend the options with the default options and provided options\n  var viewOptions = util.extend({}, this._options, options);\n\n  // create a combined filter method when needed\n  if (this._options.filter && options && options.filter) {\n    viewOptions.filter = function (item) {\n      return me._options.filter(item) && options.filter(item);\n    }\n  }\n\n  // build up the call to the linked data set\n  var getArguments = [];\n  if (ids != undefined) {\n    getArguments.push(ids);\n  }\n  getArguments.push(viewOptions);\n  getArguments.push(data);\n\n  return this._data && this._data.get.apply(this._data, getArguments);\n};\n\n/**\n * Get ids of all items or from a filtered set of items.\n * @param {Object} [options]    An Object with options. Available options:\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n * @return {Array} ids\n */\nDataView.prototype.getIds = function (options) {\n  var ids;\n\n  if (this._data) {\n    var defaultFilter = this._options.filter;\n    var filter;\n\n    if (options && options.filter) {\n      if (defaultFilter) {\n        filter = function (item) {\n          return defaultFilter(item) && options.filter(item);\n        }\n      }\n      else {\n        filter = options.filter;\n      }\n    }\n    else {\n      filter = defaultFilter;\n    }\n\n    ids = this._data.getIds({\n      filter: filter,\n      order: options && options.order\n    });\n  }\n  else {\n    ids = [];\n  }\n\n  return ids;\n};\n\n/**\n * Map every item in the dataset.\n * @param {function} callback\n * @param {Object} [options]    Available options:\n *                              {Object.<String, String>} [type]\n *                              {String[]} [fields] filter fields\n *                              {function} [filter] filter items\n *                              {String | function} [order] Order the items by\n *                                  a field name or custom sort function.\n * @return {Object[]} mappedItems\n */\nDataView.prototype.map = function (callback,options) {\n  var mappedItems = [];\n  if (this._data) {\n    var defaultFilter = this._options.filter;\n    var filter;\n\n    if (options && options.filter) {\n      if (defaultFilter) {\n        filter = function (item) {\n          return defaultFilter(item) && options.filter(item);\n        }\n      }\n      else {\n        filter = options.filter;\n      }\n    }\n    else {\n      filter = defaultFilter;\n    }\n\n    mappedItems = this._data.map(callback,{\n      filter: filter,\n      order: options && options.order\n    });\n  }\n  else {\n    mappedItems = [];\n  }\n\n  return mappedItems;\n};\n\n/**\n * Get the DataSet to which this DataView is connected. In case there is a chain\n * of multiple DataViews, the root DataSet of this chain is returned.\n * @return {DataSet} dataSet\n */\nDataView.prototype.getDataSet = function () {\n  var dataSet = this;\n  while (dataSet instanceof DataView) {\n    dataSet = dataSet._data;\n  }\n  return dataSet || null;\n};\n\n/**\n * Event listener. Will propagate all events from the connected data set to\n * the subscribers of the DataView, but will filter the items and only trigger\n * when there are changes in the filtered data set.\n * @param {String} event\n * @param {Object | null} params\n * @param {String} senderId\n * @private\n */\nDataView.prototype._onEvent = function (event, params, senderId) {\n  var i, len, id, item;\n  var ids = params && params.items;\n  var addedIds = [],\n      updatedIds = [],\n      removedIds = [],\n      oldItems = [],\n      updatedItems = [],\n      removedItems = [];\n\n  if (ids && this._data) {\n    switch (event) {\n      case 'add':\n        // filter the ids of the added items\n        for (i = 0, len = ids.length; i < len; i++) {\n          id = ids[i];\n          item = this.get(id);\n          if (item) {\n            this._ids[id] = true;\n            addedIds.push(id);\n          }\n        }\n\n        break;\n\n      case 'update':\n        // determine the event from the views viewpoint: an updated\n        // item can be added, updated, or removed from this view.\n        for (i = 0, len = ids.length; i < len; i++) {\n          id = ids[i];\n          item = this.get(id);\n\n          if (item) {\n            if (this._ids[id]) {\n              updatedIds.push(id);\n              updatedItems.push(params.data[i]);\n              oldItems.push(params.oldData[i]);\n            }\n            else {\n              this._ids[id] = true;\n              addedIds.push(id);\n            }\n          }\n          else {\n            if (this._ids[id]) {\n              delete this._ids[id];\n              removedIds.push(id);\n              removedItems.push(params.oldData[i]);\n            }\n            else {\n              // nothing interesting for me :-(\n            }\n          }\n        }\n\n        break;\n\n      case 'remove':\n        // filter the ids of the removed items\n        for (i = 0, len = ids.length; i < len; i++) {\n          id = ids[i];\n          if (this._ids[id]) {\n            delete this._ids[id];\n            removedIds.push(id);\n            removedItems.push(params.oldData[i]);\n          }\n        }\n\n        break;\n    }\n\n    this.length += addedIds.length - removedIds.length;\n\n    if (addedIds.length) {\n      this._trigger('add', {items: addedIds}, senderId);\n    }\n    if (updatedIds.length) {\n      this._trigger('update', {items: updatedIds, oldData: oldItems, data: updatedItems}, senderId);\n    }\n    if (removedIds.length) {\n      this._trigger('remove', {items: removedIds, oldData: removedItems}, senderId);\n    }\n  }\n};\n\n// copy subscription functionality from DataSet\nDataView.prototype.on = DataSet.prototype.on;\nDataView.prototype.off = DataSet.prototype.off;\nDataView.prototype._trigger = DataSet.prototype._trigger;\n\n// TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5)\nDataView.prototype.subscribe = DataView.prototype.on;\nDataView.prototype.unsubscribe = DataView.prototype.off;\n\nmodule.exports = DataView;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/DataView.js","var Emitter = require('emitter-component'); var DataSet = require('../DataSet');\nvar DataView = require('../DataView');\nvar util = require('../util');\nvar Point3d = require('./Point3d');\nvar Point2d = require('./Point2d');\nvar Camera = require('./Camera');\nvar Filter = require('./Filter');\nvar Slider = require('./Slider');\nvar StepNumber = require('./StepNumber');\nvar Range = require('./Range');\nvar Settings = require('./Settings');\n\n\n/// enumerate the available styles\nGraph3d.STYLE = Settings.STYLE; \n\n\n/**\n * Following label is used in the settings to describe values which should be\n * determined by the code while running, from the current data and graph style.\n * \n * Using 'undefined' directly achieves the same thing, but this is more\n * descriptive by describing the intent.\n */\nvar autoByDefault = undefined;\n\n\n/**\n * Default values for option settings.\n *\n * These are the values used when a Graph3d instance is initialized without\n * custom settings.\n *\n * If a field is not in this list, a default value of 'autoByDefault' is assumed,\n * which is just an alias for 'undefined'.\n */\nvar DEFAULTS = {\n  width            : '400px',\n  height           : '400px',\n  filterLabel      : 'time',\n  legendLabel      : 'value',\n  xLabel           : 'x',\n  yLabel           : 'y',\n  zLabel           : 'z',\n  xValueLabel      : function(v) { return v; },\n  yValueLabel      : function(v) { return v; },\n  zValueLabel      : function(v) { return v; },\n  showGrid         : true,\n  showPerspective  : true,\n  showShadow       : false,\n  keepAspectRatio  : true,\n  verticalRatio    : 0.5,    // 0.1 to 1.0, where 1.0 results in a 'cube'\n  dotSizeRatio     : 0.02,   // size of the dots as a fraction of the graph width\n\n  showAnimationControls: autoByDefault,\n  animationInterval    : 1000, // milliseconds\n  animationPreload     : false,\n  animationAutoStart   : autoByDefault,\n\n  axisColor        : '#4D4D4D',\n  gridColor        : '#D3D3D3',\n  xCenter          : '55%',\n  yCenter          : '50%',\n\n  style            : Graph3d.STYLE.DOT,\n  tooltip          : false,\n  showLegend       : autoByDefault, // determined by graph style\n  backgroundColor  : autoByDefault,\n\n  dataColor        : {\n    fill       : '#7DC1FF',\n    stroke     : '#3267D2',\n    strokeWidth: 1 // px\n  },\n\n  cameraPosition   : {\n     horizontal: 1.0,\n     vertical  : 0.5,\n     distance  : 1.7\n  },\n\n  xBarWidth : autoByDefault,\n  yBarWidth : autoByDefault,\n  valueMin  : autoByDefault,\n  valueMax  : autoByDefault,\n  xMin      : autoByDefault,\n  xMax      : autoByDefault,\n  xStep     : autoByDefault,\n  yMin      : autoByDefault,\n  yMax      : autoByDefault,\n  yStep     : autoByDefault,\n  zMin      : autoByDefault,\n  zMax      : autoByDefault,\n  zStep     : autoByDefault\n};\n\n\n// -----------------------------------------------------------------------------\n// Class Graph3d\n// -----------------------------------------------------------------------------\n\n\n/**\n * @constructor Graph3d\n * Graph3d displays data in 3d.\n *\n * Graph3d is developed in javascript as a Google Visualization Chart.\n *\n * @param {Element} container   The DOM element in which the Graph3d will\n *                              be created. Normally a div element.\n * @param {DataSet | DataView | Array} [data]\n * @param {Object} [options]\n */\nfunction Graph3d(container, data, options) {\n  if (!(this instanceof Graph3d)) {\n    throw new SyntaxError('Constructor must be called with the new operator');\n  }\n\n  // create variables and set default values\n  this.containerElement = container;\n\n  this.dataTable = null;  // The original data table\n  this.dataPoints = null; // The table with point objects\n\n  // create a frame and canvas\n  this.create();\n\n  Settings.setDefaults(DEFAULTS, this);\n\n  // the column indexes\n  this.colX = undefined;\n  this.colY = undefined;\n  this.colZ = undefined;\n  this.colValue = undefined;\n  this.colFilter = undefined;\n\n  // TODO: customize axis range\n\n  // apply options (also when undefined)\n  this.setOptions(options);\n\n  // apply data\n  if (data) {\n    this.setData(data);\n  }\n}\n\n// Extend Graph3d with an Emitter mixin\nEmitter(Graph3d.prototype);\n\n/**\n * Calculate the scaling values, dependent on the range in x, y, and z direction\n */\nGraph3d.prototype._setScale = function() {\n  this.scale = new Point3d(\n    1 / this.xRange.range(),\n    1 / this.yRange.range(),\n    1 / this.zRange.range()\n  );\n\n  // keep aspect ration between x and y scale if desired\n  if (this.keepAspectRatio) {\n    if (this.scale.x < this.scale.y) {\n      //noinspection JSSuspiciousNameCombination\n      this.scale.y = this.scale.x;\n    }\n    else {\n      //noinspection JSSuspiciousNameCombination\n      this.scale.x = this.scale.y;\n    }\n  }\n\n  // scale the vertical axis\n  this.scale.z *= this.verticalRatio;\n  // TODO: can this be automated? verticalRatio?\n\n  // determine scale for (optional) value\n  if (this.valueRange !== undefined) {\n    this.scale.value = 1 / this.valueRange.range();\n  }\n\n  // position the camera arm\n  var xCenter = this.xRange.center() * this.scale.x;\n  var yCenter = this.yRange.center() * this.scale.y;\n  var zCenter = this.zRange.center() * this.scale.z;\n  this.camera.setArmLocation(xCenter, yCenter, zCenter);\n};\n\n\n/**\n * Convert a 3D location to a 2D location on screen\n * Source: ttp://en.wikipedia.org/wiki/3D_projection\n *\n * @param   {Point3d} point3d  A 3D point with parameters x, y, z\n * @returns {Point2d} point2d  A 2D point with parameters x, y\n */\nGraph3d.prototype._convert3Dto2D = function(point3d) {\n  var translation = this._convertPointToTranslation(point3d);\n  return this._convertTranslationToScreen(translation);\n};\n\n/**\n * Convert a 3D location its translation seen from the camera\n * Source: http://en.wikipedia.org/wiki/3D_projection\n *\n * @param   {Point3d} point3d     A 3D point with parameters x, y, z\n * @returns {Point3d} translation A 3D point with parameters x, y, z This is\n *                                the translation of the point, seen from the\n *                                camera.\n */\nGraph3d.prototype._convertPointToTranslation = function(point3d) {\n  var cameraLocation = this.camera.getCameraLocation(),\n    cameraRotation = this.camera.getCameraRotation(),\n    ax = point3d.x * this.scale.x,\n    ay = point3d.y * this.scale.y,\n    az = point3d.z * this.scale.z,\n\n    cx = cameraLocation.x,\n    cy = cameraLocation.y,\n    cz = cameraLocation.z,\n\n  // calculate angles\n    sinTx = Math.sin(cameraRotation.x),\n    cosTx = Math.cos(cameraRotation.x),\n    sinTy = Math.sin(cameraRotation.y),\n    cosTy = Math.cos(cameraRotation.y),\n    sinTz = Math.sin(cameraRotation.z),\n    cosTz = Math.cos(cameraRotation.z),\n\n  // calculate translation\n    dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz),\n    dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)),\n    dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx));\n\n  return new Point3d(dx, dy, dz);\n};\n\n/**\n * Convert a translation point to a point on the screen\n *\n * @param   {Point3d} translation A 3D point with parameters x, y, z This is\n *                                the translation of the point, seen from the\n *                                camera.\n * @returns {Point2d} point2d     A 2D point with parameters x, y\n */\nGraph3d.prototype._convertTranslationToScreen = function(translation) {\n  var ex = this.eye.x,\n    ey = this.eye.y,\n    ez = this.eye.z,\n    dx = translation.x,\n    dy = translation.y,\n    dz = translation.z;\n\n  // calculate position on screen from translation\n  var bx;\n  var by;\n  if (this.showPerspective) {\n    bx = (dx - ex) * (ez / dz);\n    by = (dy - ey) * (ez / dz);\n  }\n  else {\n    bx = dx * -(ez / this.camera.getArmLength());\n    by = dy * -(ez / this.camera.getArmLength());\n  }\n\n  // shift and scale the point to the center of the screen\n  // use the width of the graph to scale both horizontally and vertically.\n  return new Point2d(\n    this.currentXCenter + bx * this.frame.canvas.clientWidth,\n    this.currentYCenter - by * this.frame.canvas.clientWidth);\n};\n\n\n/**\n * Calculate the translations and screen positions of all points\n */\nGraph3d.prototype._calcTranslations = function(points, sort) {\n  if (sort === undefined) {\n    sort = true;\n  }\n\n  for (var i = 0; i < points.length; i++) {\n    var point    = points[i];\n    point.trans  = this._convertPointToTranslation(point.point);\n    point.screen = this._convertTranslationToScreen(point.trans);\n\n    // calculate the translation of the point at the bottom (needed for sorting)\n    var transBottom = this._convertPointToTranslation(point.bottom);\n    point.dist = this.showPerspective ? transBottom.length() : -transBottom.z;\n  }\n\n  if (!sort) {\n    return;\n  }\n\n  // sort the points on depth of their (x,y) position (not on z)\n  var sortDepth = function (a, b) {\n    return b.dist - a.dist;\n  };\n  points.sort(sortDepth);\n};\n\n\nGraph3d.prototype.getNumberOfRows = function(data) {\n  return data.length;\n}\n\n\nGraph3d.prototype.getNumberOfColumns = function(data) {\n  var counter = 0;\n  for (var column in data[0]) {\n    if (data[0].hasOwnProperty(column)) {\n      counter++;\n    }\n  }\n  return counter;\n}\n\n\nGraph3d.prototype.getDistinctValues = function(data, column) {\n  var distinctValues = [];\n  for (var i = 0; i < data.length; i++) {\n    if (distinctValues.indexOf(data[i][column]) == -1) {\n      distinctValues.push(data[i][column]);\n    }\n  }\n  return distinctValues;\n}\n\n\n/**\n * Get the absolute min/max values for the passed data column.\n *\n * @returns {Range} A Range instance with min/max members properly set.\n */\nGraph3d.prototype.getColumnRange = function(data,column) {\n  var range  = new Range();\n\n  // Adjust the range so that it covers all values in the passed data elements.\n  for (var i = 0; i < data.length; i++) {\n    var item = data[i][column];\n    range.adjust(item);\n  }\n\n  return range;\n};\n\n\n/**\n * Check if the state is consistent for the use of the value field.\n *\n * Throws if a problem is detected.\n */\nGraph3d.prototype._checkValueField = function (data) {\n\n  var hasValueField = this.style === Graph3d.STYLE.BARCOLOR\n                   || this.style === Graph3d.STYLE.BARSIZE\n                   || this.style === Graph3d.STYLE.DOTCOLOR\n                   || this.style === Graph3d.STYLE.DOTSIZE;\n\n  if (!hasValueField) {\n    return;   // No need to check further\n  }\n\n  // Following field must be present for the current graph style\n  if (this.colValue === undefined) {\n    throw new Error('Expected data to have '\n      + ' field \\'style\\' '\n      + ' for graph style \\'' + this.style + '\\''\n    );\n  }\n\n  // The data must also contain this field.\n  // Note that only first data element is checked.\n  if (data[0][this.colValue] === undefined) {\n    throw new Error('Expected data to have '\n      + ' field \\'' + this.colValue + '\\' '\n      + ' for graph style \\'' + this.style + '\\''\n    );\n  }\n};\n\n\n/**\n * Set default values for range\n *\n * The default values override the range values, if defined.\n *\n * Because it's possible that only defaultMin or defaultMax is set, it's better\n * to pass in a range already set with the min/max set from the data. Otherwise,\n * it's quite hard to process the min/max properly.\n */\nGraph3d.prototype._setRangeDefaults = function (range, defaultMin, defaultMax) {\n  if (defaultMin !== undefined) {\n    range.min = defaultMin;\n  }\n\n  if (defaultMax !== undefined) {\n    range.max = defaultMax;\n  }\n\n  // This is the original way that the default min/max values were adjusted.\n  // TODO: Perhaps it's better if an error is thrown if the values do not agree.\n  //       But this will change the behaviour.\n  if (range.max <= range.min) range.max = range.min + 1;\n};\n\n\n/**\n * Initialize the data from the data table. Calculate minimum and maximum values\n * and column index values\n * @param {Array | DataSet | DataView} rawData The data containing the items for\n *                                             the Graph.\n * @param {Number}                     style   Style Number\n */\nGraph3d.prototype._dataInitialize = function (rawData, style) {\n  var me = this;\n\n  // unsubscribe from the dataTable\n  if (this.dataSet) {\n    this.dataSet.off('*', this._onChange);\n  }\n\n  if (rawData === undefined)\n    return;\n\n  if (Array.isArray(rawData)) {\n    rawData = new DataSet(rawData);\n  }\n\n  var data;\n  if (rawData instanceof DataSet || rawData instanceof DataView) {\n    data = rawData.get();\n  }\n  else {\n    throw new Error('Array, DataSet, or DataView expected');\n  }\n\n  if (data.length == 0)\n    return;\n\n  this.dataSet = rawData;\n  this.dataTable = data;\n\n  // subscribe to changes in the dataset\n  this._onChange = function () {\n    me.setData(me.dataSet);\n  };\n  this.dataSet.on('*', this._onChange);\n\n  // determine the location of x,y,z,value,filter columns\n  this.colX = 'x';\n  this.colY = 'y';\n  this.colZ = 'z';\n\n\n  var withBars = this.style == Graph3d.STYLE.BAR ||\n    this.style == Graph3d.STYLE.BARCOLOR ||\n    this.style == Graph3d.STYLE.BARSIZE;\n\n  // determine barWidth from data\n  if (withBars) {\n    if (this.defaultXBarWidth !== undefined) {\n      this.xBarWidth = this.defaultXBarWidth;\n    }\n    else {\n      var dataX = this.getDistinctValues(data,this.colX);\n      this.xBarWidth = (dataX[1] - dataX[0]) || 1;\n    }\n\n    if (this.defaultYBarWidth !== undefined) {\n      this.yBarWidth = this.defaultYBarWidth;\n    }\n    else {\n      var dataY = this.getDistinctValues(data,this.colY);\n      this.yBarWidth = (dataY[1] - dataY[0]) || 1;\n    }\n  }\n\n  // calculate minimums and maximums\n  var NUMSTEPS = 5;\n\n  var xRange = this.getColumnRange(data, this.colX);\n  if (withBars) {\n    xRange.expand(this.xBarWidth / 2);\n  }\n  this._setRangeDefaults(xRange, this.defaultXMin, this.defaultXMax);\n  this.xRange = xRange;\n  this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : xRange.range()/NUMSTEPS;\n\n  var yRange = this.getColumnRange(data, this.colY);\n  if (withBars) {\n    yRange.expand(this.yBarWidth / 2);\n  }\n  this._setRangeDefaults(yRange, this.defaultYMin, this.defaultYMax);\n  this.yRange = yRange;\n  this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : yRange.range()/NUMSTEPS;\n\n  var zRange = this.getColumnRange(data, this.colZ);\n  this._setRangeDefaults(zRange, this.defaultZMin, this.defaultZMax);\n  this.zRange = zRange;\n  this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : zRange.range()/NUMSTEPS;\n\n  if (data[0].hasOwnProperty('style')) {\n    this.colValue = 'style';\n    var valueRange = this.getColumnRange(data,this.colValue);\n    this._setRangeDefaults(valueRange, this.defaultValueMin, this.defaultValueMax);\n    this.valueRange = valueRange;\n  }\n\n\n  // check if a filter column is provided\n  // Needs to be started after zRange is defined\n  if (data[0].hasOwnProperty('filter')) {\n    // Only set this field if it's actually present\n    this.colFilter = 'filter';\n\n    if (this.dataFilter === undefined) {\n      this.dataFilter = new Filter(rawData, this.colFilter, this);\n      this.dataFilter.setOnLoadCallback(function() {me.redraw();});\n    }\n  }\n\n  \n  // set the scale dependent on the ranges.\n  this._setScale();\n};\n\n\n\n/**\n * Filter the data based on the current filter\n *\n * @param   {Array} data\n * @returns {Array} dataPoints Array with point objects which can be drawn on\n *                             screen\n */\nGraph3d.prototype._getDataPoints = function (data) {\n  // TODO: store the created matrix dataPoints in the filters instead of\n  //       reloading each time.\n  var x, y, i, z, obj, point;\n\n  var dataPoints = [];\n\n  if (this.style === Graph3d.STYLE.GRID ||\n    this.style === Graph3d.STYLE.SURFACE) {\n    // copy all values from the google data table to a matrix\n    // the provided values are supposed to form a grid of (x,y) positions\n\n    // create two lists with all present x and y values\n    var dataX = [];\n    var dataY = [];\n    for (i = 0; i < this.getNumberOfRows(data); i++) {\n      x = data[i][this.colX] || 0;\n      y = data[i][this.colY] || 0;\n\n      if (dataX.indexOf(x) === -1) {\n        dataX.push(x);\n      }\n      if (dataY.indexOf(y) === -1) {\n        dataY.push(y);\n      }\n    }\n\n    var sortNumber = function (a, b) {\n      return a - b;\n    };\n    dataX.sort(sortNumber);\n    dataY.sort(sortNumber);\n\n    // create a grid, a 2d matrix, with all values.\n    var dataMatrix = [];   // temporary data matrix\n    for (i = 0; i < data.length; i++) {\n      x = data[i][this.colX] || 0;\n      y = data[i][this.colY] || 0;\n      z = data[i][this.colZ] || 0;\n\n      // TODO: implement Array().indexOf() for Internet Explorer\n      var xIndex = dataX.indexOf(x);\n      var yIndex = dataY.indexOf(y);\n\n      if (dataMatrix[xIndex] === undefined) {\n        dataMatrix[xIndex] = [];\n      }\n\n      var point3d = new Point3d();\n      point3d.x = x;\n      point3d.y = y;\n      point3d.z = z;\n      point3d.data = data[i];\n\n      obj = {};\n      obj.point = point3d;\n      obj.trans = undefined;\n      obj.screen = undefined;\n      obj.bottom = new Point3d(x, y, this.zRange.min);\n\n      dataMatrix[xIndex][yIndex] = obj;\n\n      dataPoints.push(obj);\n    }\n\n    // fill in the pointers to the neighbors.\n    for (x = 0; x < dataMatrix.length; x++) {\n      for (y = 0; y < dataMatrix[x].length; y++) {\n        if (dataMatrix[x][y]) {\n          dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined;\n          dataMatrix[x][y].pointTop   = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined;\n          dataMatrix[x][y].pointCross =\n            (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ?\n              dataMatrix[x+1][y+1] :\n              undefined;\n        }\n      }\n    }\n  }\n  else {  // 'dot', 'dot-line', etc.\n    this._checkValueField(data);\n\n    // copy all values from the google data table to a list with Point3d objects\n    for (i = 0; i < data.length; i++) {\n      point = new Point3d();\n      point.x = data[i][this.colX] || 0;\n      point.y = data[i][this.colY] || 0;\n      point.z = data[i][this.colZ] || 0;\n      point.data = data[i];\n\n      if (this.colValue !== undefined) {\n        point.value = data[i][this.colValue] || 0;\n      }\n\n      obj = {};\n      obj.point = point;\n      obj.bottom = new Point3d(point.x, point.y, this.zRange.min);\n      obj.trans = undefined;\n      obj.screen = undefined;\n\n      if (this.style === Graph3d.STYLE.LINE) {\n        if (i > 0) {\n          // Add next point for line drawing\n          dataPoints[i - 1].pointNext = obj;\n        }\n      }\n\n      dataPoints.push(obj);\n    }\n  }\n\n  return dataPoints;\n};\n\n/**\n * Create the main frame for the Graph3d.\n *\n * This function is executed once when a Graph3d object is created. The frame\n * contains a canvas, and this canvas contains all objects like the axis and\n * nodes.\n */\nGraph3d.prototype.create = function () {\n  // remove all elements from the container element.\n  while (this.containerElement.hasChildNodes()) {\n    this.containerElement.removeChild(this.containerElement.firstChild);\n  }\n\n  this.frame = document.createElement('div');\n  this.frame.style.position = 'relative';\n  this.frame.style.overflow = 'hidden';\n\n  // create the graph canvas (HTML canvas element)\n  this.frame.canvas = document.createElement( 'canvas' );\n  this.frame.canvas.style.position = 'relative';\n  this.frame.appendChild(this.frame.canvas);\n  //if (!this.frame.canvas.getContext) {\n  {\n    var noCanvas = document.createElement( 'DIV' );\n    noCanvas.style.color = 'red';\n    noCanvas.style.fontWeight =  'bold' ;\n    noCanvas.style.padding =  '10px';\n    noCanvas.innerHTML =  'Error: your browser does not support HTML canvas';\n    this.frame.canvas.appendChild(noCanvas);\n  }\n\n  this.frame.filter = document.createElement( 'div' );\n  this.frame.filter.style.position = 'absolute';\n  this.frame.filter.style.bottom = '0px';\n  this.frame.filter.style.left = '0px';\n  this.frame.filter.style.width = '100%';\n  this.frame.appendChild(this.frame.filter);\n\n  // add event listeners to handle moving and zooming the contents\n  var me = this;\n  var onmousedown = function (event) {me._onMouseDown(event);};\n  var ontouchstart = function (event) {me._onTouchStart(event);};\n  var onmousewheel = function (event) {me._onWheel(event);};\n  var ontooltip = function (event) {me._onTooltip(event);};\n  var onclick = function(event) {me._onClick(event);};\n  // TODO: these events are never cleaned up... can give a 'memory leakage'\n\n  util.addEventListener(this.frame.canvas, 'keydown', onkeydown);\n  util.addEventListener(this.frame.canvas, 'mousedown', onmousedown);\n  util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart);\n  util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel);\n  util.addEventListener(this.frame.canvas, 'mousemove', ontooltip);\n  util.addEventListener(this.frame.canvas, 'click', onclick);\n\n  // add the new graph to the container element\n  this.containerElement.appendChild(this.frame);\n};\n\n\n/**\n * Set a new size for the graph\n */\nGraph3d.prototype._setSize = function(width, height) {\n  this.frame.style.width = width;\n  this.frame.style.height = height;\n\n  this._resizeCanvas();\n};\n\n\n/**\n * Resize the canvas to the current size of the frame\n */\nGraph3d.prototype._resizeCanvas = function() {\n  this.frame.canvas.style.width = '100%';\n  this.frame.canvas.style.height = '100%';\n\n  this.frame.canvas.width = this.frame.canvas.clientWidth;\n  this.frame.canvas.height = this.frame.canvas.clientHeight;\n\n  // adjust with for margin\n  this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px';\n};\n\n/**\n * Start animation\n */\nGraph3d.prototype.animationStart = function() {\n  if (!this.frame.filter || !this.frame.filter.slider)\n    throw new Error('No animation available');\n\n  this.frame.filter.slider.play();\n};\n\n\n/**\n * Stop animation\n */\nGraph3d.prototype.animationStop = function() {\n  if (!this.frame.filter || !this.frame.filter.slider) return;\n\n  this.frame.filter.slider.stop();\n};\n\n\n/**\n * Resize the center position based on the current values in this.xCenter\n * and this.yCenter (which are strings with a percentage or a value\n * in pixels). The center positions are the variables this.currentXCenter\n * and this.currentYCenter\n */\nGraph3d.prototype._resizeCenter = function() {\n  // calculate the horizontal center position\n  if (this.xCenter.charAt(this.xCenter.length-1) === '%') {\n    this.currentXCenter =\n      parseFloat(this.xCenter) / 100 *\n        this.frame.canvas.clientWidth;\n  }\n  else {\n    this.currentXCenter = parseFloat(this.xCenter); // supposed to be in px\n  }\n\n  // calculate the vertical center position\n  if (this.yCenter.charAt(this.yCenter.length-1) === '%') {\n    this.currentYCenter =\n      parseFloat(this.yCenter) / 100 *\n        (this.frame.canvas.clientHeight - this.frame.filter.clientHeight);\n  }\n  else {\n    this.currentYCenter = parseFloat(this.yCenter); // supposed to be in px\n  }\n};\n\n\n\n/**\n * Retrieve the current camera rotation\n *\n * @returns {object} An object with parameters horizontal, vertical, and\n *                   distance\n */\nGraph3d.prototype.getCameraPosition = function() {\n  var pos = this.camera.getArmRotation();\n  pos.distance = this.camera.getArmLength();\n  return pos;\n};\n\n/**\n * Load data into the 3D Graph\n */\nGraph3d.prototype._readData = function(data) {\n  // read the data\n  this._dataInitialize(data, this.style);\n\n\n  if (this.dataFilter) {\n    // apply filtering\n    this.dataPoints = this.dataFilter._getDataPoints();\n  }\n  else {\n    // no filtering. load all data\n    this.dataPoints = this._getDataPoints(this.dataTable);\n  }\n\n  // draw the filter\n  this._redrawFilter();\n};\n\n/**\n * Replace the dataset of the Graph3d\n *\n * @param {Array | DataSet | DataView} data\n */\nGraph3d.prototype.setData = function (data) {\n  this._readData(data);\n  this.redraw();\n\n  // start animation when option is true\n  if (this.animationAutoStart && this.dataFilter) {\n    this.animationStart();\n  }\n};\n\n/**\n * Update the options. Options will be merged with current options\n *\n * @param {Object} options\n */\nGraph3d.prototype.setOptions = function (options) {\n  var cameraPosition = undefined;\n\n  this.animationStop();\n\n  Settings.setOptions(options, this);\n\n  this.setPointDrawingMethod();\n  this._setSize(this.width, this.height);\n\n  // re-load the data\n  if (this.dataTable) {\n    this.setData(this.dataTable);\n  }\n\n  // start animation when option is true\n  if (this.animationAutoStart && this.dataFilter) {\n    this.animationStart();\n  }\n};\n\n\n/**\n * Determine which point drawing method to use for the current graph style.\n */\nGraph3d.prototype.setPointDrawingMethod = function() {\n  var method = undefined;\n\n  switch (this.style) {\n    case Graph3d.STYLE.BAR:\n      method = Graph3d.prototype._redrawBarGraphPoint;\n      break;\n    case Graph3d.STYLE.BARCOLOR:\n      method = Graph3d.prototype._redrawBarColorGraphPoint;\n      break;\n    case Graph3d.STYLE.BARSIZE:\n      method = Graph3d.prototype._redrawBarSizeGraphPoint;\n      break;\n    case Graph3d.STYLE.DOT:\n      method = Graph3d.prototype._redrawDotGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTLINE:\n      method = Graph3d.prototype._redrawDotLineGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTCOLOR:\n      method = Graph3d.prototype._redrawDotColorGraphPoint;\n      break;\n    case Graph3d.STYLE.DOTSIZE:\n      method = Graph3d.prototype._redrawDotSizeGraphPoint;\n      break;\n    case Graph3d.STYLE.SURFACE:\n      method = Graph3d.prototype._redrawSurfaceGraphPoint;\n      break;\n    case Graph3d.STYLE.GRID:\n      method = Graph3d.prototype._redrawGridGraphPoint;\n      break;\n    case Graph3d.STYLE.LINE:\n      method = Graph3d.prototype._redrawLineGraphPoint;\n      break;\n    default:\n      throw new Error('Can not determine point drawing method '\n                    + 'for graph style \\'' + this.style + '\\'');\n      break;\n  }\n\n  this._pointDrawingMethod = method;\n};\n\n\n/**\n * Redraw the Graph.\n */\nGraph3d.prototype.redraw = function() {\n  if (this.dataPoints === undefined) {\n    throw new Error('Graph data not initialized');\n  }\n\n  this._resizeCanvas();\n  this._resizeCenter();\n  this._redrawSlider();\n  this._redrawClear();\n  this._redrawAxis();\n\n  this._redrawDataGraph();\n\n  this._redrawInfo();\n  this._redrawLegend();\n};\n\n\n/**\n * Get drawing context without exposing canvas\n */\nGraph3d.prototype._getContext = function() {\n  var canvas = this.frame.canvas;\n  var ctx = canvas.getContext('2d');\n\n  ctx.lineJoin = 'round';\n  ctx.lineCap  = 'round';\n\n  return ctx;\n};\n\n\n/**\n * Clear the canvas before redrawing\n */\nGraph3d.prototype._redrawClear = function() {\n  var canvas = this.frame.canvas;\n  var ctx = canvas.getContext('2d');\n\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n};\n\n\nGraph3d.prototype._dotSize = function() {\n  return this.frame.clientWidth * this.dotSizeRatio;\n};\n\n\n/**\n * Get legend width\n */\nGraph3d.prototype._getLegendWidth = function() {\n  var width;\n\n  if (this.style === Graph3d.STYLE.DOTSIZE) {\n    var dotSize = this._dotSize();\n    width =  dotSize / 2 + dotSize * 2;\n  } else if (this.style === Graph3d.STYLE.BARSIZE) {\n    width = this.xBarWidth ;\n  } else {\n    width = 20;\n  }\n  return width;\n}\n\n\n/**\n * Redraw the legend based on size, dot color, or surface height\n */\nGraph3d.prototype._redrawLegend = function() {\n\n  //Return without drawing anything, if no legend is specified\n  if (this.showLegend !== true) {\n    return;\n  }\n\n  // Do not draw legend when graph style does not support\n  if (this.style === Graph3d.STYLE.LINE\n   || this.style === Graph3d.STYLE.BARSIZE //TODO add legend support for BARSIZE\n  ){\n    return;\n  }\n\n  // Legend types - size and color. Determine if size legend.\n  var isSizeLegend = (this.style === Graph3d.STYLE.BARSIZE\n                   || this.style === Graph3d.STYLE.DOTSIZE) ;\n\n  // Legend is either tracking z values or style values. This flag if false means use z values.\n  var isValueLegend = (this.style === Graph3d.STYLE.DOTSIZE\n                  || this.style === Graph3d.STYLE.DOTCOLOR\n                  || this.style === Graph3d.STYLE.BARCOLOR);\n\n  var height = Math.max(this.frame.clientHeight * 0.25, 100);\n  var top    = this.margin;\n  var width  = this._getLegendWidth() ; // px - overwritten by size legend\n  var right  = this.frame.clientWidth - this.margin;\n  var left   = right - width;\n  var bottom = top + height;\n\n  var ctx = this._getContext();\n  ctx.lineWidth = 1;\n  ctx.font = '14px arial'; // TODO: put in options\n\n  if (isSizeLegend === false) {\n    // draw the color bar\n    var ymin = 0;\n    var ymax = height; // Todo: make height customizable\n    var y;\n\n    for (y = ymin; y < ymax; y++) {\n      var f = (y - ymin) / (ymax - ymin);\n      var hue = f * 240;\n      var color = this._hsv2rgb(hue, 1, 1);\n\n      ctx.strokeStyle = color;\n      ctx.beginPath();\n      ctx.moveTo(left, top + y);\n      ctx.lineTo(right, top + y);\n      ctx.stroke();\n    }\n    ctx.strokeStyle =  this.axisColor;\n    ctx.strokeRect(left, top, width, height);\n\n  } else {\n\n    // draw the size legend box\n    var  widthMin;\n    if (this.style === Graph3d.STYLE.DOTSIZE) {\n      var dotSize = this._dotSize();\n      widthMin = dotSize / 2; // px\n    } else if (this.style === Graph3d.STYLE.BARSIZE) {\n      //widthMin = this.xBarWidth * 0.2 this is wrong - barwidth measures in terms of xvalues\n    }\n    ctx.strokeStyle =  this.axisColor;\n    ctx.fillStyle =  this.dataColor.fill;\n    ctx.beginPath();\n    ctx.moveTo(left, top);\n    ctx.lineTo(right, top);\n    ctx.lineTo(right - width + widthMin, bottom);\n    ctx.lineTo(left, bottom);\n    ctx.closePath();\n    ctx.fill();\n    ctx.stroke();\n  }\n\n  // print value text along the legend edge\n  var gridLineLen = 5; // px\n\n  var legendMin = isValueLegend ? this.valueRange.min :  this.zRange.min;\n  var legendMax = isValueLegend ? this.valueRange.max :  this.zRange.max;\n  var step = new StepNumber(legendMin, legendMax, (legendMax-legendMin)/5, true);\n  step.start(true);\n\n  var y;\n  var from;\n  var to;\n  while (!step.end()) {\n    y = bottom - (step.getCurrent() - legendMin) / (legendMax - legendMin) * height;\n    from  = new Point2d(left - gridLineLen, y);\n    to    = new Point2d(left, y);\n    this._line(ctx, from, to);\n\n    ctx.textAlign = 'right';\n    ctx.textBaseline = 'middle';\n    ctx.fillStyle = this.axisColor;\n    ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y);\n\n    step.next();\n  }\n\n  ctx.textAlign = 'right';\n  ctx.textBaseline = 'top';\n  var label = this.legendLabel;\n  ctx.fillText(label, right, bottom + this.margin);\n};\n\n/**\n * Redraw the filter\n */\nGraph3d.prototype._redrawFilter = function() {\n  this.frame.filter.innerHTML = '';\n\n  if (this.dataFilter) {\n    var options = {\n      'visible': this.showAnimationControls\n    };\n    var slider = new Slider(this.frame.filter, options);\n    this.frame.filter.slider = slider;\n\n    // TODO: css here is not nice here...\n    this.frame.filter.style.padding = '10px';\n    //this.frame.filter.style.backgroundColor = '#EFEFEF';\n\n    slider.setValues(this.dataFilter.values);\n    slider.setPlayInterval(this.animationInterval);\n\n    // create an event handler\n    var me = this;\n    var onchange = function () {\n      var index = slider.getIndex();\n\n      me.dataFilter.selectValue(index);\n      me.dataPoints = me.dataFilter._getDataPoints();\n\n      me.redraw();\n    };\n    slider.setOnChangeCallback(onchange);\n  }\n  else {\n    this.frame.filter.slider = undefined;\n  }\n};\n\n/**\n * Redraw the slider\n */\nGraph3d.prototype._redrawSlider = function() {\n  if ( this.frame.filter.slider !== undefined) {\n    this.frame.filter.slider.redraw();\n  }\n};\n\n\n/**\n * Redraw common information\n */\nGraph3d.prototype._redrawInfo = function() {\n  if (this.dataFilter) {\n    var ctx = this._getContext();\n\n    ctx.font = '14px arial'; // TODO: put in options\n    ctx.lineStyle = 'gray';\n    ctx.fillStyle = 'gray';\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'top';\n\n    var x = this.margin;\n    var y = this.margin;\n    ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y);\n  }\n};\n\n\n/**\n * Draw a line between 2d points 'from' and 'to'.\n *\n * If stroke style specified, set that as well.\n */\nGraph3d.prototype._line = function(ctx, from, to, strokeStyle) {\n  if (strokeStyle !== undefined) {\n    ctx.strokeStyle = strokeStyle;\n  }\n\n  ctx.beginPath();\n  ctx.moveTo(from.x, from.y);\n  ctx.lineTo(to.x  , to.y  );\n  ctx.stroke();\n}\n\n\nGraph3d.prototype.drawAxisLabelX = function(ctx, point3d, text, armAngle, yMargin) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  var point2d = this._convert3Dto2D(point3d);\n\n  if (Math.cos(armAngle * 2) > 0) {\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'top';\n    point2d.y += yMargin;\n  }\n  else if (Math.sin(armAngle * 2) < 0){\n    ctx.textAlign = 'right';\n    ctx.textBaseline = 'middle';\n  }\n  else {\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n  }\n\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x, point2d.y);\n}\n\n\nGraph3d.prototype.drawAxisLabelY = function(ctx, point3d, text, armAngle, yMargin) {\n  if (yMargin === undefined) {\n    yMargin = 0;\n  }\n\n  var point2d = this._convert3Dto2D(point3d);\n\n  if (Math.cos(armAngle * 2) < 0) {\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'top';\n    point2d.y += yMargin;\n  }\n  else if (Math.sin(armAngle * 2) > 0){\n    ctx.textAlign = 'right';\n    ctx.textBaseline = 'middle';\n  }\n  else {\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n  }\n\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x, point2d.y);\n}\n\n\nGraph3d.prototype.drawAxisLabelZ = function(ctx, point3d, text, offset) {\n  if (offset === undefined) {\n    offset = 0;\n  }\n\n  var point2d = this._convert3Dto2D(point3d);\n  ctx.textAlign = 'right';\n  ctx.textBaseline = 'middle';\n  ctx.fillStyle = this.axisColor;\n  ctx.fillText(text, point2d.x - offset, point2d.y);\n};\n\n\n/**\n\n\n/**\n * Draw a line between 2d points 'from' and 'to'.\n *\n * If stroke style specified, set that as well.\n */\nGraph3d.prototype._line3d = function(ctx, from, to, strokeStyle) {\n  var from2d = this._convert3Dto2D(from);\n  var to2d   = this._convert3Dto2D(to);\n\n  this._line(ctx, from2d, to2d, strokeStyle);\n}\n\n\n/**\n * Redraw the axis\n */\nGraph3d.prototype._redrawAxis = function() {\n  var ctx = this._getContext(),\n    from, to, step, prettyStep,\n    text, xText, yText, zText,\n    offset, xOffset, yOffset;\n\n  // TODO: get the actual rendered style of the containerElement\n  //ctx.font = this.containerElement.style.font;\n  ctx.font = 24 / this.camera.getArmLength() + 'px arial';\n\n  // calculate the length for the short grid lines\n  var gridLenX   = 0.025 / this.scale.x;\n  var gridLenY   = 0.025 / this.scale.y;\n  var textMargin = 5 / this.camera.getArmLength(); // px\n  var armAngle   = this.camera.getArmRotation().horizontal;\n  var armVector  = new Point2d(Math.cos(armAngle), Math.sin(armAngle));\n\n  var xRange = this.xRange;\n  var yRange = this.yRange;\n  var zRange = this.zRange;\n\n  // draw x-grid lines\n  ctx.lineWidth = 1;\n  prettyStep = (this.defaultXStep === undefined);\n  step = new StepNumber(xRange.min, xRange.max, this.xStep, prettyStep);\n  step.start(true);\n\n  while (!step.end()) {\n    var x = step.getCurrent();\n\n    if (this.showGrid) {\n      from = new Point3d(x, yRange.min, zRange.min);\n      to   = new Point3d(x, yRange.max, zRange.min);\n      this._line3d(ctx, from, to, this.gridColor);\n    }\n    else {\n      from = new Point3d(x, yRange.min, zRange.min);\n      to   = new Point3d(x, yRange.min+gridLenX, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n\n      from = new Point3d(x, yRange.max, zRange.min);\n      to   = new Point3d(x, yRange.max-gridLenX, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n    }\n\n    yText       = (armVector.x > 0) ? yRange.min : yRange.max;\n    var point3d = new Point3d(x, yText, zRange.min);\n    var msg     = '  ' + this.xValueLabel(x) + '  ';\n    this.drawAxisLabelX(ctx, point3d, msg, armAngle, textMargin);\n\n    step.next();\n  }\n\n  // draw y-grid lines\n  ctx.lineWidth = 1;\n  prettyStep = (this.defaultYStep === undefined);\n  step = new StepNumber(yRange.min, yRange.max, this.yStep, prettyStep);\n  step.start(true);\n\n  while (!step.end()) {\n    var y = step.getCurrent();\n\n    if (this.showGrid) {\n      from = new Point3d(xRange.min, y, zRange.min);\n      to   = new Point3d(xRange.max, y, zRange.min);\n      this._line3d(ctx, from, to, this.gridColor);\n    }\n    else {\n      from = new Point3d(xRange.min, y, zRange.min);\n      to   = new Point3d(xRange.min+gridLenY, y, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n\n      from = new Point3d(xRange.max, y, zRange.min);\n      to   = new Point3d(xRange.max-gridLenY, y, zRange.min);\n      this._line3d(ctx, from, to, this.axisColor);\n    }\n\n    xText   = (armVector.y > 0) ? xRange.min : xRange.max;\n    point3d = new Point3d(xText, y, zRange.min);\n    var msg = '  ' + this.yValueLabel(y) + '  ';\n    this.drawAxisLabelY(ctx, point3d, msg, armAngle, textMargin);\n\n    step.next();\n  }\n\n  // draw z-grid lines and axis\n  ctx.lineWidth = 1;\n  prettyStep = (this.defaultZStep === undefined);\n  step = new StepNumber(zRange.min, zRange.max, this.zStep, prettyStep);\n  step.start(true);\n\n  xText = (armVector.x > 0) ? xRange.min : xRange.max;\n  yText = (armVector.y < 0) ? yRange.min : yRange.max;\n\n  while (!step.end()) {\n    var z = step.getCurrent();\n\n    // TODO: make z-grid lines really 3d?\n    var from3d = new Point3d(xText, yText, z);\n    var from2d = this._convert3Dto2D(from3d);\n    to = new Point2d(from2d.x - textMargin, from2d.y);\n    this._line(ctx, from2d, to, this.axisColor);\n\n    var msg = this.zValueLabel(z) + ' ';\n    this.drawAxisLabelZ(ctx, from3d, msg, 5);\n\n    step.next();\n  }\n\n  ctx.lineWidth = 1;\n  from = new Point3d(xText, yText, zRange.min);\n  to   = new Point3d(xText, yText, zRange.max);\n  this._line3d(ctx, from, to, this.axisColor);\n\n  // draw x-axis\n  var xMin2d;\n  var xMax2d;\n  ctx.lineWidth = 1;\n\n  // line at yMin\n  xMin2d = new Point3d(xRange.min, yRange.min, zRange.min);\n  xMax2d = new Point3d(xRange.max, yRange.min, zRange.min);\n  this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n  // line at ymax\n  xMin2d = new Point3d(xRange.min, yRange.max, zRange.min);\n  xMax2d = new Point3d(xRange.max, yRange.max, zRange.min);\n  this._line3d(ctx, xMin2d, xMax2d, this.axisColor);\n\n  // draw y-axis\n  ctx.lineWidth = 1;\n  // line at xMin\n  from = new Point3d(xRange.min, yRange.min, zRange.min);\n  to   = new Point3d(xRange.min, yRange.max, zRange.min);\n  this._line3d(ctx, from, to, this.axisColor);\n  // line at xMax\n  from = new Point3d(xRange.max, yRange.min, zRange.min);\n  to   = new Point3d(xRange.max, yRange.max, zRange.min);\n  this._line3d(ctx, from, to, this.axisColor);\n\n  // draw x-label\n  var xLabel = this.xLabel;\n  if (xLabel.length > 0) {\n    yOffset = 0.1 / this.scale.y;\n    xText   = (xRange.max + 3*xRange.min)/4;\n    yText   = (armVector.x > 0) ? yRange.min - yOffset: yRange.max + yOffset;\n    text    = new Point3d(xText, yText, zRange.min);\n    this.drawAxisLabelX(ctx, text, xLabel, armAngle);\n  }\n\n  // draw y-label\n  var yLabel = this.yLabel;\n  if (yLabel.length > 0) {\n    xOffset = 0.1 / this.scale.x;\n    xText   = (armVector.y > 0) ? xRange.min - xOffset : xRange.max + xOffset;\n    yText   = (yRange.max + 3*yRange.min)/4;\n    text    = new Point3d(xText, yText, zRange.min);\n\n    this.drawAxisLabelY(ctx, text, yLabel, armAngle);\n  }\n\n  // draw z-label\n  var zLabel = this.zLabel;\n  if (zLabel.length > 0) {\n    offset = 30;  // pixels.  // TODO: relate to the max width of the values on the z axis?\n    xText  = (armVector.x > 0) ? xRange.min : xRange.max;\n    yText  = (armVector.y < 0) ? yRange.min : yRange.max;\n    zText  = (zRange.max + 3*zRange.min)/4;\n    text   = new Point3d(xText, yText, zText);\n\n    this.drawAxisLabelZ(ctx, text, zLabel, offset);\n  }\n};\n\n/**\n * Calculate the color based on the given value.\n * @param {Number} H   Hue, a value be between 0 and 360\n * @param {Number} S   Saturation, a value between 0 and 1\n * @param {Number} V   Value, a value between 0 and 1\n */\nGraph3d.prototype._hsv2rgb = function(H, S, V) {\n  var R, G, B, C, Hi, X;\n\n  C = V * S;\n  Hi = Math.floor(H/60);  // hi = 0,1,2,3,4,5\n  X = C * (1 - Math.abs(((H/60) % 2) - 1));\n\n  switch (Hi) {\n    case 0: R = C; G = X; B = 0; break;\n    case 1: R = X; G = C; B = 0; break;\n    case 2: R = 0; G = C; B = X; break;\n    case 3: R = 0; G = X; B = C; break;\n    case 4: R = X; G = 0; B = C; break;\n    case 5: R = C; G = 0; B = X; break;\n\n    default: R = 0; G = 0; B = 0; break;\n  }\n\n  return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')';\n};\n\n\nGraph3d.prototype._getStrokeWidth = function(point) {\n  if (point !== undefined) {\n    if (this.showPerspective) {\n      return 1 / -point.trans.z * this.dataColor.strokeWidth;\n    }\n    else {\n      return -(this.eye.z / this.camera.getArmLength()) * this.dataColor.strokeWidth;\n    }\n  }\n\n  return this.dataColor.strokeWidth;\n};\n\n\n// -----------------------------------------------------------------------------\n// Drawing primitives for the graphs\n// -----------------------------------------------------------------------------\n\n\n/**\n * Draw a bar element in the view with the given properties.\n */\nGraph3d.prototype._redrawBar = function(ctx, point, xWidth, yWidth, color, borderColor) {\n  var i, j, surface;\n\n  // calculate all corner points\n  var me = this;\n  var point3d = point.point;\n  var zMin = this.zRange.min;\n  var top = [\n    {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)},\n    {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)},\n    {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)},\n    {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)}\n  ];\n  var bottom = [\n    {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, zMin)},\n    {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, zMin)},\n    {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, zMin)},\n    {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, zMin)}\n  ];\n\n  // calculate screen location of the points\n  top.forEach(function (obj) {\n    obj.screen = me._convert3Dto2D(obj.point);\n  });\n  bottom.forEach(function (obj) {\n    obj.screen = me._convert3Dto2D(obj.point);\n  });\n\n  // create five sides, calculate both corner points and center points\n  var surfaces = [\n    {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)},\n    {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)},\n    {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)},\n    {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)},\n    {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)}\n  ];\n  point.surfaces = surfaces;\n\n  // calculate the distance of each of the surface centers to the camera\n  for (j = 0; j < surfaces.length; j++) {\n    surface = surfaces[j];\n    var transCenter = this._convertPointToTranslation(surface.center);\n    surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z;\n    // TODO: this dept calculation doesn't work 100% of the cases due to perspective,\n    //     but the current solution is fast/simple and works in 99.9% of all cases\n    //     the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9})\n  }\n\n  // order the surfaces by their (translated) depth\n  surfaces.sort(function (a, b) {\n    var diff = b.dist - a.dist;\n    if (diff) return diff;\n\n    // if equal depth, sort the top surface last\n    if (a.corners === top) return 1;\n    if (b.corners === top) return -1;\n\n    // both are equal\n    return 0;\n  });\n\n  // draw the ordered surfaces\n  ctx.lineWidth = this._getStrokeWidth(point);\n  ctx.strokeStyle = borderColor;\n  ctx.fillStyle = color;\n  // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside\n  for (j = 2; j < surfaces.length; j++) {\n    surface = surfaces[j];\n    this._polygon(ctx, surface.corners);\n  }\n};\n\n\n/**\n * Draw a polygon using the passed points and fill it with the passed style and stroke.\n *\n * @param points      an array of points.\n * @param fillStyle   optional; the fill style to set\n * @param strokeStyle optional; the stroke style to set\n */\nGraph3d.prototype._polygon = function(ctx, points, fillStyle, strokeStyle) {\n  if (points.length < 2) {\n    return;\n  }\n\n  if (fillStyle !== undefined) {\n    ctx.fillStyle   = fillStyle;\n  }\n  if (strokeStyle !== undefined) {\n    ctx.strokeStyle = strokeStyle;\n  }\n  ctx.beginPath();\n  ctx.moveTo(points[0].screen.x, points[0].screen.y);\n\n  for (var i = 1; i < points.length; ++i) {\n    var point = points[i];\n    ctx.lineTo(point.screen.x, point.screen.y);\n  }\n\n  ctx.closePath();\n  ctx.fill();\n  ctx.stroke(); // TODO: only draw stroke when strokeWidth > 0\n};\n\n\n/**\n * @param size optional; if not specified use value from 'this._dotSize()`\n */\nGraph3d.prototype._drawCircle = function(ctx, point, color, borderColor, size) {\n  var radius = this._calcRadius(point, size);\n\n  ctx.lineWidth   = this._getStrokeWidth(point);\n  ctx.strokeStyle = borderColor;\n  ctx.fillStyle   = color;\n  ctx.beginPath();\n  ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true);\n  ctx.fill();\n  ctx.stroke();\n};\n\n\n/**\n * Determine the colors for the 'regular' graph styles.\n */\nGraph3d.prototype._getColorsRegular = function(point) {\n  // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0\n  var hue         = (1 - (point.point.z - this.zRange.min) * this.scale.z  / this.verticalRatio) * 240;\n  var color       = this._hsv2rgb(hue, 1, 1);\n  var borderColor = this._hsv2rgb(hue, 1, 0.8);\n\n  return {\n    fill  : color,\n    border: borderColor\n  };\n};\n\n\n/**\n * Get the colors for the 'color' graph styles.\n * These styles are currently: 'bar-color' and 'dot-color'\n * Color may be set as a string representation of HTML color, like #ff00ff,\n * or calculated from a number, for example, distance from this point\n * The first option is useful when we have some pre-given legend, to which we have to adjust ourselves\n * The second option is useful when we are interested in automatically setting the color, from some value,\n * using some color scale\n */\nGraph3d.prototype._getColorsColor = function(point) {\n  // calculate the color based on the value\n  var color, borderColor;\n\n  if (typeof point.point.value === \"string\") {\n    color = point.point.value;\n    borderColor = point.point.value;\n  }\n  else {\n    var hue     = (1 - (point.point.value - this.valueRange.min) * this.scale.value) * 240;\n    color       = this._hsv2rgb(hue, 1, 1);\n    borderColor = this._hsv2rgb(hue, 1, 0.8);\n  }\n  return {\n    fill   : color,\n    border : borderColor\n  };\n};\n\n\n/**\n * Get the colors for the 'size' graph styles.\n * These styles are currently: 'bar-size' and 'dot-size'\n */\nGraph3d.prototype._getColorsSize = function() {\n  return {\n    fill   : this.dataColor.fill,\n    border : this.dataColor.stroke\n  };\n};\n\n\n/**\n * Determine the size of a point on-screen, as determined by the\n * distance to the camera.\n *\n * @param size the size that needs to be translated to screen coordinates.\n *             optional; if not passed, use the default point size.\n */\nGraph3d.prototype._calcRadius = function(point, size) {\n  if (size === undefined) {\n    size = this._dotSize();\n  }\n\n  var radius;\n  if (this.showPerspective) {\n    radius = size / -point.trans.z;\n  }\n  else {\n    radius = size * -(this.eye.z / this.camera.getArmLength());\n  }\n  if (radius < 0) {\n    radius = 0;\n  }\n\n  return radius;\n};\n\n\n// -----------------------------------------------------------------------------\n// Methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n\n/**\n * Draw single datapoint for graph style 'bar'.\n */\nGraph3d.prototype._redrawBarGraphPoint = function(ctx, point) {\n  var xWidth = this.xBarWidth / 2;\n  var yWidth = this.yBarWidth / 2;\n  var colors = this._getColorsRegular(point);\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n\n/**\n * Draw single datapoint for graph style 'bar-color'.\n */\nGraph3d.prototype._redrawBarColorGraphPoint = function(ctx, point) {\n  var xWidth = this.xBarWidth / 2;\n  var yWidth = this.yBarWidth / 2;\n  var colors = this._getColorsColor(point);\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n\n/**\n * Draw single datapoint for graph style 'bar-size'.\n */\nGraph3d.prototype._redrawBarSizeGraphPoint = function(ctx, point) {\n  // calculate size for the bar\n  var fraction = (point.point.value - this.valueRange.min) / this.valueRange.range();\n  var xWidth   = (this.xBarWidth / 2) * (fraction * 0.8 + 0.2);\n  var yWidth   = (this.yBarWidth / 2) * (fraction * 0.8 + 0.2);\n\n  var colors   = this._getColorsSize();\n\n  this._redrawBar(ctx, point, xWidth, yWidth, colors.fill, colors.border);\n};\n\n\n/**\n * Draw single datapoint for graph style 'dot'.\n */\nGraph3d.prototype._redrawDotGraphPoint = function(ctx, point) {\n  var colors = this._getColorsRegular(point);\n\n  this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n\n/**\n * Draw single datapoint for graph style 'dot-line'.\n */\nGraph3d.prototype._redrawDotLineGraphPoint = function(ctx, point) {\n  // draw a vertical line from the XY-plane to the graph value\n  var from = this._convert3Dto2D(point.bottom);\n  ctx.lineWidth = 1;\n  this._line(ctx, from, point.screen, this.gridColor);\n\n  this._redrawDotGraphPoint(ctx, point);\n};\n\n\n/**\n * Draw single datapoint for graph style 'dot-color'.\n */\nGraph3d.prototype._redrawDotColorGraphPoint = function(ctx, point) {\n  var colors = this._getColorsColor(point);\n\n  this._drawCircle(ctx, point, colors.fill, colors.border);\n};\n\n\n/**\n * Draw single datapoint for graph style 'dot-size'.\n */\nGraph3d.prototype._redrawDotSizeGraphPoint = function(ctx, point) {\n  var dotSize  = this._dotSize();\n  var fraction = (point.point.value - this.valueRange.min) / this.valueRange.range();\n  var size     = dotSize/2 + 2*dotSize * fraction;\n  var colors   = this._getColorsSize();\n\n  this._drawCircle(ctx, point, colors.fill, colors.border, size);\n};\n\n\n/**\n * Draw single datapoint for graph style 'surface'.\n */\nGraph3d.prototype._redrawSurfaceGraphPoint = function(ctx, point) {\n  var right = point.pointRight;\n  var top   = point.pointTop;\n  var cross = point.pointCross;\n\n  if (point === undefined || right === undefined || top === undefined || cross === undefined) {\n    return;\n  }\n\n  var topSideVisible = true;\n  var fillStyle;\n  var strokeStyle;\n  var lineWidth;\n\n  if (this.showGrayBottom || this.showShadow) {\n    // calculate the cross product of the two vectors from center\n    // to left and right, in order to know whether we are looking at the\n    // bottom or at the top side. We can also use the cross product\n    // for calculating light intensity\n    var aDiff = Point3d.subtract(cross.trans, point.trans);\n    var bDiff = Point3d.subtract(top.trans, right.trans);\n    var crossproduct = Point3d.crossProduct(aDiff, bDiff);\n    var len = crossproduct.length();\n    // FIXME: there is a bug with determining the surface side (shadow or colored)\n\n    topSideVisible = (crossproduct.z > 0);\n  }\n\n  if (topSideVisible) {\n\n    // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0\n    var zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4;\n    var h    = (1 - (zAvg - this.zRange.min) * this.scale.z  / this.verticalRatio) * 240;\n    var s    = 1; // saturation\n    var v;\n\n    if (this.showShadow) {\n      v = Math.min(1 + (crossproduct.x / len) / 2, 1);  // value. TODO: scale\n      fillStyle = this._hsv2rgb(h, s, v);\n      strokeStyle = fillStyle;\n    }\n    else  {\n      v = 1;\n      fillStyle = this._hsv2rgb(h, s, v);\n      strokeStyle = this.axisColor; // TODO: should be customizable\n    }\n  }\n  else {\n    fillStyle = 'gray';\n    strokeStyle = this.axisColor;\n  }\n\n  ctx.lineWidth = this._getStrokeWidth(point);\n  // TODO: only draw stroke when strokeWidth > 0\n\n  var points = [point, right, cross, top];\n  this._polygon(ctx, points, fillStyle, strokeStyle);\n};\n\n\n/**\n * Helper method for _redrawGridGraphPoint()\n */\nGraph3d.prototype._drawGridLine = function(ctx, from, to) {\n  if (from === undefined || to === undefined) {\n     return;\n  }\n\n  // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0\n  var zAvg = (from.point.z + to.point.z) / 2;\n  var h    = (1 - (zAvg - this.zRange.min) * this.scale.z  / this.verticalRatio) * 240;\n\n  ctx.lineWidth   = this._getStrokeWidth(from) * 2;\n  ctx.strokeStyle = this._hsv2rgb(h, 1, 1);\n  this._line(ctx, from.screen, to.screen);\n};\n\n\n/**\n * Draw single datapoint for graph style 'Grid'.\n */\nGraph3d.prototype._redrawGridGraphPoint = function(ctx, point) {\n  this._drawGridLine(ctx, point, point.pointRight);\n  this._drawGridLine(ctx, point, point.pointTop);\n};\n\n\n/**\n * Draw single datapoint for graph style 'line'.\n */\nGraph3d.prototype._redrawLineGraphPoint = function(ctx, point) {\n  if (point.pointNext === undefined) {\n    return;\n  }\n\n  ctx.lineWidth   = this._getStrokeWidth(point);\n  ctx.strokeStyle = this.dataColor.stroke;\n\n  this._line(ctx, point.screen, point.pointNext.screen);\n};\n\n\n/**\n * Draw all datapoints for currently selected graph style.\n *\n */\nGraph3d.prototype._redrawDataGraph = function() {\n  var ctx = this._getContext();\n  var i;\n\n  if (this.dataPoints === undefined || this.dataPoints.length <= 0)\n    return;  // TODO: throw exception?\n\n  this._calcTranslations(this.dataPoints);\n\n  for (i = 0; i < this.dataPoints.length; i++) {\n    var point = this.dataPoints[i];\n\n    // Using call() ensures that the correct context is used\n    this._pointDrawingMethod.call(this, ctx, point);\n  }\n};\n\n\n// -----------------------------------------------------------------------------\n// End methods for drawing points per graph style.\n// -----------------------------------------------------------------------------\n\n/**\n * Store startX, startY and startOffset for mouse operations\n *\n * @param {Event}     event     The event that occurred\n */\nGraph3d.prototype._storeMousePosition = function(event) {\n  // get mouse position (different code for IE and all other browsers)\n  this.startMouseX = getMouseX(event);\n  this.startMouseY = getMouseY(event);\n\n  this._startCameraOffset = this.camera.getOffset();\n};\n\n\n/**\n * Start a moving operation inside the provided parent element\n * @param {Event}     event     The event that occurred (required for\n *                  retrieving the  mouse position)\n */\nGraph3d.prototype._onMouseDown = function(event) {\n  event = event || window.event;\n\n  // check if mouse is still down (may be up when focus is lost for example\n  // in an iframe)\n  if (this.leftButtonDown) {\n    this._onMouseUp(event);\n  }\n\n  // only react on left mouse button down\n  this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1);\n  if (!this.leftButtonDown && !this.touchDown) return;\n\n  this._storeMousePosition(event);\n\n  this.startStart = new Date(this.start);\n  this.startEnd = new Date(this.end);\n  this.startArmRotation = this.camera.getArmRotation();\n\n  this.frame.style.cursor = 'move';\n\n  // add event listeners to handle moving the contents\n  // we store the function onmousemove and onmouseup in the graph, so we can\n  // remove the eventlisteners lateron in the function mouseUp()\n  var me = this;\n  this.onmousemove = function (event) {me._onMouseMove(event);};\n  this.onmouseup   = function (event) {me._onMouseUp(event);};\n  util.addEventListener(document, 'mousemove', me.onmousemove);\n  util.addEventListener(document, 'mouseup', me.onmouseup);\n  util.preventDefault(event);\n};\n\n\n/**\n * Perform moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {Event}   event  Well, eehh, the event\n */\nGraph3d.prototype._onMouseMove = function (event) {\n  this.moving = true;\n  event = event || window.event;\n\n  // calculate change in mouse position\n  var diffX = parseFloat(getMouseX(event)) - this.startMouseX;\n  var diffY = parseFloat(getMouseY(event)) - this.startMouseY;\n\n  // move with ctrl or rotate by other\n  if (event && event.ctrlKey === true) {\n      // calculate change in mouse position\n      var scaleX = this.frame.clientWidth  * 0.5;\n      var scaleY = this.frame.clientHeight * 0.5;\n\n      var offXNew = (this._startCameraOffset.x || 0) - ((diffX / scaleX) * this.camera.armLength) * 0.8;\n      var offYNew = (this._startCameraOffset.y || 0) + ((diffY / scaleY) * this.camera.armLength) * 0.8;\n\n      this.camera.setOffset(offXNew, offYNew);\n      this._storeMousePosition(event);\n    } else {\n      var horizontalNew = this.startArmRotation.horizontal + diffX / 200;\n      var verticalNew   = this.startArmRotation.vertical   + diffY / 200;\n\n      var snapAngle = 4; // degrees\n      var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI);\n\n      // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc...\n      // the -0.001 is to take care that the vertical axis is always drawn at the left front corner\n      if (Math.abs(Math.sin(horizontalNew)) < snapValue) {\n          horizontalNew = Math.round(horizontalNew / Math.PI) * Math.PI - 0.001;\n      }\n      if (Math.abs(Math.cos(horizontalNew)) < snapValue) {\n          horizontalNew = (Math.round(horizontalNew / Math.PI - 0.5) + 0.5) * Math.PI - 0.001;\n      }\n\n      // snap vertically to nice angles\n      if (Math.abs(Math.sin(verticalNew)) < snapValue) {\n          verticalNew = Math.round(verticalNew / Math.PI) * Math.PI;\n      }\n      if (Math.abs(Math.cos(verticalNew)) < snapValue) {\n          verticalNew = (Math.round(verticalNew / Math.PI - 0.5) + 0.5) * Math.PI;\n      }\n      this.camera.setArmRotation(horizontalNew, verticalNew);\n  }\n\n  this.redraw();\n\n  // fire a cameraPositionChange event\n  var parameters = this.getCameraPosition();\n  this.emit('cameraPositionChange', parameters);\n\n  util.preventDefault(event);\n};\n\n\n/**\n * Stop moving operating.\n * This function activated from within the funcion Graph.mouseDown().\n * @param {event}  event   The event\n */\nGraph3d.prototype._onMouseUp = function (event) {\n  this.frame.style.cursor = 'auto';\n  this.leftButtonDown = false;\n\n  // remove event listeners here\n  util.removeEventListener(document, 'mousemove', this.onmousemove);\n  util.removeEventListener(document, 'mouseup',   this.onmouseup);\n  util.preventDefault(event);\n};\n\n/**\n * @param {event}  event   The event\n */\nGraph3d.prototype._onClick = function (event) {\n  if (!this.onclick_callback)\n    return;\n  if (!this.moving) {\n    var boundingRect = this.frame.getBoundingClientRect();\n    var mouseX = getMouseX(event) - boundingRect.left;\n    var mouseY = getMouseY(event) - boundingRect.top;\n    var dataPoint = this._dataPointFromXY(mouseX, mouseY);\n    if (dataPoint)\n        this.onclick_callback(dataPoint.point.data);\n  }\n  else { // disable onclick callback, if it came immediately after rotate/pan\n    this.moving = false;\n  }\n  util.preventDefault(event);\n};\n\n/**\n * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point\n * @param {Event}  event   A mouse move event\n */\nGraph3d.prototype._onTooltip = function (event) {\n  var delay = 300; // ms\n  var boundingRect = this.frame.getBoundingClientRect();\n  var mouseX = getMouseX(event) - boundingRect.left;\n  var mouseY = getMouseY(event) - boundingRect.top;\n\n  if (!this.showTooltip) {\n    return;\n  }\n\n  if (this.tooltipTimeout) {\n    clearTimeout(this.tooltipTimeout);\n  }\n\n  // (delayed) display of a tooltip only if no mouse button is down\n  if (this.leftButtonDown) {\n    this._hideTooltip();\n    return;\n  }\n\n  if (this.tooltip && this.tooltip.dataPoint) {\n    // tooltip is currently visible\n    var dataPoint = this._dataPointFromXY(mouseX, mouseY);\n    if (dataPoint !== this.tooltip.dataPoint) {\n      // datapoint changed\n      if (dataPoint) {\n        this._showTooltip(dataPoint);\n      }\n      else {\n        this._hideTooltip();\n      }\n    }\n  }\n  else {\n    // tooltip is currently not visible\n    var me = this;\n    this.tooltipTimeout = setTimeout(function () {\n      me.tooltipTimeout = null;\n\n      // show a tooltip if we have a data point\n      var dataPoint = me._dataPointFromXY(mouseX, mouseY);\n      if (dataPoint) {\n        me._showTooltip(dataPoint);\n      }\n    }, delay);\n  }\n};\n\n/**\n * Event handler for touchstart event on mobile devices\n */\nGraph3d.prototype._onTouchStart = function(event) {\n  this.touchDown = true;\n\n  var me = this;\n  this.ontouchmove = function (event) {me._onTouchMove(event);};\n  this.ontouchend  = function (event) {me._onTouchEnd(event);};\n  util.addEventListener(document, 'touchmove', me.ontouchmove);\n  util.addEventListener(document, 'touchend', me.ontouchend);\n\n  this._onMouseDown(event);\n};\n\n/**\n * Event handler for touchmove event on mobile devices\n */\nGraph3d.prototype._onTouchMove = function(event) {\n  this._onMouseMove(event);\n};\n\n/**\n * Event handler for touchend event on mobile devices\n */\nGraph3d.prototype._onTouchEnd = function(event) {\n  this.touchDown = false;\n\n  util.removeEventListener(document, 'touchmove', this.ontouchmove);\n  util.removeEventListener(document, 'touchend',   this.ontouchend);\n\n  this._onMouseUp(event);\n};\n\n\n/**\n * Event handler for mouse wheel event, used to zoom the graph\n * Code from http://adomas.org/javascript-mouse-wheel/\n * @param {event}  event   The event\n */\nGraph3d.prototype._onWheel = function(event) {\n  if (!event) /* For IE. */\n    event = window.event;\n\n  // retrieve delta\n  var delta = 0;\n  if (event.wheelDelta) { /* IE/Opera. */\n    delta = event.wheelDelta/120;\n  } else if (event.detail) { /* Mozilla case. */\n    // In Mozilla, sign of delta is different than in IE.\n    // Also, delta is multiple of 3.\n    delta = -event.detail/3;\n  }\n\n  // If delta is nonzero, handle it.\n  // Basically, delta is now positive if wheel was scrolled up,\n  // and negative, if wheel was scrolled down.\n  if (delta) {\n    var oldLength = this.camera.getArmLength();\n    var newLength = oldLength * (1 - delta / 10);\n\n    this.camera.setArmLength(newLength);\n    this.redraw();\n\n    this._hideTooltip();\n  }\n\n  // fire a cameraPositionChange event\n  var parameters = this.getCameraPosition();\n  this.emit('cameraPositionChange', parameters);\n\n  // Prevent default actions caused by mouse wheel.\n  // That might be ugly, but we handle scrolls somehow\n  // anyway, so don't bother here..\n  util.preventDefault(event);\n};\n\n/**\n * Test whether a point lies inside given 2D triangle\n *\n * @param   {Point2d}   point\n * @param   {Point2d[]} triangle\n * @returns {boolean}   true if given point lies inside or on the edge of the\n *                      triangle, false otherwise\n * @private\n */\nGraph3d.prototype._insideTriangle = function (point, triangle) {\n  var a = triangle[0],\n    b = triangle[1],\n    c = triangle[2];\n\n  function sign (x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n\n  var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x));\n  var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x));\n  var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x));\n\n  // each of the three signs must be either equal to each other or zero\n  return (as == 0 || bs == 0 || as == bs) &&\n    (bs == 0 || cs == 0 || bs == cs) &&\n    (as == 0 || cs == 0 || as == cs);\n};\n\n/**\n * Find a data point close to given screen position (x, y)\n *\n * @param   {Number} x\n * @param   {Number} y\n * @returns {Object | null} The closest data point or null if not close to any\n *                          data point\n * @private\n */\nGraph3d.prototype._dataPointFromXY = function (x, y) {\n  var i,\n    distMax = 100, // px\n    dataPoint = null,\n    closestDataPoint = null,\n    closestDist = null,\n    center = new Point2d(x, y);\n\n  if (this.style === Graph3d.STYLE.BAR ||\n    this.style === Graph3d.STYLE.BARCOLOR ||\n    this.style === Graph3d.STYLE.BARSIZE) {\n    // the data points are ordered from far away to closest\n    for (i = this.dataPoints.length - 1; i >= 0; i--) {\n      dataPoint = this.dataPoints[i];\n      var surfaces  = dataPoint.surfaces;\n      if (surfaces) {\n        for (var s = surfaces.length - 1; s >= 0; s--) {\n          // split each surface in two triangles, and see if the center point is inside one of these\n          var surface = surfaces[s];\n          var corners = surface.corners;\n          var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen];\n          var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen];\n          if (this._insideTriangle(center, triangle1) ||\n            this._insideTriangle(center, triangle2)) {\n            // return immediately at the first hit\n            return dataPoint;\n          }\n        }\n      }\n    }\n  }\n  else {\n    // find the closest data point, using distance to the center of the point on 2d screen\n    for (i = 0; i < this.dataPoints.length; i++) {\n      dataPoint = this.dataPoints[i];\n      var point = dataPoint.screen;\n      if (point) {\n        var distX = Math.abs(x - point.x);\n        var distY = Math.abs(y - point.y);\n        var dist  = Math.sqrt(distX * distX + distY * distY);\n\n        if ((closestDist === null || dist < closestDist) && dist < distMax) {\n          closestDist = dist;\n          closestDataPoint = dataPoint;\n        }\n      }\n    }\n  }\n\n\n  return closestDataPoint;\n};\n\n/**\n * Display a tooltip for given data point\n * @param {Object} dataPoint\n * @private\n */\nGraph3d.prototype._showTooltip = function (dataPoint) {\n  var content, line, dot;\n\n  if (!this.tooltip) {\n    content = document.createElement('div');\n    content.style.position = 'absolute';\n    content.style.padding = '10px';\n    content.style.border = '1px solid #4d4d4d';\n    content.style.color = '#1a1a1a';\n    content.style.background = 'rgba(255,255,255,0.7)';\n    content.style.borderRadius = '2px';\n    content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)';\n\n    line = document.createElement('div');\n    line.style.position = 'absolute';\n    line.style.height = '40px';\n    line.style.width = '0';\n    line.style.borderLeft = '1px solid #4d4d4d';\n\n    dot = document.createElement('div');\n    dot.style.position = 'absolute';\n    dot.style.height = '0';\n    dot.style.width = '0';\n    dot.style.border = '5px solid #4d4d4d';\n    dot.style.borderRadius = '5px';\n\n    this.tooltip = {\n      dataPoint: null,\n      dom: {\n        content: content,\n        line: line,\n        dot: dot\n      }\n    };\n  }\n  else {\n    content = this.tooltip.dom.content;\n    line  = this.tooltip.dom.line;\n    dot   = this.tooltip.dom.dot;\n  }\n\n  this._hideTooltip();\n\n  this.tooltip.dataPoint = dataPoint;\n  if (typeof this.showTooltip === 'function') {\n    content.innerHTML = this.showTooltip(dataPoint.point);\n  }\n  else {\n    content.innerHTML = '<table>' +\n      '<tr><td>' + this.xLabel + ':</td><td>' + dataPoint.point.x + '</td></tr>' +\n      '<tr><td>' + this.yLabel + ':</td><td>' + dataPoint.point.y + '</td></tr>' +\n      '<tr><td>' + this.zLabel + ':</td><td>' + dataPoint.point.z + '</td></tr>' +\n      '</table>';\n  }\n\n  content.style.left  = '0';\n  content.style.top   = '0';\n  this.frame.appendChild(content);\n  this.frame.appendChild(line);\n  this.frame.appendChild(dot);\n\n  // calculate sizes\n  var contentWidth  = content.offsetWidth;\n  var contentHeight   = content.offsetHeight;\n  var lineHeight    = line.offsetHeight;\n  var dotWidth    = dot.offsetWidth;\n  var dotHeight     = dot.offsetHeight;\n\n  var left = dataPoint.screen.x - contentWidth / 2;\n  left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth);\n\n  line.style.left   = dataPoint.screen.x + 'px';\n  line.style.top    = (dataPoint.screen.y - lineHeight) + 'px';\n  content.style.left  = left + 'px';\n  content.style.top   = (dataPoint.screen.y - lineHeight - contentHeight) + 'px';\n  dot.style.left    = (dataPoint.screen.x - dotWidth / 2) + 'px';\n  dot.style.top     = (dataPoint.screen.y - dotHeight / 2) + 'px';\n};\n\n/**\n * Hide the tooltip when displayed\n * @private\n */\nGraph3d.prototype._hideTooltip = function () {\n  if (this.tooltip) {\n    this.tooltip.dataPoint = null;\n\n    for (var prop in this.tooltip.dom) {\n      if (this.tooltip.dom.hasOwnProperty(prop)) {\n        var elem = this.tooltip.dom[prop];\n        if (elem && elem.parentNode) {\n          elem.parentNode.removeChild(elem);\n        }\n      }\n    }\n  }\n};\n\n/**--------------------------------------------------------------------------**/\n\n\n/**\n * Get the horizontal mouse position from a mouse event\n *\n * @param   {Event}  event\n * @returns {Number} mouse x\n */\nfunction getMouseX (event) {\n  if ('clientX' in event) return event.clientX;\n  return event.targetTouches[0] && event.targetTouches[0].clientX || 0;\n}\n\n/**\n * Get the vertical mouse position from a mouse event\n *\n * @param   {Event}  event\n * @returns {Number} mouse y\n */\nfunction getMouseY (event) {\n  if ('clientY' in event) return event.clientY;\n  return event.targetTouches[0] && event.targetTouches[0].clientY || 0;\n}\n\n\n// -----------------------------------------------------------------------------\n//  Public methods for specific settings\n// -----------------------------------------------------------------------------\n\n/**\n * Set the rotation and distance of the camera\n *\n * @param {Object}  pos            An object with the camera position\n * @param {?Number} pos.horizontal The horizontal rotation, between 0 and 2*PI.\n *                                 Optional, can be left undefined.\n * @param {?Number} pos.vertical   The vertical rotation, between 0 and 0.5*PI.\n *                                 if vertical=0.5*PI, the graph is shown from\n *                                 the top. Optional, can be left undefined.\n * @param {?Number} pos.distance   The (normalized) distance of the camera to the\n *                                 center of the graph, a value between 0.71 and\n *                                 5.0. Optional, can be left undefined.\n */\nGraph3d.prototype.setCameraPosition = function(pos) {\n  Settings.setCameraPosition(pos, this);\n  this.redraw();\n};\n\n\n/**\n * Set a new size for the graph\n *\n * @param {string} width  Width in pixels or percentage (for example '800px'\n *                        or '50%')\n * @param {string} height Height in pixels or percentage  (for example '400px'\n *                        or '30%')\n */\nGraph3d.prototype.setSize = function(width, height) {\n\tthis._setSize(width, height);\n\tthis.redraw();\n};\n\n// -----------------------------------------------------------------------------\n//  End public methods for specific settings\n// -----------------------------------------------------------------------------\n\n\nmodule.exports = Graph3d;\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Graph3d.js","\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/emitter-component/index.js\n// module id = 95\n// module chunks = 0","/**\n * @prototype Point3d\n * @param {Number} [x]\n * @param {Number} [y]\n * @param {Number} [z]\n */\nfunction Point3d(x, y, z) {\n  this.x = x !== undefined ? x : 0;\n  this.y = y !== undefined ? y : 0;\n  this.z = z !== undefined ? z : 0;\n};\n\n/**\n * Subtract the two provided points, returns a-b\n * @param {Point3d} a\n * @param {Point3d} b\n * @return {Point3d} a-b\n */\nPoint3d.subtract = function(a, b) {\n  var sub = new Point3d();\n  sub.x = a.x - b.x;\n  sub.y = a.y - b.y;\n  sub.z = a.z - b.z;\n  return sub;\n};\n\n/**\n * Add the two provided points, returns a+b\n * @param {Point3d} a\n * @param {Point3d} b\n * @return {Point3d} a+b\n */\nPoint3d.add = function(a, b) {\n  var sum = new Point3d();\n  sum.x = a.x + b.x;\n  sum.y = a.y + b.y;\n  sum.z = a.z + b.z;\n  return sum;\n};\n\n/**\n * Calculate the average of two 3d points\n * @param {Point3d} a\n * @param {Point3d} b\n * @return {Point3d} The average, (a+b)/2\n */\nPoint3d.avg = function(a, b) {\n  return new Point3d(\n          (a.x + b.x) / 2,\n          (a.y + b.y) / 2,\n          (a.z + b.z) / 2\n  );\n};\n\n/**\n * Calculate the cross product of the two provided points, returns axb\n * Documentation: http://en.wikipedia.org/wiki/Cross_product\n * @param {Point3d} a\n * @param {Point3d} b\n * @return {Point3d} cross product axb\n */\nPoint3d.crossProduct = function(a, b) {\n  var crossproduct = new Point3d();\n\n  crossproduct.x = a.y * b.z - a.z * b.y;\n  crossproduct.y = a.z * b.x - a.x * b.z;\n  crossproduct.z = a.x * b.y - a.y * b.x;\n\n  return crossproduct;\n};\n\n\n/**\n * Rtrieve the length of the vector (or the distance from this point to the origin\n * @return {Number}  length\n */\nPoint3d.prototype.length = function() {\n  return Math.sqrt(\n          this.x * this.x +\n          this.y * this.y +\n          this.z * this.z\n  );\n};\n\nmodule.exports = Point3d;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Point3d.js","/**\n * @prototype Point2d\n * @param {Number} [x]\n * @param {Number} [y]\n */\nfunction Point2d (x, y) {\n  this.x = x !== undefined ? x : 0;\n  this.y = y !== undefined ? y : 0;\n}\n\nmodule.exports = Point2d;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Point2d.js","var Point3d = require('./Point3d');\n\n/**\n * @class Camera\n * The camera is mounted on a (virtual) camera arm. The camera arm can rotate\n * The camera is always looking in the direction of the origin of the arm.\n * This way, the camera always rotates around one fixed point, the location\n * of the camera arm.\n *\n * Documentation:\n *   http://en.wikipedia.org/wiki/3D_projection\n */\nfunction Camera() {\n  this.armLocation = new Point3d();\n  this.armRotation = {};\n  this.armRotation.horizontal = 0;\n  this.armRotation.vertical = 0;\n  this.armLength = 1.7;\n  this.cameraOffset = new Point3d();\n  this.offsetMultiplier = 0.6;\n\n  this.cameraLocation = new Point3d();\n  this.cameraRotation =  new Point3d(0.5*Math.PI, 0, 0);\n\n  this.calculateCameraOrientation();\n}\n\n/**\n * Set offset camera in camera coordinates\n * @param {Number} x offset by camera horisontal\n * @param {Number} y offset by camera vertical\n */\nCamera.prototype.setOffset = function(x, y) {\n  var abs = Math.abs,\n      sign = Math.sign,\n      mul = this.offsetMultiplier,\n      border = this.armLength * mul;\n\n  if (abs(x) > border) {\n      x = sign(x) * border;\n  }\n  if (abs(y) > border) {\n      y = sign(y) * border;\n  }\n  this.cameraOffset.x = x;\n  this.cameraOffset.y = y;\n  this.calculateCameraOrientation();\n};\n\n/**\n * Get camera offset by horizontal and vertical\n * @return {Point3d} x - horizontal offset, y - vertical offset, z - not used\n */\nCamera.prototype.getOffset = function(x, y) {\n  return this.cameraOffset;\n};\n\n/**\n * Set the location (origin) of the arm\n * @param {Number} x  Normalized value of x\n * @param {Number} y  Normalized value of y\n * @param {Number} z  Normalized value of z\n */\nCamera.prototype.setArmLocation = function(x, y, z) {\n  this.armLocation.x = x;\n  this.armLocation.y = y;\n  this.armLocation.z = z;\n\n  this.calculateCameraOrientation();\n};\n\n/**\n * Set the rotation of the camera arm\n * @param {Number} horizontal   The horizontal rotation, between 0 and 2*PI.\n *                Optional, can be left undefined.\n * @param {Number} vertical   The vertical rotation, between 0 and 0.5*PI\n *                if vertical=0.5*PI, the graph is shown from the\n *                top. Optional, can be left undefined.\n */\nCamera.prototype.setArmRotation = function(horizontal, vertical) {\n  if (horizontal !== undefined) {\n    this.armRotation.horizontal = horizontal;\n  }\n\n  if (vertical !== undefined) {\n    this.armRotation.vertical = vertical;\n    if (this.armRotation.vertical < 0) this.armRotation.vertical = 0;\n    if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI;\n  }\n\n  if (horizontal !== undefined || vertical !== undefined) {\n    this.calculateCameraOrientation();\n  }\n};\n\n/**\n * Retrieve the current arm rotation\n * @return {object}   An object with parameters horizontal and vertical\n */\nCamera.prototype.getArmRotation = function() {\n  var rot = {};\n  rot.horizontal = this.armRotation.horizontal;\n  rot.vertical = this.armRotation.vertical;\n\n  return rot;\n};\n\n/**\n * Set the (normalized) length of the camera arm.\n * @param {Number} length A length between 0.71 and 5.0\n */\nCamera.prototype.setArmLength = function(length) {\n  if (length === undefined)\n    return;\n\n  this.armLength = length;\n\n  // Radius must be larger than the corner of the graph,\n  // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the\n  // graph\n  if (this.armLength < 0.71) this.armLength = 0.71;\n  if (this.armLength > 5.0) this.armLength = 5.0;\n\n  this.setOffset(this.cameraOffset.x, this.cameraOffset.y);\n  this.calculateCameraOrientation();\n};\n\n/**\n * Retrieve the arm length\n * @return {Number} length\n */\nCamera.prototype.getArmLength = function() {\n  return this.armLength;\n};\n\n/**\n * Retrieve the camera location\n * @return {Point3d} cameraLocation\n */\nCamera.prototype.getCameraLocation = function() {\n  return this.cameraLocation;\n};\n\n/**\n * Retrieve the camera rotation\n * @return {Point3d} cameraRotation\n */\nCamera.prototype.getCameraRotation = function() {\n  return this.cameraRotation;\n};\n\n/**\n * Calculate the location and rotation of the camera based on the\n * position and orientation of the camera arm\n */\nCamera.prototype.calculateCameraOrientation = function() {\n  // calculate location of the camera\n  this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical);\n  this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical);\n  this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical);\n\n  // calculate rotation of the camera\n  this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical;\n  this.cameraRotation.y = 0;\n  this.cameraRotation.z = -this.armRotation.horizontal;\n\n  var xa = this.cameraRotation.x;\n  var ya = this.cameraRotation.y;\n  var za = this.cameraRotation.z;\n  var dx = this.cameraOffset.x;\n  var dy = this.cameraOffset.y;\n  var sin = Math.sin, cos = Math.cos;\n\n  this.cameraLocation.x = this.cameraLocation.x + dx * cos(za) + dy * - sin(za) * cos(xa);\n  this.cameraLocation.y = this.cameraLocation.y + dx * sin(za) + dy * cos(za) * cos(xa);\n  this.cameraLocation.z = this.cameraLocation.z + dy * sin(xa);\n};\n\nmodule.exports = Camera;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Camera.js","module.exports = { \"default\": require(\"core-js/library/fn/math/sign\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/math/sign.js\n// module id = 99\n// module chunks = 0","require('../../modules/es6.math.sign');\nmodule.exports = require('../../modules/_core').Math.sign;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/math/sign.js\n// module id = 100\n// module chunks = 0","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {sign: require('./_math-sign')});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.math.sign.js\n// module id = 101\n// module chunks = 0","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x){\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_math-sign.js\n// module id = 102\n// module chunks = 0","var DataView = require('../DataView');\n\n/**\n * @class Filter\n *\n * @param {DataSet} data The google data table\n * @param {Number}  column             The index of the column to be filtered\n * @param {Graph} graph           The graph\n */\nfunction Filter (data, column, graph) {\n  this.data = data;\n  this.column = column;\n  this.graph = graph; // the parent graph\n\n  this.index = undefined;\n  this.value = undefined;\n\n  // read all distinct values and select the first one\n  this.values = graph.getDistinctValues(data.get(), this.column);\n\n  // sort both numeric and string values correctly\n  this.values.sort(function (a, b) {\n    return a > b ? 1 : a < b ? -1 : 0;\n  });\n\n  if (this.values.length > 0) {\n    this.selectValue(0);\n  }\n\n  // create an array with the filtered datapoints. this will be loaded afterwards\n  this.dataPoints = [];\n\n  this.loaded = false;\n  this.onLoadCallback = undefined;\n\n  if (graph.animationPreload) {\n    this.loaded = false;\n    this.loadInBackground();\n  }\n  else {\n    this.loaded = true;\n  }\n};\n\n\n/**\n * Return the label\n * @return {string} label\n */\nFilter.prototype.isLoaded = function() {\n  return this.loaded;\n};\n\n\n/**\n * Return the loaded progress\n * @return {Number} percentage between 0 and 100\n */\nFilter.prototype.getLoadedProgress = function() {\n  var len = this.values.length;\n\n  var i = 0;\n  while (this.dataPoints[i]) {\n    i++;\n  }\n\n  return Math.round(i / len * 100);\n};\n\n\n/**\n * Return the label\n * @return {string} label\n */\nFilter.prototype.getLabel = function() {\n  return this.graph.filterLabel;\n};\n\n\n/**\n * Return the columnIndex of the filter\n * @return {Number} columnIndex\n */\nFilter.prototype.getColumn = function() {\n  return this.column;\n};\n\n/**\n * Return the currently selected value. Returns undefined if there is no selection\n * @return {*} value\n */\nFilter.prototype.getSelectedValue = function() {\n  if (this.index === undefined)\n    return undefined;\n\n  return this.values[this.index];\n};\n\n/**\n * Retrieve all values of the filter\n * @return {Array} values\n */\nFilter.prototype.getValues = function() {\n  return this.values;\n};\n\n/**\n * Retrieve one value of the filter\n * @param {Number}  index\n * @return {*} value\n */\nFilter.prototype.getValue = function(index) {\n  if (index >= this.values.length)\n    throw new Error('Index out of range');\n\n  return this.values[index];\n};\n\n\n/**\n * Retrieve the (filtered) dataPoints for the currently selected filter index\n * @param {Number} [index] (optional)\n * @return {Array} dataPoints\n */\nFilter.prototype._getDataPoints = function(index) {\n  if (index === undefined)\n    index = this.index;\n\n  if (index === undefined)\n    return [];\n\n  var dataPoints;\n  if (this.dataPoints[index]) {\n    dataPoints = this.dataPoints[index];\n  }\n  else {\n    var f = {};\n    f.column = this.column;\n    f.value = this.values[index];\n\n    var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get();\n    dataPoints = this.graph._getDataPoints(dataView);\n\n    this.dataPoints[index] = dataPoints;\n  }\n\n  return dataPoints;\n};\n\n\n\n/**\n * Set a callback function when the filter is fully loaded.\n */\nFilter.prototype.setOnLoadCallback = function(callback) {\n  this.onLoadCallback = callback;\n};\n\n\n/**\n * Add a value to the list with available values for this filter\n * No double entries will be created.\n * @param {Number} index\n */\nFilter.prototype.selectValue = function(index) {\n  if (index >= this.values.length)\n    throw new Error('Index out of range');\n\n  this.index = index;\n  this.value = this.values[index];\n};\n\n/**\n * Load all filtered rows in the background one by one\n * Start this method without providing an index!\n */\nFilter.prototype.loadInBackground = function(index) {\n  if (index === undefined)\n    index = 0;\n\n  var frame = this.graph.frame;\n\n  if (index < this.values.length) {\n    var dataPointsTemp = this._getDataPoints(index);\n    //this.graph.redrawInfo(); // TODO: not neat\n\n    // create a progress box\n    if (frame.progress === undefined) {\n      frame.progress = document.createElement('DIV');\n      frame.progress.style.position = 'absolute';\n      frame.progress.style.color = 'gray';\n      frame.appendChild(frame.progress);\n    }\n    var progress = this.getLoadedProgress();\n    frame.progress.innerHTML = 'Loading animation... ' + progress + '%';\n    // TODO: this is no nice solution...\n    frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider\n    frame.progress.style.left = 10 + 'px';\n\n    var me = this;\n    setTimeout(function() {me.loadInBackground(index+1);}, 10);\n    this.loaded = false;\n  }\n  else {\n    this.loaded = true;\n\n    // remove the progress box\n    if (frame.progress !== undefined) {\n      frame.removeChild(frame.progress);\n      frame.progress = undefined;\n    }\n\n    if (this.onLoadCallback)\n      this.onLoadCallback();\n  }\n};\n\nmodule.exports = Filter;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Filter.js","var util = require('../util');\n\n/**\n * @constructor Slider\n *\n * An html slider control with start/stop/prev/next buttons\n * @param {Element} container  The element where the slider will be created\n * @param {Object} options   Available options:\n *                 {boolean} visible   If true (default) the\n *                           slider is visible.\n */\nfunction Slider(container, options) {\n  if (container === undefined) {\n    throw new Error('No container element defined');\n  }\n  this.container = container;\n  this.visible = (options && options.visible != undefined) ? options.visible : true;\n\n  if (this.visible) {\n    this.frame = document.createElement('DIV');\n    //this.frame.style.backgroundColor = '#E5E5E5';\n    this.frame.style.width = '100%';\n    this.frame.style.position = 'relative';\n    this.container.appendChild(this.frame);\n\n    this.frame.prev = document.createElement('INPUT');\n    this.frame.prev.type = 'BUTTON';\n    this.frame.prev.value = 'Prev';\n    this.frame.appendChild(this.frame.prev);\n\n    this.frame.play = document.createElement('INPUT');\n    this.frame.play.type = 'BUTTON';\n    this.frame.play.value = 'Play';\n    this.frame.appendChild(this.frame.play);\n\n    this.frame.next = document.createElement('INPUT');\n    this.frame.next.type = 'BUTTON';\n    this.frame.next.value = 'Next';\n    this.frame.appendChild(this.frame.next);\n\n    this.frame.bar = document.createElement('INPUT');\n    this.frame.bar.type = 'BUTTON';\n    this.frame.bar.style.position = 'absolute';\n    this.frame.bar.style.border = '1px solid red';\n    this.frame.bar.style.width = '100px';\n    this.frame.bar.style.height = '6px';\n    this.frame.bar.style.borderRadius = '2px';\n    this.frame.bar.style.MozBorderRadius = '2px';\n    this.frame.bar.style.border = '1px solid #7F7F7F';\n    this.frame.bar.style.backgroundColor = '#E5E5E5';\n    this.frame.appendChild(this.frame.bar);\n\n    this.frame.slide = document.createElement('INPUT');\n    this.frame.slide.type = 'BUTTON';\n    this.frame.slide.style.margin = '0px';\n    this.frame.slide.value = ' ';\n    this.frame.slide.style.position = 'relative';\n    this.frame.slide.style.left = '-100px';\n    this.frame.appendChild(this.frame.slide);\n\n    // create events\n    var me = this;\n    this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);};\n    this.frame.prev.onclick = function (event) {me.prev(event);};\n    this.frame.play.onclick = function (event) {me.togglePlay(event);};\n    this.frame.next.onclick = function (event) {me.next(event);};\n  }\n\n  this.onChangeCallback = undefined;\n\n  this.values = [];\n  this.index = undefined;\n\n  this.playTimeout = undefined;\n  this.playInterval = 1000; // milliseconds\n  this.playLoop = true;\n}\n\n/**\n * Select the previous index\n */\nSlider.prototype.prev = function() {\n  var index = this.getIndex();\n  if (index > 0) {\n    index--;\n    this.setIndex(index);\n  }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.next = function() {\n  var index = this.getIndex();\n  if (index < this.values.length - 1) {\n    index++;\n    this.setIndex(index);\n  }\n};\n\n/**\n * Select the next index\n */\nSlider.prototype.playNext = function() {\n  var start = new Date();\n\n  var index = this.getIndex();\n  if (index < this.values.length - 1) {\n    index++;\n    this.setIndex(index);\n  }\n  else if (this.playLoop) {\n    // jump to the start\n    index = 0;\n    this.setIndex(index);\n  }\n\n  var end = new Date();\n  var diff = (end - start);\n\n  // calculate how much time it to to set the index and to execute the callback\n  // function.\n  var interval = Math.max(this.playInterval - diff, 0);\n  // document.title = diff // TODO: cleanup\n\n  var me = this;\n  this.playTimeout = setTimeout(function() {me.playNext();}, interval);\n};\n\n/**\n * Toggle start or stop playing\n */\nSlider.prototype.togglePlay = function() {\n  if (this.playTimeout === undefined) {\n    this.play();\n  } else {\n    this.stop();\n  }\n};\n\n/**\n * Start playing\n */\nSlider.prototype.play = function() {\n  // Test whether already playing\n  if (this.playTimeout) return;\n\n  this.playNext();\n\n  if (this.frame) {\n    this.frame.play.value = 'Stop';\n  }\n};\n\n/**\n * Stop playing\n */\nSlider.prototype.stop = function() {\n  clearInterval(this.playTimeout);\n  this.playTimeout = undefined;\n\n  if (this.frame) {\n    this.frame.play.value = 'Play';\n  }\n};\n\n/**\n * Set a callback function which will be triggered when the value of the\n * slider bar has changed.\n */\nSlider.prototype.setOnChangeCallback = function(callback) {\n  this.onChangeCallback = callback;\n};\n\n/**\n * Set the interval for playing the list\n * @param {Number} interval   The interval in milliseconds\n */\nSlider.prototype.setPlayInterval = function(interval) {\n  this.playInterval = interval;\n};\n\n/**\n * Retrieve the current play interval\n * @return {Number} interval   The interval in milliseconds\n */\nSlider.prototype.getPlayInterval = function(interval) {\n  return this.playInterval;\n};\n\n/**\n * Set looping on or off\n * @pararm {boolean} doLoop  If true, the slider will jump to the start when\n *               the end is passed, and will jump to the end\n *               when the start is passed.\n */\nSlider.prototype.setPlayLoop = function(doLoop) {\n  this.playLoop = doLoop;\n};\n\n\n/**\n * Execute the onchange callback function\n */\nSlider.prototype.onChange = function() {\n  if (this.onChangeCallback !== undefined) {\n    this.onChangeCallback();\n  }\n};\n\n/**\n * redraw the slider on the correct place\n */\nSlider.prototype.redraw = function() {\n  if (this.frame) {\n    // resize the bar\n    this.frame.bar.style.top = (this.frame.clientHeight/2 -\n        this.frame.bar.offsetHeight/2) + 'px';\n    this.frame.bar.style.width = (this.frame.clientWidth -\n        this.frame.prev.clientWidth -\n        this.frame.play.clientWidth -\n        this.frame.next.clientWidth - 30)  + 'px';\n\n    // position the slider button\n    var left = this.indexToLeft(this.index);\n    this.frame.slide.style.left = (left) + 'px';\n  }\n};\n\n\n/**\n * Set the list with values for the slider\n * @param {Array} values   A javascript array with values (any type)\n */\nSlider.prototype.setValues = function(values) {\n  this.values = values;\n\n  if (this.values.length > 0)\n    this.setIndex(0);\n  else\n    this.index = undefined;\n};\n\n/**\n * Select a value by its index\n * @param {Number} index\n */\nSlider.prototype.setIndex = function(index) {\n  if (index < this.values.length) {\n    this.index = index;\n\n    this.redraw();\n    this.onChange();\n  }\n  else {\n    throw new Error('Index out of range');\n  }\n};\n\n/**\n * retrieve the index of the currently selected vaue\n * @return {Number} index\n */\nSlider.prototype.getIndex = function() {\n  return this.index;\n};\n\n\n/**\n * retrieve the currently selected value\n * @return {*} value\n */\nSlider.prototype.get = function() {\n  return this.values[this.index];\n};\n\n\nSlider.prototype._onMouseDown = function(event) {\n  // only react on left mouse button down\n  var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1);\n  if (!leftButtonDown) return;\n\n  this.startClientX = event.clientX;\n  this.startSlideX = parseFloat(this.frame.slide.style.left);\n\n  this.frame.style.cursor = 'move';\n\n  // add event listeners to handle moving the contents\n  // we store the function onmousemove and onmouseup in the graph, so we can\n  // remove the eventlisteners lateron in the function mouseUp()\n  var me = this;\n  this.onmousemove = function (event) {me._onMouseMove(event);};\n  this.onmouseup   = function (event) {me._onMouseUp(event);};\n  util.addEventListener(document, 'mousemove', this.onmousemove);\n  util.addEventListener(document, 'mouseup',   this.onmouseup);\n  util.preventDefault(event);\n};\n\n\nSlider.prototype.leftToIndex = function (left) {\n  var width = parseFloat(this.frame.bar.style.width) -\n      this.frame.slide.clientWidth - 10;\n  var x = left - 3;\n\n  var index = Math.round(x / width * (this.values.length-1));\n  if (index < 0) index = 0;\n  if (index > this.values.length-1) index = this.values.length-1;\n\n  return index;\n};\n\nSlider.prototype.indexToLeft = function (index) {\n  var width = parseFloat(this.frame.bar.style.width) -\n      this.frame.slide.clientWidth - 10;\n\n  var x = index / (this.values.length-1) * width;\n  var left = x + 3;\n\n  return left;\n};\n\n\n\nSlider.prototype._onMouseMove = function (event) {\n  var diff = event.clientX - this.startClientX;\n  var x = this.startSlideX + diff;\n\n  var index = this.leftToIndex(x);\n\n  this.setIndex(index);\n\n  util.preventDefault();\n};\n\n\nSlider.prototype._onMouseUp = function (event) {\n  this.frame.style.cursor = 'auto';\n\n  // remove event listeners\n  util.removeEventListener(document, 'mousemove', this.onmousemove);\n  util.removeEventListener(document, 'mouseup', this.onmouseup);\n\n  util.preventDefault();\n};\n\nmodule.exports = Slider;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Slider.js","/**\n * @prototype StepNumber\n * The class StepNumber is an iterator for Numbers. You provide a start and end\n * value, and a best step size. StepNumber itself rounds to fixed values and\n * a finds the step that best fits the provided step.\n *\n * If prettyStep is true, the step size is chosen as close as possible to the\n * provided step, but being a round value like 1, 2, 5, 10, 20, 50, ....\n *\n * Example usage:\n *   var step = new StepNumber(0, 10, 2.5, true);\n *   step.start();\n *   while (!step.end()) {\n *   alert(step.getCurrent());\n *   step.next();\n *   }\n *\n * Version: 1.0\n *\n * @param {Number} start     The start value\n * @param {Number} end     The end value\n * @param {Number} step    Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n *               To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nfunction StepNumber(start, end, step, prettyStep) {\n  // set default values\n  this._start = 0;\n  this._end = 0;\n  this._step = 1;\n  this.prettyStep = true;\n  this.precision = 5;\n\n  this._current = 0;\n  this.setRange(start, end, step, prettyStep);\n};\n\n\n/**\n * Check for input values, to prevent disasters from happening\n *\n * Source: http://stackoverflow.com/a/1830844\n */\nStepNumber.prototype.isNumeric = function(n) {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n\n/**\n * Set a new range: start, end and step.\n *\n * @param {Number} start     The start value\n * @param {Number} end     The end value\n * @param {Number} step    Optional. Step size. Must be a positive value.\n * @param {boolean} prettyStep Optional. If true, the step size is rounded\n *               To a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setRange = function(start, end, step, prettyStep) {\n  if (!this.isNumeric(start)) {\n    throw new Error('Parameter \\'start\\' is not numeric; value: ' + start);\n  }\n  if (!this.isNumeric(end)) {\n    throw new Error('Parameter \\'end\\' is not numeric; value: ' + start);\n  }\n  if (!this.isNumeric(step)) {\n    throw new Error('Parameter \\'step\\' is not numeric; value: ' + start);\n  }\n\n  this._start = start ? start : 0;\n  this._end = end ? end : 0;\n\n  this.setStep(step, prettyStep);\n};\n\n/**\n * Set a new step size\n * @param {Number} step    New step size. Must be a positive value\n * @param {boolean} prettyStep Optional. If true, the provided step is rounded\n *               to a pretty step size (like 1, 2, 5, 10, 20, 50, ...)\n */\nStepNumber.prototype.setStep = function(step, prettyStep) {\n  if (step === undefined || step <= 0)\n    return;\n\n  if (prettyStep !== undefined)\n    this.prettyStep = prettyStep;\n\n  if (this.prettyStep === true)\n    this._step = StepNumber.calculatePrettyStep(step);\n  else\n    this._step = step;\n};\n\n/**\n * Calculate a nice step size, closest to the desired step size.\n * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an\n * integer Number. For example 1, 2, 5, 10, 20, 50, etc...\n * @param {Number}  step  Desired step size\n * @return {Number}     Nice step size\n */\nStepNumber.calculatePrettyStep = function (step) {\n  var log10 = function (x) {return Math.log(x) / Math.LN10;};\n\n  // try three steps (multiple of 1, 2, or 5\n  var step1 = Math.pow(10, Math.round(log10(step))),\n      step2 = 2 * Math.pow(10, Math.round(log10(step / 2))),\n      step5 = 5 * Math.pow(10, Math.round(log10(step / 5)));\n\n  // choose the best step (closest to minimum step)\n  var prettyStep = step1;\n  if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2;\n  if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5;\n\n  // for safety\n  if (prettyStep <= 0) {\n    prettyStep = 1;\n  }\n\n  return prettyStep;\n};\n\n/**\n * returns the current value of the step\n * @return {Number} current value\n */\nStepNumber.prototype.getCurrent = function () {\n  return parseFloat(this._current.toPrecision(this.precision));\n};\n\n/**\n * returns the current step size\n * @return {Number} current step size\n */\nStepNumber.prototype.getStep = function () {\n  return this._step;\n};\n\n/**\n * Set the current to its starting value.\n *\n * By default, this will be the largest value smaller than start, which\n * is a multiple of the step size.\n *\n * Parameters checkFirst is optional, default false.\n * If set to true, move the current value one step if smaller than start.\n */\nStepNumber.prototype.start = function(checkFirst) {\n  if (checkFirst === undefined) {\n    checkFirst = false;\n  }\n\n  this._current = this._start - this._start % this._step;\n\n  if (checkFirst) {\n    if (this.getCurrent() < this._start) {\n      this.next();\n    }\n  }\n};\n\n\n/**\n * Do a step, add the step size to the current value\n */\nStepNumber.prototype.next = function () {\n  this._current += this._step;\n};\n\n/**\n * Returns true whether the end is reached\n * @return {boolean}  True if the current value has passed the end value.\n */\nStepNumber.prototype.end = function () {\n  return (this._current > this._end);\n};\n\nmodule.exports = StepNumber;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/StepNumber.js","/**\n * @prototype Range\n *\n * Helper class to make working with related min and max values easier.\n *\n * The range is inclusive; a given value is considered part of the range if:\n *\n *    this.min <= value <= this.max\n */\nfunction Range() {\n  this.min = undefined;\n  this.max = undefined;\n}\n\n\n/**\n * Adjust the range so that the passed value fits in it.\n *\n * If the value is outside of the current extremes, adjust\n * the min or max so that the value is within the range.\n *\n * @param {number} value Numeric value to fit in range\n */\nRange.prototype.adjust = function(value) {\n  if (value === undefined) return;\n\n  if (this.min === undefined || this.min > value ) {\n    this.min = value;\n  }\n\n  if (this.max === undefined || this.max < value) {\n    this.max = value;\n  }\n};\n\n\n/**\n * Adjust the current range so that the passed range fits in it.\n *\n * @param {Range} range Range instance to fit in current instance\n */\nRange.prototype.combine = function(range) {\n   this.add(range.min);\n   this.add(range.max);\n};\n\n\n/**\n * Expand the range by the given value\n *\n * min will be lowered by given value;\n * max will be raised by given value\n *\n * Shrinking by passing a negative value is allowed.\n *\n * @param {number} val Amount by which to expand or shrink current range with\n */\nRange.prototype.expand = function(val) {\n  if (val === undefined) {\n    return;\n  }\n\n  var newMin = this.min - val;\n  var newMax = this.max + val;\n\n  // Note that following allows newMin === newMax.\n  // This should be OK, since method expand() allows this also.\n  if (newMin > newMax) {\n    throw new Error('Passed expansion value makes range invalid');\n  }\n\n  this.min = newMin;\n  this.max = newMax;\n};\n\n\n/**\n * Determine the full range width of current instance.\n *\n * @returns {num} The calculated width of this range\n */\nRange.prototype.range = function() {\n  return this.max - this.min;\n};\n\n\n/**\n * Determine the central point of current instance.\n *\n * @returns {number} the value in the middle of min and max\n */\nRange.prototype.center = function() {\n return (this.min + this.max) / 2;\n};\n\n\nmodule.exports = Range;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Range.js","////////////////////////////////////////////////////////////////////////////////\n// This modules handles the options for Graph3d.\n//\n////////////////////////////////////////////////////////////////////////////////\nvar Camera  = require('./Camera');\nvar Point3d = require('./Point3d');\n\n\n// enumerate the available styles\nvar STYLE = {\n  BAR     : 0,\n  BARCOLOR: 1,\n  BARSIZE : 2,\n  DOT     : 3,\n  DOTLINE : 4,\n  DOTCOLOR: 5,\n  DOTSIZE : 6,\n  GRID    : 7,\n  LINE    : 8,\n  SURFACE : 9\n};\n\n\n// The string representations of the styles\nvar STYLENAME = {\n  'dot'      : STYLE.DOT,\n  'dot-line' : STYLE.DOTLINE,\n  'dot-color': STYLE.DOTCOLOR,\n  'dot-size' : STYLE.DOTSIZE,\n  'line'     : STYLE.LINE,\n  'grid'     : STYLE.GRID,\n  'surface'  : STYLE.SURFACE,\n  'bar'      : STYLE.BAR,\n  'bar-color': STYLE.BARCOLOR,\n  'bar-size' : STYLE.BARSIZE\n};\n\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Specifically, these are the fields which require no special handling,\n * and can be directly copied over.\n */\nvar OPTIONKEYS = [\n  'width',\n  'height',\n  'filterLabel',\n  'legendLabel',\n  'xLabel',\n  'yLabel',\n  'zLabel',\n  'xValueLabel',\n  'yValueLabel',\n  'zValueLabel',\n  'showGrid',\n  'showPerspective',\n  'showShadow',\n  'keepAspectRatio',\n  'verticalRatio',\n  'dotSizeRatio',\n  'showAnimationControls',\n  'animationInterval',\n  'animationPreload',\n  'animationAutoStart',\n  'axisColor',\n  'gridColor',\n  'xCenter',\n  'yCenter'\n];\n\n\n/**\n * Field names in the options hash which are of relevance to the user.\n *\n * Same as OPTIONKEYS, but internally these fields are stored with \n * prefix 'default' in the name.\n */\nvar PREFIXEDOPTIONKEYS = [\n  'xBarWidth',\n  'yBarWidth',\n  'valueMin',\n  'valueMax',\n  'xMin',\n  'xMax',\n  'xStep',\n  'yMin',\n  'yMax',\n  'yStep',\n  'zMin',\n  'zMax',\n  'zStep'\n];\n\n\n// Placeholder for DEFAULTS reference\nvar DEFAULTS = undefined; \n\n\n/**\n * Check if given hash is empty.\n *\n * Source: http://stackoverflow.com/a/679937\n */\nfunction isEmpty(obj) {\n  for(var prop in obj) {\n    if (obj.hasOwnProperty(prop))\n      return false;\n  }\n\n  return true;\n}\n\n\n\n/**\n * Make first letter of parameter upper case.\n *\n * Source: http://stackoverflow.com/a/1026087\n */\nfunction capitalize(str) {\n  if (str === undefined || str === \"\" || typeof str != \"string\") {\n    return str;\n  }\n\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n/**\n * Add a prefix to a field name, taking style guide into account\n */\nfunction prefixFieldName(prefix, fieldName) {\n  if (prefix === undefined || prefix === \"\") {\n    return fieldName;\n  }\n\n  return prefix + capitalize(fieldName);\n}\n\n\n/**\n * Forcibly copy fields from src to dst in a controlled manner.\n *\n * A given field in dst will always be overwitten. If this field\n * is undefined or not present in src, the field in dst will \n * be explicitly set to undefined.\n * \n * The intention here is to be able to reset all option fields.\n * \n * Only the fields mentioned in array 'fields' will be handled.\n *\n * @param fields array with names of fields to copy\n * @param prefix optional; prefix to use for the target fields.\n */\nfunction forceCopy(src, dst, fields, prefix) {\n  var srcKey;\n  var dstKey;\n\n  for (var i in fields) {\n    srcKey  = fields[i];\n    dstKey  = prefixFieldName(prefix, srcKey);\n\n    dst[dstKey] = src[srcKey];\n  }\n}\n\n\n/**\n * Copy fields from src to dst in a safe and controlled manner.\n *\n * Only the fields mentioned in array 'fields' will be copied over,\n * and only if these are actually defined.\n *\n * @param fields array with names of fields to copy\n * @param prefix optional; prefix to use for the target fields.\n */\nfunction safeCopy(src, dst, fields, prefix) {\n  var srcKey;\n  var dstKey;\n\n  for (var i in fields) {\n    srcKey  = fields[i];\n    if (src[srcKey] === undefined) continue;\n\n    dstKey  = prefixFieldName(prefix, srcKey);\n\n    dst[dstKey] = src[srcKey];\n  }\n}\n\n\n/**\n * Initialize dst with the values in src.\n *\n * src is the hash with the default values. \n * A reference DEFAULTS to this hash is stored locally for \n * further handling.\n *\n * For now, dst is assumed to be a Graph3d instance.\n */\nfunction setDefaults(src, dst) {\n  if (src === undefined || isEmpty(src)) {\n    throw new Error('No DEFAULTS passed');\n  }\n  if (dst === undefined) {\n    throw new Error('No dst passed');\n  }\n\n  // Remember defaults for future reference\n  DEFAULTS = src;\n\n  // Handle the defaults which can be simply copied over\n  forceCopy(src, dst, OPTIONKEYS);\n  forceCopy(src, dst, PREFIXEDOPTIONKEYS, 'default');\n\n  // Handle the more complex ('special') fields\n  setSpecialSettings(src, dst);\n\n  // Following are internal fields, not part of the user settings\n  dst.margin = 10;                  // px\n  dst.showGrayBottom = false;       // TODO: this does not work correctly\n  dst.showTooltip = false;\n  dst.onclick_callback = null;\n  dst.eye = new Point3d(0, 0, -1);  // TODO: set eye.z about 3/4 of the width of the window?\n}\n\n\nfunction setOptions(options, dst) {\n  if (options === undefined) {\n    return;\n  }\n  if (dst === undefined) {\n    throw new Error('No dst passed');\n  }\n\n  if (DEFAULTS === undefined || isEmpty(DEFAULTS)) {\n    throw new Error('DEFAULTS not set for module Settings');\n  }\n\n\n  // Handle the parameters which can be simply copied over\n  safeCopy(options, dst, OPTIONKEYS);\n  safeCopy(options, dst, PREFIXEDOPTIONKEYS, 'default');\n\n  // Handle the more complex ('special') fields\n  setSpecialSettings(options, dst);\n}\n\n\n/**\n * Special handling for certain parameters\n *\n * 'Special' here means: setting requires more than a simple copy\n */\nfunction setSpecialSettings(src, dst) {\n  if (src.backgroundColor !== undefined) {\n    setBackgroundColor(src.backgroundColor, dst);\n  }\n\n  setDataColor(src.dataColor, dst);\n  setStyle(src.style, dst);\n  setShowLegend(src.showLegend, dst);\n  setCameraPosition(src.cameraPosition, dst);\n\n  // As special fields go, this is an easy one; just a translation of the name.\n  // Can't use this.tooltip directly, because that field exists internally\n  if (src.tooltip !== undefined) {\n    dst.showTooltip = src.tooltip;\n  }\n  if (src.onclick != undefined) {\n    dst.onclick_callback = src.onclick;\n  }\n}\n\n\n/**\n * Set the value of setting 'showLegend'\n *\n * This depends on the value of the style fields, so it must be called\n * after the style field has been initialized.\n */\nfunction setShowLegend(showLegend, dst) {\n  if (showLegend === undefined) {\n    // If the default was auto, make a choice for this field\n    var isAutoByDefault = (DEFAULTS.showLegend === undefined);\n\n    if (isAutoByDefault) {\n      // these styles default to having legends\n      var isLegendGraphStyle = dst.style === STYLE.DOTCOLOR\n                            || dst.style === STYLE.DOTSIZE;\n\n      dst.showLegend = isLegendGraphStyle;\n    } else {\n       // Leave current value as is\n    }\n  } else {\n    dst.showLegend = showLegend;\n  }\n}\n\n\n/**\n * Retrieve the style index from given styleName\n * @param {string} styleName  Style name such as 'dot', 'grid', 'dot-line'\n * @return {Number} styleNumber Enumeration value representing the style, or -1\n *                when not found\n */\nfunction getStyleNumberByName(styleName) {\n  var number = STYLENAME[styleName];\n\n  if (number === undefined) {\n    return -1;\n  }\n\n  return number;\n}\n\n\n/**\n * Check if given number is a valid style number.\n *\n * @return true if valid, false otherwise\n */\nfunction checkStyleNumber(style) {\n  var valid = false;\n\n  for (var n in STYLE) {\n    if (STYLE[n] === style) {\n      valid = true;\n      break;\n    }\n  }\n\n  return valid;\n}\n\n\nfunction setStyle(style, dst) {\n  if (style === undefined) {\n    return;   // Nothing to do\n  }\n\n  var styleNumber;\n\n  if (typeof style === 'string') {\n    styleNumber = getStyleNumberByName(style);\n\n    if (styleNumber === -1 ) {\n      throw new Error('Style \\'' + style + '\\' is invalid');\n    }\n  } else {\n    // Do a pedantic check on style number value\n    if (!checkStyleNumber(style)) {\n      throw new Error('Style \\'' + style + '\\' is invalid');\n    }\n\n    styleNumber = style;\n  }\n\n  dst.style = styleNumber;\n}\n\n\n/**\n * Set the background styling for the graph\n * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor\n */\nfunction setBackgroundColor(backgroundColor, dst) {\n  var fill = 'white';\n  var stroke = 'gray';\n  var strokeWidth = 1;\n\n  if (typeof(backgroundColor) === 'string') {\n    fill = backgroundColor;\n    stroke = 'none';\n    strokeWidth = 0;\n  }\n  else if (typeof(backgroundColor) === 'object') {\n    if (backgroundColor.fill !== undefined)    fill = backgroundColor.fill;\n    if (backgroundColor.stroke !== undefined)    stroke = backgroundColor.stroke;\n    if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth;\n  }\n  else {\n    throw new Error('Unsupported type of backgroundColor');\n  }\n\n  dst.frame.style.backgroundColor = fill;\n  dst.frame.style.borderColor = stroke;\n  dst.frame.style.borderWidth = strokeWidth + 'px';\n  dst.frame.style.borderStyle = 'solid';\n}\n\n\nfunction setDataColor(dataColor, dst) {\n  if (dataColor === undefined) {\n    return;    // Nothing to do\n  }\n\n  if (dst.dataColor === undefined) {\n    dst.dataColor = {};\n  }\n\n  if (typeof dataColor === 'string') {\n    dst.dataColor.fill   = dataColor;\n    dst.dataColor.stroke = dataColor;\n  }\n  else {\n    if (dataColor.fill) {\n      dst.dataColor.fill = dataColor.fill;\n    }\n    if (dataColor.stroke) {\n      dst.dataColor.stroke = dataColor.stroke;\n    }\n    if (dataColor.strokeWidth !== undefined) {\n      dst.dataColor.strokeWidth = dataColor.strokeWidth;\n    }\n  }\n}\n\n\nfunction setCameraPosition(cameraPosition, dst) {\n  var camPos = cameraPosition;\n  if (camPos === undefined) {\n    return;\n  }\n\n  if (dst.camera === undefined) {\n    dst.camera = new Camera();\n  }\n\n  dst.camera.setArmRotation(camPos.horizontal, camPos.vertical);\n  dst.camera.setArmLength(camPos.distance);\n}\n\n\nmodule.exports.STYLE             = STYLE;\nmodule.exports.setDefaults       = setDefaults;\nmodule.exports.setOptions        = setOptions;\nmodule.exports.setCameraPosition = setCameraPosition;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/graph3d/Settings.js","// Only load hammer.js when in a browser environment\n// (loading hammer.js in a node.js environment gives errors)\nif (typeof window !== 'undefined') {\n  var propagating = require('propagating-hammerjs');\n  var Hammer = window['Hammer'] || require('hammerjs');\n  module.exports = propagating(Hammer, {\n    preventDefault: 'mouse'\n  });\n}\nelse {\n  module.exports = function () {\n    throw Error('hammer.js is only available in a browser, not in node.js.');\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./lib/module/hammer.js","'use strict';\n\n(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define([], factory);\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    // Browser globals (root is window)\n    window.propagating = factory();\n  }\n}(function () {\n  var _firstTarget = null; // singleton, will contain the target element where the touch event started\n\n  /**\n   * Extend an Hammer.js instance with event propagation.\n   *\n   * Features:\n   * - Events emitted by hammer will propagate in order from child to parent\n   *   elements.\n   * - Events are extended with a function `event.stopPropagation()` to stop\n   *   propagation to parent elements.\n   * - An option `preventDefault` to stop all default browser behavior.\n   *\n   * Usage:\n   *   var hammer = propagatingHammer(new Hammer(element));\n   *   var hammer = propagatingHammer(new Hammer(element), {preventDefault: true});\n   *\n   * @param {Hammer.Manager} hammer   An hammer instance.\n   * @param {Object} [options]        Available options:\n   *                                  - `preventDefault: true | false | 'mouse' | 'touch' | 'pen'`.\n   *                                    Enforce preventing the default browser behavior.\n   *                                    Cannot be set to `false`.\n   * @return {Hammer.Manager} Returns the same hammer instance with extended\n   *                          functionality\n   */\n  return function propagating(hammer, options) {\n    var _options = options || {\n      preventDefault: false\n    };\n\n    if (hammer.Manager) {\n      // This looks like the Hammer constructor.\n      // Overload the constructors with our own.\n      var Hammer = hammer;\n\n      var PropagatingHammer = function(element, options) {\n        var o = Object.create(_options);\n        if (options) Hammer.assign(o, options);\n        return propagating(new Hammer(element, o), o);\n      };\n      Hammer.assign(PropagatingHammer, Hammer);\n\n      PropagatingHammer.Manager = function (element, options) {\n        var o = Object.create(_options);\n        if (options) Hammer.assign(o, options);\n        return propagating(new Hammer.Manager(element, o), o);\n      };\n\n      return PropagatingHammer;\n    }\n\n    // create a wrapper object which will override the functions\n    // `on`, `off`, `destroy`, and `emit` of the hammer instance\n    var wrapper = Object.create(hammer);\n\n    // attach to DOM element\n    var element = hammer.element;\n\n    if(!element.hammer) element.hammer = [];\n    element.hammer.push(wrapper);\n\n    // register an event to catch the start of a gesture and store the\n    // target in a singleton\n    hammer.on('hammer.input', function (event) {\n      if (_options.preventDefault === true || (_options.preventDefault === event.pointerType)) {\n        event.preventDefault();\n      }\n      if (event.isFirst) {\n        _firstTarget = event.target;\n      }\n    });\n\n    /** @type {Object.<String, Array.<function>>} */\n    wrapper._handlers = {};\n\n    /**\n     * Register a handler for one or multiple events\n     * @param {String} events    A space separated string with events\n     * @param {function} handler A callback function, called as handler(event)\n     * @returns {Hammer.Manager} Returns the hammer instance\n     */\n    wrapper.on = function (events, handler) {\n      // register the handler\n      split(events).forEach(function (event) {\n        var _handlers = wrapper._handlers[event];\n        if (!_handlers) {\n          wrapper._handlers[event] = _handlers = [];\n\n          // register the static, propagated handler\n          hammer.on(event, propagatedHandler);\n        }\n        _handlers.push(handler);\n      });\n\n      return wrapper;\n    };\n\n    /**\n     * Unregister a handler for one or multiple events\n     * @param {String} events      A space separated string with events\n     * @param {function} [handler] Optional. The registered handler. If not\n     *                             provided, all handlers for given events\n     *                             are removed.\n     * @returns {Hammer.Manager}   Returns the hammer instance\n     */\n    wrapper.off = function (events, handler) {\n      // unregister the handler\n      split(events).forEach(function (event) {\n        var _handlers = wrapper._handlers[event];\n        if (_handlers) {\n          _handlers = handler ? _handlers.filter(function (h) {\n            return h !== handler;\n          }) : [];\n\n          if (_handlers.length > 0) {\n            wrapper._handlers[event] = _handlers;\n          }\n          else {\n            // remove static, propagated handler\n            hammer.off(event, propagatedHandler);\n            delete wrapper._handlers[event];\n          }\n        }\n      });\n\n      return wrapper;\n    };\n\n    /**\n     * Emit to the event listeners\n     * @param {string} eventType\n     * @param {Event} event\n     */\n    wrapper.emit = function(eventType, event) {\n      _firstTarget = event.target;\n      hammer.emit(eventType, event);\n    };\n\n    wrapper.destroy = function () {\n      // Detach from DOM element\n      var hammers = hammer.element.hammer;\n      var idx = hammers.indexOf(wrapper);\n      if(idx !== -1) hammers.splice(idx,1);\n      if(!hammers.length) delete hammer.element.hammer;\n\n      // clear all handlers\n      wrapper._handlers = {};\n\n      // call original hammer destroy\n      hammer.destroy();\n    };\n\n    // split a string with space separated words\n    function split(events) {\n      return events.match(/[^ ]+/g);\n    }\n\n    /**\n     * A static event handler, applying event propagation.\n     * @param {Object} event\n     */\n    function propagatedHandler(event) {\n      // let only a single hammer instance handle this event\n      if (event.type !== 'hammer.input') {\n        // it is possible that the same srcEvent is used with multiple hammer events,\n        // we keep track on which events are handled in an object _handled\n        if (!event.srcEvent._handled) {\n          event.srcEvent._handled = {};\n        }\n\n        if (event.srcEvent._handled[event.type]) {\n          return;\n        }\n        else {\n          event.srcEvent._handled[event.type] = true;\n        }\n      }\n\n      // attach a stopPropagation function to the event\n      var stopped = false;\n      event.stopPropagation = function () {\n        stopped = true;\n      };\n\n      //wrap the srcEvent's stopPropagation to also stop hammer propagation:\n      var srcStop = event.srcEvent.stopPropagation.bind(event.srcEvent);\n      if(typeof srcStop == \"function\") {\n        event.srcEvent.stopPropagation = function(){\n          srcStop();\n          event.stopPropagation();\n        }\n      }\n\n      // attach firstTarget property to the event\n      event.firstTarget = _firstTarget;\n\n      // propagate over all elements (until stopped)\n      var elem = _firstTarget;\n      while (elem && !stopped) {\n        var elemHammer = elem.hammer;\n        if(elemHammer){\n          var _handlers;\n          for(var k = 0; k < elemHammer.length; k++){\n            _handlers = elemHammer[k]._handlers[event.type];\n            if(_handlers) for (var i = 0; i < _handlers.length && !stopped; i++) {\n              _handlers[i](event);\n            }\n          }\n        }\n        elem = elem.parentNode;\n      }\n    }\n\n    return wrapper;\n  };\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/propagating-hammerjs/propagating.js\n// module id = 109\n// module chunks = 0","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/hammerjs/hammer.js\n// module id = 110\n// module chunks = 0","\"use strict\";\r\n/**\r\n * Created by Alex on 11/6/2014.\r\n */\r\n\r\n// https://github.com/umdjs/umd/blob/master/returnExports.js#L40-L60\r\n// if the module has no dependencies, the above pattern can be simplified to\r\n(function (root, factory) {\r\n  if (typeof define === 'function' && define.amd) {\r\n    // AMD. Register as an anonymous module.\r\n    define([], factory);\r\n  } else if (typeof exports === 'object') {\r\n    // Node. Does not work with strict CommonJS, but\r\n    // only CommonJS-like environments that support module.exports,\r\n    // like Node.\r\n    module.exports = factory();\r\n  } else {\r\n    // Browser globals (root is window)\r\n    root.keycharm = factory();\r\n  }\r\n}(this, function () {\r\n\r\n  function keycharm(options) {\r\n    var preventDefault = options && options.preventDefault || false;\r\n\r\n    var container = options && options.container || window;\r\n\r\n    var _exportFunctions = {};\r\n    var _bound = {keydown:{}, keyup:{}};\r\n    var _keys = {};\r\n    var i;\r\n\r\n    // a - z\r\n    for (i = 97; i <= 122; i++) {_keys[String.fromCharCode(i)] = {code:65 + (i - 97), shift: false};}\r\n    // A - Z\r\n    for (i = 65; i <= 90; i++) {_keys[String.fromCharCode(i)] = {code:i, shift: true};}\r\n    // 0 - 9\r\n    for (i = 0;  i <= 9;   i++) {_keys['' + i] = {code:48 + i, shift: false};}\r\n    // F1 - F12\r\n    for (i = 1;  i <= 12;   i++) {_keys['F' + i] = {code:111 + i, shift: false};}\r\n    // num0 - num9\r\n    for (i = 0;  i <= 9;   i++) {_keys['num' + i] = {code:96 + i, shift: false};}\r\n\r\n    // numpad misc\r\n    _keys['num*'] = {code:106, shift: false};\r\n    _keys['num+'] = {code:107, shift: false};\r\n    _keys['num-'] = {code:109, shift: false};\r\n    _keys['num/'] = {code:111, shift: false};\r\n    _keys['num.'] = {code:110, shift: false};\r\n    // arrows\r\n    _keys['left']  = {code:37, shift: false};\r\n    _keys['up']    = {code:38, shift: false};\r\n    _keys['right'] = {code:39, shift: false};\r\n    _keys['down']  = {code:40, shift: false};\r\n    // extra keys\r\n    _keys['space'] = {code:32, shift: false};\r\n    _keys['enter'] = {code:13, shift: false};\r\n    _keys['shift'] = {code:16, shift: undefined};\r\n    _keys['esc']   = {code:27, shift: false};\r\n    _keys['backspace'] = {code:8, shift: false};\r\n    _keys['tab']       = {code:9, shift: false};\r\n    _keys['ctrl']      = {code:17, shift: false};\r\n    _keys['alt']       = {code:18, shift: false};\r\n    _keys['delete']    = {code:46, shift: false};\r\n    _keys['pageup']    = {code:33, shift: false};\r\n    _keys['pagedown']  = {code:34, shift: false};\r\n    // symbols\r\n    _keys['=']     = {code:187, shift: false};\r\n    _keys['-']     = {code:189, shift: false};\r\n    _keys[']']     = {code:221, shift: false};\r\n    _keys['[']     = {code:219, shift: false};\r\n\r\n\r\n\r\n    var down = function(event) {handleEvent(event,'keydown');};\r\n    var up = function(event) {handleEvent(event,'keyup');};\r\n\r\n    // handle the actualy bound key with the event\r\n    var handleEvent = function(event,type) {\r\n      if (_bound[type][event.keyCode] !== undefined) {\r\n        var bound = _bound[type][event.keyCode];\r\n        for (var i = 0; i < bound.length; i++) {\r\n          if (bound[i].shift === undefined) {\r\n            bound[i].fn(event);\r\n          }\r\n          else if (bound[i].shift == true && event.shiftKey == true) {\r\n            bound[i].fn(event);\r\n          }\r\n          else if (bound[i].shift == false && event.shiftKey == false) {\r\n            bound[i].fn(event);\r\n          }\r\n        }\r\n\r\n        if (preventDefault == true) {\r\n          event.preventDefault();\r\n        }\r\n      }\r\n    };\r\n\r\n    // bind a key to a callback\r\n    _exportFunctions.bind = function(key, callback, type) {\r\n      if (type === undefined) {\r\n        type = 'keydown';\r\n      }\r\n      if (_keys[key] === undefined) {\r\n        throw new Error(\"unsupported key: \" + key);\r\n      }\r\n      if (_bound[type][_keys[key].code] === undefined) {\r\n        _bound[type][_keys[key].code] = [];\r\n      }\r\n      _bound[type][_keys[key].code].push({fn:callback, shift:_keys[key].shift});\r\n    };\r\n\r\n\r\n    // bind all keys to a call back (demo purposes)\r\n    _exportFunctions.bindAll = function(callback, type) {\r\n      if (type === undefined) {\r\n        type = 'keydown';\r\n      }\r\n      for (var key in _keys) {\r\n        if (_keys.hasOwnProperty(key)) {\r\n          _exportFunctions.bind(key,callback,type);\r\n        }\r\n      }\r\n    };\r\n\r\n    // get the key label from an event\r\n    _exportFunctions.getKey = function(event) {\r\n      for (var key in _keys) {\r\n        if (_keys.hasOwnProperty(key)) {\r\n          if (event.shiftKey == true && _keys[key].shift == true && event.keyCode == _keys[key].code) {\r\n            return key;\r\n          }\r\n          else if (event.shiftKey == false && _keys[key].shift == false && event.keyCode == _keys[key].code) {\r\n            return key;\r\n          }\r\n          else if (event.keyCode == _keys[key].code && key == 'shift') {\r\n            return key;\r\n          }\r\n        }\r\n      }\r\n      return \"unknown key, currently not supported\";\r\n    };\r\n\r\n    // unbind either a specific callback from a key or all of them (by leaving callback undefined)\r\n    _exportFunctions.unbind = function(key, callback, type) {\r\n      if (type === undefined) {\r\n        type = 'keydown';\r\n      }\r\n      if (_keys[key] === undefined) {\r\n        throw new Error(\"unsupported key: \" + key);\r\n      }\r\n      if (callback !== undefined) {\r\n        var newBindings = [];\r\n        var bound = _bound[type][_keys[key].code];\r\n        if (bound !== undefined) {\r\n          for (var i = 0; i < bound.length; i++) {\r\n            if (!(bound[i].fn == callback && bound[i].shift == _keys[key].shift)) {\r\n              newBindings.push(_bound[type][_keys[key].code][i]);\r\n            }\r\n          }\r\n        }\r\n        _bound[type][_keys[key].code] = newBindings;\r\n      }\r\n      else {\r\n        _bound[type][_keys[key].code] = [];\r\n      }\r\n    };\r\n\r\n    // reset all bound variables.\r\n    _exportFunctions.reset = function() {\r\n      _bound = {keydown:{}, keyup:{}};\r\n    };\r\n\r\n    // unbind all listeners and reset all variables.\r\n    _exportFunctions.destroy = function() {\r\n      _bound = {keydown:{}, keyup:{}};\r\n      container.removeEventListener('keydown', down, true);\r\n      container.removeEventListener('keyup', up, true);\r\n    };\r\n\r\n    // create listeners.\r\n    container.addEventListener('keydown',down,true);\r\n    container.addEventListener('keyup',up,true);\r\n\r\n    // return the public functions.\r\n    return _exportFunctions;\r\n  }\r\n\r\n  return keycharm;\r\n}));\r\n\r\n\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/keycharm/keycharm.js\n// module id = 111\n// module chunks = 0","// utils\nexports.util = require('./lib/util');\nexports.DOMutil = require('./lib/DOMutil');\n\n// data\nexports.DataSet = require('./lib/DataSet');\nexports.DataView = require('./lib/DataView');\nexports.Queue = require('./lib/Queue');\n\n// Timeline\nexports.Timeline = require('./lib/timeline/Timeline');\nexports.Graph2d = require('./lib/timeline/Graph2d');\nexports.timeline = {\n  Core: require('./lib/timeline/Core'),\n  DateUtil: require('./lib/timeline/DateUtil'),\n  Range: require('./lib/timeline/Range'),\n  stack: require('./lib/timeline/Stack'),\n  TimeStep: require('./lib/timeline/TimeStep'),\n\n  components: {\n    items: {\n      Item: require('./lib/timeline/component/item/Item'),\n      BackgroundItem: require('./lib/timeline/component/item/BackgroundItem'),\n      BoxItem: require('./lib/timeline/component/item/BoxItem'),\n      PointItem: require('./lib/timeline/component/item/PointItem'),\n      RangeItem: require('./lib/timeline/component/item/RangeItem')\n    },\n\n    BackgroundGroup: require('./lib/timeline/component/BackgroundGroup'),\n    Component: require('./lib/timeline/component/Component'),\n    CurrentTime: require('./lib/timeline/component/CurrentTime'),\n    CustomTime: require('./lib/timeline/component/CustomTime'),\n    DataAxis: require('./lib/timeline/component/DataAxis'),\n    DataScale: require('./lib/timeline/component/DataScale'),\n    GraphGroup: require('./lib/timeline/component/GraphGroup'),\n    Group: require('./lib/timeline/component/Group'),\n    ItemSet: require('./lib/timeline/component/ItemSet'),\n    Legend: require('./lib/timeline/component/Legend'),\n    LineGraph: require('./lib/timeline/component/LineGraph'),\n    TimeAxis: require('./lib/timeline/component/TimeAxis')\n  }\n};\n\n// bundled external libraries\nexports.moment = require('./lib/module/moment');\nexports.Hammer = require('./lib/module/hammer');\nexports.keycharm = require('keycharm');\n\n\n\n// WEBPACK FOOTER //\n// ./index-timeline-graph2d.js","var Emitter = require('emitter-component');\nvar Hammer = require('../module/hammer');\nvar moment = require('../module/moment');\nvar util = require('../util');\nvar DataSet = require('../DataSet');\nvar DataView = require('../DataView');\nvar Range = require('./Range');\nvar Core = require('./Core');\nvar TimeAxis = require('./component/TimeAxis');\nvar CurrentTime = require('./component/CurrentTime');\nvar CustomTime = require('./component/CustomTime');\nvar ItemSet = require('./component/ItemSet');\n\nvar printStyle = require('../shared/Validator').printStyle;\nvar allOptions = require('./optionsTimeline').allOptions;\nvar configureOptions = require('./optionsTimeline').configureOptions;\n\nimport Configurator from '../shared/Configurator';\nimport Validator from '../shared/Validator';\n\n\n/**\n * Create a timeline visualization\n * @param {HTMLElement} container\n * @param {vis.DataSet | vis.DataView | Array} [items]\n * @param {vis.DataSet | vis.DataView | Array} [groups]\n * @param {Object} [options]  See Timeline.setOptions for the available options.\n * @constructor\n * @extends Core\n */\nfunction Timeline (container, items, groups, options) {\n\n  if (!(this instanceof Timeline)) {\n    throw new SyntaxError('Constructor must be called with the new operator');\n  }\n\n  // if the third element is options, the forth is groups (optionally);\n  if (!(Array.isArray(groups) || groups instanceof DataSet || groups instanceof DataView) && groups instanceof Object) {\n    var forthArgument = options;\n    options = groups;\n    groups = forthArgument;\n  }\n\n  // TODO: REMOVE THIS in the next MAJOR release\n  // see https://github.com/almende/vis/issues/2511\n  if (options && options.throttleRedraw) {\n    console.warn(\"Timeline option \\\"throttleRedraw\\\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.\");\n  }\n\n  var me = this;\n  this.defaultOptions = {\n    start: null,\n    end:   null,\n    autoResize: true,\n    orientation: {\n      axis: 'bottom',   // axis orientation: 'bottom', 'top', or 'both'\n      item: 'bottom'    // not relevant\n    },\n    moment: moment,\n    width: null,\n    height: null,\n    maxHeight: null,\n    minHeight: null\n  };\n  this.options = util.deepExtend({}, this.defaultOptions);\n\n  // Create the DOM, props, and emitter\n  this._create(container);\n  if (!options || (options && typeof options.rtl == \"undefined\")) {\n    var directionFromDom, domNode = this.dom.root;\n    while (!directionFromDom && domNode) {\n      directionFromDom = window.getComputedStyle(domNode, null).direction;\n      domNode = domNode.parentElement;\n    }\n    this.options.rtl = (directionFromDom && (directionFromDom.toLowerCase() == \"rtl\"));\n  } else {\n    this.options.rtl = options.rtl;\n  }\n\n  this.options.rollingMode = options && options.rollingMode;\n\n  // all components listed here will be repainted automatically\n  this.components = [];\n\n  this.body = {\n    dom: this.dom,\n    domProps: this.props,\n    emitter: {\n      on: this.on.bind(this),\n      off: this.off.bind(this),\n      emit: this.emit.bind(this)\n    },\n    hiddenDates: [],\n    util: {\n      getScale: function () {\n        return me.timeAxis.step.scale;\n      },\n      getStep: function () {\n        return me.timeAxis.step.step;\n      },\n\n      toScreen: me._toScreen.bind(me),\n      toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width\n      toTime: me._toTime.bind(me),\n      toGlobalTime : me._toGlobalTime.bind(me)\n    }\n  };\n\n  // range\n  this.range = new Range(this.body, this.options);\n  this.components.push(this.range);\n  this.body.range = this.range;\n\n  // time axis\n  this.timeAxis = new TimeAxis(this.body, this.options);\n  this.timeAxis2 = null; // used in case of orientation option 'both'\n  this.components.push(this.timeAxis);\n\n  // current time bar\n  this.currentTime = new CurrentTime(this.body, this.options);\n  this.components.push(this.currentTime);\n\n  // item set\n  this.itemSet = new ItemSet(this.body, this.options);\n  this.components.push(this.itemSet);\n\n  this.itemsData = null;      // DataSet\n  this.groupsData = null;     // DataSet\n\n  this.dom.root.onclick = function (event) {\n    me.emit('click', me.getEventProperties(event))\n  };\n  this.dom.root.ondblclick = function (event) {\n    me.emit('doubleClick', me.getEventProperties(event))\n  };\n  this.dom.root.oncontextmenu = function (event) {\n    me.emit('contextmenu', me.getEventProperties(event))\n  };\n  this.dom.root.onmouseover = function (event) {\n    me.emit('mouseOver', me.getEventProperties(event))\n  };\n  this.dom.root.onmousemove = function (event) {\n    me.emit('mouseMove', me.getEventProperties(event))\n  };\n\n  //Single time autoscale/fit\n  this.fitDone = false;\n  this.on('changed', function (){\n    if (this.itemsData == null || this.options.rollingMode) return;\n    if (!me.fitDone) {\n      me.fitDone = true;\n      if (me.options.start != undefined || me.options.end != undefined) {\n        if (me.options.start == undefined || me.options.end == undefined) {\n          var range = me.getItemRange();\n        }\n\n        var start = me.options.start != undefined ? me.options.start : range.min;\n        var end   = me.options.end   != undefined ? me.options.end   : range.max;\n        me.setWindow(start, end, {animation: false});\n      }\n      else {\n        me.fit({animation: false});\n      }\n    }\n  });\n\n  // apply options\n  if (options) {\n    this.setOptions(options);\n  }\n\n  // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS!\n  if (groups) {\n    this.setGroups(groups);\n  }\n\n  // create itemset\n  if (items) {\n    this.setItems(items);\n  }\n\n  // draw for the first time\n  this._redraw();\n}\n\n// Extend the functionality from Core\nTimeline.prototype = new Core();\n\n/**\n * Load a configurator\n * @return {Object}\n * @private\n */\nTimeline.prototype._createConfigurator = function () {\n  return new Configurator(this, this.dom.container, configureOptions);\n};\n\n/**\n * Force a redraw. The size of all items will be recalculated.\n * Can be useful to manually redraw when option autoResize=false and the window\n * has been resized, or when the items CSS has been changed.\n *\n * Note: this function will be overridden on construction with a trottled version\n */\nTimeline.prototype.redraw = function() {\n  this.itemSet && this.itemSet.markDirty({refreshItems: true});\n  this._redraw();\n};\n\nTimeline.prototype.setOptions = function (options) {\n  // validate options\n  let errorFound = Validator.validate(options, allOptions);\n\n  if (errorFound === true) {\n    console.log('%cErrors have been found in the supplied options object.', printStyle);\n  }\n  Core.prototype.setOptions.call(this, options);\n\n  if ('type' in options) {\n    if (options.type !== this.options.type) {\n      this.options.type = options.type;\n\n      // force recreation of all items\n      var itemsData = this.itemsData;\n      if (itemsData) {\n        var selection = this.getSelection();\n        this.setItems(null);          // remove all\n        this.setItems(itemsData);     // add all\n        this.setSelection(selection); // restore selection\n      }\n    }\n  }\n};\n\n/**\n * Set items\n * @param {vis.DataSet | Array | null} items\n */\nTimeline.prototype.setItems = function(items) {\n  // convert to type DataSet when needed\n  var newDataSet;\n  if (!items) {\n    newDataSet = null;\n  }\n  else if (items instanceof DataSet || items instanceof DataView) {\n    newDataSet = items;\n  }\n  else {\n    // turn an array into a dataset\n    newDataSet = new DataSet(items, {\n      type: {\n        start: 'Date',\n        end: 'Date'\n      }\n    });\n  }\n\n  // set items\n  this.itemsData = newDataSet;\n  this.itemSet && this.itemSet.setItems(newDataSet);\n};\n\n/**\n * Set groups\n * @param {vis.DataSet | Array} groups\n */\nTimeline.prototype.setGroups = function(groups) {\n  // convert to type DataSet when needed\n  var newDataSet;\n  if (!groups) {\n    newDataSet = null;\n  }\n  else {\n    var filter = function(group) {\n      return group.visible !== false;\n    }\n    if (groups instanceof DataSet || groups instanceof DataView) {\n      newDataSet = new DataView(groups,{filter: filter});\n    }\n    else {\n      // turn an array into a dataset\n      newDataSet = new DataSet(groups.filter(filter));\n    }\n  }\n\n\n  this.groupsData = newDataSet;\n  this.itemSet.setGroups(newDataSet);\n};\n\n/**\n * Set both items and groups in one go\n * @param {{items: Array | vis.DataSet, groups: Array | vis.DataSet}} data\n */\nTimeline.prototype.setData = function (data) {\n  if (data && data.groups) {\n    this.setGroups(data.groups);\n  }\n\n  if (data && data.items) {\n    this.setItems(data.items);\n  }\n};\n\n/**\n * Set selected items by their id. Replaces the current selection\n * Unknown id's are silently ignored.\n * @param {string[] | string} [ids]  An array with zero or more id's of the items to be\n *                                selected. If ids is an empty array, all items will be\n *                                unselected.\n * @param {Object} [options]      Available options:\n *                                `focus: boolean`\n *                                    If true, focus will be set to the selected item(s)\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n *                                    Only applicable when option focus is true.\n */\nTimeline.prototype.setSelection = function(ids, options) {\n  this.itemSet && this.itemSet.setSelection(ids);\n\n  if (options && options.focus) {\n    this.focus(ids, options);\n  }\n};\n\n/**\n * Get the selected items by their id\n * @return {Array} ids  The ids of the selected items\n */\nTimeline.prototype.getSelection = function() {\n  return this.itemSet && this.itemSet.getSelection() || [];\n};\n\n/**\n * Adjust the visible window such that the selected item (or multiple items)\n * are centered on screen.\n * @param {String | String[]} id     An item id or array with item ids\n * @param {Object} [options]      Available options:\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n */\nTimeline.prototype.focus = function(id, options) {\n  if (!this.itemsData || id == undefined) return;\n\n  var ids = Array.isArray(id) ? id : [id];\n\n  // get the specified item(s)\n  var itemsData = this.itemsData.getDataSet().get(ids, {\n    type: {\n      start: 'Date',\n      end: 'Date'\n    }\n  });\n\n  // calculate minimum start and maximum end of specified items\n  var start = null;\n  var end = null;\n  itemsData.forEach(function (itemData) {\n    var s = itemData.start.valueOf();\n    var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf();\n\n    if (start === null || s < start) {\n      start = s;\n    }\n\n    if (end === null || e > end) {\n      end = e;\n    }\n  });\n\n  if (start !== null && end !== null) {\n    // calculate the new middle and interval for the window\n    var middle = (start + end) / 2;\n    var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1);\n\n    var animation = (options && options.animation !== undefined) ? options.animation : true;\n    this.range.setRange(middle - interval / 2, middle + interval / 2, animation);\n  }\n};\n\n/**\n * Set Timeline window such that it fits all items\n * @param {Object} [options]  Available options:\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n */\nTimeline.prototype.fit = function (options) {\n  var animation = (options && options.animation !== undefined) ? options.animation : true;\n  var range;\n\n  var dataset = this.itemsData && this.itemsData.getDataSet();\n  if (dataset.length === 1 && dataset.get()[0].end === undefined) {\n    // a single item -> don't fit, just show a range around the item from -4 to +3 days\n    range = this.getDataRange();\n    this.moveTo(range.min.valueOf(), {animation});\n  }\n  else {\n    // exactly fit the items (plus a small margin)\n    range = this.getItemRange();\n    this.range.setRange(range.min, range.max, animation);\n  }\n};\n\n/**\n * Determine the range of the items, taking into account their actual width\n * and a margin of 10 pixels on both sides.\n * @return {{min: Date | null, max: Date | null}}\n */\nTimeline.prototype.getItemRange = function () {\n  // get a rough approximation for the range based on the items start and end dates\n  var range = this.getDataRange();\n  var min = range.min !== null ? range.min.valueOf() : null;\n  var max = range.max !== null ? range.max.valueOf() : null;\n  var minItem = null;\n  var maxItem = null;\n\n  if (min != null && max != null) {\n    var interval = (max - min); // ms\n    if (interval <= 0) {\n      interval = 10;\n    }\n    var factor = interval / this.props.center.width;\n\n    function getStart(item) {\n      return util.convert(item.data.start, 'Date').valueOf()\n    }\n\n    function getEnd(item) {\n      var end = item.data.end != undefined ? item.data.end : item.data.start;\n      return util.convert(end, 'Date').valueOf();\n    }\n\n    // calculate the date of the left side and right side of the items given\n    util.forEach(this.itemSet.items, function (item) {\n      if (item.groupShowing) {\n        item.show();\n        item.repositionX();\n      }\n\n      var start = getStart(item);\n      var end = getEnd(item);\n\n      if (this.options.rtl) {\n        var startSide  = start - (item.getWidthRight()  + 10) * factor;\n        var endSide = end   + (item.getWidthLeft() + 10) * factor;\n      } else {\n        var startSide  = start - (item.getWidthLeft()  + 10) * factor;\n        var endSide = end   + (item.getWidthRight() + 10) * factor;\n      }\n\n\n      if (startSide < min) {\n        min = startSide;\n        minItem = item;\n      }\n      if (endSide > max) {\n        max = endSide;\n        maxItem = item;\n      }\n    }.bind(this));\n\n    if (minItem && maxItem) {\n      var lhs = minItem.getWidthLeft() + 10;\n      var rhs = maxItem.getWidthRight() + 10;\n      var delta = this.props.center.width - lhs - rhs;  // px\n\n      if (delta > 0) {\n        if (this.options.rtl) {\n          min = getStart(minItem) - rhs * interval / delta; // ms\n          max = getEnd(maxItem)   + lhs * interval / delta; // ms\n        } else {\n          min = getStart(minItem) - lhs * interval / delta; // ms\n          max = getEnd(maxItem)   + rhs * interval / delta; // ms\n        }\n      }\n    }\n  }\n\n  return {\n    min: min != null ? new Date(min) : null,\n    max: max != null ? new Date(max) : null\n  }\n};\n\n/**\n * Calculate the data range of the items start and end dates\n * @returns {{min: Date | null, max: Date | null}}\n */\nTimeline.prototype.getDataRange = function() {\n  var min = null;\n  var max = null;\n\n  var dataset = this.itemsData && this.itemsData.getDataSet();\n  if (dataset) {\n    dataset.forEach(function (item) {\n      var start = util.convert(item.start, 'Date').valueOf();\n      var end   = util.convert(item.end != undefined ? item.end : item.start, 'Date').valueOf();\n      if (min === null || start < min) {\n        min = start;\n      }\n      if (max === null || end > max) {\n        max = end;\n      }\n    });\n  }\n\n  return {\n    min: min != null ? new Date(min) : null,\n    max: max != null ? new Date(max) : null\n  }\n};\n\n/**\n * Generate Timeline related information from an event\n * @param {Event} event\n * @return {Object} An object with related information, like on which area\n *                  The event happened, whether clicked on an item, etc.\n */\nTimeline.prototype.getEventProperties = function (event) {\n  var clientX = event.center ? event.center.x : event.clientX;\n  var clientY = event.center ? event.center.y : event.clientY;\n  if (this.options.rtl) {\n    var x = util.getAbsoluteRight(this.dom.centerContainer) - clientX;\n  } else {\n    var x = clientX - util.getAbsoluteLeft(this.dom.centerContainer);\n  }\n  var y = clientY - util.getAbsoluteTop(this.dom.centerContainer);\n\n  var item  = this.itemSet.itemFromTarget(event);\n  var group = this.itemSet.groupFromTarget(event);\n  var customTime = CustomTime.customTimeFromTarget(event);\n\n  var snap = this.itemSet.options.snap || null;\n  var scale = this.body.util.getScale();\n  var step = this.body.util.getStep();\n  var time = this._toTime(x);\n  var snappedTime = snap ? snap(time, scale, step) : time;\n\n  var element = util.getTarget(event);\n  var what = null;\n  if (item != null)                                                    {what = 'item';}\n  else if (customTime != null)                                         {what = 'custom-time';}\n  else if (util.hasParent(element, this.timeAxis.dom.foreground))      {what = 'axis';}\n  else if (this.timeAxis2 && util.hasParent(element, this.timeAxis2.dom.foreground)) {what = 'axis';}\n  else if (util.hasParent(element, this.itemSet.dom.labelSet))         {what = 'group-label';}\n  else if (util.hasParent(element, this.currentTime.bar))              {what = 'current-time';}\n  else if (util.hasParent(element, this.dom.center))                   {what = 'background';}\n\n  return {\n    event: event,\n    item: item ? item.id : null,\n    group: group ? group.groupId : null,\n    what: what,\n    pageX: event.srcEvent ? event.srcEvent.pageX : event.pageX,\n    pageY: event.srcEvent ? event.srcEvent.pageY : event.pageY,\n    x: x,\n    y: y,\n    time: time,\n    snappedTime: snappedTime\n  }\n};\n\nmodule.exports = Timeline;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/Timeline.js","var util = require('../util');\n\nimport ColorPicker from './ColorPicker'\n\n/**\n * The way this works is for all properties of this.possible options, you can supply the property name in any form to list the options.\n * Boolean options are recognised as Boolean\n * Number options should be written as array: [default value, min value, max value, stepsize]\n * Colors should be written as array: ['color', '#ffffff']\n * Strings with should be written as array: [option1, option2, option3, ..]\n *\n * The options are matched with their counterparts in each of the modules and the values used in the configuration are\n *\n * @param parentModule        | the location where parentModule.setOptions() can be called\n * @param defaultContainer    | the default container of the module\n * @param configureOptions    | the fully configured and predefined options set found in allOptions.js\n * @param pixelRatio          | canvas pixel ratio\n */\nclass Configurator {\n  constructor(parentModule, defaultContainer, configureOptions, pixelRatio = 1) {\n    this.parent = parentModule;\n    this.changedOptions = [];\n    this.container = defaultContainer;\n    this.allowCreation = false;\n\n    this.options = {};\n    this.initialized = false;\n    this.popupCounter = 0;\n    this.defaultOptions = {\n      enabled: false,\n      filter: true,\n      container: undefined,\n      showButton: true\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this.configureOptions = configureOptions;\n    this.moduleOptions = {};\n    this.domElements = [];\n    this.popupDiv = {};\n    this.popupLimit = 5;\n    this.popupHistory = {};\n    this.colorPicker = new ColorPicker(pixelRatio);\n    this.wrapper = undefined;\n  }\n\n\n  /**\n   * refresh all options.\n   * Because all modules parse their options by themselves, we just use their options. We copy them here.\n   *\n   * @param options\n   */\n  setOptions(options) {\n    if (options !== undefined) {\n      // reset the popup history because the indices may have been changed.\n      this.popupHistory = {};\n      this._removePopup();\n\n      let enabled = true;\n      if (typeof options === 'string') {\n        this.options.filter = options;\n      }\n      else if (options instanceof Array) {\n        this.options.filter = options.join();\n      }\n      else if (typeof options === 'object') {\n        if (options.container !== undefined) {\n          this.options.container = options.container;\n        }\n        if (options.filter !== undefined) {\n          this.options.filter = options.filter;\n        }\n        if (options.showButton !== undefined) {\n          this.options.showButton = options.showButton;\n        }\n        if (options.enabled !== undefined) {\n          enabled = options.enabled;\n        }\n      }\n      else if (typeof options === 'boolean') {\n        this.options.filter = true;\n        enabled = options;\n      }\n      else if (typeof options === 'function') {\n        this.options.filter = options;\n        enabled = true;\n      }\n      if (this.options.filter === false) {\n        enabled = false;\n      }\n\n      this.options.enabled = enabled;\n    }\n    this._clean();\n  }\n\n\n  setModuleOptions(moduleOptions) {\n    this.moduleOptions = moduleOptions;\n    if (this.options.enabled === true) {\n      this._clean();\n      if (this.options.container !== undefined) {\n        this.container = this.options.container;\n      }\n      this._create();\n    }\n  }\n\n  /**\n   * Create all DOM elements\n   * @private\n   */\n  _create() {\n    this._clean();\n    this.changedOptions = [];\n\n    let filter = this.options.filter;\n    let counter = 0;\n    let show = false;\n    for (let option in this.configureOptions) {\n      if (this.configureOptions.hasOwnProperty(option)) {\n        this.allowCreation = false;\n        show = false;\n        if (typeof filter === 'function') {\n          show = filter(option,[]);\n          show = show || this._handleObject(this.configureOptions[option], [option], true);\n        }\n        else if (filter === true || filter.indexOf(option) !== -1) {\n          show = true;\n        }\n\n        if (show !== false) {\n          this.allowCreation = true;\n\n          // linebreak between categories\n          if (counter > 0) {\n            this._makeItem([]);\n          }\n          // a header for the category\n          this._makeHeader(option);\n\n          // get the sub options\n          this._handleObject(this.configureOptions[option], [option]);\n        }\n        counter++;\n      }\n    }\n\n    if (this.options.showButton === true) {\n      let generateButton = document.createElement('div');\n      generateButton.className = 'vis-configuration vis-config-button';\n      generateButton.innerHTML = 'generate options';\n      generateButton.onclick =     () => {this._printOptions();};\n      generateButton.onmouseover = () => {generateButton.className = 'vis-configuration vis-config-button hover';};\n      generateButton.onmouseout =  () => {generateButton.className = 'vis-configuration vis-config-button';};\n\n      this.optionsContainer = document.createElement('div');\n      this.optionsContainer.className = 'vis-configuration vis-config-option-container';\n\n      this.domElements.push(this.optionsContainer);\n      this.domElements.push(generateButton);\n    }\n\n    this._push();\n    //~ this.colorPicker.insertTo(this.container);\n  }\n\n\n  /**\n   * draw all DOM elements on the screen\n   * @private\n   */\n  _push() {\n    this.wrapper = document.createElement('div');\n    this.wrapper.className = 'vis-configuration-wrapper';\n    this.container.appendChild(this.wrapper);\n    for (var i = 0; i < this.domElements.length; i++) {\n      this.wrapper.appendChild(this.domElements[i]);\n    }\n\n    this._showPopupIfNeeded()\n  }\n\n\n  /**\n   * delete all DOM elements\n   * @private\n   */\n  _clean() {\n    for (var i = 0; i < this.domElements.length; i++) {\n      this.wrapper.removeChild(this.domElements[i]);\n    }\n\n    if (this.wrapper !== undefined) {\n      this.container.removeChild(this.wrapper);\n      this.wrapper = undefined;\n    }\n    this.domElements = [];\n\n    this._removePopup();\n  }\n\n\n  /**\n   * get the value from the actualOptions if it exists\n   * @param {array} path    | where to look for the actual option\n   * @returns {*}\n   * @private\n   */\n  _getValue(path) {\n    let base = this.moduleOptions;\n    for (let i = 0; i < path.length; i++) {\n      if (base[path[i]] !== undefined) {\n        base = base[path[i]];\n      }\n      else {\n        base = undefined;\n        break;\n      }\n    }\n    return base;\n  }\n\n\n  /**\n   * all option elements are wrapped in an item\n   * @param path\n   * @param domElements\n   * @private\n   */\n  _makeItem(path, ...domElements) {\n    if (this.allowCreation === true) {\n      let item = document.createElement('div');\n      item.className = 'vis-configuration vis-config-item vis-config-s' + path.length;\n      domElements.forEach((element) => {\n        item.appendChild(element);\n      });\n      this.domElements.push(item);\n      return this.domElements.length;\n    }\n    return 0;\n  }\n\n\n  /**\n   * header for major subjects\n   * @param name\n   * @private\n   */\n  _makeHeader(name) {\n    let div = document.createElement('div');\n    div.className = 'vis-configuration vis-config-header';\n    div.innerHTML = name;\n    this._makeItem([],div);\n  }\n\n\n  /**\n   * make a label, if it is an object label, it gets different styling.\n   * @param name\n   * @param path\n   * @param objectLabel\n   * @returns {HTMLElement}\n   * @private\n   */\n  _makeLabel(name, path, objectLabel = false) {\n    let div = document.createElement('div');\n    div.className = 'vis-configuration vis-config-label vis-config-s' + path.length;\n    if (objectLabel === true) {\n      div.innerHTML = '<i><b>' + name + ':</b></i>';\n    }\n    else {\n      div.innerHTML = name + ':';\n    }\n    return div;\n  }\n\n\n  /**\n   * make a dropdown list for multiple possible string optoins\n   * @param arr\n   * @param value\n   * @param path\n   * @private\n   */\n  _makeDropdown(arr, value, path) {\n    let select = document.createElement('select');\n    select.className = 'vis-configuration vis-config-select';\n    let selectedValue = 0;\n    if (value !== undefined) {\n      if (arr.indexOf(value) !== -1) {\n        selectedValue = arr.indexOf(value);\n      }\n    }\n\n    for (let i = 0; i < arr.length; i++) {\n      let option = document.createElement('option');\n      option.value = arr[i];\n      if (i === selectedValue) {\n        option.selected = 'selected';\n      }\n      option.innerHTML = arr[i];\n      select.appendChild(option);\n    }\n\n    let me = this;\n    select.onchange = function () {me._update(this.value, path);};\n\n    let label = this._makeLabel(path[path.length-1], path);\n    this._makeItem(path, label, select);\n  }\n\n\n  /**\n   * make a range object for numeric options\n   * @param arr\n   * @param value\n   * @param path\n   * @private\n   */\n  _makeRange(arr, value, path) {\n    let defaultValue = arr[0];\n    let min = arr[1];\n    let max = arr[2];\n    let step = arr[3];\n    let range = document.createElement('input');\n    range.className = 'vis-configuration vis-config-range';\n    try {\n      range.type = 'range'; // not supported on IE9\n      range.min = min;\n      range.max = max;\n    }\n    catch (err) {}\n    range.step = step;\n\n    // set up the popup settings in case they are needed.\n    let popupString = '';\n    let popupValue = 0;\n\n    if (value !== undefined) {\n      let factor = 1.20;\n      if (value < 0 && value * factor < min) {\n        range.min = Math.ceil(value * factor);\n        popupValue = range.min;\n        popupString = 'range increased';\n      }\n      else if (value / factor < min) {\n        range.min = Math.ceil(value / factor);\n        popupValue = range.min;\n        popupString = 'range increased';\n      }\n      if (value * factor > max && max !== 1) {\n        range.max = Math.ceil(value * factor);\n        popupValue = range.max;\n        popupString = 'range increased';\n      }\n      range.value = value;\n    }\n    else {\n      range.value = defaultValue;\n    }\n\n    let input = document.createElement('input');\n    input.className = 'vis-configuration vis-config-rangeinput';\n    input.value = range.value;\n\n    var me = this;\n    range.onchange = function () {input.value = this.value; me._update(Number(this.value), path);};\n    range.oninput  = function () {input.value = this.value; };\n\n    let label = this._makeLabel(path[path.length-1], path);\n    let itemIndex = this._makeItem(path, label, range, input);\n\n    // if a popup is needed AND it has not been shown for this value, show it.\n    if (popupString !== '' && this.popupHistory[itemIndex] !== popupValue) {\n      this.popupHistory[itemIndex] = popupValue;\n      this._setupPopup(popupString, itemIndex);\n    }\n\n  }\n\n\n  /**\n   * prepare the popup\n   * @param string\n   * @param index\n   * @private\n   */\n  _setupPopup(string, index) {\n    if (this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit) {\n      let div = document.createElement(\"div\");\n      div.id = \"vis-configuration-popup\";\n      div.className = \"vis-configuration-popup\";\n      div.innerHTML = string;\n      div.onclick = () => {this._removePopup()};\n      this.popupCounter += 1;\n      this.popupDiv = {html:div, index:index};\n    }\n  }\n\n\n  /**\n   * remove the popup from the dom\n   * @private\n   */\n  _removePopup() {\n    if (this.popupDiv.html !== undefined) {\n      this.popupDiv.html.parentNode.removeChild(this.popupDiv.html);\n      clearTimeout(this.popupDiv.hideTimeout);\n      clearTimeout(this.popupDiv.deleteTimeout);\n      this.popupDiv = {};\n    }\n  }\n\n\n  /**\n   * Show the popup if it is needed.\n   * @private\n   */\n  _showPopupIfNeeded() {\n    if (this.popupDiv.html !== undefined) {\n      let correspondingElement = this.domElements[this.popupDiv.index];\n      let rect = correspondingElement.getBoundingClientRect();\n      this.popupDiv.html.style.left = rect.left + \"px\";\n      this.popupDiv.html.style.top = rect.top - 30 + \"px\"; // 30 is the height;\n      document.body.appendChild(this.popupDiv.html)\n      this.popupDiv.hideTimeout = setTimeout(() => {\n        this.popupDiv.html.style.opacity = 0;\n      },1500);\n      this.popupDiv.deleteTimeout = setTimeout(() => {\n        this._removePopup();\n      },1800)\n    }\n  }\n\n  /**\n   * make a checkbox for boolean options.\n   * @param defaultValue\n   * @param value\n   * @param path\n   * @private\n   */\n  _makeCheckbox(defaultValue, value, path) {\n    var checkbox = document.createElement('input');\n    checkbox.type = 'checkbox';\n    checkbox.className = 'vis-configuration vis-config-checkbox';\n    checkbox.checked = defaultValue;\n    if (value !== undefined) {\n      checkbox.checked = value;\n      if (value !== defaultValue) {\n        if (typeof defaultValue === 'object') {\n          if (value !== defaultValue.enabled) {\n            this.changedOptions.push({path:path, value:value});\n          }\n        }\n        else {\n          this.changedOptions.push({path:path, value:value});\n        }\n      }\n    }\n\n    let me = this;\n    checkbox.onchange = function() {me._update(this.checked, path)};\n\n    let label = this._makeLabel(path[path.length-1], path);\n    this._makeItem(path, label, checkbox);\n  }\n\n  /**\n   * make a text input field for string options.\n   * @param defaultValue\n   * @param value\n   * @param path\n   * @private\n   */\n  _makeTextInput(defaultValue, value, path) {\n    var checkbox = document.createElement('input');\n    checkbox.type = 'text';\n    checkbox.className = 'vis-configuration vis-config-text';\n    checkbox.value = value;\n    if (value !== defaultValue) {\n      this.changedOptions.push({path:path, value:value});\n    }\n\n    let me = this;\n    checkbox.onchange = function() {me._update(this.value, path)};\n\n    let label = this._makeLabel(path[path.length-1], path);\n    this._makeItem(path, label, checkbox);\n  }\n\n\n  /**\n   * make a color field with a color picker for color fields\n   * @param arr\n   * @param value\n   * @param path\n   * @private\n   */\n  _makeColorField(arr, value, path) {\n    let defaultColor = arr[1];\n    let div = document.createElement('div');\n    value = value === undefined ? defaultColor : value;\n\n    if (value !== 'none') {\n      div.className = 'vis-configuration vis-config-colorBlock';\n      div.style.backgroundColor = value;\n    }\n    else {\n      div.className = 'vis-configuration vis-config-colorBlock none';\n    }\n\n    value = value === undefined ? defaultColor : value;\n    div.onclick = () => {\n      this._showColorPicker(value,div,path);\n    };\n\n    let label = this._makeLabel(path[path.length-1], path);\n    this._makeItem(path,label, div);\n  }\n\n\n  /**\n   * used by the color buttons to call the color picker.\n   * @param event\n   * @param value\n   * @param div\n   * @param path\n   * @private\n   */\n  _showColorPicker(value, div, path) {\n    // clear the callback from this div\n    div.onclick = function() {};\n\n    this.colorPicker.insertTo(div);\n    this.colorPicker.show();\n\n    this.colorPicker.setColor(value);\n    this.colorPicker.setUpdateCallback((color) => {\n      let colorString = 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + color.a + ')';\n      div.style.backgroundColor = colorString;\n      this._update(colorString,path);\n    });\n\n    // on close of the colorpicker, restore the callback.\n    this.colorPicker.setCloseCallback(() => {\n      div.onclick = () => {\n        this._showColorPicker(value,div,path);\n      };\n    });\n  }\n\n\n  /**\n   * parse an object and draw the correct items\n   * @param obj\n   * @param path\n   * @private\n   */\n  _handleObject(obj, path = [], checkOnly = false) {\n    let show = false;\n    let filter = this.options.filter;\n    let visibleInSet = false;\n    for (let subObj in obj) {\n      if (obj.hasOwnProperty(subObj)) {\n        show = true;\n        let item = obj[subObj];\n        let newPath = util.copyAndExtendArray(path, subObj);\n        if (typeof filter === 'function') {\n          show = filter(subObj,path);\n\n          // if needed we must go deeper into the object.\n          if (show === false) {\n            if (!(item instanceof Array) && typeof item !== 'string' && typeof item !== 'boolean' && item instanceof Object) {\n              this.allowCreation = false;\n              show = this._handleObject(item, newPath, true);\n              this.allowCreation = checkOnly === false;\n            }\n          }\n        }\n\n        if (show !== false) {\n          visibleInSet = true;\n          let value = this._getValue(newPath);\n\n          if (item instanceof Array) {\n            this._handleArray(item, value, newPath);\n          }\n          else if (typeof item === 'string') {\n            this._makeTextInput(item, value, newPath);\n          }\n          else if (typeof item === 'boolean') {\n            this._makeCheckbox(item, value, newPath);\n          }\n          else if (item instanceof Object) {\n            // collapse the physics options that are not enabled\n            let draw = true;\n            if (path.indexOf('physics') !== -1) {\n              if (this.moduleOptions.physics.solver !== subObj) {\n                draw = false;\n              }\n            }\n\n            if (draw === true) {\n              // initially collapse options with an disabled enabled option.\n              if (item.enabled !== undefined) {\n                let enabledPath = util.copyAndExtendArray(newPath, 'enabled');\n                let enabledValue = this._getValue(enabledPath);\n                if (enabledValue === true) {\n                  let label = this._makeLabel(subObj, newPath, true);\n                  this._makeItem(newPath, label);\n                  visibleInSet = this._handleObject(item, newPath) || visibleInSet;\n                }\n                else {\n                  this._makeCheckbox(item, enabledValue, newPath);\n                }\n              }\n              else {\n                let label = this._makeLabel(subObj, newPath, true);\n                this._makeItem(newPath, label);\n                visibleInSet = this._handleObject(item, newPath) || visibleInSet;\n              }\n            }\n          }\n          else {\n            console.error('dont know how to handle', item, subObj, newPath);\n          }\n        }\n      }\n    }\n    return visibleInSet;\n  }\n\n\n  /**\n   * handle the array type of option\n   * @param optionName\n   * @param arr\n   * @param value\n   * @param path\n   * @private\n   */\n  _handleArray(arr, value, path) {\n    if (typeof arr[0] === 'string' && arr[0] === 'color') {\n      this._makeColorField(arr, value, path);\n      if (arr[1] !== value) {this.changedOptions.push({path:path, value:value});}\n    }\n    else if (typeof arr[0] === 'string') {\n      this._makeDropdown(arr, value, path);\n      if (arr[0] !== value) {this.changedOptions.push({path:path, value:value});}\n    }\n    else if (typeof arr[0] === 'number') {\n      this._makeRange(arr, value, path);\n      if (arr[0] !== value) {this.changedOptions.push({path:path, value:Number(value)});}\n    }\n  }\n\n\n\n  /**\n   * called to update the network with the new settings.\n   * @param value\n   * @param path\n   * @private\n   */\n  _update(value, path) {\n    let options = this._constructOptions(value,path);\n\n    if (this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit) {\n      this.parent.body.emitter.emit(\"configChange\", options);\n    }\n    this.initialized = true;\n    this.parent.setOptions(options);\n  }\n\n  _constructOptions(value, path, optionsObj = {}) {\n    let pointer = optionsObj;\n\n    // when dropdown boxes can be string or boolean, we typecast it into correct types\n    value = value === 'true'  ? true  : value;\n    value = value === 'false' ? false : value;\n\n    for (let i = 0; i < path.length; i++) {\n      if (path[i] !== 'global') {\n        if (pointer[path[i]] === undefined) {\n          pointer[path[i]] = {};\n        }\n        if (i !== path.length - 1) {\n          pointer = pointer[path[i]];\n        }\n        else {\n          pointer[path[i]] = value;\n        }\n      }\n    }\n    return optionsObj;\n  }\n\n  _printOptions() {\n    let options = this.getOptions();\n    this.optionsContainer.innerHTML = '<pre>var options = ' + JSON.stringify(options, null, 2) + '</pre>';\n  }\n\n  getOptions() {\n    let options = {};\n    for (var i = 0; i < this.changedOptions.length; i++) {\n      this._constructOptions(this.changedOptions[i].value, this.changedOptions[i].path, options)\n    }\n    return options;\n  }\n}\n\n\nexport default Configurator;\n\n\n// WEBPACK FOOTER //\n// ./lib/shared/Configurator.js","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/classCallCheck.js\n// module id = 115\n// module chunks = 0","\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/createClass.js\n// module id = 116\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/object/define-property\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/define-property.js\n// module id = 117\n// module chunks = 0","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc){\n  return $Object.defineProperty(it, key, desc);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/object/define-property.js\n// module id = 118\n// module chunks = 0","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', {defineProperty: require('./_object-dp').f});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.object.define-property.js\n// module id = 119\n// module chunks = 0","let Hammer = require('../module/hammer');\nlet hammerUtil = require('../hammerUtil');\nlet util = require('../util');\n\nclass ColorPicker {\n  constructor(pixelRatio = 1) {\n    this.pixelRatio = pixelRatio;\n    this.generated = false;\n    this.centerCoordinates = {x:289/2, y:289/2};\n    this.r = 289 * 0.49;\n    this.color = {r:255,g:255,b:255,a:1.0};\n    this.hueCircle = undefined;\n    this.initialColor = {r:255,g:255,b:255,a:1.0};\n    this.previousColor= undefined;\n    this.applied = false;\n\n    // bound by\n    this.updateCallback = () => {};\n    this.closeCallback = () => {};\n\n    // create all DOM elements\n    this._create();\n  }\n\n\n  /**\n   * this inserts the colorPicker into a div from the DOM\n   * @param container\n   */\n  insertTo(container) {\n    if (this.hammer !== undefined) {\n      this.hammer.destroy();\n      this.hammer = undefined;\n    }\n    this.container = container;\n    this.container.appendChild(this.frame);\n    this._bindHammer();\n\n    this._setSize();\n  }\n\n  /**\n   * the callback is executed on apply and save. Bind it to the application\n   * @param callback\n   */\n  setUpdateCallback(callback) {\n    if (typeof callback === 'function') {\n      this.updateCallback = callback;\n    }\n    else {\n      throw new Error(\"Function attempted to set as colorPicker update callback is not a function.\");\n    }\n  }\n\n  /**\n   * the callback is executed on apply and save. Bind it to the application\n   * @param callback\n   */\n  setCloseCallback(callback) {\n    if (typeof callback === 'function') {\n      this.closeCallback = callback;\n    }\n    else {\n      throw new Error(\"Function attempted to set as colorPicker closing callback is not a function.\");\n    }\n  }\n\n  _isColorString(color) {\n    var htmlColors = {black: '#000000',navy: '#000080',darkblue: '#00008B',mediumblue: '#0000CD',blue: '#0000FF',darkgreen: '#006400',green: '#008000',teal: '#008080',darkcyan: '#008B8B',deepskyblue: '#00BFFF',darkturquoise: '#00CED1',mediumspringgreen: '#00FA9A',lime: '#00FF00',springgreen: '#00FF7F',aqua: '#00FFFF',cyan: '#00FFFF',midnightblue: '#191970',dodgerblue: '#1E90FF',lightseagreen: '#20B2AA',forestgreen: '#228B22',seagreen: '#2E8B57',darkslategray: '#2F4F4F',limegreen: '#32CD32',mediumseagreen: '#3CB371',turquoise: '#40E0D0',royalblue: '#4169E1',steelblue: '#4682B4',darkslateblue: '#483D8B',mediumturquoise: '#48D1CC',indigo: '#4B0082',darkolivegreen: '#556B2F',cadetblue: '#5F9EA0',cornflowerblue: '#6495ED',mediumaquamarine: '#66CDAA',dimgray: '#696969',slateblue: '#6A5ACD',olivedrab: '#6B8E23',slategray: '#708090',lightslategray: '#778899',mediumslateblue: '#7B68EE',lawngreen: '#7CFC00',chartreuse: '#7FFF00',aquamarine: '#7FFFD4',maroon: '#800000',purple: '#800080',olive: '#808000',gray: '#808080',skyblue: '#87CEEB',lightskyblue: '#87CEFA',blueviolet: '#8A2BE2',darkred: '#8B0000',darkmagenta: '#8B008B',saddlebrown: '#8B4513',darkseagreen: '#8FBC8F',lightgreen: '#90EE90',mediumpurple: '#9370D8',darkviolet: '#9400D3',palegreen: '#98FB98',darkorchid: '#9932CC',yellowgreen: '#9ACD32',sienna: '#A0522D',brown: '#A52A2A',darkgray: '#A9A9A9',lightblue: '#ADD8E6',greenyellow: '#ADFF2F',paleturquoise: '#AFEEEE',lightsteelblue: '#B0C4DE',powderblue: '#B0E0E6',firebrick: '#B22222',darkgoldenrod: '#B8860B',mediumorchid: '#BA55D3',rosybrown: '#BC8F8F',darkkhaki: '#BDB76B',silver: '#C0C0C0',mediumvioletred: '#C71585',indianred: '#CD5C5C',peru: '#CD853F',chocolate: '#D2691E',tan: '#D2B48C',lightgrey: '#D3D3D3',palevioletred: '#D87093',thistle: '#D8BFD8',orchid: '#DA70D6',goldenrod: '#DAA520',crimson: '#DC143C',gainsboro: '#DCDCDC',plum: '#DDA0DD',burlywood: '#DEB887',lightcyan: '#E0FFFF',lavender: '#E6E6FA',darksalmon: '#E9967A',violet: '#EE82EE',palegoldenrod: '#EEE8AA',lightcoral: '#F08080',khaki: '#F0E68C',aliceblue: '#F0F8FF',honeydew: '#F0FFF0',azure: '#F0FFFF',sandybrown: '#F4A460',wheat: '#F5DEB3',beige: '#F5F5DC',whitesmoke: '#F5F5F5',mintcream: '#F5FFFA',ghostwhite: '#F8F8FF',salmon: '#FA8072',antiquewhite: '#FAEBD7',linen: '#FAF0E6',lightgoldenrodyellow: '#FAFAD2',oldlace: '#FDF5E6',red: '#FF0000',fuchsia: '#FF00FF',magenta: '#FF00FF',deeppink: '#FF1493',orangered: '#FF4500',tomato: '#FF6347',hotpink: '#FF69B4',coral: '#FF7F50',darkorange: '#FF8C00',lightsalmon: '#FFA07A',orange: '#FFA500',lightpink: '#FFB6C1',pink: '#FFC0CB',gold: '#FFD700',peachpuff: '#FFDAB9',navajowhite: '#FFDEAD',moccasin: '#FFE4B5',bisque: '#FFE4C4',mistyrose: '#FFE4E1',blanchedalmond: '#FFEBCD',papayawhip: '#FFEFD5',lavenderblush: '#FFF0F5',seashell: '#FFF5EE',cornsilk: '#FFF8DC',lemonchiffon: '#FFFACD',floralwhite: '#FFFAF0',snow: '#FFFAFA',yellow: '#FFFF00',lightyellow: '#FFFFE0',ivory: '#FFFFF0',white: '#FFFFFF'};\n    if (typeof color === 'string') {\n      return htmlColors[color];\n    }\n  }\n\n\n  /**\n   * Set the color of the colorPicker\n   * Supported formats:\n   * 'red'                   --> HTML color string\n   * '#ffffff'               --> hex string\n   * 'rbg(255,255,255)'      --> rgb string\n   * 'rgba(255,255,255,1.0)' --> rgba string\n   * {r:255,g:255,b:255}     --> rgb object\n   * {r:255,g:255,b:255,a:1.0} --> rgba object\n   * @param color\n   * @param setInitial\n   */\n  setColor(color, setInitial = true) {\n    if (color === 'none') {\n      return;\n    }\n\n    let rgba;\n\n    // if a html color shorthand is used, convert to hex\n    var htmlColor = this._isColorString(color);\n    if (htmlColor !== undefined) {\n      color = htmlColor;\n    }\n\n    // check format\n    if (util.isString(color) === true) {\n      if (util.isValidRGB(color) === true) {\n        let rgbaArray = color.substr(4).substr(0, color.length - 5).split(',');\n        rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:1.0};\n      }\n      else if (util.isValidRGBA(color) === true) {\n        let rgbaArray = color.substr(5).substr(0, color.length - 6).split(',');\n        rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:rgbaArray[3]};\n      }\n      else if (util.isValidHex(color) === true) {\n        let rgbObj = util.hexToRGB(color);\n        rgba = {r:rgbObj.r, g:rgbObj.g, b:rgbObj.b, a:1.0};\n      }\n    }\n    else {\n      if (color instanceof Object) {\n        if (color.r !== undefined && color.g !== undefined && color.b !== undefined) {\n          let alpha = color.a !== undefined ? color.a : '1.0';\n          rgba = {r:color.r, g:color.g, b:color.b, a:alpha};\n        }\n      }\n    }\n\n    // set color\n    if (rgba === undefined) {\n      throw new Error(\"Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: \" + JSON.stringify(color));\n    }\n    else {\n      this._setColor(rgba, setInitial);\n    }\n  }\n\n\n  /**\n   * this shows the color picker.\n   * The hue circle is constructed once and stored.\n   */\n  show() {\n    if (this.closeCallback !== undefined) {\n      this.closeCallback();\n      this.closeCallback = undefined;\n    }\n\n    this.applied = false;\n    this.frame.style.display = 'block';\n    this._generateHueCircle();\n  }\n\n  // ------------------------------------------ PRIVATE ----------------------------- //\n\n  /**\n   * Hide the picker. Is called by the cancel button.\n   * Optional boolean to store the previous color for easy access later on.\n   * @param storePrevious\n   * @private\n   */\n  _hide(storePrevious = true) {\n    // store the previous color for next time;\n    if (storePrevious === true) {\n      this.previousColor = util.extend({}, this.color);\n    }\n\n    if (this.applied === true) {\n      this.updateCallback(this.initialColor);\n    }\n\n    this.frame.style.display = 'none';\n\n    // call the closing callback, restoring the onclick method.\n    // this is in a setTimeout because it will trigger the show again before the click is done.\n    setTimeout(() => {\n      if (this.closeCallback !== undefined) {\n        this.closeCallback();\n        this.closeCallback = undefined;\n      }\n    },0);\n  }\n\n\n  /**\n   * bound to the save button. Saves and hides.\n   * @private\n   */\n  _save() {\n    this.updateCallback(this.color);\n    this.applied = false;\n    this._hide();\n  }\n\n\n  /**\n   * Bound to apply button. Saves but does not close. Is undone by the cancel button.\n   * @private\n   */\n  _apply() {\n    this.applied = true;\n    this.updateCallback(this.color);\n    this._updatePicker(this.color);\n  }\n\n\n  /**\n   * load the color from the previous session.\n   * @private\n   */\n  _loadLast() {\n    if (this.previousColor !== undefined) {\n      this.setColor(this.previousColor, false);\n    }\n    else {\n      alert(\"There is no last color to load...\");\n    }\n  }\n\n\n  /**\n   * set the color, place the picker\n   * @param rgba\n   * @param setInitial\n   * @private\n   */\n  _setColor(rgba, setInitial = true) {\n    // store the initial color\n    if (setInitial === true) {\n      this.initialColor = util.extend({}, rgba);\n    }\n\n    this.color = rgba;\n    let hsv = util.RGBToHSV(rgba.r, rgba.g, rgba.b);\n\n    let angleConvert = 2 * Math.PI;\n    let radius = this.r * hsv.s;\n    let x = this.centerCoordinates.x + radius * Math.sin(angleConvert * hsv.h);\n    let y = this.centerCoordinates.y + radius * Math.cos(angleConvert * hsv.h);\n\n    this.colorPickerSelector.style.left = x - 0.5 * this.colorPickerSelector.clientWidth + 'px';\n    this.colorPickerSelector.style.top = y - 0.5 * this.colorPickerSelector.clientHeight + 'px';\n\n    this._updatePicker(rgba);\n  }\n\n\n  /**\n   * bound to opacity control\n   * @param value\n   * @private\n   */\n  _setOpacity(value) {\n    this.color.a = value / 100;\n    this._updatePicker(this.color);\n  }\n\n\n  /**\n   * bound to brightness control\n   * @param value\n   * @private\n   */\n  _setBrightness(value) {\n    let hsv = util.RGBToHSV(this.color.r, this.color.g, this.color.b);\n    hsv.v = value / 100;\n    let rgba = util.HSVToRGB(hsv.h, hsv.s, hsv.v);\n    rgba['a'] = this.color.a;\n    this.color = rgba;\n    this._updatePicker();\n  }\n\n\n  /**\n   * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing.\n   * @param rgba\n   * @private\n   */\n  _updatePicker(rgba = this.color) {\n    let hsv = util.RGBToHSV(rgba.r, rgba.g, rgba.b);\n    let ctx = this.colorPickerCanvas.getContext('2d');\n    if (this.pixelRation === undefined) {\n      this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n      ctx.mozBackingStorePixelRatio ||\n      ctx.msBackingStorePixelRatio ||\n      ctx.oBackingStorePixelRatio ||\n      ctx.backingStorePixelRatio || 1);\n    }\n    ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n\n    // clear the canvas\n    let w = this.colorPickerCanvas.clientWidth;\n    let h = this.colorPickerCanvas.clientHeight;\n    ctx.clearRect(0, 0, w, h);\n\n    ctx.putImageData(this.hueCircle, 0,0);\n    ctx.fillStyle = 'rgba(0,0,0,' + (1- hsv.v) + ')';\n    ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r);\n    ctx.fill();\n\n    this.brightnessRange.value = 100 * hsv.v;\n    this.opacityRange.value    = 100 * rgba.a;\n\n    this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')';\n    this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')';\n  }\n\n\n  /**\n   * used by create to set the size of the canvas.\n   * @private\n   */\n  _setSize() {\n    this.colorPickerCanvas.style.width = '100%';\n    this.colorPickerCanvas.style.height = '100%';\n\n    this.colorPickerCanvas.width = 289 * this.pixelRatio;\n    this.colorPickerCanvas.height = 289 * this.pixelRatio;\n  }\n\n\n  /**\n   * create all dom elements\n   * TODO: cleanup, lots of similar dom elements\n   * @private\n   */\n  _create() {\n    this.frame = document.createElement('div');\n    this.frame.className = 'vis-color-picker';\n\n    this.colorPickerDiv = document.createElement('div');\n    this.colorPickerSelector = document.createElement('div');\n    this.colorPickerSelector.className = 'vis-selector';\n    this.colorPickerDiv.appendChild(this.colorPickerSelector);\n\n    this.colorPickerCanvas = document.createElement('canvas');\n    this.colorPickerDiv.appendChild(this.colorPickerCanvas);\n\n    if (!this.colorPickerCanvas.getContext) {\n      let noCanvas = document.createElement( 'DIV' );\n      noCanvas.style.color = 'red';\n      noCanvas.style.fontWeight =  'bold' ;\n      noCanvas.style.padding =  '10px';\n      noCanvas.innerHTML =  'Error: your browser does not support HTML canvas';\n      this.colorPickerCanvas.appendChild(noCanvas);\n    }\n    else {\n      let ctx = this.colorPickerCanvas.getContext(\"2d\");\n      this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n      ctx.mozBackingStorePixelRatio ||\n      ctx.msBackingStorePixelRatio ||\n      ctx.oBackingStorePixelRatio ||\n      ctx.backingStorePixelRatio || 1);\n\n      this.colorPickerCanvas.getContext(\"2d\").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n    }\n\n    this.colorPickerDiv.className = 'vis-color';\n\n    this.opacityDiv = document.createElement('div');\n    this.opacityDiv.className = 'vis-opacity';\n\n    this.brightnessDiv = document.createElement('div');\n    this.brightnessDiv.className = 'vis-brightness';\n\n    this.arrowDiv = document.createElement('div');\n    this.arrowDiv.className = 'vis-arrow';\n\n    this.opacityRange = document.createElement('input');\n    try {\n      this.opacityRange.type = 'range'; // Not supported on IE9\n      this.opacityRange.min = '0';\n      this.opacityRange.max = '100';\n    }\n    catch (err) {}\n    this.opacityRange.value = '100';\n    this.opacityRange.className = 'vis-range';\n\n    this.brightnessRange = document.createElement('input');\n    try {\n      this.brightnessRange.type = 'range'; // Not supported on IE9\n      this.brightnessRange.min = '0';\n      this.brightnessRange.max = '100';\n    }\n    catch (err) {}\n    this.brightnessRange.value = '100';\n    this.brightnessRange.className = 'vis-range';\n\n    this.opacityDiv.appendChild(this.opacityRange);\n    this.brightnessDiv.appendChild(this.brightnessRange);\n\n    var me = this;\n    this.opacityRange.onchange = function () {me._setOpacity(this.value);};\n    this.opacityRange.oninput  = function () {me._setOpacity(this.value);};\n    this.brightnessRange.onchange = function () {me._setBrightness(this.value);};\n    this.brightnessRange.oninput  = function () {me._setBrightness(this.value);};\n\n    this.brightnessLabel = document.createElement(\"div\");\n    this.brightnessLabel.className = \"vis-label vis-brightness\";\n    this.brightnessLabel.innerHTML = 'brightness:';\n\n    this.opacityLabel = document.createElement(\"div\");\n    this.opacityLabel.className = \"vis-label vis-opacity\";\n    this.opacityLabel.innerHTML = 'opacity:';\n\n    this.newColorDiv = document.createElement(\"div\");\n    this.newColorDiv.className = \"vis-new-color\";\n    this.newColorDiv.innerHTML = 'new';\n\n    this.initialColorDiv = document.createElement(\"div\");\n    this.initialColorDiv.className = \"vis-initial-color\";\n    this.initialColorDiv.innerHTML = 'initial';\n\n    this.cancelButton = document.createElement(\"div\");\n    this.cancelButton.className = \"vis-button vis-cancel\";\n    this.cancelButton.innerHTML = 'cancel';\n    this.cancelButton.onclick = this._hide.bind(this, false);\n\n    this.applyButton = document.createElement(\"div\");\n    this.applyButton.className = \"vis-button vis-apply\";\n    this.applyButton.innerHTML = 'apply';\n    this.applyButton.onclick = this._apply.bind(this);\n\n    this.saveButton = document.createElement(\"div\");\n    this.saveButton.className = \"vis-button vis-save\";\n    this.saveButton.innerHTML = 'save';\n    this.saveButton.onclick = this._save.bind(this);\n\n    this.loadButton = document.createElement(\"div\");\n    this.loadButton.className = \"vis-button vis-load\";\n    this.loadButton.innerHTML = 'load last';\n    this.loadButton.onclick = this._loadLast.bind(this);\n\n    this.frame.appendChild(this.colorPickerDiv);\n    this.frame.appendChild(this.arrowDiv);\n    this.frame.appendChild(this.brightnessLabel);\n    this.frame.appendChild(this.brightnessDiv);\n    this.frame.appendChild(this.opacityLabel);\n    this.frame.appendChild(this.opacityDiv);\n    this.frame.appendChild(this.newColorDiv);\n    this.frame.appendChild(this.initialColorDiv);\n\n    this.frame.appendChild(this.cancelButton);\n    this.frame.appendChild(this.applyButton);\n    this.frame.appendChild(this.saveButton);\n    this.frame.appendChild(this.loadButton);\n  }\n\n\n  /**\n   * bind hammer to the color picker\n   * @private\n   */\n  _bindHammer() {\n    this.drag = {};\n    this.pinch = {};\n    this.hammer = new Hammer(this.colorPickerCanvas);\n    this.hammer.get('pinch').set({enable: true});\n\n    hammerUtil.onTouch(this.hammer, (event) => {this._moveSelector(event)});\n    this.hammer.on('tap',       (event) => {this._moveSelector(event)});\n    this.hammer.on('panstart',  (event) => {this._moveSelector(event)});\n    this.hammer.on('panmove',   (event) => {this._moveSelector(event)});\n    this.hammer.on('panend',    (event) => {this._moveSelector(event)});\n  }\n\n\n  /**\n   * generate the hue circle. This is relatively heavy (200ms) and is done only once on the first time it is shown.\n   * @private\n   */\n  _generateHueCircle() {\n    if (this.generated === false) {\n      let ctx = this.colorPickerCanvas.getContext('2d');\n      if (this.pixelRation === undefined) {\n        this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n        ctx.mozBackingStorePixelRatio ||\n        ctx.msBackingStorePixelRatio ||\n        ctx.oBackingStorePixelRatio ||\n        ctx.backingStorePixelRatio || 1);\n      }\n      ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n\n      // clear the canvas\n      let w = this.colorPickerCanvas.clientWidth;\n      let h = this.colorPickerCanvas.clientHeight;\n      ctx.clearRect(0, 0, w, h);\n\n\n      // draw hue circle\n      let x, y, hue, sat;\n      this.centerCoordinates = {x: w * 0.5, y: h * 0.5};\n      this.r = 0.49 * w;\n      let angleConvert = (2 * Math.PI) / 360;\n      let hfac = 1 / 360;\n      let sfac = 1 / this.r;\n      let rgb;\n      for (hue = 0; hue < 360; hue++) {\n        for (sat = 0; sat < this.r; sat++) {\n          x = this.centerCoordinates.x + sat * Math.sin(angleConvert * hue);\n          y = this.centerCoordinates.y + sat * Math.cos(angleConvert * hue);\n          rgb = util.HSVToRGB(hue * hfac, sat * sfac, 1);\n          ctx.fillStyle = 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';\n          ctx.fillRect(x - 0.5, y - 0.5, 2, 2);\n        }\n      }\n      ctx.strokeStyle = 'rgba(0,0,0,1)';\n      ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r);\n      ctx.stroke();\n\n      this.hueCircle = ctx.getImageData(0,0,w,h);\n    }\n    this.generated = true;\n  }\n\n\n  /**\n   * move the selector. This is called by hammer functions.\n   *\n   * @param event\n   * @private\n   */\n  _moveSelector(event) {\n    let rect = this.colorPickerDiv.getBoundingClientRect();\n    let left = event.center.x - rect.left;\n    let top = event.center.y - rect.top;\n\n    let centerY = 0.5 * this.colorPickerDiv.clientHeight;\n    let centerX = 0.5 * this.colorPickerDiv.clientWidth;\n\n    let x = left - centerX;\n    let y = top - centerY;\n\n    let angle = Math.atan2(x,y);\n    let radius = 0.98 * Math.min(Math.sqrt(x * x + y * y), centerX);\n\n    let newTop = Math.cos(angle) * radius + centerY;\n    let newLeft = Math.sin(angle) * radius + centerX;\n\n    this.colorPickerSelector.style.top = newTop - 0.5 * this.colorPickerSelector.clientHeight + 'px';\n    this.colorPickerSelector.style.left = newLeft - 0.5 * this.colorPickerSelector.clientWidth + 'px';\n\n    // set color\n    let h = angle / (2 * Math.PI);\n    h = h < 0 ? h + 1 : h;\n    let s = radius / this.r;\n    let hsv = util.RGBToHSV(this.color.r, this.color.g, this.color.b);\n    hsv.h = h;\n    hsv.s = s;\n    let rgba = util.HSVToRGB(hsv.h, hsv.s, hsv.v);\n    rgba['a'] = this.color.a;\n    this.color = rgba;\n\n    // update previews\n    this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')';\n    this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')';\n  }\n}\n\nexport default ColorPicker;\n\n\n// WEBPACK FOOTER //\n// ./lib/shared/ColorPicker.js","var Hammer = require('./module/hammer');\n\n/**\n * Register a touch event, taking place before a gesture\n * @param {Hammer} hammer       A hammer instance\n * @param {function} callback   Callback, called as callback(event)\n */\nexports.onTouch = function (hammer, callback) {\n  callback.inputHandler = function (event) {\n    if (event.isFirst) {\n      callback(event);\n    }\n  };\n\n  hammer.on('hammer.input', callback.inputHandler);\n};\n\n/**\n * Register a release event, taking place after a gesture\n * @param {Hammer} hammer       A hammer instance\n * @param {function} callback   Callback, called as callback(event)\n */\nexports.onRelease = function (hammer, callback) {\n  callback.inputHandler = function (event) {\n    if (event.isFinal) {\n      callback(event);\n    }\n  };\n\n  return hammer.on('hammer.input', callback.inputHandler);\n};\n\n\n/**\n * Unregister a touch event, taking place before a gesture\n * @param {Hammer} hammer       A hammer instance\n * @param {function} callback   Callback, called as callback(event)\n */\nexports.offTouch = function (hammer, callback) {\n  hammer.off('hammer.input', callback.inputHandler);\n};\n\n/**\n * Unregister a release event, taking place before a gesture\n * @param {Hammer} hammer       A hammer instance\n * @param {function} callback   Callback, called as callback(event)\n */\nexports.offRelease = exports.offTouch;\n\n/**\n * Hack the PinchRecognizer such that it doesn't prevent default behavior\n * for vertical panning.\n *\n * Yeah ... this is quite a hack ... see https://github.com/hammerjs/hammer.js/issues/932\n *\n * @param {Hammer.Pinch} pinchRecognizer\n * @return {Hammer.Pinch} returns the pinchRecognizer\n */\nexports.disablePreventDefaultVertically = function (pinchRecognizer) {\n  var TOUCH_ACTION_PAN_Y = 'pan-y';\n\n  pinchRecognizer.getTouchAction = function() {\n    // default method returns [TOUCH_ACTION_NONE]\n    return [TOUCH_ACTION_PAN_Y];\n  };\n\n  return pinchRecognizer;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/hammerUtil.js","var util = require('../util');\n\nlet errorFound = false;\nlet allOptions;\nlet printStyle = 'background: #FFeeee; color: #dd0000';\n/**\n *  Used to validate options.\n */\nclass Validator {\n  constructor() {\n  }\n\n  /**\n   * Main function to be called\n   * @param options\n   * @param subObject\n   * @returns {boolean}\n   */\n  static validate(options, referenceOptions, subObject) {\n    errorFound = false;\n    allOptions = referenceOptions;\n    let usedOptions = referenceOptions;\n    if (subObject !== undefined) {\n      usedOptions = referenceOptions[subObject];\n    }\n    Validator.parse(options, usedOptions, []);\n    return errorFound;\n  }\n\n\n  /**\n   * Will traverse an object recursively and check every value\n   * @param options\n   * @param referenceOptions\n   * @param path\n   */\n  static parse(options, referenceOptions, path) {\n    for (let option in options) {\n      if (options.hasOwnProperty(option)) {\n        Validator.check(option, options, referenceOptions, path);\n      }\n    }\n  }\n\n\n  /**\n   * Check every value. If the value is an object, call the parse function on that object.\n   * @param option\n   * @param options\n   * @param referenceOptions\n   * @param path\n   */\n  static check(option, options, referenceOptions, path) {\n    if (referenceOptions[option] === undefined && referenceOptions.__any__ === undefined) {\n      Validator.getSuggestion(option, referenceOptions, path);\n    }\n    else if (referenceOptions[option] === undefined && referenceOptions.__any__ !== undefined) {\n      // __any__ is a wildcard. Any value is accepted and will be further analysed by reference.\n      if (Validator.getType(options[option]) === 'object' && referenceOptions['__any__'].__type__ !== undefined) {\n        // if the any subgroup is not a predefined object int he configurator we do not look deeper into the object.\n        Validator.checkFields(option, options, referenceOptions, '__any__', referenceOptions['__any__'].__type__, path);\n      }\n      else {\n        Validator.checkFields(option, options, referenceOptions, '__any__', referenceOptions['__any__'], path);\n      }\n    }\n    else {\n      // Since all options in the reference are objects, we can check whether they are supposed to be object to look for the __type__ field.\n      if (referenceOptions[option].__type__ !== undefined) {\n        // if this should be an object, we check if the correct type has been supplied to account for shorthand options.\n        Validator.checkFields(option, options, referenceOptions, option, referenceOptions[option].__type__, path);\n      }\n      else {\n        Validator.checkFields(option, options, referenceOptions, option, referenceOptions[option], path);\n      }\n    }\n  }\n\n  /**\n   *\n   * @param {String}  option     | the option property\n   * @param {Object}  options    | The supplied options object\n   * @param {Object}  referenceOptions    | The reference options containing all options and their allowed formats\n   * @param {String}  referenceOption     | Usually this is the same as option, except when handling an __any__ tag.\n   * @param {String}  refOptionType       | This is the type object from the reference options\n   * @param {Array}   path      | where in the object is the option\n   */\n  static checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path) {\n    let optionType = Validator.getType(options[option]);\n    let refOptionType = refOptionObj[optionType];\n    if (refOptionType !== undefined) {\n      // if the type is correct, we check if it is supposed to be one of a few select values\n      if (Validator.getType(refOptionType) === 'array') {\n        if (refOptionType.indexOf(options[option]) === -1) {\n          console.log('%cInvalid option detected in \"' + option + '\".' +\n            ' Allowed values are:' + Validator.print(refOptionType) + ' not \"' + options[option] + '\". ' + Validator.printLocation(path, option), printStyle);\n          errorFound = true;\n        }\n        else if (optionType === 'object' && referenceOption !== \"__any__\") {\n          path = util.copyAndExtendArray(path, option);\n          Validator.parse(options[option], referenceOptions[referenceOption], path);\n        }\n      }\n      else if (optionType === 'object' && referenceOption !== \"__any__\") {\n        path = util.copyAndExtendArray(path, option);\n        Validator.parse(options[option], referenceOptions[referenceOption], path);\n      }\n    }\n    else if (refOptionObj['any'] === undefined) {\n      // type of the field is incorrect and the field cannot be any\n      console.log('%cInvalid type received for \"' + option + '\". Expected: ' + Validator.print(Object.keys(refOptionObj)) + '. Received [' + optionType + '] \"' + options[option] + '\"' + Validator.printLocation(path, option), printStyle);\n      errorFound = true;\n    }\n  }\n\n\n  static getType(object) {\n    var type = typeof object;\n\n    if (type === 'object') {\n      if (object === null) {\n        return 'null';\n      }\n      if (object instanceof Boolean) {\n        return 'boolean';\n      }\n      if (object instanceof Number) {\n        return 'number';\n      }\n      if (object instanceof String) {\n        return 'string';\n      }\n      if (Array.isArray(object)) {\n        return 'array';\n      }\n      if (object instanceof Date) {\n        return 'date';\n      }\n      if (object.nodeType !== undefined) {\n        return 'dom';\n      }\n      if (object._isAMomentObject === true) {\n        return 'moment';\n      }\n      return 'object';\n    }\n    else if (type === 'number') {\n      return 'number';\n    }\n    else if (type === 'boolean') {\n      return 'boolean';\n    }\n    else if (type === 'string') {\n      return 'string';\n    }\n    else if (type === undefined) {\n      return 'undefined';\n    }\n    return type;\n  }\n\n  static getSuggestion(option, options, path) {\n    let localSearch = Validator.findInOptions(option,options,path,false);\n    let globalSearch = Validator.findInOptions(option,allOptions,[],true);\n\n    let localSearchThreshold = 8;\n    let globalSearchThreshold = 4;\n\n    if (localSearch.indexMatch !== undefined) {\n      console.log('%cUnknown option detected: \"' + option + '\" in ' + Validator.printLocation(localSearch.path, option,'') + 'Perhaps it was incomplete? Did you mean: \"' + localSearch.indexMatch + '\"?\\n\\n', printStyle);\n    }\n    else if (globalSearch.distance <= globalSearchThreshold && localSearch.distance > globalSearch.distance) {\n      console.log('%cUnknown option detected: \"' + option + '\" in ' + Validator.printLocation(localSearch.path, option,'') + 'Perhaps it was misplaced? Matching option found at: ' + Validator.printLocation(globalSearch.path, globalSearch.closestMatch,''), printStyle);\n    }\n    else if (localSearch.distance <= localSearchThreshold) {\n      console.log('%cUnknown option detected: \"' + option + '\". Did you mean \"' + localSearch.closestMatch + '\"?' + Validator.printLocation(localSearch.path, option), printStyle);\n    }\n    else {\n      console.log('%cUnknown option detected: \"' + option + '\". Did you mean one of these: ' + Validator.print(Object.keys(options)) + Validator.printLocation(path, option), printStyle);\n    }\n\n    errorFound = true;\n  }\n\n  /**\n   * traverse the options in search for a match.\n   * @param option\n   * @param options\n   * @param path\n   * @param recursive\n   * @returns {{closestMatch: string, path: Array, distance: number}}\n   */\n  static findInOptions(option, options, path, recursive = false) {\n    let min = 1e9;\n    let closestMatch = '';\n    let closestMatchPath = [];\n    let lowerCaseOption = option.toLowerCase();\n    let indexMatch = undefined;\n    for (let op in options) {\n      let distance;\n      if (options[op].__type__ !== undefined && recursive === true) {\n        let result = Validator.findInOptions(option, options[op], util.copyAndExtendArray(path,op));\n        if (min > result.distance) {\n          closestMatch = result.closestMatch;\n          closestMatchPath = result.path;\n          min = result.distance;\n          indexMatch = result.indexMatch;\n        }\n      }\n      else {\n        if (op.toLowerCase().indexOf(lowerCaseOption) !== -1) {\n          indexMatch = op;\n        }\n        distance = Validator.levenshteinDistance(option, op);\n        if (min > distance) {\n          closestMatch = op;\n          closestMatchPath = util.copyArray(path);\n          min = distance;\n        }\n      }\n    }\n    return {closestMatch:closestMatch, path:closestMatchPath, distance:min, indexMatch: indexMatch};\n  }\n\n  static printLocation(path, option, prefix = 'Problem value found at: \\n') {\n    let str = '\\n\\n' + prefix + 'options = {\\n';\n    for (let i = 0; i < path.length; i++) {\n      for (let j = 0; j < i + 1; j++) {\n        str += '  ';\n      }\n      str += path[i] + ': {\\n'\n    }\n    for (let j = 0; j < path.length + 1; j++) {\n      str += '  ';\n    }\n    str += option + '\\n';\n    for (let i = 0; i < path.length + 1; i++) {\n      for (let j = 0; j < path.length - i; j++) {\n        str += '  ';\n      }\n      str += '}\\n'\n    }\n    return str + '\\n\\n';\n  }\n\n  static print(options) {\n    return JSON.stringify(options).replace(/(\\\")|(\\[)|(\\])|(,\"__type__\")/g, \"\").replace(/(\\,)/g, ', ')\n  }\n\n\n  // Compute the edit distance between the two given strings\n  // http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript\n  /*\n   Copyright (c) 2011 Andrei Mackenzie\n\n   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\n   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\n   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n   */\n  static levenshteinDistance(a, b) {\n    if (a.length === 0) return b.length;\n    if (b.length === 0) return a.length;\n\n    var matrix = [];\n\n    // increment along the first column of each row\n    var i;\n    for (i = 0; i <= b.length; i++) {\n      matrix[i] = [i];\n    }\n\n    // increment each column in the first row\n    var j;\n    for (j = 0; j <= a.length; j++) {\n      matrix[0][j] = j;\n    }\n\n    // Fill in the rest of the matrix\n    for (i = 1; i <= b.length; i++) {\n      for (j = 1; j <= a.length; j++) {\n        if (b.charAt(i - 1) == a.charAt(j - 1)) {\n          matrix[i][j] = matrix[i - 1][j - 1];\n        } else {\n          matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution\n            Math.min(matrix[i][j - 1] + 1, // insertion\n              matrix[i - 1][j] + 1)); // deletion\n        }\n      }\n    }\n\n    return matrix[b.length][a.length];\n  }\n\n;\n}\n\n\nexport default Validator;\nexport {printStyle}\n\n\n// WEBPACK FOOTER //\n// ./lib/shared/Validator.js","var util = require('../util');\nvar hammerUtil = require('../hammerUtil');\nvar moment = require('../module/moment');\nvar Component = require('./component/Component');\nvar DateUtil = require('./DateUtil');\n\n/**\n * @constructor Range\n * A Range controls a numeric range with a start and end value.\n * The Range adjusts the range based on mouse events or programmatic changes,\n * and triggers events when the range is changing or has been changed.\n * @param {{dom: Object, domProps: Object, emitter: Emitter}} body\n * @param {Object} [options]    See description at Range.setOptions\n */\nfunction Range(body, options) {\n  var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0);\n  var start = now.clone().add(-3, 'days').valueOf();\n  var end = now.clone().add(-3, 'days').valueOf(); \n\n  if(options === undefined) {\n    this.start = start;\n    this.end = end;\n  } else {\n    this.start = options.start || start\n    this.end = options.end || end\n  }\n\n  this.rolling = false;\n\n  this.body = body;\n  this.deltaDifference = 0;\n  this.scaleOffset = 0;\n  this.startToFront = false;\n  this.endToFront = true;\n\n  // default options\n  this.defaultOptions = {\n    rtl: false,\n    start: null,\n    end: null,\n    moment: moment,\n    direction: 'horizontal', // 'horizontal' or 'vertical'\n    moveable: true,\n    zoomable: true,\n    min: null,\n    max: null,\n    zoomMin: 10,                                // milliseconds\n    zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000  // milliseconds\n  };\n  this.options = util.extend({}, this.defaultOptions);\n  this.props = {\n    touch: {}\n  };\n  this.animationTimer = null;\n\n  // drag listeners for dragging\n  this.body.emitter.on('panstart', this._onDragStart.bind(this));\n  this.body.emitter.on('panmove',  this._onDrag.bind(this));\n  this.body.emitter.on('panend',   this._onDragEnd.bind(this));\n\n  // mouse wheel for zooming\n  this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this));\n\n  // pinch to zoom\n  this.body.emitter.on('touch', this._onTouch.bind(this));\n  this.body.emitter.on('pinch', this._onPinch.bind(this));\n\n  // on click of rolling mode button\n  this.body.dom.rollingModeBtn.addEventListener('click', this.startRolling.bind(this));\n\n  this.setOptions(options);\n}\n\nRange.prototype = new Component();\n\n/**\n * Set options for the range controller\n * @param {Object} options      Available options:\n *                              {Number | Date | String} start  Start date for the range\n *                              {Number | Date | String} end    End date for the range\n *                              {Number} min    Minimum value for start\n *                              {Number} max    Maximum value for end\n *                              {Number} zoomMin    Set a minimum value for\n *                                                  (end - start).\n *                              {Number} zoomMax    Set a maximum value for\n *                                                  (end - start).\n *                              {Boolean} moveable Enable moving of the range\n *                                                 by dragging. True by default\n *                              {Boolean} zoomable Enable zooming of the range\n *                                                 by pinching/scrolling. True by default\n */\nRange.prototype.setOptions = function (options) {\n  if (options) {\n    // copy the options that we know\n    var fields = [\n      'animation', 'direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable',\n      'moment', 'activate', 'hiddenDates', 'zoomKey', 'rtl', 'showCurrentTime', 'rollMode', 'horizontalScroll'\n    ];\n    util.selectiveExtend(fields, this.options, options);\n\n    if (options.rollingMode) {\n      this.startRolling();\n    }\n    if ('start' in options || 'end' in options) {\n      // apply a new range. both start and end are optional\n      this.setRange(options.start, options.end);\n    }\n  }\n};\n\n/**\n * Test whether direction has a valid value\n * @param {String} direction    'horizontal' or 'vertical'\n */\nfunction validateDirection (direction) {\n  if (direction != 'horizontal' && direction != 'vertical') {\n    throw new TypeError('Unknown direction \"' + direction + '\". ' +\n        'Choose \"horizontal\" or \"vertical\".');\n  }\n}\n\n/**\n * Start auto refreshing the current time bar\n */\nRange.prototype.startRolling = function() {\n  var me = this;\n\n\n  function update () {\n    me.stopRolling();\n    me.rolling = true;\n\n\n    var interval = me.end - me.start;\n    var t = util.convert(new Date(), 'Date').valueOf();\n\n    var start = t - interval / 2;\n    var end = t + interval / 2;\n    var animation = (me.options && me.options.animation !== undefined) ? me.options.animation : true;\n\n    me.setRange(start, end, false);\n\n    // determine interval to refresh\n    var scale = me.conversion(me.body.domProps.center.width).scale;\n    var interval = 1 / scale / 10;\n    if (interval < 30)   interval = 30;\n    if (interval > 1000) interval = 1000;\n\n    me.body.dom.rollingModeBtn.style.visibility = \"hidden\";\n    // start a renderTimer to adjust for the new time\n    me.currentTimeTimer = setTimeout(update, interval);\n  }\n\n  update();\n};\n\n/**\n * Stop auto refreshing the current time bar\n */\nRange.prototype.stopRolling = function() {\n  if (this.currentTimeTimer !== undefined) {\n    clearTimeout(this.currentTimeTimer);\n    this.rolling = false;\n    this.body.dom.rollingModeBtn.style.visibility = \"visible\";\n  }\n};\n\n/**\n * Set a new start and end range\n * @param {Date | Number | String} [start]\n * @param {Date | Number | String} [end]\n * @param {boolean | {duration: number, easingFunction: string}} [animation=false]\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n * @param {Boolean} [byUser=false]\n *\n */\nRange.prototype.setRange = function(start, end, animation, byUser, event) {\n  if (byUser !== true) {\n    byUser = false;\n  }\n  var finalStart = start != undefined ? util.convert(start, 'Date').valueOf() : null;\n  var finalEnd   = end != undefined   ? util.convert(end, 'Date').valueOf()   : null;\n  this._cancelAnimation();\n\n  if (animation) { // true or an Object\n    var me = this;\n    var initStart = this.start;\n    var initEnd = this.end;\n    var duration = (typeof animation === 'object' && 'duration' in animation) ? animation.duration : 500;\n    var easingName = (typeof animation === 'object' && 'easingFunction' in animation) ? animation.easingFunction : 'easeInOutQuad';\n    var easingFunction = util.easingFunctions[easingName];\n    if (!easingFunction) {\n      throw new Error('Unknown easing function ' + JSON.stringify(easingName) + '. ' +\n          'Choose from: ' + Object.keys(util.easingFunctions).join(', '));\n    }\n\n    var initTime = new Date().valueOf();\n    var anyChanged = false;\n\n    var next = function () {\n      if (!me.props.touch.dragging) {\n        var now = new Date().valueOf();\n        var time = now - initTime;\n        var ease = easingFunction(time / duration);\n        var done = time > duration;\n        var s = (done || finalStart === null) ? finalStart : initStart + (finalStart - initStart) * ease;\n        var e = (done || finalEnd   === null) ? finalEnd   : initEnd   + (finalEnd   - initEnd)   * ease;\n\n        changed = me._applyRange(s, e);\n        DateUtil.updateHiddenDates(me.options.moment, me.body, me.options.hiddenDates);\n        anyChanged = anyChanged || changed;\n\n        var params = {\n          start: new Date(me.start), \n          end: new Date(me.end), \n          byUser:byUser,\n          event: util.elementsCensor(event)\n        }\n\n        if (changed) {\n          me.body.emitter.emit('rangechange', params);\n        }\n\n        if (done) {\n          if (anyChanged) {\n            me.body.emitter.emit('rangechanged', params);\n          }\n        }\n        else {\n          // animate with as high as possible frame rate, leave 20 ms in between\n          // each to prevent the browser from blocking\n          me.animationTimer = setTimeout(next, 20);\n        }\n      }\n    };\n\n    return next();\n  }\n  else {\n    var changed = this._applyRange(finalStart, finalEnd);\n    DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates);\n    if (changed) {\n      var params = {\n        start: new Date(this.start), \n        end: new Date(this.end), \n        byUser:byUser, \n        event: util.elementsCensor(event)\n      };\n      this.body.emitter.emit('rangechange', params);\n      this.body.emitter.emit('rangechanged', params);\n    }\n  }\n};\n\n/**\n * Stop an animation\n * @private\n */\nRange.prototype._cancelAnimation = function () {\n  if (this.animationTimer) {\n    clearTimeout(this.animationTimer);\n    this.animationTimer = null;\n  }\n};\n\n/**\n * Set a new start and end range. This method is the same as setRange, but\n * does not trigger a range change and range changed event, and it returns\n * true when the range is changed\n * @param {Number} [start]\n * @param {Number} [end]\n * @return {Boolean} changed\n * @private\n */\nRange.prototype._applyRange = function(start, end) {\n  var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start,\n      newEnd   = (end != null)   ? util.convert(end, 'Date').valueOf()   : this.end,\n      max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null,\n      min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null,\n      diff;\n\n  // check for valid number\n  if (isNaN(newStart) || newStart === null) {\n    throw new Error('Invalid start \"' + start + '\"');\n  }\n  if (isNaN(newEnd) || newEnd === null) {\n    throw new Error('Invalid end \"' + end + '\"');\n  }\n\n  // prevent start < end\n  if (newEnd < newStart) {\n    newEnd = newStart;\n  }\n\n  // prevent start < min\n  if (min !== null) {\n    if (newStart < min) {\n      diff = (min - newStart);\n      newStart += diff;\n      newEnd += diff;\n\n      // prevent end > max\n      if (max != null) {\n        if (newEnd > max) {\n          newEnd = max;\n        }\n      }\n    }\n  }\n\n  // prevent end > max\n  if (max !== null) {\n    if (newEnd > max) {\n      diff = (newEnd - max);\n      newStart -= diff;\n      newEnd -= diff;\n\n      // prevent start < min\n      if (min != null) {\n        if (newStart < min) {\n          newStart = min;\n        }\n      }\n    }\n  }\n\n  // prevent (end-start) < zoomMin\n  if (this.options.zoomMin !== null) {\n    var zoomMin = parseFloat(this.options.zoomMin);\n    if (zoomMin < 0) {\n      zoomMin = 0;\n    }\n    if ((newEnd - newStart) < zoomMin) {\n      if ((this.end - this.start) === zoomMin && newStart > this.start && newEnd < this.end) {\n        // ignore this action, we are already zoomed to the minimum\n        newStart = this.start;\n        newEnd = this.end;\n      }\n      else {\n        // zoom to the minimum\n        diff = (zoomMin - (newEnd - newStart));\n        newStart -= diff / 2;\n        newEnd += diff / 2;\n      }\n    }\n  }\n\n  // prevent (end-start) > zoomMax\n  if (this.options.zoomMax !== null) {\n    var zoomMax = parseFloat(this.options.zoomMax);\n    if (zoomMax < 0) {\n      zoomMax = 0;\n    }\n\n    if ((newEnd - newStart) > zoomMax) {\n      if ((this.end - this.start) === zoomMax && newStart < this.start && newEnd > this.end) {\n        // ignore this action, we are already zoomed to the maximum\n        newStart = this.start;\n        newEnd = this.end;\n      }\n      else {\n        // zoom to the maximum\n        diff = ((newEnd - newStart) - zoomMax);\n        newStart += diff / 2;\n        newEnd -= diff / 2;\n      }\n    }\n  }\n\n  var changed = (this.start != newStart || this.end != newEnd);\n\n  // if the new range does NOT overlap with the old range, emit checkRangedItems to avoid not showing ranged items (ranged meaning has end time, not necessarily of type Range)\n  if (!((newStart >= this.start && newStart   <= this.end) || (newEnd   >= this.start && newEnd   <= this.end)) &&\n      !((this.start >= newStart && this.start <= newEnd)   || (this.end >= newStart   && this.end <= newEnd) )) {\n    this.body.emitter.emit('checkRangedItems');\n  }\n\n  this.start = newStart;\n  this.end = newEnd;\n  return changed;\n};\n\n/**\n * Retrieve the current range.\n * @return {Object} An object with start and end properties\n */\nRange.prototype.getRange = function() {\n  return {\n    start: this.start,\n    end: this.end\n  };\n};\n\n/**\n * Calculate the conversion offset and scale for current range, based on\n * the provided width\n * @param {Number} width\n * @returns {{offset: number, scale: number}} conversion\n */\nRange.prototype.conversion = function (width, totalHidden) {\n  return Range.conversion(this.start, this.end, width, totalHidden);\n};\n\n/**\n * Static method to calculate the conversion offset and scale for a range,\n * based on the provided start, end, and width\n * @param {Number} start\n * @param {Number} end\n * @param {Number} width\n * @returns {{offset: number, scale: number}} conversion\n */\nRange.conversion = function (start, end, width, totalHidden) {\n  if (totalHidden === undefined) {\n    totalHidden = 0;\n  }\n  if (width != 0 && (end - start != 0)) {\n    return {\n      offset: start,\n      scale: width / (end - start - totalHidden)\n    }\n  }\n  else {\n    return {\n      offset: 0,\n      scale: 1\n    };\n  }\n};\n\n/**\n * Start dragging horizontally or vertically\n * @param {Event} event\n * @private\n */\nRange.prototype._onDragStart = function(event) {\n  this.deltaDifference = 0;\n  this.previousDelta = 0;\n\n  // only allow dragging when configured as movable\n  if (!this.options.moveable) return;\n\n  // only start dragging when the mouse is inside the current range\n  if (!this._isInsideRange(event)) return;\n\n  // refuse to drag when we where pinching to prevent the timeline make a jump\n  // when releasing the fingers in opposite order from the touch screen\n  if (!this.props.touch.allowDragging) return;\n\n  this.stopRolling();\n\n  this.props.touch.start = this.start;\n  this.props.touch.end = this.end;\n  this.props.touch.dragging = true;\n\n  if (this.body.dom.root) {\n    this.body.dom.root.style.cursor = 'move';\n  }\n};\n\n/**\n * Perform dragging operation\n * @param {Event} event\n * @private\n */\nRange.prototype._onDrag = function (event) {\n  if (!event) return\n\n  if (!this.props.touch.dragging) return;\n\n  // only allow dragging when configured as movable\n  if (!this.options.moveable) return;\n\n  // TODO: this may be redundant in hammerjs2\n  // refuse to drag when we where pinching to prevent the timeline make a jump\n  // when releasing the fingers in opposite order from the touch screen\n  if (!this.props.touch.allowDragging) return;\n\n  var direction = this.options.direction;\n  validateDirection(direction);\n  var delta = (direction == 'horizontal') ? event.deltaX : event.deltaY;\n  delta -= this.deltaDifference;\n  var interval = (this.props.touch.end - this.props.touch.start);\n\n  // normalize dragging speed if cutout is in between.\n  var duration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end);\n  interval -= duration;\n\n  var width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height;\n\n  if (this.options.rtl) {\n    var diffRange = delta / width * interval;\n  } else {\n     var diffRange = -delta / width * interval;\n  }\n\n  var newStart = this.props.touch.start + diffRange;\n  var newEnd = this.props.touch.end + diffRange;\n\n  // snapping times away from hidden zones\n  var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, this.previousDelta-delta, true);\n  var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, this.previousDelta-delta, true);\n  if (safeStart != newStart || safeEnd != newEnd) {\n    this.deltaDifference += delta;\n    this.props.touch.start = safeStart;\n    this.props.touch.end = safeEnd;\n    this._onDrag(event);\n    return;\n  }\n\n  this.previousDelta = delta;\n  this._applyRange(newStart, newEnd);\n\n\n  var startDate = new Date(this.start);\n  var endDate = new Date(this.end);\n\n  // fire a rangechange event\n  this.body.emitter.emit('rangechange', {\n    start: startDate,\n    end:   endDate,\n    byUser: true,\n    event: util.elementsCensor(event)\n  });\n\n  // fire a panmove event\n  this.body.emitter.emit('panmove');\n};\n\n/**\n * Stop dragging operation\n * @param {event} event\n * @private\n */\nRange.prototype._onDragEnd = function (event) {\n  if (!this.props.touch.dragging) return;\n\n  // only allow dragging when configured as movable\n  if (!this.options.moveable) return;\n\n  // TODO: this may be redundant in hammerjs2\n  // refuse to drag when we where pinching to prevent the timeline make a jump\n  // when releasing the fingers in opposite order from the touch screen\n  if (!this.props.touch.allowDragging) return;\n\n  this.props.touch.dragging = false;\n  if (this.body.dom.root) {\n    this.body.dom.root.style.cursor = 'auto';\n  }\n\n  // fire a rangechanged event\n  this.body.emitter.emit('rangechanged', {\n    start: new Date(this.start),\n    end:   new Date(this.end),\n    byUser: true,\n    event: util.elementsCensor(event)\n  });\n};\n\n/**\n * Event handler for mouse wheel event, used to zoom\n * Code from http://adomas.org/javascript-mouse-wheel/\n * @param {Event} event\n * @private\n */\nRange.prototype._onMouseWheel = function(event) {\n  // retrieve delta\n  var delta = 0;\n  if (event.wheelDelta) { /* IE/Opera. */\n    delta = event.wheelDelta / 120;\n  } else if (event.detail) { /* Mozilla case. */\n    // In Mozilla, sign of delta is different than in IE.\n    // Also, delta is multiple of 3.\n    delta = -event.detail / 3;\n  }\n\n  // don't allow zoom when the according key is pressed and the zoomKey option or not zoomable but movable\n  if ((this.options.zoomKey && !event[this.options.zoomKey] && this.options.zoomable) \n    || (!this.options.zoomable && this.options.moveable)) {\n    if (this.options.horizontalScroll) {\n      // Prevent default actions caused by mouse wheel\n      // (else the page and timeline both scroll)\n      event.preventDefault();\n      \n      // calculate a single scroll jump relative to the range scale\n      var diff = delta * (this.end - this.start) / 20;\n      // calculate new start and end\n      var newStart = this.start - diff;\n      var newEnd = this.end - diff;\n\n      this.setRange(newStart, newEnd, false, true, event);\n    }\n    return;\n  }\n\n  // only allow zooming when configured as zoomable and moveable\n  if (!(this.options.zoomable && this.options.moveable)) return;\n  \n  // only zoom when the mouse is inside the current range\n  if (!this._isInsideRange(event)) return;\n\n  // If delta is nonzero, handle it.\n  // Basically, delta is now positive if wheel was scrolled up,\n  // and negative, if wheel was scrolled down.\n  if (delta) {\n    // perform the zoom action. Delta is normally 1 or -1\n\n    // adjust a negative delta such that zooming in with delta 0.1\n    // equals zooming out with a delta -0.1\n    var scale;\n    if (delta < 0) {\n      scale = 1 - (delta / 5);\n    }\n    else {\n      scale = 1 / (1 + (delta / 5)) ;\n    }\n\n    // calculate center, the date to zoom around\n    var pointerDate\n    if (this.rolling) {\n      pointerDate = (this.start + this.end) / 2;\n    } else {\n      var pointer = this.getPointer({x: event.clientX, y: event.clientY}, this.body.dom.center);\n      pointerDate = this._pointerToDate(pointer);\n    }\n    this.zoom(scale, pointerDate, delta, event);\n\n    // Prevent default actions caused by mouse wheel\n    // (else the page and timeline both scroll)\n    event.preventDefault();\n  }\n};\n\n/**\n * Start of a touch gesture\n * @private\n */\nRange.prototype._onTouch = function (event) {\n  this.props.touch.start = this.start;\n  this.props.touch.end = this.end;\n  this.props.touch.allowDragging = true;\n  this.props.touch.center = null;\n  this.scaleOffset = 0;\n  this.deltaDifference = 0;\n};\n\n/**\n * Handle pinch event\n * @param {Event} event\n * @private\n */\nRange.prototype._onPinch = function (event) {\n  // only allow zooming when configured as zoomable and moveable\n  if (!(this.options.zoomable && this.options.moveable)) return;\n\n  this.props.touch.allowDragging = false;\n\n  if (!this.props.touch.center) {\n    this.props.touch.center = this.getPointer(event.center, this.body.dom.center);\n  }\n\n  this.stopRolling();\n\n  var scale = 1 / (event.scale + this.scaleOffset);\n  var centerDate = this._pointerToDate(this.props.touch.center);\n\n  var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end);\n  var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, centerDate);\n  var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore;\n\n  // calculate new start and end\n  var newStart = (centerDate - hiddenDurationBefore) + (this.props.touch.start - (centerDate - hiddenDurationBefore)) * scale;\n  var newEnd = (centerDate + hiddenDurationAfter) + (this.props.touch.end - (centerDate + hiddenDurationAfter)) * scale;\n\n  // snapping times away from hidden zones\n  this.startToFront = 1 - scale <= 0; // used to do the right auto correction with periodic hidden times\n  this.endToFront = scale - 1 <= 0;   // used to do the right auto correction with periodic hidden times\n\n  var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, 1 - scale, true);\n  var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, scale - 1, true);\n  if (safeStart != newStart || safeEnd != newEnd) {\n    this.props.touch.start = safeStart;\n    this.props.touch.end = safeEnd;\n    this.scaleOffset = 1 - event.scale;\n    newStart = safeStart;\n    newEnd = safeEnd;\n  }\n\n  this.setRange(newStart, newEnd, false, true, event);\n\n  this.startToFront = false; // revert to default\n  this.endToFront = true; // revert to default\n};\n\n/**\n * Test whether the mouse from a mouse event is inside the visible window,\n * between the current start and end date\n * @param {Object} event\n * @return {boolean} Returns true when inside the visible window\n * @private\n */\nRange.prototype._isInsideRange = function(event) {\n  // calculate the time where the mouse is, check whether inside\n  // and no scroll action should happen.\n  var clientX = event.center ? event.center.x : event.clientX;\n  if (this.options.rtl) {\n    var x = clientX - util.getAbsoluteLeft(this.body.dom.centerContainer);\n  } else {\n    var x = util.getAbsoluteRight(this.body.dom.centerContainer) - clientX;\n  }\n  var time = this.body.util.toTime(x);\n\n  return time >= this.start && time <= this.end;\n};\n\n/**\n * Helper function to calculate the center date for zooming\n * @param {{x: Number, y: Number}} pointer\n * @return {number} date\n * @private\n */\nRange.prototype._pointerToDate = function (pointer) {\n  var conversion;\n  var direction = this.options.direction;\n\n  validateDirection(direction);\n\n  if (direction == 'horizontal') {\n    return this.body.util.toTime(pointer.x).valueOf();\n  }\n  else {\n    var height = this.body.domProps.center.height;\n    conversion = this.conversion(height);\n    return pointer.y / conversion.scale + conversion.offset;\n  }\n};\n\n/**\n * Get the pointer location relative to the location of the dom element\n * @param {{x: Number, y: Number}} touch\n * @param {Element} element   HTML DOM element\n * @return {{x: Number, y: Number}} pointer\n * @private\n */\nRange.prototype.getPointer = function (touch, element) {\n  if (this.options.rtl) {\n    return {\n      x: util.getAbsoluteRight(element) - touch.x,\n      y: touch.y - util.getAbsoluteTop(element)\n    };\n  } else {\n    return {\n      x: touch.x - util.getAbsoluteLeft(element),\n      y: touch.y - util.getAbsoluteTop(element)\n    };\n  }\n}\n\n/**\n * Zoom the range the given scale in or out. Start and end date will\n * be adjusted, and the timeline will be redrawn. You can optionally give a\n * date around which to zoom.\n * For example, try scale = 0.9 or 1.1\n * @param {Number} scale      Scaling factor. Values above 1 will zoom out,\n *                            values below 1 will zoom in.\n * @param {Number} [center]   Value representing a date around which will\n *                            be zoomed.\n */\nRange.prototype.zoom = function(scale, center, delta, event) {\n  // if centerDate is not provided, take it half between start Date and end Date\n  if (center == null) {\n    center = (this.start + this.end) / 2;\n  }\n\n  var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end);\n  var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, center);\n  var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore;\n\n  // calculate new start and end\n  var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale;\n  var newEnd   = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale;\n\n  // snapping times away from hidden zones\n  this.startToFront = delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times\n  this.endToFront = -delta  > 0 ? false : true; // used to do the right autocorrection with periodic hidden times\n  var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, delta, true);\n  var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, -delta, true);\n  if (safeStart != newStart || safeEnd != newEnd) {\n    newStart = safeStart;\n    newEnd = safeEnd;\n  }\n\n  this.setRange(newStart, newEnd, false, true, event);\n\n  this.startToFront = false; // revert to default\n  this.endToFront = true; // revert to default\n};\n\n\n\n/**\n * Move the range with a given delta to the left or right. Start and end\n * value will be adjusted. For example, try delta = 0.1 or -0.1\n * @param {Number}  delta     Moving amount. Positive value will move right,\n *                            negative value will move left\n */\nRange.prototype.move = function(delta) {\n  // zoom start Date and end Date relative to the centerDate\n  var diff = (this.end - this.start);\n\n  // apply new values\n  var newStart = this.start + diff * delta;\n  var newEnd = this.end + diff * delta;\n\n  // TODO: reckon with min and max range\n\n  this.start = newStart;\n  this.end = newEnd;\n};\n\n/**\n * Move the range to a new center point\n * @param {Number} moveTo      New center point of the range\n */\nRange.prototype.moveTo = function(moveTo) {\n  var center = (this.start + this.end) / 2;\n\n  var diff = center - moveTo;\n\n  // calculate new start and end\n  var newStart = this.start - diff;\n  var newEnd = this.end - diff;\n\n  this.setRange(newStart, newEnd, false, true, event);\n};\n\nmodule.exports = Range;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/Range.js","var util = require('../../util');\n\n/**\n * Prototype for visual components\n * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body]\n * @param {Object} [options]\n */\nfunction Component (body, options) {\n  this.options = null;\n  this.props = null;\n}\n\n/**\n * Set options for the component. The new options will be merged into the\n * current options.\n * @param {Object} options\n */\nComponent.prototype.setOptions = function(options) {\n  if (options) {\n    util.extend(this.options, options);\n  }\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nComponent.prototype.redraw = function() {\n  // should be implemented by the component\n  return false;\n};\n\n/**\n * Destroy the component. Cleanup DOM and event listeners\n */\nComponent.prototype.destroy = function() {\n  // should be implemented by the component\n};\n\n/**\n * Test whether the component is resized since the last time _isResized() was\n * called.\n * @return {Boolean} Returns true if the component is resized\n * @protected\n */\nComponent.prototype._isResized = function() {\n  var resized = (this.props._previousWidth !== this.props.width ||\n      this.props._previousHeight !== this.props.height);\n\n  this.props._previousWidth = this.props.width;\n  this.props._previousHeight = this.props.height;\n\n  return resized;\n};\n\nmodule.exports = Component;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/Component.js","\n/**\n * used in Core to convert the options into a volatile variable\n * \n * @param {function} moment\n * @param {Object} body\n * @param {Array | Object} hiddenDates\n */\nexports.convertHiddenOptions = function(moment, body, hiddenDates) {\n  if (hiddenDates && !Array.isArray(hiddenDates)) {\n    return exports.convertHiddenOptions(moment, body, [hiddenDates])\n  }\n\n  body.hiddenDates = [];\n  if (hiddenDates) {\n    if (Array.isArray(hiddenDates) == true) {\n      for (var i = 0; i < hiddenDates.length; i++) {\n        if (hiddenDates[i].repeat === undefined) {\n          var dateItem = {};\n          dateItem.start = moment(hiddenDates[i].start).toDate().valueOf();\n          dateItem.end = moment(hiddenDates[i].end).toDate().valueOf();\n          body.hiddenDates.push(dateItem);\n        }\n      }\n      body.hiddenDates.sort(function (a, b) {\n        return a.start - b.start;\n      }); // sort by start time\n    }\n  }\n};\n\n\n/**\n * create new entrees for the repeating hidden dates\n * @param {function} moment\n * @param {Object} body\n * @param {Array | Object} hiddenDates\n */\nexports.updateHiddenDates = function (moment, body, hiddenDates) {\n  if (hiddenDates && !Array.isArray(hiddenDates)) {\n    return exports.updateHiddenDates(moment, body, [hiddenDates])\n  }\n\n  if (hiddenDates && body.domProps.centerContainer.width !== undefined) {\n    exports.convertHiddenOptions(moment, body, hiddenDates);\n\n    var start = moment(body.range.start);\n    var end = moment(body.range.end);\n\n    var totalRange = (body.range.end - body.range.start);\n    var pixelTime = totalRange / body.domProps.centerContainer.width;\n\n    for (var i = 0; i < hiddenDates.length; i++) {\n      if (hiddenDates[i].repeat !== undefined) {\n        var startDate = moment(hiddenDates[i].start);\n        var endDate = moment(hiddenDates[i].end);\n\n        if (startDate._d == \"Invalid Date\") {\n          throw new Error(\"Supplied start date is not valid: \" + hiddenDates[i].start);\n        }\n        if (endDate._d == \"Invalid Date\") {\n          throw new Error(\"Supplied end date is not valid: \" + hiddenDates[i].end);\n        }\n\n        var duration = endDate - startDate;\n        if (duration >= 4 * pixelTime) {\n\n          var offset = 0;\n          var runUntil = end.clone();\n          switch (hiddenDates[i].repeat) {\n            case \"daily\": // case of time\n              if (startDate.day() != endDate.day()) {\n                offset = 1;\n              }\n              startDate.dayOfYear(start.dayOfYear());\n              startDate.year(start.year());\n              startDate.subtract(7,'days');\n\n              endDate.dayOfYear(start.dayOfYear());\n              endDate.year(start.year());\n              endDate.subtract(7 - offset,'days');\n\n              runUntil.add(1, 'weeks');\n              break;\n            case \"weekly\":\n              var dayOffset = endDate.diff(startDate,'days')\n              var day = startDate.day();\n\n              // set the start date to the range.start\n              startDate.date(start.date());\n              startDate.month(start.month());\n              startDate.year(start.year());\n              endDate = startDate.clone();\n\n              // force\n              startDate.day(day);\n              endDate.day(day);\n              endDate.add(dayOffset,'days');\n\n              startDate.subtract(1,'weeks');\n              endDate.subtract(1,'weeks');\n\n              runUntil.add(1, 'weeks');\n              break\n            case \"monthly\":\n              if (startDate.month() != endDate.month()) {\n                offset = 1;\n              }\n              startDate.month(start.month());\n              startDate.year(start.year());\n              startDate.subtract(1,'months');\n\n              endDate.month(start.month());\n              endDate.year(start.year());\n              endDate.subtract(1,'months');\n              endDate.add(offset,'months');\n\n              runUntil.add(1, 'months');\n              break;\n            case \"yearly\":\n              if (startDate.year() != endDate.year()) {\n                offset = 1;\n              }\n              startDate.year(start.year());\n              startDate.subtract(1,'years');\n              endDate.year(start.year());\n              endDate.subtract(1,'years');\n              endDate.add(offset,'years');\n\n              runUntil.add(1, 'years');\n              break;\n            default:\n              console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\", hiddenDates[i].repeat);\n              return;\n          }\n          while (startDate < runUntil) {\n            body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()});\n            switch (hiddenDates[i].repeat) {\n              case \"daily\":\n                startDate.add(1, 'days');\n                endDate.add(1, 'days');\n                break;\n              case \"weekly\":\n                startDate.add(1, 'weeks');\n                endDate.add(1, 'weeks');\n                break;\n              case \"monthly\":\n                startDate.add(1, 'months');\n                endDate.add(1, 'months');\n                break;\n              case \"yearly\":\n                startDate.add(1, 'y');\n                endDate.add(1, 'y');\n                break;\n              default:\n                console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\", hiddenDates[i].repeat);\n                return;\n            }\n          }\n          body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()});\n        }\n      }\n    }\n    // remove duplicates, merge where possible\n    exports.removeDuplicates(body);\n    // ensure the new positions are not on hidden dates\n    var startHidden = exports.isHidden(body.range.start, body.hiddenDates);\n    var endHidden = exports.isHidden(body.range.end,body.hiddenDates);\n    var rangeStart = body.range.start;\n    var rangeEnd = body.range.end;\n    if (startHidden.hidden == true) {rangeStart = body.range.startToFront == true ? startHidden.startDate - 1 : startHidden.endDate + 1;}\n    if (endHidden.hidden == true)   {rangeEnd   = body.range.endToFront == true ?   endHidden.startDate - 1   : endHidden.endDate + 1;}\n    if (startHidden.hidden == true || endHidden.hidden == true) {\n      body.range._applyRange(rangeStart, rangeEnd);\n    }\n  }\n\n}\n\n\n/**\n * remove duplicates from the hidden dates list. Duplicates are evil. They mess everything up.\n * Scales with N^2\n * @param body\n */\nexports.removeDuplicates = function(body) {\n  var hiddenDates = body.hiddenDates;\n  var safeDates = [];\n  for (var i = 0; i < hiddenDates.length; i++) {\n    for (var j = 0; j < hiddenDates.length; j++) {\n      if (i != j && hiddenDates[j].remove != true && hiddenDates[i].remove != true) {\n        // j inside i\n        if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) {\n          hiddenDates[j].remove = true;\n        }\n        // j start inside i\n        else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) {\n          hiddenDates[i].end = hiddenDates[j].end;\n          hiddenDates[j].remove = true;\n        }\n        // j end inside i\n        else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) {\n          hiddenDates[i].start = hiddenDates[j].start;\n          hiddenDates[j].remove = true;\n        }\n      }\n    }\n  }\n\n  for (var i = 0; i < hiddenDates.length; i++) {\n    if (hiddenDates[i].remove !== true) {\n      safeDates.push(hiddenDates[i]);\n    }\n  }\n\n  body.hiddenDates = safeDates;\n  body.hiddenDates.sort(function (a, b) {\n    return a.start - b.start;\n  }); // sort by start time\n};\n\nexports.printDates = function(dates) {\n  for (var i =0; i < dates.length; i++) {\n    console.log(i, new Date(dates[i].start),new Date(dates[i].end), dates[i].start, dates[i].end, dates[i].remove);\n  }\n};\n\n/**\n * Used in TimeStep to avoid the hidden times.\n * @param {function} moment\n * @param {TimeStep} timeStep\n * @param previousTime\n */\nexports.stepOverHiddenDates = function(moment, timeStep, previousTime) {\n  var stepInHidden = false;\n  var currentValue = timeStep.current.valueOf();\n  for (var i = 0; i < timeStep.hiddenDates.length; i++) {\n    var startDate = timeStep.hiddenDates[i].start;\n    var endDate = timeStep.hiddenDates[i].end;\n    if (currentValue >= startDate && currentValue < endDate) {\n      stepInHidden = true;\n      break;\n    }\n  }\n\n  if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) {\n    var prevValue = moment(previousTime);\n    var newValue = moment(endDate);\n    //check if the next step should be major\n    if (prevValue.year() != newValue.year()) {timeStep.switchedYear = true;}\n    else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;}\n    else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;}\n\n    timeStep.current = newValue;\n  }\n};\n\n\n///**\n// * Used in TimeStep to avoid the hidden times.\n// * @param timeStep\n// * @param previousTime\n// */\n//exports.checkFirstStep = function(timeStep) {\n//  var stepInHidden = false;\n//  var currentValue = timeStep.current.valueOf();\n//  for (var i = 0; i < timeStep.hiddenDates.length; i++) {\n//    var startDate = timeStep.hiddenDates[i].start;\n//    var endDate = timeStep.hiddenDates[i].end;\n//    if (currentValue >= startDate && currentValue < endDate) {\n//      stepInHidden = true;\n//      break;\n//    }\n//  }\n//\n//  if (stepInHidden == true && currentValue <= timeStep._end.valueOf()) {\n//    var newValue = moment(endDate);\n//    timeStep.current = newValue.toDate();\n//  }\n//};\n\n/**\n * replaces the Core toScreen methods\n * @param Core\n * @param time\n * @param width\n * @returns {number}\n */\nexports.toScreen = function (Core, time, width) {\n    if (Core.body.hiddenDates.length == 0) {\n      var conversion = Core.range.conversion(width);\n      return (time.valueOf() - conversion.offset) * conversion.scale;\n    } else {\n      var hidden = exports.isHidden(time, Core.body.hiddenDates);\n      if (hidden.hidden == true) {\n        time = hidden.startDate;\n      }\n\n      var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end);\n      if (time < Core.range.start) {\n        var conversion = Core.range.conversion(width, duration);\n        var hiddenBeforeStart = exports.getHiddenDurationBeforeStart(Core.body.hiddenDates, time, conversion.offset);\n        time = Core.options.moment(time).toDate().valueOf();\n        time = time + hiddenBeforeStart;\n        return -(conversion.offset - time.valueOf()) * conversion.scale;\n        \n      } else if (time > Core.range.end) {\n        var rangeAfterEnd = {start: Core.range.start, end: time};\n        time = exports.correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, rangeAfterEnd, time);\n        var conversion = Core.range.conversion(width, duration);\n        return (time.valueOf() - conversion.offset) * conversion.scale;\n\n      } else {\n        time = exports.correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, Core.range, time);\n        var conversion = Core.range.conversion(width, duration);\n        return (time.valueOf() - conversion.offset) * conversion.scale;\n      }\n    }\n  };\n\n\n/**\n * Replaces the core toTime methods\n * @param body\n * @param range\n * @param x\n * @param width\n * @returns {Date}\n */\nexports.toTime = function(Core, x, width) {\n  if (Core.body.hiddenDates.length == 0) {\n    var conversion = Core.range.conversion(width);\n    return new Date(x / conversion.scale + conversion.offset);\n  }\n  else {\n    var hiddenDuration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end);\n    var totalDuration = Core.range.end - Core.range.start - hiddenDuration;\n    var partialDuration = totalDuration * x / width;\n    var accumulatedHiddenDuration = exports.getAccumulatedHiddenDuration(Core.body.hiddenDates, Core.range, partialDuration);\n\n    var newTime = new Date(accumulatedHiddenDuration + partialDuration + Core.range.start);\n    return newTime;\n  }\n};\n\n\n/**\n * Support function\n *\n * @param hiddenDates\n * @param range\n * @returns {number}\n */\nexports.getHiddenDurationBetween = function(hiddenDates, start, end) {\n  var duration = 0;\n  for (var i = 0; i < hiddenDates.length; i++) {\n    var startDate = hiddenDates[i].start;\n    var endDate = hiddenDates[i].end;\n    // if time after the cutout, and the\n    if (startDate >= start && endDate < end) {\n      duration += endDate - startDate;\n    }\n  }\n  return duration;\n};\n\n/**\n   * Support function\n   *\n   * @param hiddenDates\n   * @param start\n   * @param end\n   * @returns {number}\n   */\nexports.getHiddenDurationBeforeStart = function (hiddenDates, start, end) {\n  var duration = 0;\n  for (var i = 0; i < hiddenDates.length; i++) {\n    var startDate = hiddenDates[i].start;\n    var endDate = hiddenDates[i].end;\n\n    if (startDate >= start && endDate <= end) {\n      duration += endDate - startDate;\n    }\n  }\n  return duration;\n};\n\n\n/**\n * Support function\n * @param moment\n * @param hiddenDates\n * @param range\n * @param time\n * @returns {{duration: number, time: *, offset: number}}\n */\nexports.correctTimeForHidden = function(moment, hiddenDates, range, time) {\n  time = moment(time).toDate().valueOf();\n  time -= exports.getHiddenDurationBefore(moment, hiddenDates,range,time);\n  return time;\n};\n\nexports.getHiddenDurationBefore = function(moment, hiddenDates, range, time) {\n  var timeOffset = 0;\n  time = moment(time).toDate().valueOf();\n\n  for (var i = 0; i < hiddenDates.length; i++) {\n    var startDate = hiddenDates[i].start;\n    var endDate = hiddenDates[i].end;\n    // if time after the cutout, and the\n    if (startDate >= range.start && endDate < range.end) {\n      if (time >= endDate) {\n        timeOffset += (endDate - startDate);\n      }\n    }\n  }\n  return timeOffset;\n}\n\n/**\n * sum the duration from start to finish, including the hidden duration,\n * until the required amount has been reached, return the accumulated hidden duration\n * @param hiddenDates\n * @param range\n * @param time\n * @returns {{duration: number, time: *, offset: number}}\n */\nexports.getAccumulatedHiddenDuration = function(hiddenDates, range, requiredDuration) {\n  var hiddenDuration = 0;\n  var duration = 0;\n  var previousPoint = range.start;\n  //exports.printDates(hiddenDates)\n  for (var i = 0; i < hiddenDates.length; i++) {\n    var startDate = hiddenDates[i].start;\n    var endDate = hiddenDates[i].end;\n    // if time after the cutout, and the\n    if (startDate >= range.start && endDate < range.end) {\n      duration += startDate - previousPoint;\n      previousPoint = endDate;\n      if (duration >= requiredDuration) {\n        break;\n      }\n      else {\n        hiddenDuration += endDate - startDate;\n      }\n    }\n  }\n\n  return hiddenDuration;\n};\n\n\n\n/**\n * used to step over to either side of a hidden block. Correction is disabled on tablets, might be set to true\n * @param hiddenDates\n * @param time\n * @param direction\n * @param correctionEnabled\n * @returns {*}\n */\nexports.snapAwayFromHidden = function(hiddenDates, time, direction, correctionEnabled) {\n  var isHidden = exports.isHidden(time, hiddenDates);\n  if (isHidden.hidden == true) {\n    if (direction < 0) {\n      if (correctionEnabled == true) {\n        return isHidden.startDate - (isHidden.endDate - time) - 1;\n      }\n      else {\n        return isHidden.startDate - 1;\n      }\n    }\n    else {\n      if (correctionEnabled == true) {\n        return isHidden.endDate + (time - isHidden.startDate) + 1;\n      }\n      else {\n        return isHidden.endDate + 1;\n      }\n    }\n  }\n  else {\n    return time;\n  }\n\n}\n\n\n/**\n * Check if a time is hidden\n *\n * @param time\n * @param hiddenDates\n * @returns {{hidden: boolean, startDate: Window.start, endDate: *}}\n */\nexports.isHidden = function(time, hiddenDates) {\n  for (var i = 0; i < hiddenDates.length; i++) {\n    var startDate = hiddenDates[i].start;\n    var endDate = hiddenDates[i].end;\n\n    if (time >= startDate && time < endDate) { // if the start is entering a hidden zone\n      return {hidden: true, startDate: startDate, endDate: endDate};\n      break;\n    }\n  }\n  return {hidden: false, startDate: startDate, endDate: endDate};\n}\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/DateUtil.js","var Emitter = require('emitter-component');\nvar Hammer = require('../module/hammer');\nvar hammerUtil = require('../hammerUtil');\nvar util = require('../util');\nvar DataSet = require('../DataSet');\nvar DataView = require('../DataView');\nvar Range = require('./Range');\nvar ItemSet = require('./component/ItemSet');\nvar TimeAxis = require('./component/TimeAxis');\nvar Activator = require('../shared/Activator');\nvar DateUtil = require('./DateUtil');\nvar CustomTime = require('./component/CustomTime');\n\n/**\n * Create a timeline visualization\n * @constructor\n */\nfunction Core () {}\n\n// turn Core into an event emitter\nEmitter(Core.prototype);\n\n/**\n * Create the main DOM for the Core: a root panel containing left, right,\n * top, bottom, content, and background panel.\n * @param {Element} container  The container element where the Core will\n *                             be attached.\n * @protected\n */\nCore.prototype._create = function (container) {\n  this.dom = {};\n\n  this.dom.container = container;\n\n  this.dom.root                 = document.createElement('div');\n  this.dom.background           = document.createElement('div');\n  this.dom.backgroundVertical   = document.createElement('div');\n  this.dom.backgroundHorizontal = document.createElement('div');\n  this.dom.centerContainer      = document.createElement('div');\n  this.dom.leftContainer        = document.createElement('div');\n  this.dom.rightContainer       = document.createElement('div');\n  this.dom.center               = document.createElement('div');\n  this.dom.left                 = document.createElement('div');\n  this.dom.right                = document.createElement('div');\n  this.dom.top                  = document.createElement('div');\n  this.dom.bottom               = document.createElement('div');\n  this.dom.shadowTop            = document.createElement('div');\n  this.dom.shadowBottom         = document.createElement('div');\n  this.dom.shadowTopLeft        = document.createElement('div');\n  this.dom.shadowBottomLeft     = document.createElement('div');\n  this.dom.shadowTopRight       = document.createElement('div');\n  this.dom.shadowBottomRight    = document.createElement('div');\n  this.dom.rollingModeBtn       = document.createElement('div');\n\n  this.dom.root.className                 = 'vis-timeline';\n  this.dom.background.className           = 'vis-panel vis-background';\n  this.dom.backgroundVertical.className   = 'vis-panel vis-background vis-vertical';\n  this.dom.backgroundHorizontal.className = 'vis-panel vis-background vis-horizontal';\n  this.dom.centerContainer.className      = 'vis-panel vis-center';\n  this.dom.leftContainer.className        = 'vis-panel vis-left';\n  this.dom.rightContainer.className       = 'vis-panel vis-right';\n  this.dom.top.className                  = 'vis-panel vis-top';\n  this.dom.bottom.className               = 'vis-panel vis-bottom';\n  this.dom.left.className                 = 'vis-content';\n  this.dom.center.className               = 'vis-content';\n  this.dom.right.className                = 'vis-content';\n  this.dom.shadowTop.className            = 'vis-shadow vis-top';\n  this.dom.shadowBottom.className         = 'vis-shadow vis-bottom';\n  this.dom.shadowTopLeft.className        = 'vis-shadow vis-top';\n  this.dom.shadowBottomLeft.className     = 'vis-shadow vis-bottom';\n  this.dom.shadowTopRight.className       = 'vis-shadow vis-top';\n  this.dom.shadowBottomRight.className    = 'vis-shadow vis-bottom';\n  this.dom.rollingModeBtn.className       = 'vis-rolling-mode-btn';\n\n  this.dom.root.appendChild(this.dom.background);\n  this.dom.root.appendChild(this.dom.backgroundVertical);\n  this.dom.root.appendChild(this.dom.backgroundHorizontal);\n  this.dom.root.appendChild(this.dom.centerContainer);\n  this.dom.root.appendChild(this.dom.leftContainer);\n  this.dom.root.appendChild(this.dom.rightContainer);\n  this.dom.root.appendChild(this.dom.top);\n  this.dom.root.appendChild(this.dom.bottom);\n  this.dom.root.appendChild(this.dom.bottom);\n  this.dom.root.appendChild(this.dom.rollingModeBtn);\n\n  this.dom.centerContainer.appendChild(this.dom.center);\n  this.dom.leftContainer.appendChild(this.dom.left);\n  this.dom.rightContainer.appendChild(this.dom.right);\n  this.dom.centerContainer.appendChild(this.dom.shadowTop);\n  this.dom.centerContainer.appendChild(this.dom.shadowBottom);\n  this.dom.leftContainer.appendChild(this.dom.shadowTopLeft);\n  this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft);\n  this.dom.rightContainer.appendChild(this.dom.shadowTopRight);\n  this.dom.rightContainer.appendChild(this.dom.shadowBottomRight);\n\n  // size properties of each of the panels\n  this.props = {\n    root: {},\n    background: {},\n    centerContainer: {},\n    leftContainer: {},\n    rightContainer: {},\n    center: {},\n    left: {},\n    right: {},\n    top: {},\n    bottom: {},\n    border: {},\n    scrollTop: 0,\n    scrollTopMin: 0\n  };\n\n  this.on('rangechange', function () {\n    if (this.initialDrawDone === true) {\n      this._redraw();\n    }\n  }.bind(this));\n  this.on('touch',       this._onTouch.bind(this));\n  this.on('panmove',         this._onDrag.bind(this));\n\n  var me = this;\n  this._origRedraw = this._redraw.bind(this);\n  this._redraw = util.throttle(this._origRedraw);\n\n  this.on('_change', function (properties) {\n    if (me.itemSet && me.itemSet.initialItemSetDrawn && properties && properties.queue == true) {\n      me._redraw()\n    } else {\n      me._origRedraw();\n    }\n  });\n\n  // create event listeners for all interesting events, these events will be\n  // emitted via emitter\n  this.hammer = new Hammer(this.dom.root);\n  var pinchRecognizer = this.hammer.get('pinch').set({enable: true});\n  hammerUtil.disablePreventDefaultVertically(pinchRecognizer);\n  this.hammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_HORIZONTAL});\n  this.listeners = {};\n\n  var events = [\n    'tap', 'doubletap', 'press',\n    'pinch',\n    'pan', 'panstart', 'panmove', 'panend'\n      // TODO: cleanup\n    //'touch', 'pinch',\n    //'tap', 'doubletap', 'hold',\n    //'dragstart', 'drag', 'dragend',\n    //'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox\n  ];\n  events.forEach(function (type) {\n    var listener = function (event) {\n      if (me.isActive()) {\n        me.emit(type, event);\n      }\n    };\n    me.hammer.on(type, listener);\n    me.listeners[type] = listener;\n  });\n\n  // emulate a touch event (emitted before the start of a pan, pinch, tap, or press)\n  hammerUtil.onTouch(this.hammer, function (event) {\n    me.emit('touch', event);\n  }.bind(this));\n\n  // emulate a release event (emitted after a pan, pinch, tap, or press)\n  hammerUtil.onRelease(this.hammer, function (event) {\n    me.emit('release', event);\n  }.bind(this));\n\n  function onMouseWheel(event) {\n    if (this.isActive()) {\n      this.emit('mousewheel', event);\n    }\n\n    // prevent scrolling if not specified explicitly or when horizontalScroll is true\n    if (!this.options.verticalScroll || this.options.horizontalScroll) return;\n\n    // prevent scrolling when zoomKey defined or activated\n    if (!this.options.zoomKey || event[this.options.zoomKey]) return;\n\n    // Prevent default actions caused by mouse wheel\n    // (else the page and timeline both scroll)\n    event.preventDefault();\n\n    var delta = 0;\n    if (event.wheelDelta) { /* IE/Opera. */\n      delta = event.wheelDelta / 120;\n    } else if (event.detail) { /* Mozilla case. */\n      // In Mozilla, sign of delta is different than in IE.\n      // Also, delta is multiple of 3.\n      delta = -event.detail / 3;\n    }\n\n    var current = this.props.scrollTop;\n    var adjusted = current + delta * 120;\n\n    if (this.isActive()) {\n      this._setScrollTop(adjusted);\n      this._redraw();\n      this.emit('scroll', event);\n    }\n  }\n\n  if (this.dom.centerContainer.addEventListener) {\n    // IE9, Chrome, Safari, Opera\n    this.dom.centerContainer.addEventListener(\"mousewheel\", onMouseWheel.bind(this), false);\n    // Firefox\n    this.dom.centerContainer.addEventListener(\"DOMMouseScroll\", onMouseWheel.bind(this), false);\n  } else {\n    // IE 6/7/8\n    this.dom.centerContainer.attachEvent(\"onmousewheel\", onMouseWheel.bind(this));\n  }\n\n  function onMouseScrollSide(event) {\n    if (!me.options.verticalScroll) return;\n    event.preventDefault();\n    if (me.isActive()) {\n      var adjusted = -event.target.scrollTop;\n      me._setScrollTop(adjusted);\n      me._redraw();\n      me.emit('scrollSide', event);\n    }\n  }\n\n  this.dom.left.parentNode.addEventListener('scroll', onMouseScrollSide.bind(this));\n  this.dom.right.parentNode.addEventListener('scroll', onMouseScrollSide.bind(this));\n\n  var itemAddedToTimeline = false;\n\n  function handleDragOver(event) {\n    if (event.preventDefault) {\n      event.preventDefault(); // Necessary. Allows us to drop.\n    }\n\n    // make sure your target is a vis element\n    if (!event.target.className.indexOf(\"vis\") > -1) return;\n\n    // make sure only one item is added every time you're over the timeline\n    if (itemAddedToTimeline) return;\n\n    event.dataTransfer.dropEffect = 'move';  \n    itemAddedToTimeline = true;\n    return false;\n  }\n\n  function handleDrop(event) {\n    // return when dropping non-vis items \n    try {\n      var itemData = JSON.parse(event.dataTransfer.getData(\"text\"))\n      if (!itemData.content) return\n    } catch (err) {\n      return false;\n    }\n\n    itemAddedToTimeline = false;\n    event.center = {\n      x: event.clientX,\n      y: event.clientY\n    }\n    me.itemSet._onAddItem(event);\n\n    return false;\n  }\n\n  this.dom.center.addEventListener('dragover', handleDragOver.bind(this), false);\n  this.dom.center.addEventListener('drop', handleDrop.bind(this), false);\n\n  this.customTimes = [];\n\n  // store state information needed for touch events\n  this.touch = {};\n\n  this.redrawCount = 0;\n  this.initialDrawDone = false;\n\n  // attach the root panel to the provided container\n  if (!container) throw new Error('No container provided');\n  container.appendChild(this.dom.root);\n};\n\n/**\n * Set options. Options will be passed to all components loaded in the Timeline.\n * @param {Object} [options]\n *                           {String} orientation\n *                              Vertical orientation for the Timeline,\n *                              can be 'bottom' (default) or 'top'.\n *                           {String | Number} width\n *                              Width for the timeline, a number in pixels or\n *                              a css string like '1000px' or '75%'. '100%' by default.\n *                           {String | Number} height\n *                              Fixed height for the Timeline, a number in pixels or\n *                              a css string like '400px' or '75%'. If undefined,\n *                              The Timeline will automatically size such that\n *                              its contents fit.\n *                           {String | Number} minHeight\n *                              Minimum height for the Timeline, a number in pixels or\n *                              a css string like '400px' or '75%'.\n *                           {String | Number} maxHeight\n *                              Maximum height for the Timeline, a number in pixels or\n *                              a css string like '400px' or '75%'.\n *                           {Number | Date | String} start\n *                              Start date for the visible window\n *                           {Number | Date | String} end\n *                              End date for the visible window\n */\nCore.prototype.setOptions = function (options) {\n  if (options) {\n    // copy the known options\n    var fields = [\n      'width', 'height', 'minHeight', 'maxHeight', 'autoResize',\n      'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates',\n      'locale', 'locales', 'moment', 'rtl', 'zoomKey', 'horizontalScroll', 'verticalScroll'\n    ];\n    util.selectiveExtend(fields, this.options, options); \n\n    this.dom.rollingModeBtn.style.visibility = 'hidden';\n\n    if (this.options.rtl) {\n      this.dom.container.style.direction = \"rtl\";\n      this.dom.backgroundVertical.className = 'vis-panel vis-background vis-vertical-rtl';    \n    }\n\n    if (this.options.verticalScroll) {\n      if (this.options.rtl) {\n        this.dom.rightContainer.className = 'vis-panel vis-right vis-vertical-scroll';\n      } else {\n        this.dom.leftContainer.className = 'vis-panel vis-left vis-vertical-scroll';\n      }\n    }\n\n    this.options.orientation = {item:undefined,axis:undefined};\n    if ('orientation' in options) {\n      if (typeof options.orientation === 'string') {\n        this.options.orientation = {\n          item: options.orientation,\n          axis: options.orientation\n        };\n      }\n      else if (typeof options.orientation === 'object') {\n        if ('item' in options.orientation) {\n          this.options.orientation.item = options.orientation.item;\n        }\n        if ('axis' in options.orientation) {\n          this.options.orientation.axis = options.orientation.axis;\n        }\n      }\n    }\n\n    if (this.options.orientation.axis === 'both') {\n      if (!this.timeAxis2) {\n        var timeAxis2 = this.timeAxis2 = new TimeAxis(this.body);\n        timeAxis2.setOptions = function (options) {\n          var _options = options ? util.extend({}, options) : {};\n          _options.orientation = 'top'; // override the orientation option, always top\n          TimeAxis.prototype.setOptions.call(timeAxis2, _options);\n        };\n        this.components.push(timeAxis2);\n      }\n    }\n    else {\n      if (this.timeAxis2) {\n        var index = this.components.indexOf(this.timeAxis2);\n        if (index !== -1) {\n          this.components.splice(index, 1);\n        }\n        this.timeAxis2.destroy();\n        this.timeAxis2 = null;\n      }\n    }\n\n    // if the graph2d's drawPoints is a function delegate the callback to the onRender property\n    if (typeof options.drawPoints == 'function') {\n      options.drawPoints = {\n          onRender: options.drawPoints\n      };\n    }\n\n    if ('hiddenDates' in this.options) {\n      DateUtil.convertHiddenOptions(this.options.moment, this.body, this.options.hiddenDates);\n    }\n\n    if ('clickToUse' in options) {\n      if (options.clickToUse) {\n        if (!this.activator) {\n          this.activator = new Activator(this.dom.root);\n        }\n      }\n      else {\n        if (this.activator) {\n          this.activator.destroy();\n          delete this.activator;\n        }\n      }\n    }\n\n    if ('showCustomTime' in options) {\n      throw new Error('Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])');\n    }\n\n    // enable/disable autoResize\n    this._initAutoResize();\n  }\n\n  // propagate options to all components\n  this.components.forEach(component => component.setOptions(options));\n\n  // enable/disable configure\n  if ('configure' in options) {\n    if (!this.configurator) {\n      this.configurator = this._createConfigurator();\n    }\n\n    this.configurator.setOptions(options.configure);\n\n    // collect the settings of all components, and pass them to the configuration system\n    var appliedOptions = util.deepExtend({}, this.options);\n    this.components.forEach(function (component) {\n      util.deepExtend(appliedOptions, component.options);\n    });\n    this.configurator.setModuleOptions({global: appliedOptions});\n  }\n\n  this._redraw();\n};\n\n/**\n * Returns true when the Timeline is active.\n * @returns {boolean}\n */\nCore.prototype.isActive = function () {\n  return !this.activator || this.activator.active;\n};\n\n/**\n * Destroy the Core, clean up all DOM elements and event listeners.\n */\nCore.prototype.destroy = function () {\n  // unbind datasets\n  this.setItems(null);\n  this.setGroups(null);\n\n  // remove all event listeners\n  this.off();\n\n  // stop checking for changed size\n  this._stopAutoResize();\n\n  // remove from DOM\n  if (this.dom.root.parentNode) {\n    this.dom.root.parentNode.removeChild(this.dom.root);\n  }\n  this.dom = null;\n\n  // remove Activator\n  if (this.activator) {\n    this.activator.destroy();\n    delete this.activator;\n  }\n\n  // cleanup hammer touch events\n  for (var event in this.listeners) {\n    if (this.listeners.hasOwnProperty(event)) {\n      delete this.listeners[event];\n    }\n  }\n  this.listeners = null;\n  this.hammer = null;\n\n  // give all components the opportunity to cleanup\n  this.components.forEach(component => component.destroy());\n\n  this.body = null;\n};\n\n\n/**\n * Set a custom time bar\n * @param {Date} time\n * @param {number} [id=undefined] Optional id of the custom time bar to be adjusted.\n */\nCore.prototype.setCustomTime = function (time, id) {\n  var customTimes = this.customTimes.filter(function (component) {\n    return id === component.options.id;\n  });\n\n  if (customTimes.length === 0) {\n    throw new Error('No custom time bar found with id ' + JSON.stringify(id))\n  }\n\n  if (customTimes.length > 0) {\n    customTimes[0].setCustomTime(time);\n  }\n};\n\n/**\n * Retrieve the current custom time.\n * @param {number} [id=undefined]    Id of the custom time bar.\n * @return {Date | undefined} customTime\n */\nCore.prototype.getCustomTime = function(id) {\n  var customTimes = this.customTimes.filter(function (component) {\n    return component.options.id === id;\n  });\n\n  if (customTimes.length === 0) {\n    throw new Error('No custom time bar found with id ' + JSON.stringify(id))\n  }\n  return customTimes[0].getCustomTime();\n};\n\n/**\n * Set a custom title for the custom time bar.\n * @param {String} [title] Custom title\n * @param {number} [id=undefined]    Id of the custom time bar.\n */\nCore.prototype.setCustomTimeTitle = function(title, id) {\n  var customTimes = this.customTimes.filter(function (component) {\n    return component.options.id === id;\n  });\n\n  if (customTimes.length === 0) {\n    throw new Error('No custom time bar found with id ' + JSON.stringify(id))\n  }\n  if (customTimes.length > 0) {\n    return customTimes[0].setCustomTitle(title);\n  }\n};\n\n/**\n * Retrieve meta information from an event.\n * Should be overridden by classes extending Core\n * @param {Event} event\n * @return {Object} An object with related information.\n */\nCore.prototype.getEventProperties = function (event) {\n  return { event: event };\n};\n\n/**\n * Add custom vertical bar\n * @param {Date | String | Number} [time]  A Date, unix timestamp, or\n *                                         ISO date string. Time point where\n *                                         the new bar should be placed.\n *                                         If not provided, `new Date()` will\n *                                         be used.\n * @param {Number | String} [id=undefined] Id of the new bar. Optional\n * @return {Number | String}               Returns the id of the new bar\n */\nCore.prototype.addCustomTime = function (time, id) {\n  var timestamp = time !== undefined\n      ? util.convert(time, 'Date').valueOf()\n      : new Date();\n\n  var exists = this.customTimes.some(function (customTime) {\n    return customTime.options.id === id;\n  });\n  if (exists) {\n    throw new Error('A custom time with id ' + JSON.stringify(id) + ' already exists');\n  }\n\n  var customTime = new CustomTime(this.body, util.extend({}, this.options, {\n    time : timestamp,\n    id : id\n  }));\n\n  this.customTimes.push(customTime);\n  this.components.push(customTime);\n  this._redraw();\n\n  return id;\n};\n\n/**\n * Remove previously added custom bar\n * @param {int} id ID of the custom bar to be removed\n * @return {boolean} True if the bar exists and is removed, false otherwise\n */\nCore.prototype.removeCustomTime = function (id) {\n  var customTimes = this.customTimes.filter(function (bar) {\n    return (bar.options.id === id);\n  });\n\n  if (customTimes.length === 0) {\n    throw new Error('No custom time bar found with id ' + JSON.stringify(id))\n  }\n\n  customTimes.forEach(function (customTime) {\n    this.customTimes.splice(this.customTimes.indexOf(customTime), 1);\n    this.components.splice(this.components.indexOf(customTime), 1);\n    customTime.destroy();\n  }.bind(this))\n};\n\n\n/**\n * Get the id's of the currently visible items.\n * @returns {Array} The ids of the visible items\n */\nCore.prototype.getVisibleItems = function() {\n  return this.itemSet && this.itemSet.getVisibleItems() || [];\n};\n\n/**\n * Set Core window such that it fits all items\n * @param {Object} [options]  Available options:\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n */\nCore.prototype.fit = function(options) {\n  var range = this.getDataRange();\n\n  // skip range set if there is no min and max date\n  if (range.min === null && range.max === null) {\n    return;\n  }\n\n  // apply a margin of 1% left and right of the data\n  var interval = range.max - range.min;\n  var min = new Date(range.min.valueOf() - interval * 0.01);\n  var max = new Date(range.max.valueOf() + interval * 0.01);\n  var animation = (options && options.animation !== undefined) ? options.animation : true;\n  this.range.setRange(min, max, animation);\n};\n\n/**\n * Calculate the data range of the items start and end dates\n * @returns {{min: Date | null, max: Date | null}}\n * @protected\n */\nCore.prototype.getDataRange = function() {\n  // must be implemented by Timeline and Graph2d\n  throw new Error('Cannot invoke abstract method getDataRange');\n};\n\n/**\n * Set the visible window. Both parameters are optional, you can change only\n * start or only end. Syntax:\n *\n *     TimeLine.setWindow(start, end)\n *     TimeLine.setWindow(start, end, options)\n *     TimeLine.setWindow(range)\n *\n * Where start and end can be a Date, number, or string, and range is an\n * object with properties start and end.\n *\n * @param {Date | Number | String | Object} [start] Start date of visible window\n * @param {Date | Number | String} [end]            End date of visible window\n * @param {Object} [options]  Available options:\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n */\nCore.prototype.setWindow = function(start, end, options) {\n  var animation;\n  if (arguments.length == 1) {\n    var range = arguments[0];\n    animation = (range.animation !== undefined) ? range.animation : true;\n    this.range.setRange(range.start, range.end, animation);\n  }\n  else {\n    animation = (options && options.animation !== undefined) ? options.animation : true;\n    this.range.setRange(start, end, animation);\n  }\n};\n\n/**\n * Move the window such that given time is centered on screen.\n * @param {Date | Number | String} time\n * @param {Object} [options]  Available options:\n *                                `animation: boolean | {duration: number, easingFunction: string}`\n *                                    If true (default), the range is animated\n *                                    smoothly to the new window. An object can be\n *                                    provided to specify duration and easing function.\n *                                    Default duration is 500 ms, and default easing\n *                                    function is 'easeInOutQuad'.\n */\nCore.prototype.moveTo = function(time, options) {\n  var interval = this.range.end - this.range.start;\n  var t = util.convert(time, 'Date').valueOf();\n\n  var start = t - interval / 2;\n  var end = t + interval / 2;\n  var animation = (options && options.animation !== undefined) ? options.animation : true;\n\n  this.range.setRange(start, end, animation);\n};\n\n/**\n * Get the visible window\n * @return {{start: Date, end: Date}}   Visible range\n */\nCore.prototype.getWindow = function() {\n  var range = this.range.getRange();\n  return {\n    start: new Date(range.start),\n    end: new Date(range.end)\n  };\n};\n\n/**\n * Zoom in the window such that given time is centered on screen.\n * @param {Number} percentage - must be between [0..1]\n */\nCore.prototype.zoomIn = function(percentage) {\n  if (!percentage || percentage < 0 || percentage > 1) return\n  var range = this.getWindow();\n  var start = range.start.valueOf();\n  var end = range.end.valueOf();\n  var interval = end - start;\n  var newInterval = interval / (1 + percentage);\n  var distance = (interval - newInterval) / 2;\n  var newStart = start + distance;\n  var newEnd = end - distance;\n\n  this.setWindow({\n    start   : newStart,\n    end     : newEnd\n  });\n};\n\n/**\n * Zoom out the window such that given time is centered on screen.\n * @param {Number} percentage - must be between [0..1]\n */\nCore.prototype.zoomOut = function(percentage) {\n  if (!percentage || percentage < 0 || percentage > 1) return\n  var range = this.getWindow();\n  var start = range.start.valueOf();\n  var end = range.end.valueOf();\n  var interval = end - start;\n  var newStart = start - interval * percentage / 2;\n  var newEnd = end + interval * percentage / 2;\n\n  this.setWindow({\n    start   : newStart,\n    end     : newEnd\n  });\n};\n\n/**\n * Force a redraw. Can be overridden by implementations of Core\n *\n * Note: this function will be overridden on construction with a trottled version\n */\nCore.prototype.redraw = function() {\n  this._redraw();\n};\n\n/**\n * Redraw for internal use. Redraws all components. See also the public\n * method redraw.\n * @protected\n */\nCore.prototype._redraw = function() {\n  this.redrawCount++;\n  var resized = false;\n  var options = this.options;\n  var props = this.props;\n  var dom = this.dom;\n\n  if (!dom || !dom.container || dom.root.offsetWidth == 0) return; // when destroyed, or invisible\n\n  DateUtil.updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates);\n\n  // update class names\n  if (options.orientation == 'top') {\n    util.addClassName(dom.root, 'vis-top');\n    util.removeClassName(dom.root, 'vis-bottom');\n  }\n  else {\n    util.removeClassName(dom.root, 'vis-top');\n    util.addClassName(dom.root, 'vis-bottom');\n  }\n\n  // update root width and height options\n  dom.root.style.maxHeight = util.option.asSize(options.maxHeight, '');\n  dom.root.style.minHeight = util.option.asSize(options.minHeight, '');\n  dom.root.style.width = util.option.asSize(options.width, '');\n\n  // calculate border widths\n  props.border.left   = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2;\n  props.border.right  = props.border.left;\n  props.border.top    = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2;\n  props.border.bottom = props.border.top;\n  props.borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight;\n  props.borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth;\n\n  // workaround for a bug in IE: the clientWidth of an element with\n  // a height:0px and overflow:hidden is not calculated and always has value 0\n  if (dom.centerContainer.clientHeight === 0) {\n    props.border.left = props.border.top;\n    props.border.right  = props.border.left;\n  }\n  if (dom.root.clientHeight === 0) {\n    props.borderRootWidth = props.borderRootHeight;\n  }\n\n  // calculate the heights. If any of the side panels is empty, we set the height to\n  // minus the border width, such that the border will be invisible\n  props.center.height = dom.center.offsetHeight;\n  props.left.height   = dom.left.offsetHeight;\n  props.right.height  = dom.right.offsetHeight;\n  props.top.height    = dom.top.clientHeight    || -props.border.top;\n  props.bottom.height = dom.bottom.clientHeight || -props.border.bottom;\n\n  // TODO: compensate borders when any of the panels is empty.\n\n  // apply auto height\n  // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM)\n  var contentHeight = Math.max(props.left.height, props.center.height, props.right.height);\n  var autoHeight = props.top.height + contentHeight + props.bottom.height +\n    props.borderRootHeight + props.border.top + props.border.bottom;\n  dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px');\n\n  // calculate heights of the content panels\n  props.root.height = dom.root.offsetHeight;\n  props.background.height = props.root.height - props.borderRootHeight;\n  var containerHeight = props.root.height - props.top.height - props.bottom.height -\n    props.borderRootHeight;\n  props.centerContainer.height  = containerHeight;\n  props.leftContainer.height    = containerHeight;\n  props.rightContainer.height   = props.leftContainer.height;\n\n  // calculate the widths of the panels\n  props.root.width = dom.root.offsetWidth;\n  props.background.width = props.root.width - props.borderRootWidth;\n\n  if (!this.initialDrawDone) {\n    props.scrollbarWidth = util.getScrollBarWidth();\n  }\n\n  if (options.verticalScroll) {\n    if (options.rtl) {\n      props.left.width = dom.leftContainer.clientWidth || -props.border.left;\n      props.right.width = dom.rightContainer.clientWidth + props.scrollbarWidth || -props.border.right;\n    } else {\n      props.left.width = dom.leftContainer.clientWidth + props.scrollbarWidth || -props.border.left;\n      props.right.width = dom.rightContainer.clientWidth || -props.border.right;\n    }\n  } else {\n    props.left.width = dom.leftContainer.clientWidth  || -props.border.left;\n    props.right.width = dom.rightContainer.clientWidth || -props.border.right;\n  }\n\n  this._setDOM();\n\n  // update the scrollTop, feasible range for the offset can be changed\n  // when the height of the Core or of the contents of the center changed\n  var offset = this._updateScrollTop();\n\n  // reposition the scrollable contents\n  if (options.orientation.item != 'top') {\n    offset += Math.max(props.centerContainer.height - props.center.height -\n      props.border.top - props.border.bottom, 0);\n  }\n  dom.center.style.top  = offset + 'px';\n  \n  // show shadows when vertical scrolling is available\n  var visibilityTop = props.scrollTop == 0 ? 'hidden' : '';\n  var visibilityBottom = props.scrollTop == props.scrollTopMin ? 'hidden' : '';\n  dom.shadowTop.style.visibility          = visibilityTop;\n  dom.shadowBottom.style.visibility       = visibilityBottom;\n  dom.shadowTopLeft.style.visibility      = visibilityTop;\n  dom.shadowBottomLeft.style.visibility   = visibilityBottom;\n  dom.shadowTopRight.style.visibility     = visibilityTop;\n  dom.shadowBottomRight.style.visibility  = visibilityBottom;\n\n  if (options.verticalScroll) {\n    dom.rightContainer.className = 'vis-panel vis-right vis-vertical-scroll';\n    dom.leftContainer.className = 'vis-panel vis-left vis-vertical-scroll';\n\n    dom.shadowTopRight.style.visibility     = \"hidden\";\n    dom.shadowBottomRight.style.visibility  = \"hidden\";\n    dom.shadowTopLeft.style.visibility      = \"hidden\";\n    dom.shadowBottomLeft.style.visibility   = \"hidden\";\n\n    dom.left.style.top    = '0px';\n    dom.right.style.top   = '0px';\n  }\n\n  if (!options.verticalScroll ||  props.center.height < props.centerContainer.height) {\n    dom.left.style.top    = offset + 'px';\n    dom.right.style.top   = offset + 'px';\n    dom.rightContainer.className = dom.rightContainer.className.replace(new RegExp('(?:^|\\\\s)'+ 'vis-vertical-scroll' + '(?:\\\\s|$)'), ' ');\n    dom.leftContainer.className = dom.leftContainer.className.replace(new RegExp('(?:^|\\\\s)'+ 'vis-vertical-scroll' + '(?:\\\\s|$)'), ' ');\n    props.left.width = dom.leftContainer.clientWidth  || -props.border.left;\n    props.right.width = dom.rightContainer.clientWidth || -props.border.right;\n    this._setDOM();\n  }\n\n  // enable/disable vertical panning\n  var contentsOverflow = props.center.height > props.centerContainer.height;\n  this.hammer.get('pan').set({\n    direction: contentsOverflow ? Hammer.DIRECTION_ALL : Hammer.DIRECTION_HORIZONTAL\n  });\n\n  // redraw all components\n  this.components.forEach(function (component) {\n    resized = component.redraw() || resized;\n  });\n  var MAX_REDRAW = 5;\n  if (resized) {\n    if (this.redrawCount < MAX_REDRAW) {\n      this.body.emitter.emit('_change');\n      return;\n    }\n    else {\n      console.log('WARNING: infinite loop in redraw?');\n    }\n  } else {\n    this.redrawCount = 0;\n  }\n  this.initialDrawDone = true;\n\n  //Emit public 'changed' event for UI updates, see issue #1592\n  this.body.emitter.emit(\"changed\");\n};\n\nCore.prototype._setDOM = function () {\n  var props = this.props;\n  var dom = this.dom;\n\n  props.leftContainer.width = props.left.width;\n  props.rightContainer.width = props.right.width;\n  var centerWidth = props.root.width - props.left.width - props.right.width - props.borderRootWidth;\n  props.center.width          = centerWidth;\n  props.centerContainer.width = centerWidth;\n  props.top.width             = centerWidth;\n  props.bottom.width          = centerWidth;\n\n  // resize the panels\n  dom.background.style.height           = props.background.height + 'px';\n  dom.backgroundVertical.style.height   = props.background.height + 'px';\n  dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px';\n  dom.centerContainer.style.height      = props.centerContainer.height + 'px';\n  dom.leftContainer.style.height        = props.leftContainer.height + 'px';\n  dom.rightContainer.style.height       = props.rightContainer.height + 'px';\n\n  dom.background.style.width            = props.background.width + 'px';\n  dom.backgroundVertical.style.width    = props.centerContainer.width + 'px';\n  dom.backgroundHorizontal.style.width  = props.background.width + 'px';\n  dom.centerContainer.style.width       = props.center.width + 'px';\n  dom.top.style.width                   = props.top.width + 'px';\n  dom.bottom.style.width                = props.bottom.width + 'px';\n\n  // reposition the panels\n  dom.background.style.left           = '0';\n  dom.background.style.top            = '0';\n  dom.backgroundVertical.style.left   = (props.left.width + props.border.left) + 'px';\n  dom.backgroundVertical.style.top    = '0';\n  dom.backgroundHorizontal.style.left = '0';\n  dom.backgroundHorizontal.style.top  = props.top.height + 'px';\n  dom.centerContainer.style.left      = props.left.width + 'px';\n  dom.centerContainer.style.top       = props.top.height + 'px';\n  dom.leftContainer.style.left        = '0';\n  dom.leftContainer.style.top         = props.top.height + 'px';\n  dom.rightContainer.style.left       = (props.left.width + props.center.width) + 'px';\n  dom.rightContainer.style.top        = props.top.height + 'px';\n  dom.top.style.left                  = props.left.width + 'px';\n  dom.top.style.top                   = '0';\n  dom.bottom.style.left               = props.left.width + 'px';\n  dom.bottom.style.top                = (props.top.height + props.centerContainer.height) + 'px';\n  dom.center.style.left               = '0';\n  dom.left.style.left                 = '0';\n  dom.right.style.left                = '0';\n}\n\n// TODO: deprecated since version 1.1.0, remove some day\nCore.prototype.repaint = function () {\n  throw new Error('Function repaint is deprecated. Use redraw instead.');\n};\n\n/**\n * Set a current time. This can be used for example to ensure that a client's\n * time is synchronized with a shared server time.\n * Only applicable when option `showCurrentTime` is true.\n * @param {Date | String | Number} time     A Date, unix timestamp, or\n *                                          ISO date string.\n */\nCore.prototype.setCurrentTime = function(time) {\n  if (!this.currentTime) {\n    throw new Error('Option showCurrentTime must be true');\n  }\n\n  this.currentTime.setCurrentTime(time);\n};\n\n/**\n * Get the current time.\n * Only applicable when option `showCurrentTime` is true.\n * @return {Date} Returns the current time.\n */\nCore.prototype.getCurrentTime = function() {\n  if (!this.currentTime) {\n    throw new Error('Option showCurrentTime must be true');\n  }\n\n  return this.currentTime.getCurrentTime();\n};\n\n/**\n * Convert a position on screen (pixels) to a datetime\n * @param {int}     x    Position on the screen in pixels\n * @return {Date}   time The datetime the corresponds with given position x\n * @protected\n */\n// TODO: move this function to Range\nCore.prototype._toTime = function(x) {\n  return DateUtil.toTime(this, x, this.props.center.width);\n};\n\n/**\n * Convert a position on the global screen (pixels) to a datetime\n * @param {int}     x    Position on the screen in pixels\n * @return {Date}   time The datetime the corresponds with given position x\n * @protected\n */\n// TODO: move this function to Range\nCore.prototype._toGlobalTime = function(x) {\n  return DateUtil.toTime(this, x, this.props.root.width);\n  //var conversion = this.range.conversion(this.props.root.width);\n  //return new Date(x / conversion.scale + conversion.offset);\n};\n\n/**\n * Convert a datetime (Date object) into a position on the screen\n * @param {Date}   time A date\n * @return {int}   x    The position on the screen in pixels which corresponds\n *                      with the given date.\n * @protected\n */\n// TODO: move this function to Range\nCore.prototype._toScreen = function(time) {\n  return DateUtil.toScreen(this, time, this.props.center.width);\n};\n\n\n\n/**\n * Convert a datetime (Date object) into a position on the root\n * This is used to get the pixel density estimate for the screen, not the center panel\n * @param {Date}   time A date\n * @return {int}   x    The position on root in pixels which corresponds\n *                      with the given date.\n * @protected\n */\n// TODO: move this function to Range\nCore.prototype._toGlobalScreen = function(time) {\n  return DateUtil.toScreen(this, time, this.props.root.width);\n  //var conversion = this.range.conversion(this.props.root.width);\n  //return (time.valueOf() - conversion.offset) * conversion.scale;\n};\n\n\n/**\n * Initialize watching when option autoResize is true\n * @private\n */\nCore.prototype._initAutoResize = function () {\n  if (this.options.autoResize == true) {\n    this._startAutoResize();\n  }\n  else {\n    this._stopAutoResize();\n  }\n};\n\n/**\n * Watch for changes in the size of the container. On resize, the Panel will\n * automatically redraw itself.\n * @private\n */\nCore.prototype._startAutoResize = function () {\n  var me = this;\n\n  this._stopAutoResize();\n\n  this._onResize = function() {\n    if (me.options.autoResize != true) {\n      // stop watching when the option autoResize is changed to false\n      me._stopAutoResize();\n      return;\n    }\n\n    if (me.dom.root) {\n      // check whether the frame is resized\n      // Note: we compare offsetWidth here, not clientWidth. For some reason,\n      // IE does not restore the clientWidth from 0 to the actual width after\n      // changing the timeline's container display style from none to visible\n      if ((me.dom.root.offsetWidth != me.props.lastWidth) ||\n        (me.dom.root.offsetHeight != me.props.lastHeight)) {\n        me.props.lastWidth = me.dom.root.offsetWidth;\n        me.props.lastHeight = me.dom.root.offsetHeight;\n        me.props.scrollbarWidth = util.getScrollBarWidth();\n\n        me.body.emitter.emit('_change');\n      }\n    }\n  };\n\n  // add event listener to window resize\n  util.addEventListener(window, 'resize', this._onResize);\n\n  //Prevent initial unnecessary redraw\n  if (me.dom.root) {\n      me.props.lastWidth = me.dom.root.offsetWidth;\n      me.props.lastHeight = me.dom.root.offsetHeight;\n  }\n\n  this.watchTimer = setInterval(this._onResize, 1000);\n};\n\n/**\n * Stop watching for a resize of the frame.\n * @private\n */\nCore.prototype._stopAutoResize = function () {\n  if (this.watchTimer) {\n    clearInterval(this.watchTimer);\n    this.watchTimer = undefined;\n  }\n\n  // remove event listener on window.resize\n  if (this._onResize) {\n    util.removeEventListener(window, 'resize', this._onResize);\n    this._onResize = null;\n  }\n};\n\n/**\n * Start moving the timeline vertically\n * @param {Event} event\n * @private\n */\nCore.prototype._onTouch = function (event) {\n  this.touch.allowDragging = true;\n  this.touch.initialScrollTop = this.props.scrollTop;\n};\n\n/**\n * Start moving the timeline vertically\n * @param {Event} event\n * @private\n */\nCore.prototype._onPinch = function (event) {\n  this.touch.allowDragging = false;\n};\n\n/**\n * Move the timeline vertically\n * @param {Event} event\n * @private\n */\nCore.prototype._onDrag = function (event) {\n  if (!event) return\n  // refuse to drag when we where pinching to prevent the timeline make a jump\n  // when releasing the fingers in opposite order from the touch screen\n  if (!this.touch.allowDragging) return;\n\n  var delta = event.deltaY;\n\n  var oldScrollTop = this._getScrollTop();\n  var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta);\n\n  if (this.options.verticalScroll) {\n    this.dom.left.parentNode.scrollTop = -this.props.scrollTop;\n    this.dom.right.parentNode.scrollTop = -this.props.scrollTop;\n  }\n\n  if (newScrollTop != oldScrollTop) {\n    this.emit(\"verticalDrag\");\n  }\n};\n\n/**\n * Apply a scrollTop\n * @param {Number} scrollTop\n * @returns {Number} scrollTop  Returns the applied scrollTop\n * @private\n */\nCore.prototype._setScrollTop = function (scrollTop) {\n  this.props.scrollTop = scrollTop;\n  this._updateScrollTop();\n  return this.props.scrollTop;\n};\n\n/**\n * Update the current scrollTop when the height of  the containers has been changed\n * @returns {Number} scrollTop  Returns the applied scrollTop\n * @private\n */\nCore.prototype._updateScrollTop = function () {\n  // recalculate the scrollTopMin\n  var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero\n  if (scrollTopMin != this.props.scrollTopMin) {\n    // in case of bottom orientation, change the scrollTop such that the contents\n    // do not move relative to the time axis at the bottom\n    if (this.options.orientation.item != 'top') {\n      this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin);\n    }\n    this.props.scrollTopMin = scrollTopMin;\n  }\n\n  // limit the scrollTop to the feasible scroll range\n  if (this.props.scrollTop > 0) this.props.scrollTop = 0;\n  if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin;\n\n  if (this.options.verticalScroll) {\n    this.dom.left.parentNode.scrollTop = -this.props.scrollTop;\n    this.dom.right.parentNode.scrollTop = -this.props.scrollTop;\n  }\n\n  return this.props.scrollTop;\n};\n\n/**\n * Get the current scrollTop\n * @returns {number} scrollTop\n * @private\n */\nCore.prototype._getScrollTop = function () {\n  return this.props.scrollTop;\n};\n\n/**\n * Load a configurator\n * @return {Object}\n * @private\n */\nCore.prototype._createConfigurator = function () {\n  throw new Error('Cannot invoke abstract method _createConfigurator');\n};\n\nmodule.exports = Core;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/Core.js","var Hammer = require('../../module/hammer');\nvar util = require('../../util');\nvar DataSet = require('../../DataSet');\nvar DataView = require('../../DataView');\nvar TimeStep = require('../TimeStep');\nvar Component = require('./Component');\nvar Group = require('./Group');\nvar BackgroundGroup = require('./BackgroundGroup');\nvar BoxItem = require('./item/BoxItem');\nvar PointItem = require('./item/PointItem');\nvar RangeItem = require('./item/RangeItem');\nvar BackgroundItem = require('./item/BackgroundItem');\nimport Popup from '../../shared/Popup';\n\n\nvar UNGROUPED = '__ungrouped__';   // reserved group id for ungrouped items\nvar BACKGROUND = '__background__'; // reserved group id for background items without group\n\n/**\n * An ItemSet holds a set of items and ranges which can be displayed in a\n * range. The width is determined by the parent of the ItemSet, and the height\n * is determined by the size of the items.\n * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body\n * @param {Object} [options]      See ItemSet.setOptions for the available options.\n * @constructor ItemSet\n * @extends Component\n */\nfunction ItemSet(body, options) {\n  this.body = body;\n  this.defaultOptions = {\n    type: null,  // 'box', 'point', 'range', 'background'\n    orientation: {\n      item: 'bottom'   // item orientation: 'top' or 'bottom'\n    },\n    align: 'auto', // alignment of box items\n    stack: true,\n    stackSubgroups: true,\n    groupOrderSwap: function(fromGroup, toGroup, groups) {\n    \tvar targetOrder = toGroup.order;\n    \ttoGroup.order = fromGroup.order;\n    \tfromGroup.order = targetOrder;\n    },\n    groupOrder: 'order',\n\n    selectable: true,\n    multiselect: false,\n    itemsAlwaysDraggable: false,\n\n    editable: {\n      updateTime: false,\n      updateGroup: false,\n      add: false,\n      remove: false,\n      overrideItems: false\n    },\n\n    groupEditable: {\n      order: false,\n      add: false,\n      remove: false\n    },    \n    \n    snap: TimeStep.snap,\n\n    onAdd: function (item, callback) {\n      callback(item);\n    },\n    onUpdate: function (item, callback) {\n      callback(item);\n    },\n    onMove: function (item, callback) {\n      callback(item);\n    },\n    onRemove: function (item, callback) {\n      callback(item);\n    },\n    onMoving: function (item, callback) {\n      callback(item);\n    },\n    onAddGroup: function (item, callback) {\n      callback(item);\n    },\n    onMoveGroup: function (item, callback) {\n      callback(item);\n    },\n    onRemoveGroup: function (item, callback) {\n      callback(item);\n    },\n\n    margin: {\n      item: {\n        horizontal: 10,\n        vertical: 10\n      },\n      axis: 20\n    },\n\n    tooltip: {\n      followMouse: false,\n      overflowMethod: 'flip'\n    },\n\n    tooltipOnItemUpdateTime: false\n  };\n\n  // options is shared by this ItemSet and all its items\n  this.options = util.extend({}, this.defaultOptions);\n  this.options.rtl = options.rtl;\n\n  // options for getting items from the DataSet with the correct type\n  this.itemOptions = {\n    type: {start: 'Date', end: 'Date'}\n  };\n\n  this.conversion = {\n    toScreen: body.util.toScreen,\n    toTime: body.util.toTime\n  };\n  this.dom = {};\n  this.props = {};\n  this.hammer = null;\n\n  var me = this;\n  this.itemsData = null;    // DataSet\n  this.groupsData = null;   // DataSet\n\n  // listeners for the DataSet of the items\n  this.itemListeners = {\n    'add': function (event, params, senderId) {\n      me._onAdd(params.items);\n    },\n    'update': function (event, params, senderId) {\n      me._onUpdate(params.items);\n    },\n    'remove': function (event, params, senderId) {\n      me._onRemove(params.items);\n    }\n  };\n\n  // listeners for the DataSet of the groups\n  this.groupListeners = {\n    'add': function (event, params, senderId) {\n      me._onAddGroups(params.items);\n    },\n    'update': function (event, params, senderId) {\n      me._onUpdateGroups(params.items);\n    },\n    'remove': function (event, params, senderId) {\n      me._onRemoveGroups(params.items);\n    }\n  };\n\n  this.items = {};      // object with an Item for every data item\n  this.groups = {};     // Group object for every group\n  this.groupIds = [];\n\n  this.selection = [];  // list with the ids of all selected nodes\n  this.stackDirty = true; // if true, all items will be restacked on next redraw\n\n  this.touchParams = {}; // stores properties while dragging\n  this.groupTouchParams = {};\n  // create the HTML DOM\n\n  this._create();\n\n  this.setOptions(options);\n}\n\nItemSet.prototype = new Component();\n\n// available item types will be registered here\nItemSet.types = {\n  background: BackgroundItem,\n  box: BoxItem,\n  range: RangeItem,\n  point: PointItem\n};\n\n/**\n * Create the HTML DOM for the ItemSet\n */\nItemSet.prototype._create = function(){\n  var frame = document.createElement('div');\n  frame.className = 'vis-itemset';\n  frame['timeline-itemset'] = this;\n  this.dom.frame = frame;\n\n  // create background panel\n  var background = document.createElement('div');\n  background.className = 'vis-background';\n  frame.appendChild(background);\n  this.dom.background = background;\n\n  // create foreground panel\n  var foreground = document.createElement('div');\n  foreground.className = 'vis-foreground';\n  frame.appendChild(foreground);\n  this.dom.foreground = foreground;\n\n  // create axis panel\n  var axis = document.createElement('div');\n  axis.className = 'vis-axis';\n  this.dom.axis = axis;\n\n  // create labelset\n  var labelSet = document.createElement('div');\n  labelSet.className = 'vis-labelset';\n  this.dom.labelSet = labelSet;\n\n  // create ungrouped Group\n  this._updateUngrouped();\n\n  // create background Group\n  var backgroundGroup = new BackgroundGroup(BACKGROUND, null, this);\n  backgroundGroup.show();\n  this.groups[BACKGROUND] = backgroundGroup;\n\n  // attach event listeners\n  // Note: we bind to the centerContainer for the case where the height\n  //       of the center container is larger than of the ItemSet, so we\n  //       can click in the empty area to create a new item or deselect an item.\n  this.hammer = new Hammer(this.body.dom.centerContainer);\n\n  // drag items when selected\n  this.hammer.on('hammer.input', function (event) {\n    if (event.isFirst) {\n      this._onTouch(event);\n    }\n  }.bind(this));\n  this.hammer.on('panstart', this._onDragStart.bind(this));\n  this.hammer.on('panmove',  this._onDrag.bind(this));\n  this.hammer.on('panend',   this._onDragEnd.bind(this));\n  this.hammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_HORIZONTAL});\n\n  // single select (or unselect) when tapping an item\n  this.hammer.on('tap',  this._onSelectItem.bind(this));\n\n  // multi select when holding mouse/touch, or on ctrl+click\n  this.hammer.on('press', this._onMultiSelectItem.bind(this));\n\n  // add item on doubletap\n  this.hammer.on('doubletap', this._onAddItem.bind(this));\n\n  if (this.options.rtl) {\n    this.groupHammer = new Hammer(this.body.dom.rightContainer);\n  } else {\n    this.groupHammer = new Hammer(this.body.dom.leftContainer);\n  }\n  \n  this.groupHammer.on('tap',      this._onGroupClick.bind(this));\n  this.groupHammer.on('panstart', this._onGroupDragStart.bind(this));\n  this.groupHammer.on('panmove',  this._onGroupDrag.bind(this));\n  this.groupHammer.on('panend',   this._onGroupDragEnd.bind(this));\n  this.groupHammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_VERTICAL});\n  \n  this.body.dom.centerContainer.addEventListener('mouseover', this._onMouseOver.bind(this));\n  this.body.dom.centerContainer.addEventListener('mouseout', this._onMouseOut.bind(this));\n  this.body.dom.centerContainer.addEventListener('mousemove', this._onMouseMove.bind(this));\n  // right-click on timeline \n  this.body.dom.centerContainer.addEventListener('contextmenu', this._onDragEnd.bind(this));\n\n  // attach to the DOM\n  this.show();\n};\n\n/**\n * Set options for the ItemSet. Existing options will be extended/overwritten.\n * @param {Object} [options] The following options are available:\n *                           {String} type\n *                              Default type for the items. Choose from 'box'\n *                              (default), 'point', 'range', or 'background'.\n *                              The default style can be overwritten by\n *                              individual items.\n *                           {String} align\n *                              Alignment for the items, only applicable for\n *                              BoxItem. Choose 'center' (default), 'left', or\n *                              'right'.\n *                           {String} orientation.item\n *                              Orientation of the item set. Choose 'top' or\n *                              'bottom' (default).\n *                           {Function} groupOrder\n *                              A sorting function for ordering groups\n *                           {Boolean} stack\n *                              If true (default), items will be stacked on\n *                              top of each other.\n *                           {Number} margin.axis\n *                              Margin between the axis and the items in pixels.\n *                              Default is 20.\n *                           {Number} margin.item.horizontal\n *                              Horizontal margin between items in pixels.\n *                              Default is 10.\n *                           {Number} margin.item.vertical\n *                              Vertical Margin between items in pixels.\n *                              Default is 10.\n *                           {Number} margin.item\n *                              Margin between items in pixels in both horizontal\n *                              and vertical direction. Default is 10.\n *                           {Number} margin\n *                              Set margin for both axis and items in pixels.\n *                           {Boolean} selectable\n *                              If true (default), items can be selected.\n *                           {Boolean} multiselect\n *                              If true, multiple items can be selected.\n *                              False by default.\n *                           {Boolean} editable\n *                              Set all editable options to true or false\n *                           {Boolean} editable.updateTime\n *                              Allow dragging an item to an other moment in time\n *                           {Boolean} editable.updateGroup\n *                              Allow dragging an item to an other group\n *                           {Boolean} editable.add\n *                              Allow creating new items on double tap\n *                           {Boolean} editable.remove\n *                              Allow removing items by clicking the delete button\n *                              top right of a selected item.\n *                           {Function(item: Item, callback: Function)} onAdd\n *                              Callback function triggered when an item is about to be added:\n *                              when the user double taps an empty space in the Timeline.\n *                           {Function(item: Item, callback: Function)} onUpdate\n *                              Callback function fired when an item is about to be updated.\n *                              This function typically has to show a dialog where the user\n *                              change the item. If not implemented, nothing happens.\n *                           {Function(item: Item, callback: Function)} onMove\n *                              Fired when an item has been moved. If not implemented,\n *                              the move action will be accepted.\n *                           {Function(item: Item, callback: Function)} onRemove\n *                              Fired when an item is about to be deleted.\n *                              If not implemented, the item will be always removed.\n */\nItemSet.prototype.setOptions = function(options) {\n  if (options) {\n    // copy all options that we know\n    var fields = [\n      'type', 'rtl', 'align', 'order', 'stack', 'stackSubgroups', 'selectable', 'multiselect', 'itemsAlwaysDraggable', \n      'multiselectPerGroup', 'groupOrder', 'dataAttributes', 'template', 'groupTemplate', 'visibleFrameTemplate',\n      'hide', 'snap', 'groupOrderSwap', 'tooltip', 'tooltipOnItemUpdateTime'\n    ];\n    util.selectiveExtend(fields, this.options, options);\n\n    if ('orientation' in options) {\n      if (typeof options.orientation === 'string') {\n        this.options.orientation.item = options.orientation === 'top' ? 'top' : 'bottom';\n      }\n      else if (typeof options.orientation === 'object' && 'item' in options.orientation) {\n        this.options.orientation.item = options.orientation.item;\n      }\n    }\n\n    if ('margin' in options) {\n      if (typeof options.margin === 'number') {\n        this.options.margin.axis = options.margin;\n        this.options.margin.item.horizontal = options.margin;\n        this.options.margin.item.vertical = options.margin;\n      }\n      else if (typeof options.margin === 'object') {\n        util.selectiveExtend(['axis'], this.options.margin, options.margin);\n        if ('item' in options.margin) {\n          if (typeof options.margin.item === 'number') {\n            this.options.margin.item.horizontal = options.margin.item;\n            this.options.margin.item.vertical = options.margin.item;\n          }\n          else if (typeof options.margin.item === 'object') {\n            util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item);\n          }\n        }\n      }\n    }\n\n    if ('editable' in options) {\n      if (typeof options.editable === 'boolean') {\n        this.options.editable.updateTime    = options.editable;\n        this.options.editable.updateGroup   = options.editable;\n        this.options.editable.add           = options.editable;\n        this.options.editable.remove        = options.editable;\n        this.options.editable.overrideItems = false;\n      }\n      else if (typeof options.editable === 'object') {\n        util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove', 'overrideItems'], this.options.editable, options.editable);\n      }\n    }\n\n    if ('groupEditable' in options) {\n      if (typeof options.groupEditable === 'boolean') {\n        this.options.groupEditable.order  = options.groupEditable;\n        this.options.groupEditable.add    = options.groupEditable;\n        this.options.groupEditable.remove = options.groupEditable;\n      }\n      else if (typeof options.groupEditable === 'object') {\n        util.selectiveExtend(['order', 'add', 'remove'], this.options.groupEditable, options.groupEditable);\n      }\n    }\n\n    // callback functions\n    var addCallback = (function (name) {\n      var fn = options[name];\n      if (fn) {\n        if (!(fn instanceof Function)) {\n          throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)');\n        }\n        this.options[name] = fn;\n      }\n    }).bind(this);\n    ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving', 'onAddGroup', 'onMoveGroup', 'onRemoveGroup'].forEach(addCallback);\n\n    // force the itemSet to refresh: options like orientation and margins may be changed\n    this.markDirty();\n  }\n};\n\n/**\n * Mark the ItemSet dirty so it will refresh everything with next redraw.\n * Optionally, all items can be marked as dirty and be refreshed.\n * @param {{refreshItems: boolean}} [options]\n */\nItemSet.prototype.markDirty = function(options) {\n  this.groupIds = [];\n  this.stackDirty = true;\n\n  if (options && options.refreshItems) {\n    util.forEach(this.items, function (item) {\n      item.dirty = true;\n      if (item.displayed) item.redraw();\n    });\n  }\n};\n\n/**\n * Destroy the ItemSet\n */\nItemSet.prototype.destroy = function() {\n  this.hide();\n  this.setItems(null);\n  this.setGroups(null);\n\n  this.hammer = null;\n\n  this.body = null;\n  this.conversion = null;\n};\n\n/**\n * Hide the component from the DOM\n */\nItemSet.prototype.hide = function() {\n  // remove the frame containing the items\n  if (this.dom.frame.parentNode) {\n    this.dom.frame.parentNode.removeChild(this.dom.frame);\n  }\n\n  // remove the axis with dots\n  if (this.dom.axis.parentNode) {\n    this.dom.axis.parentNode.removeChild(this.dom.axis);\n  }\n\n  // remove the labelset containing all group labels\n  if (this.dom.labelSet.parentNode) {\n    this.dom.labelSet.parentNode.removeChild(this.dom.labelSet);\n  }\n};\n\n/**\n * Show the component in the DOM (when not already visible).\n * @return {Boolean} changed\n */\nItemSet.prototype.show = function() {\n  // show frame containing the items\n  if (!this.dom.frame.parentNode) {\n    this.body.dom.center.appendChild(this.dom.frame);\n  }\n\n  // show axis with dots\n  if (!this.dom.axis.parentNode) {\n    this.body.dom.backgroundVertical.appendChild(this.dom.axis);\n  }\n\n  // show labelset containing labels\n  if (!this.dom.labelSet.parentNode) {\n    if (this.options.rtl) {\n      this.body.dom.right.appendChild(this.dom.labelSet);\n    } else {\n      this.body.dom.left.appendChild(this.dom.labelSet);\n    }\n  }\n};\n\n/**\n * Set selected items by their id. Replaces the current selection\n * Unknown id's are silently ignored.\n * @param {string[] | string} [ids] An array with zero or more id's of the items to be\n *                                  selected, or a single item id. If ids is undefined\n *                                  or an empty array, all items will be unselected.\n */\nItemSet.prototype.setSelection = function(ids) {\n  var i, ii, id, item;\n\n  if (ids == undefined) ids = [];\n  if (!Array.isArray(ids)) ids = [ids];\n\n  // unselect currently selected items\n  for (i = 0, ii = this.selection.length; i < ii; i++) {\n    id = this.selection[i];\n    item = this.items[id];\n    if (item) item.unselect();\n  }\n\n  // select items\n  this.selection = [];\n  for (i = 0, ii = ids.length; i < ii; i++) {\n    id = ids[i];\n    item = this.items[id];\n    if (item) {\n      this.selection.push(id);\n      item.select();\n    }\n  }\n};\n\n/**\n * Get the selected items by their id\n * @return {Array} ids  The ids of the selected items\n */\nItemSet.prototype.getSelection = function() {\n  return this.selection.concat([]);\n};\n\n/**\n * Get the id's of the currently visible items.\n * @returns {Array} The ids of the visible items\n */\nItemSet.prototype.getVisibleItems = function() {\n  var range = this.body.range.getRange();\n\n  if (this.options.rtl) { \n    var right  = this.body.util.toScreen(range.start);\n    var left = this.body.util.toScreen(range.end);\n  } else {\n    var left  = this.body.util.toScreen(range.start);\n    var right = this.body.util.toScreen(range.end);\n  }\n\n  var ids = [];\n  for (var groupId in this.groups) {\n    if (this.groups.hasOwnProperty(groupId)) {\n      var group = this.groups[groupId];\n      var rawVisibleItems = group.visibleItems;\n\n      // filter the \"raw\" set with visibleItems into a set which is really\n      // visible by pixels\n      for (var i = 0; i < rawVisibleItems.length; i++) {\n        var item = rawVisibleItems[i];\n        // TODO: also check whether visible vertically\n        if (this.options.rtl) { \n          if ((item.right < left) && (item.right + item.width > right)) {\n            ids.push(item.id);\n          }\n        } else {\n          if ((item.left < right) && (item.left + item.width > left)) {\n            ids.push(item.id);\n          }\n        }\n      }\n    }\n  }\n\n  return ids;\n};\n\n/**\n * Deselect a selected item\n * @param {String | Number} id\n * @private\n */\nItemSet.prototype._deselect = function(id) {\n  var selection = this.selection;\n  for (var i = 0, ii = selection.length; i < ii; i++) {\n    if (selection[i] == id) { // non-strict comparison!\n      selection.splice(i, 1);\n      break;\n    }\n  }\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nItemSet.prototype.redraw = function() {\n  var margin = this.options.margin,\n      range = this.body.range,\n      asSize = util.option.asSize,\n      options = this.options,\n      orientation = options.orientation.item,\n      resized = false,\n      frame = this.dom.frame;\n\n  // recalculate absolute position (before redrawing groups)\n  this.props.top = this.body.domProps.top.height + this.body.domProps.border.top;\n\n  if (this.options.rtl) {\n    this.props.right = this.body.domProps.right.width + this.body.domProps.border.right;\n  } else {\n    this.props.left = this.body.domProps.left.width + this.body.domProps.border.left;\n  }\n\n  // update class name\n  frame.className = 'vis-itemset';\n\n  // reorder the groups (if needed)\n  resized = this._orderGroups() || resized;\n\n  // check whether zoomed (in that case we need to re-stack everything)\n  // TODO: would be nicer to get this as a trigger from Range\n  var visibleInterval = range.end - range.start;\n  var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth);\n  if (zoomed) this.stackDirty = true;\n  this.lastVisibleInterval = visibleInterval;\n  this.props.lastWidth = this.props.width;\n\n  var restack = this.stackDirty;\n  var firstGroup = this._firstGroup();\n  var firstMargin = {\n    item: margin.item,\n    axis: margin.axis\n  };\n  var nonFirstMargin = {\n    item: margin.item,\n    axis: margin.item.vertical / 2\n  };\n  var height = 0;\n  var minHeight = margin.axis + margin.item.vertical;\n\n  // redraw the background group\n  this.groups[BACKGROUND].redraw(range, nonFirstMargin, restack);\n\n  // redraw all regular groups\n  util.forEach(this.groups, function (group) {\n    var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin;\n    var groupResized = group.redraw(range, groupMargin, restack);\n    resized = groupResized || resized;\n    height += group.height;\n  });\n  height = Math.max(height, minHeight);\n  this.stackDirty = false;\n\n  // update frame height\n  frame.style.height  = asSize(height);\n\n  // calculate actual size\n  this.props.width = frame.offsetWidth;\n  this.props.height = height;\n\n  // reposition axis\n  this.dom.axis.style.top = asSize((orientation == 'top') ?\n      (this.body.domProps.top.height + this.body.domProps.border.top) :\n      (this.body.domProps.top.height + this.body.domProps.centerContainer.height));\n  if (this.options.rtl) {\n    this.dom.axis.style.right = '0';\n  } else {\n    this.dom.axis.style.left = '0';\n  }\n\n  this.initialItemSetDrawn = true;\n  // check if this component is resized\n  resized = this._isResized() || resized;\n\n  return resized;\n};\n\n/**\n * Get the first group, aligned with the axis\n * @return {Group | null} firstGroup\n * @private\n */\nItemSet.prototype._firstGroup = function() {\n  var firstGroupIndex = (this.options.orientation.item == 'top') ? 0 : (this.groupIds.length - 1);\n  var firstGroupId = this.groupIds[firstGroupIndex];\n  var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED];\n\n  return firstGroup || null;\n};\n\n/**\n * Create or delete the group holding all ungrouped items. This group is used when\n * there are no groups specified.\n * @protected\n */\nItemSet.prototype._updateUngrouped = function() {\n  var ungrouped = this.groups[UNGROUPED];\n  var background = this.groups[BACKGROUND];\n  var item, itemId;\n\n  if (this.groupsData) {\n    // remove the group holding all ungrouped items\n    if (ungrouped) {\n      ungrouped.hide();\n      delete this.groups[UNGROUPED];\n\n      for (itemId in this.items) {\n        if (this.items.hasOwnProperty(itemId)) {\n          item = this.items[itemId];\n          item.parent && item.parent.remove(item);\n          var groupId = this._getGroupId(item.data);\n          var group = this.groups[groupId];\n          group && group.add(item) || item.hide();\n        }\n      }\n    }\n  }\n  else {\n    // create a group holding all (unfiltered) items\n    if (!ungrouped) {\n      var id = null;\n      var data = null;\n      ungrouped = new Group(id, data, this);\n      this.groups[UNGROUPED] = ungrouped;\n\n      for (itemId in this.items) {\n        if (this.items.hasOwnProperty(itemId)) {\n          item = this.items[itemId];\n          ungrouped.add(item);\n        }\n      }\n\n      ungrouped.show();\n    }\n  }\n};\n\n/**\n * Get the element for the labelset\n * @return {HTMLElement} labelSet\n */\nItemSet.prototype.getLabelSet = function() {\n  return this.dom.labelSet;\n};\n\n/**\n * Set items\n * @param {vis.DataSet | null} items\n */\nItemSet.prototype.setItems = function(items) {\n  var me = this,\n      ids,\n      oldItemsData = this.itemsData;\n\n  // replace the dataset\n  if (!items) {\n    this.itemsData = null;\n  }\n  else if (items instanceof DataSet || items instanceof DataView) {\n    this.itemsData = items;\n  }\n  else {\n    throw new TypeError('Data must be an instance of DataSet or DataView');\n  }\n\n  if (oldItemsData) {\n    // unsubscribe from old dataset\n    util.forEach(this.itemListeners, function (callback, event) {\n      oldItemsData.off(event, callback);\n    });\n\n    // remove all drawn items\n    ids = oldItemsData.getIds();\n    this._onRemove(ids);\n  }\n\n  if (this.itemsData) {\n    // subscribe to new dataset\n    var id = this.id;\n    util.forEach(this.itemListeners, function (callback, event) {\n      me.itemsData.on(event, callback, id);\n    });\n\n    // add all new items\n    ids = this.itemsData.getIds();\n    this._onAdd(ids);\n\n    // update the group holding all ungrouped items\n    this._updateUngrouped();\n  }\n\n  this.body.emitter.emit('_change', {queue: true});\n};\n\n/**\n * Get the current items\n * @returns {vis.DataSet | null}\n */\nItemSet.prototype.getItems = function() {\n  return this.itemsData;\n};\n\n/**\n * Set groups\n * @param {vis.DataSet} groups\n */\nItemSet.prototype.setGroups = function(groups) {\n  var me = this,\n      ids;\n\n  // unsubscribe from current dataset\n  if (this.groupsData) {\n    util.forEach(this.groupListeners, function (callback, event) {\n      me.groupsData.off(event, callback);\n    });\n\n    // remove all drawn groups\n    ids = this.groupsData.getIds();\n    this.groupsData = null;\n    this._onRemoveGroups(ids); // note: this will cause a redraw\n  }\n\n  // replace the dataset\n  if (!groups) {\n    this.groupsData = null;\n  }\n  else if (groups instanceof DataSet || groups instanceof DataView) {\n    this.groupsData = groups;\n  }\n  else {\n    throw new TypeError('Data must be an instance of DataSet or DataView');\n  }\n\n  if (this.groupsData) {\n    // go over all groups nesting\n    var groupsData = this.groupsData;\n    if (this.groupsData instanceof DataView) {\n      groupsData = this.groupsData.getDataSet()\n    }\n\n    groupsData.get().forEach(function(group){\n      if (group.nestedGroups) {\n        group.nestedGroups.forEach(function(nestedGroupId) {\n          var updatedNestedGroup = groupsData.get(nestedGroupId);\n          updatedNestedGroup.nestedInGroup = group.id;\n          if (group.showNested == false) {\n            updatedNestedGroup.visible = false;\n          }\n          groupsData.update(updatedNestedGroup);\n        })\n      }\n    })\n\n\n    // subscribe to new dataset\n    var id = this.id;\n    util.forEach(this.groupListeners, function (callback, event) {\n      me.groupsData.on(event, callback, id);\n    });\n\n    // draw all ms\n    ids = this.groupsData.getIds();\n    this._onAddGroups(ids);\n  }\n\n  // update the group holding all ungrouped items\n  this._updateUngrouped();\n\n  // update the order of all items in each group\n  this._order();\n\n  this.body.emitter.emit('_change', {queue: true});\n};\n\n/**\n * Get the current groups\n * @returns {vis.DataSet | null} groups\n */\nItemSet.prototype.getGroups = function() {\n  return this.groupsData;\n};\n\n/**\n * Remove an item by its id\n * @param {String | Number} id\n */\nItemSet.prototype.removeItem = function(id) {\n  var item = this.itemsData.get(id),\n      dataset = this.itemsData.getDataSet(),\n      itemObj = this.items[id];\n\n  if (item) {\n    // confirm deletion\n    this.options.onRemove(item, function (item) {\n      if (item) {\n        // remove by id here, it is possible that an item has no id defined\n        // itself, so better not delete by the item itself\n        dataset.remove(id);\n\n        // Remove it's popup\n        if (itemObj.popup) {\n          itemObj.popup.destroy();\n          itemObj.popup = null;\n        }\n      }\n    });\n  }\n};\n\n/**\n * Get the time of an item based on it's data and options.type\n * @param {Object} itemData\n * @returns {string} Returns the type\n * @private\n */\nItemSet.prototype._getType = function (itemData) {\n  return itemData.type || this.options.type || (itemData.end ? 'range' : 'box');\n};\n\n\n/**\n * Get the group id for an item\n * @param {Object} itemData\n * @returns {string} Returns the groupId\n * @private\n */\nItemSet.prototype._getGroupId = function (itemData) {\n  var type = this._getType(itemData);\n  if (type == 'background' && itemData.group == undefined) {\n   return BACKGROUND;\n  }\n  else {\n    return this.groupsData ? itemData.group : UNGROUPED;\n  }\n};\n\n/**\n * Handle updated items\n * @param {Number[]} ids\n * @protected\n */\nItemSet.prototype._onUpdate = function(ids) {\n  var me = this;\n\n  ids.forEach(function (id) {\n    var itemData = me.itemsData.get(id, me.itemOptions);\n    var item = me.items[id];\n    var type = itemData ? me._getType(itemData) : null;\n\n    var constructor = ItemSet.types[type];\n    var selected;\n\n    if (item) {\n      // update item   \t\n      if (!constructor || !(item instanceof constructor)) {\n        // item type has changed, delete the item and recreate it\n        selected = item.selected; // preserve selection of this item\n        me._removeItem(item);\n        item = null;\n      }\n      else {\n        me._updateItem(item, itemData);\n      }\n    }\n\n    if (!item && itemData) {\n      // create item\n      if (constructor) {\n        item = new constructor(itemData, me.conversion, me.options);\n        item.id = id; // TODO: not so nice setting id afterwards\n\n        me._addItem(item);\n        if (selected) {\n          this.selection.push(id);\n          item.select();\n        }\n      }\n      else if (type == 'rangeoverflow') {\n        // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day\n        throw new TypeError('Item type \"rangeoverflow\" is deprecated. Use css styling instead: ' +\n            '.vis-item.vis-range .vis-item-content {overflow: visible;}');\n      }\n      else {\n        throw new TypeError('Unknown item type \"' + type + '\"');\n      }\n    }\n  }.bind(this));\n\n  this._order();\n  this.stackDirty = true; // force re-stacking of all items next redraw\n  this.body.emitter.emit('_change', {queue: true});\n};\n\n/**\n * Handle added items\n * @param {Number[]} ids\n * @protected\n */\nItemSet.prototype._onAdd = ItemSet.prototype._onUpdate;\n\n/**\n * Handle removed items\n * @param {Number[]} ids\n * @protected\n */\nItemSet.prototype._onRemove = function(ids) {\n  var count = 0;\n  var me = this;\n  ids.forEach(function (id) {\n    var item = me.items[id];\n    if (item) {\n      count++;\n      me._removeItem(item);\n    }\n  });\n\n  if (count) {\n    // update order\n    this._order();\n    this.stackDirty = true; // force re-stacking of all items next redraw\n    this.body.emitter.emit('_change', {queue: true});\n  }\n};\n\n/**\n * Update the order of item in all groups\n * @private\n */\nItemSet.prototype._order = function() {\n  // reorder the items in all groups\n  // TODO: optimization: only reorder groups affected by the changed items\n  util.forEach(this.groups, function (group) {\n    group.order();\n  });\n};\n\n/**\n * Handle updated groups\n * @param {Number[]} ids\n * @private\n */\nItemSet.prototype._onUpdateGroups = function(ids) {\n  this._onAddGroups(ids);\n};\n\n/**\n * Handle changed groups (added or updated)\n * @param {Number[]} ids\n * @private\n */\nItemSet.prototype._onAddGroups = function(ids) {\n  var me = this;\n\n  ids.forEach(function (id) {\n    var groupData = me.groupsData.get(id);\n    var group = me.groups[id];\n\n    if (!group) {\n      // check for reserved ids\n      if (id == UNGROUPED || id == BACKGROUND) {\n        throw new Error('Illegal group id. ' + id + ' is a reserved id.');\n      }\n\n      var groupOptions = Object.create(me.options);\n      util.extend(groupOptions, {\n        height: null\n      });\n\n      group = new Group(id, groupData, me);\n      me.groups[id] = group;\n\n      // add items with this groupId to the new group\n      for (var itemId in me.items) {\n        if (me.items.hasOwnProperty(itemId)) {\n          var item = me.items[itemId];\n          if (item.data.group == id) {\n            group.add(item);\n          }\n        }\n      }\n\n      group.order();\n      group.show();\n    }\n    else {\n      // update group\n      group.setData(groupData);\n    }\n  });\n\n  this.body.emitter.emit('_change', {queue: true});\n};\n\n/**\n * Handle removed groups\n * @param {Number[]} ids\n * @private\n */\nItemSet.prototype._onRemoveGroups = function(ids) {\n  var groups = this.groups;\n  ids.forEach(function (id) {\n    var group = groups[id];\n\n    if (group) {\n      group.hide();\n      delete groups[id];\n    }\n  });\n\n  this.markDirty();\n\n  this.body.emitter.emit('_change', {queue: true});\n};\n\n/**\n * Reorder the groups if needed\n * @return {boolean} changed\n * @private\n */\nItemSet.prototype._orderGroups = function () {\n  if (this.groupsData) {\n    // reorder the groups\n    var groupIds = this.groupsData.getIds({\n      order: this.options.groupOrder\n    });\n\n    groupIds = this._orderNestedGroups(groupIds);\n\n    var changed = !util.equalArray(groupIds, this.groupIds);\n    if (changed) {\n      // hide all groups, removes them from the DOM\n      var groups = this.groups;\n      groupIds.forEach(function (groupId) {\n        groups[groupId].hide();\n      });\n\n      // show the groups again, attach them to the DOM in correct order\n      groupIds.forEach(function (groupId) {\n        groups[groupId].show();\n      });\n\n      this.groupIds = groupIds;\n    }\n\n    return changed;\n  }\n  else {\n    return false;\n  }\n};\n\n/**\n * Reorder the nested groups\n * @return {boolean} changed\n * @private\n */\nItemSet.prototype._orderNestedGroups = function(groupIds) {\n  var newGroupIdsOrder = [];\n\n  groupIds.forEach(function(groupId){\n    var groupData = this.groupsData.get(groupId);\n    if (!groupData.nestedInGroup) {\n      newGroupIdsOrder.push(groupId)\n    }\n    if (groupData.nestedGroups) {\n      var nestedGroups = this.groupsData.get({\n        filter: function(nestedGroup) {\n          return nestedGroup.nestedInGroup == groupId;\n        }\n      });\n      var nestedGroupIds = nestedGroups.map(function(nestedGroup) { return nestedGroup.id })\n      newGroupIdsOrder = newGroupIdsOrder.concat(nestedGroupIds);\n    }\n  }, this)\n  return newGroupIdsOrder;\n}\n\n\n/**\n * Add a new item\n * @param {Item} item\n * @private\n */\nItemSet.prototype._addItem = function(item) {\n  this.items[item.id] = item;\n\n  // add to group\n  var groupId = this._getGroupId(item.data);\n  var group = this.groups[groupId];\n\n  if (!group) {\n   \titem.groupShowing = false;\n  } else if (group && group.data && group.data.showNested) {\n  \titem.groupShowing = true;\n  }\n\n  if (group) group.add(item);\n};\n\n/**\n * Update an existing item\n * @param {Item} item\n * @param {Object} itemData\n * @private\n */\nItemSet.prototype._updateItem = function(item, itemData) {\n  var oldGroupId = item.data.group;\n  var oldSubGroupId = item.data.subgroup;\n\n  // update the items data (will redraw the item when displayed)\n  item.setData(itemData);\n\n  var groupId = this._getGroupId(item.data);\n\tvar group = this.groups[groupId];\n  if (!group) {\n   \titem.groupShowing = false;\n  } else if (group && group.data && group.data.showNested) {\n  \titem.groupShowing = true;\n  }\n  // update group\n  if (oldGroupId != item.data.group || oldSubGroupId != item.data.subgroup) {\n    var oldGroup = this.groups[oldGroupId];\n    if (oldGroup) oldGroup.remove(item);\n    if (group) group.add(item);\n  }\n};\n\n/**\n * Delete an item from the ItemSet: remove it from the DOM, from the map\n * with items, and from the map with visible items, and from the selection\n * @param {Item} item\n * @private\n */\nItemSet.prototype._removeItem = function(item) {\n  // remove from DOM\n  item.hide();\n\n  // remove from items\n  delete this.items[item.id];\n\n  // remove from selection\n  var index = this.selection.indexOf(item.id);\n  if (index != -1) this.selection.splice(index, 1);\n\n  // remove from group\n  item.parent && item.parent.remove(item);\n};\n\n/**\n * Create an array containing all items being a range (having an end date)\n * @param array\n * @returns {Array}\n * @private\n */\nItemSet.prototype._constructByEndArray = function(array) {\n  var endArray = [];\n\n  for (var i = 0; i < array.length; i++) {\n    if (array[i] instanceof RangeItem) {\n      endArray.push(array[i]);\n    }\n  }\n  return endArray;\n};\n\n/**\n * Register the clicked item on touch, before dragStart is initiated.\n *\n * dragStart is initiated from a mousemove event, AFTER the mouse/touch is\n * already moving. Therefore, the mouse/touch can sometimes be above an other\n * DOM element than the item itself.\n *\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onTouch = function (event) {\n  // store the touched item, used in _onDragStart\n  this.touchParams.item = this.itemFromTarget(event);\n  this.touchParams.dragLeftItem = event.target.dragLeftItem || false;\n  this.touchParams.dragRightItem = event.target.dragRightItem || false;\n  this.touchParams.itemProps = null;\n};\n\n\n/**\n * Given an group id, returns the index it has.\n *\n * @param {Number} groupID\n * @private\n */\nItemSet.prototype._getGroupIndex = function(groupId) {\n    for (var i = 0; i < this.groupIds.length; i++) {\n        if (groupId == this.groupIds[i])\n            return i;\n    }\n};\n\n/**\n * Start dragging the selected events\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onDragStart = function (event) {\n  if (this.touchParams.itemIsDragging) { return; }\n  var item = this.touchParams.item || null;\n  var me = this;\n  var props;\n\n  if (item && (item.selected || this.options.itemsAlwaysDraggable)) {\n\n    if (this.options.editable.overrideItems &&\n        !this.options.editable.updateTime &&\n        !this.options.editable.updateGroup) {\n      return;\n    }\n\n    // override options.editable\n    if ((item.editable != null && !item.editable.updateTime && !item.editable.updateGroup)\n        && !this.options.editable.overrideItems) {\n      return;\n    }\n\n    var dragLeftItem = this.touchParams.dragLeftItem;\n    var dragRightItem = this.touchParams.dragRightItem;\n    this.touchParams.itemIsDragging = true;\n    this.touchParams.selectedItem = item;\n\n    if (dragLeftItem) {\n      props = {\n        item: dragLeftItem,\n        initialX: event.center.x,\n        dragLeft:  true,\n        data: this._cloneItemData(item.data)\n      };\n\n      this.touchParams.itemProps = [props];\n    }\n    else if (dragRightItem) {\n      props = {\n        item: dragRightItem,\n        initialX: event.center.x,\n        dragRight: true,\n        data: this._cloneItemData(item.data)\n      };\n\n      this.touchParams.itemProps = [props];\n    }\n    else {\n      var baseGroupIndex = this._getGroupIndex(item.data.group);\n\n      var itemsToDrag = (this.options.itemsAlwaysDraggable && !item.selected) ? [item.id] : this.getSelection();\n\n      this.touchParams.itemProps = itemsToDrag.map(function (id) {\n        var item = me.items[id];\n        var groupIndex = me._getGroupIndex(item.data.group);\n        return {\n          item: item,\n          initialX: event.center.x,\n          groupOffset: baseGroupIndex-groupIndex,\n          data: this._cloneItemData(item.data)\n        };\n      }.bind(this));\n    }\n\n    event.stopPropagation();\n  }\n  else if (this.options.editable.add && (event.srcEvent.ctrlKey || event.srcEvent.metaKey)) {\n    // create a new range item when dragging with ctrl key down\n    this._onDragStartAddItem(event);\n  }\n};\n\n/**\n * Start creating a new range item by dragging.\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onDragStartAddItem = function (event) {\n  var snap = this.options.snap || null;\n\n  if (this.options.rtl) {\n    var xAbs = util.getAbsoluteRight(this.dom.frame);\n    var x = xAbs - event.center.x  + 10;  // plus 10 to compensate for the drag starting as soon as you've moved 10px\n  } else {\n    var xAbs = util.getAbsoluteLeft(this.dom.frame);\n    var x = event.center.x - xAbs - 10;  // minus 10 to compensate for the drag starting as soon as you've moved 10px\n  }\n\n  var time = this.body.util.toTime(x);\n  var scale = this.body.util.getScale();\n  var step = this.body.util.getStep();\n  var start = snap ? snap(time, scale, step) : time;\n  var end = start;\n\n  var itemData = {\n    type: 'range',\n    start: start,\n    end: end,\n    content: 'new item'\n  };\n\n  var id = util.randomUUID();\n  itemData[this.itemsData._fieldId] = id;\n\n  var group = this.groupFromTarget(event);\n  if (group) {\n    itemData.group = group.groupId;\n  }\n  var newItem = new RangeItem(itemData, this.conversion, this.options);\n  newItem.id = id; // TODO: not so nice setting id afterwards\n  newItem.data = this._cloneItemData(itemData);\n  this._addItem(newItem);\n  this.touchParams.selectedItem = newItem;\n  \n  var props = {\n    item: newItem,\n    initialX: event.center.x,\n    data: newItem.data\n  };\n\n  if (this.options.rtl) {\n    props.dragLeft = true;\n  } else {\n    props.dragRight = true;\n  }\n  this.touchParams.itemProps = [props];\n\n  event.stopPropagation();\n};\n\n/**\n * Drag selected items\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onDrag = function (event) {\n  if (this.touchParams.itemProps) {\n    event.stopPropagation();\n\n    var me = this;\n    var snap = this.options.snap || null;\n\n    if (this.options.rtl) {\n      var xOffset = this.body.dom.root.offsetLeft + this.body.domProps.right.width;\n    } else {\n      var xOffset = this.body.dom.root.offsetLeft + this.body.domProps.left.width;\n    }\n\n    var scale = this.body.util.getScale();\n    var step = this.body.util.getStep();\n\n    //only calculate the new group for the item that's actually dragged\n    var selectedItem = this.touchParams.selectedItem;\n    var updateGroupAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateGroup) ||\n                             (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateGroup);\n    var newGroupBase = null;\n    if (updateGroupAllowed && selectedItem) {\n      if (selectedItem.data.group != undefined) {\n        // drag from one group to another\n        var group = me.groupFromTarget(event);\n        if (group) {\n          //we know the offset for all items, so the new group for all items\n          //will be relative to this one.\n          newGroupBase = this._getGroupIndex(group.groupId);\n        }\n      }\n    }\n\n    // move\n    this.touchParams.itemProps.forEach(function (props) {\n      var current = me.body.util.toTime(event.center.x - xOffset);\n      var initial = me.body.util.toTime(props.initialX - xOffset);\n\n      if (this.options.rtl) {\n        var offset = -(current - initial); // ms\n      } else {\n        var offset = (current - initial); // ms\n      }\n\n      var itemData = this._cloneItemData(props.item.data); // clone the data\n      if (props.item.editable != null\n        && !props.item.editable.updateTime\n        && !props.item.editable.updateGroup\n        && !me.options.editable.overrideItems) {\n        return;\n      }\n\n      var updateTimeAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateTime) ||\n                               (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateTime);\n      if (updateTimeAllowed) {\n        if (props.dragLeft) {\n          // drag left side of a range item\n          if (this.options.rtl) {\n            if (itemData.end != undefined) {\n              var initialEnd = util.convert(props.data.end, 'Date');\n              var end = new Date(initialEnd.valueOf() + offset);\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.end = snap ? snap(end, scale, step) : end;\n            }\n          } else {\n            if (itemData.start != undefined) {\n              var initialStart = util.convert(props.data.start, 'Date');\n              var start = new Date(initialStart.valueOf() + offset);\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.start = snap ? snap(start, scale, step) : start;\n            }\n          }\n        }\n        else if (props.dragRight) {\n          // drag right side of a range item\n          if (this.options.rtl) {\n            if (itemData.start != undefined) {\n              var initialStart = util.convert(props.data.start, 'Date');\n              var start = new Date(initialStart.valueOf() + offset);\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.start = snap ? snap(start, scale, step) : start;\n            }\n          } else {\n            if (itemData.end != undefined) {\n              var initialEnd = util.convert(props.data.end, 'Date');\n              var end = new Date(initialEnd.valueOf() + offset);\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.end = snap ? snap(end, scale, step) : end;\n            }\n          }\n        }\n        else {\n          // drag both start and end\n          if (itemData.start != undefined) {\n\n            var initialStart = util.convert(props.data.start, 'Date').valueOf();\n            var start = new Date(initialStart + offset);\n\n            if (itemData.end != undefined) {\n              var initialEnd = util.convert(props.data.end, 'Date');\n              var duration  = initialEnd.valueOf() - initialStart.valueOf();\n\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.start = snap ? snap(start, scale, step) : start;\n              itemData.end   = new Date(itemData.start.valueOf() + duration);\n            }\n            else {\n              // TODO: pass a Moment instead of a Date to snap(). (Breaking change)\n              itemData.start = snap ? snap(start, scale, step) : start;\n            }\n\n\n          }\n        }\n      }\n\n\n      if (updateGroupAllowed && (!props.dragLeft && !props.dragRight) && newGroupBase!=null) {\n        if (itemData.group != undefined) {\n          var newOffset = newGroupBase - props.groupOffset;\n\n          //make sure we stay in bounds\n          newOffset = Math.max(0, newOffset);\n          newOffset = Math.min(me.groupIds.length-1, newOffset);\n\n          itemData.group = me.groupIds[newOffset];\n        }\n      }\n\n      // confirm moving the item\n      itemData = this._cloneItemData(itemData);  // convert start and end to the correct type\n      me.options.onMoving(itemData, function (itemData) {\n        if (itemData) {\n          props.item.setData(this._cloneItemData(itemData, 'Date'));\n        }\n      }.bind(this));\n    }.bind(this));\n\n    this.stackDirty = true; // force re-stacking of all items next redraw\n    this.body.emitter.emit('_change');\n  }\n};\n\n/**\n * Move an item to another group\n * @param {Item} item\n * @param {String | Number} groupId\n * @private\n */\nItemSet.prototype._moveToGroup = function(item, groupId) {\n  var group = this.groups[groupId];\n  if (group && group.groupId != item.data.group) {\n    var oldGroup = item.parent;\n    oldGroup.remove(item);\n    oldGroup.order();\n    group.add(item);\n    group.order();\n\n    item.data.group = group.groupId;\n  }\n};\n\n/**\n * End of dragging selected items\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onDragEnd = function (event) {\n  this.touchParams.itemIsDragging = false;\n  if (this.touchParams.itemProps) {\n    event.stopPropagation();\n\n    var me = this;\n    var dataset = this.itemsData.getDataSet();\n    var itemProps = this.touchParams.itemProps ;\n    this.touchParams.itemProps = null;\n\n    itemProps.forEach(function (props) {\n      var id = props.item.id;\n      var exists = me.itemsData.get(id, me.itemOptions) != null;\n\n      if (!exists) {\n        // add a new item\n        me.options.onAdd(props.item.data, function (itemData) {\n          me._removeItem(props.item); // remove temporary item\n          if (itemData) {\n            me.itemsData.getDataSet().add(itemData);\n          }\n\n          // force re-stacking of all items next redraw\n          me.stackDirty = true;\n          me.body.emitter.emit('_change');\n        });\n      }\n      else {\n        // update existing item\n        var itemData = this._cloneItemData(props.item.data); // convert start and end to the correct type\n        me.options.onMove(itemData, function (itemData) {\n          if (itemData) {\n            // apply changes\n            itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined)\n            dataset.update(itemData);\n          }\n          else {\n            // restore original values\n            props.item.setData(props.data);\n\n            me.stackDirty = true; // force re-stacking of all items next redraw\n            me.body.emitter.emit('_change');\n          }\n        });\n      }\n    }.bind(this));\n  }\n};\n\nItemSet.prototype._onGroupClick = function (event) {\n  var group = this.groupFromTarget(event);\n\n  if (!group.nestedGroups) return;\n\n  var groupsData = this.groupsData;\n  if (this.groupsData instanceof DataView) {\n    groupsData = this.groupsData.getDataSet()\n  }\n\n  group.showNested = !group.showNested;\n\n  var nestedGroups = groupsData.get(group.nestedGroups).map(function(nestedGroup) {\n    if (nestedGroup.visible == undefined) { nestedGroup.visible = true; }\n    nestedGroup.visible = !!group.showNested;\n    return nestedGroup;\n  });\n  groupsData.update(nestedGroups);\n\n  if (group.showNested) {\n    util.removeClassName(group.dom.label, 'collapsed');\n    util.addClassName(group.dom.label, 'expanded');\n  } else {\n    util.removeClassName(group.dom.label, 'expanded');\n    var collapsedDirClassName = this.options.rtl ? 'collapsed-rtl' : 'collapsed'\n    util.addClassName(group.dom.label, collapsedDirClassName);\n  }\n}\n\nItemSet.prototype._onGroupDragStart = function (event) {\n\tif (this.options.groupEditable.order) {\n\t\tthis.groupTouchParams.group = this.groupFromTarget(event);\n\t\t\n\t\tif (this.groupTouchParams.group) {\n\t\t\tevent.stopPropagation();\n\t\t\t\n\t\t\tthis.groupTouchParams.originalOrder = this.groupsData.getIds({\n\t\t\t    order: this.options.groupOrder\n\t\t    });\n\t\t}\n\t}\n}\n\nItemSet.prototype._onGroupDrag = function (event) {\n\tif (this.options.groupEditable.order && this.groupTouchParams.group) {\n\t\tevent.stopPropagation();\n\t\t\n    var groupsData = this.groupsData;\n    if (this.groupsData instanceof DataView) {\n      groupsData = this.groupsData.getDataSet()\n    }\n\t\t// drag from one group to another\n\t\tvar group = this.groupFromTarget(event);\n\t\t\n\t\t// try to avoid toggling when groups differ in height\n\t\tif (group && group.height != this.groupTouchParams.group.height) {\n\t\t\tvar movingUp = (group.top < this.groupTouchParams.group.top);\n\t\t\tvar clientY = event.center ? event.center.y : event.clientY;\n\t\t\tvar targetGroupTop = util.getAbsoluteTop(group.dom.foreground);\n\t\t\tvar draggedGroupHeight = this.groupTouchParams.group.height;\n\t\t\tif (movingUp) {\n\t\t\t\t// skip swapping the groups when the dragged group is not below clientY afterwards\n\t\t\t\tif (targetGroupTop + draggedGroupHeight < clientY) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar targetGroupHeight = group.height;\n\t\t\t\t// skip swapping the groups when the dragged group is not below clientY afterwards\n\t\t\t\tif (targetGroupTop + targetGroupHeight - draggedGroupHeight > clientY) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (group && group != this.groupTouchParams.group) {\n\t\t\tvar targetGroup = groupsData.get(group.groupId);\n\t\t\tvar draggedGroup = groupsData.get(this.groupTouchParams.group.groupId);\n\t\t\t\n\t\t\t// switch groups\n\t\t\tif (draggedGroup && targetGroup) {\n\t\t\t\tthis.options.groupOrderSwap(draggedGroup, targetGroup, groupsData);\n\t\t\t\tgroupsData.update(draggedGroup);\n\t\t\t\tgroupsData.update(targetGroup);\n\t\t\t}\n\t\t\t\n\t\t\t// fetch current order of groups\n\t\t\tvar newOrder = groupsData.getIds({\n\t\t\t  order: this.options.groupOrder\n\t\t  });\n\n\t\t\t\n\t\t\t// in case of changes since _onGroupDragStart\n\t\t\tif (!util.equalArray(newOrder, this.groupTouchParams.originalOrder)) {\n\t\t\t\tvar origOrder = this.groupTouchParams.originalOrder;\n\t\t\t\tvar draggedId = this.groupTouchParams.group.groupId;\n\t\t\t\tvar numGroups = Math.min(origOrder.length, newOrder.length);\n\t\t\t\tvar curPos = 0;\n\t\t\t\tvar newOffset = 0;\n\t\t\t\tvar orgOffset = 0;\n\t\t\t\twhile (curPos < numGroups) {\n\t\t\t\t\t// as long as the groups are where they should be step down along the groups order\n\t\t\t\t\twhile ((curPos+newOffset) < numGroups \n\t\t\t\t\t\t&& (curPos+orgOffset) < numGroups \n\t\t\t\t\t\t&& newOrder[curPos+newOffset] == origOrder[curPos+orgOffset]) {\n\t\t\t\t\t\tcurPos++;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// all ok\n\t\t\t\t\tif (curPos+newOffset >= numGroups) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// not all ok\n\t\t\t\t\t// if dragged group was move upwards everything below should have an offset\n\t\t\t\t\tif (newOrder[curPos+newOffset] == draggedId) {\n\t\t\t\t\t\tnewOffset = 1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// if dragged group was move downwards everything above should have an offset\n\t\t\t\t\telse if (origOrder[curPos+orgOffset] == draggedId) {\n\t\t\t\t\t\torgOffset = 1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} \n\t\t\t\t\t// found a group (apart from dragged group) that has the wrong position -> switch with the \n\t\t\t\t\t// group at the position where other one should be, fix index arrays and continue\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar slippedPosition = newOrder.indexOf(origOrder[curPos+orgOffset])\n\t\t\t\t\t\tvar switchGroup = groupsData.get(newOrder[curPos+newOffset]);\n\t\t\t\t\t\tvar shouldBeGroup = groupsData.get(origOrder[curPos+orgOffset]);\n\t\t\t\t\t\tthis.options.groupOrderSwap(switchGroup, shouldBeGroup, groupsData);\n\t\t\t\t\t\tgroupsData.update(switchGroup);\n\t\t\t\t\t\tgroupsData.update(shouldBeGroup);\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar switchGroupId = newOrder[curPos+newOffset];\n\t\t\t\t\t\tnewOrder[curPos+newOffset] = origOrder[curPos+orgOffset];\n\t\t\t\t\t\tnewOrder[slippedPosition] = switchGroupId;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcurPos++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n}\n\nItemSet.prototype._onGroupDragEnd = function (event) {\n\tif (this.options.groupEditable.order && this.groupTouchParams.group) {\n\t\tevent.stopPropagation();\n\t\t\n\t\t// update existing group\n\t\tvar me = this;\n\t\tvar id = me.groupTouchParams.group.groupId;\n\t\tvar dataset = me.groupsData.getDataSet();\n        var groupData = util.extend({}, dataset.get(id)); // clone the data\n        me.options.onMoveGroup(groupData, function (groupData) {\n          if (groupData) {\n            // apply changes\n        \tgroupData[dataset._fieldId] = id; // ensure the group contains its id (can be undefined)\n            dataset.update(groupData);\n          }\n          else {\n        \t  \n        \t// fetch current order of groups\n  \t\t\tvar newOrder = dataset.getIds({\n  \t\t\t    order: me.options.groupOrder\n  \t\t    });\n        \t  \n            // restore original order\n        \tif (!util.equalArray(newOrder, me.groupTouchParams.originalOrder)) {\n        \t\tvar origOrder = me.groupTouchParams.originalOrder;\n  \t\t\t\tvar numGroups = Math.min(origOrder.length, newOrder.length);\n  \t\t\t\tvar curPos = 0;\n  \t\t\t\twhile (curPos < numGroups) {\n  \t\t\t\t\t// as long as the groups are where they should be step down along the groups order\n  \t\t\t\t\twhile (curPos < numGroups && newOrder[curPos] == origOrder[curPos]) {\n  \t\t\t\t\t    curPos++;\n  \t\t\t\t\t}\n  \t\t\t\t\t\n  \t\t\t\t\t// all ok\n  \t\t\t\t\tif (curPos >= numGroups) {\n  \t\t\t\t\t\tbreak;\n  \t\t\t\t\t}\n  \t\t\t\t\t\n\t\t\t\t\t\t// found a group that has the wrong position -> switch with the \n\t\t\t\t\t\t// group at the position where other one should be, fix index arrays and continue\n\t\t\t\t\t\tvar slippedPosition = newOrder.indexOf(origOrder[curPos])\n\t\t\t\t\t\tvar switchGroup = dataset.get(newOrder[curPos]);\n\t\t\t\t\t\tvar shouldBeGroup = dataset.get(origOrder[curPos]);\n\t\t\t\t\t\tme.options.groupOrderSwap(switchGroup, shouldBeGroup, dataset);\n\t\t\t\t\t\tgroupsData.update(switchGroup);\n\t\t\t\t\t\tgroupsData.update(shouldBeGroup);\n  \t\t\t\t\t\t\n  \t\t\t\t\tvar switchGroupId = newOrder[curPos];\n  \t\t\t\t\tnewOrder[curPos] = origOrder[curPos];\n  \t\t\t\t\tnewOrder[slippedPosition] = switchGroupId;\n  \t\t\t\t\t\t\n  \t\t\t\t\tcurPos++;\n  \t\t\t\t}\n  \t\t\t}\n\n          }\n        });\n        \n        me.body.emitter.emit('groupDragged', { groupId: id });\n\t}\n}\n\n/**\n * Handle selecting/deselecting an item when tapping it\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onSelectItem = function (event) {\n  if (!this.options.selectable) return;\n\n  var ctrlKey  = event.srcEvent && (event.srcEvent.ctrlKey || event.srcEvent.metaKey);\n  var shiftKey = event.srcEvent && event.srcEvent.shiftKey;\n  if (ctrlKey || shiftKey) {\n    this._onMultiSelectItem(event);\n    return;\n  }\n\n  var oldSelection = this.getSelection();\n\n  var item = this.itemFromTarget(event);\n  var selection = item ? [item.id] : [];\n  this.setSelection(selection);\n\n  var newSelection = this.getSelection();\n\n  // emit a select event,\n  // except when old selection is empty and new selection is still empty\n  if (newSelection.length > 0 || oldSelection.length > 0) {\n    this.body.emitter.emit('select', {\n      items: newSelection,\n      event: util.elementsCensor(event)\n    });\n  }\n};\n\n/**\n * Handle hovering an item\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onMouseOver = function (event) {\n  var item = this.itemFromTarget(event);\n  if (!item) return;\n\n  // Item we just left\n  var related = this.itemFromRelatedTarget(event);\n  if (item === related) {\n    // We haven't changed item, just element in the item\n    return;\n  }\n\n  if (item.getTitle()) {\n    if (item.popup == null) {\n      item.setPopup(new Popup(this.body.dom.root, this.options.tooltip.overflowMethod || 'flip'));\n    }\n\n    var container = this.body.dom.centerContainer;\n    item.popup.setPosition(\n      event.clientX - util.getAbsoluteLeft(container) + container.offsetLeft,\n      event.clientY - util.getAbsoluteTop(container) + container.offsetTop\n    );\n    item.popup.show();\n  }\n\n  this.body.emitter.emit('itemover', {\n    item: item.id,\n    event: util.elementsCensor(event)\n  });\n};\nItemSet.prototype._onMouseOut = function (event) {\n  var item = this.itemFromTarget(event);\n  if (!item) return;\n\n  // Item we are going to\n  var related = this.itemFromRelatedTarget(event);\n  if (item === related) {\n    // We aren't changing item, just element in the item\n    return;\n  }\n\n  if (item.popup != null) {\n    item.popup.hide();\n  }\n\n  this.body.emitter.emit('itemout', {\n    item: item.id,\n    event: util.elementsCensor(event)\n  });\n};\nItemSet.prototype._onMouseMove = function (event) {\n  var item = this.itemFromTarget(event);\n  if (!item) return;\n\n  if (this.options.tooltip.followMouse) {\n    if (item.popup) {\n      if (!item.popup.hidden) {\n        var container = this.body.dom.centerContainer;\n        item.popup.setPosition(\n          event.clientX - util.getAbsoluteLeft(container) + container.offsetLeft,\n          event.clientY - util.getAbsoluteTop(container) + container.offsetTop\n        );\n        item.popup.show(); // Redraw\n      }\n    }\n  }\n};\n\n\n/**\n * Handle updates of an item on double tap\n * @param event\n * @private\n */\nItemSet.prototype._onUpdateItem = function (item) {\n  if (!this.options.selectable) return;\n  if (!this.options.editable.add) return;\n\n  var me = this;\n \n  if (item) {\n    // execute async handler to update the item (or cancel it)\n    var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset\n    this.options.onUpdate(itemData, function (itemData) {\n      if (itemData) {\n        me.itemsData.getDataSet().update(itemData);\n      }\n    });\n  }\n}\n\n/**\n * Handle creation of an item on double tap\n * @param event\n * @private\n */\nItemSet.prototype._onAddItem = function (event) {\n  if (!this.options.selectable) return;\n  if (!this.options.editable.add) return;\n\n  var me = this;\n  var snap = this.options.snap || null;\n  var item = this.itemFromTarget(event);\n\n  if (!item) {\n    // add item\n    if (this.options.rtl) {\n      var xAbs = util.getAbsoluteRight(this.dom.frame);\n      var x = xAbs - event.center.x;\n    } else {\n      var xAbs = util.getAbsoluteLeft(this.dom.frame);\n      var x = event.center.x - xAbs; \n    }\n    // var xAbs = util.getAbsoluteLeft(this.dom.frame);\n    // var x = event.center.x - xAbs;\n    var start = this.body.util.toTime(x);\n    var scale = this.body.util.getScale();\n    var step = this.body.util.getStep();\n\n    var newItemData = {\n      start: snap ? snap(start, scale, step) : start,\n      content: 'new item'\n    };\n\n    if (event.type == 'drop') {\n      var itemData = JSON.parse(event.dataTransfer.getData(\"text\"))\n      newItemData.content = itemData.content; // content is required \n      newItemData.type = itemData.type || 'box';\n      newItemData[this.itemsData._fieldId] = itemData.id || util.randomUUID();\n\n      if (itemData.type == 'range' || (itemData.end && itemData.start)) {\n        if (!itemData.end) {\n          var end = this.body.util.toTime(x + this.props.width / 5);\n          newItemData.end = snap ? snap(end, scale, step) : end;\n        } else {\n          newItemData.end = itemData.end;\n          newItemData.start = itemData.start;\n        }\n      }\n    } else {\n      newItemData[this.itemsData._fieldId] = util.randomUUID();\n\n      // when default type is a range, add a default end date to the new item\n      if (this.options.type === 'range') {\n        var end = this.body.util.toTime(x + this.props.width / 5);\n        newItemData.end = snap ? snap(end, scale, step) : end;\n      }\n    }\n\n    var group = this.groupFromTarget(event);\n    if (group) {\n      newItemData.group = group.groupId;\n    }\n\n    // execute async handler to customize (or cancel) adding an item\n    newItemData = this._cloneItemData(newItemData);     // convert start and end to the correct type\n    this.options.onAdd(newItemData, function (item) {\n      if (item) {\n        me.itemsData.getDataSet().add(item);\n        if (event.type == 'drop') {\n          me.setSelection([item.id]);\n        }\n        // TODO: need to trigger a redraw?\n      }\n    });\n  }\n};\n\n/**\n * Handle selecting/deselecting multiple items when holding an item\n * @param {Event} event\n * @private\n */\nItemSet.prototype._onMultiSelectItem = function (event) {\n  if (!this.options.selectable) return;\n\n  var item = this.itemFromTarget(event);\n\n  if (item) {\n    // multi select items (if allowed)\n\n    var selection = this.options.multiselect\n      ? this.getSelection() // take current selection\n      : [];                 // deselect current selection\n\n    var shiftKey = event.srcEvent && event.srcEvent.shiftKey || false;\n\n    if (shiftKey && this.options.multiselect) {\n      // select all items between the old selection and the tapped item\n      var itemGroup = this.itemsData.get(item.id).group;\n    \t\n      // when filtering get the group of the last selected item\n      var lastSelectedGroup = undefined;\n      if (this.options.multiselectPerGroup) {\n        if (selection.length > 0) {\n          lastSelectedGroup = this.itemsData.get(selection[0]).group;\n        }\n      }\n    \t\n      // determine the selection range\n      if (!this.options.multiselectPerGroup || lastSelectedGroup == undefined || lastSelectedGroup == itemGroup) {\n        selection.push(item.id);\n      }\n      var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions));\n      \n      if (!this.options.multiselectPerGroup || lastSelectedGroup == itemGroup) {\n        // select all items within the selection range\n        selection = [];\n        for (var id in this.items) {\n          if (this.items.hasOwnProperty(id)) {\n            var _item = this.items[id];\n            var start = _item.data.start;\n            var end = (_item.data.end !== undefined) ? _item.data.end : start;\n\n            if (start >= range.min &&\n                end <= range.max &&\n                (!this.options.multiselectPerGroup || lastSelectedGroup == this.itemsData.get(_item.id).group) &&\n                !(_item instanceof BackgroundItem)) {\n              selection.push(_item.id); // do not use id but item.id, id itself is stringified\n            }\n          }\n        }\n      }\n    }\n    else {\n      // add/remove this item from the current selection\n      var index = selection.indexOf(item.id);\n      if (index == -1) {\n        // item is not yet selected -> select it\n        selection.push(item.id);\n      }\n      else {\n        // item is already selected -> deselect it\n        selection.splice(index, 1);\n      }\n    }\n\n    this.setSelection(selection);\n\n    this.body.emitter.emit('select', {\n      items: this.getSelection(),\n      event: util.elementsCensor(event)\n    });\n  }\n};\n\n/**\n * Calculate the time range of a list of items\n * @param {Array.<Object>} itemsData\n * @return {{min: Date, max: Date}} Returns the range of the provided items\n * @private\n */\nItemSet._getItemRange = function(itemsData) {\n  var max = null;\n  var min = null;\n\n  itemsData.forEach(function (data) {\n    if (min == null || data.start < min) {\n      min = data.start;\n    }\n\n    if (data.end != undefined) {\n      if (max == null || data.end > max) {\n        max = data.end;\n      }\n    }\n    else {\n      if (max == null || data.start > max) {\n        max = data.start;\n      }\n    }\n  });\n\n  return {\n    min: min,\n    max: max\n  }\n};\n\n/**\n * Find an item from an element:\n * searches for the attribute 'timeline-item' in the element's tree\n * @param {HTMLElement} element\n * @return {Item | null} item\n */\nItemSet.prototype.itemFromElement = function(element) {\n  var cur = element;\n  while (cur) {\n    if (cur.hasOwnProperty('timeline-item')) {\n      return cur['timeline-item'];\n    }\n    cur = cur.parentNode;\n  }\n\n  return null;\n};\n\n/**\n * Find an item from an event target:\n * searches for the attribute 'timeline-item' in the event target's element tree\n * @param {Event} event\n * @return {Item | null} item\n */\nItemSet.prototype.itemFromTarget = function(event) {\n  return this.itemFromElement(event.target);\n};\n\n/**\n * Find an item from an event's related target:\n * searches for the attribute 'timeline-item' in the related target's element tree\n * @param {Event} event\n * @return {Item | null} item\n */\nItemSet.prototype.itemFromRelatedTarget = function(event) {\n  return this.itemFromElement(event.relatedTarget);\n};\n\n/**\n * Find the Group from an event target:\n * searches for the attribute 'timeline-group' in the event target's element tree\n * @param {Event} event\n * @return {Group | null} group\n */\nItemSet.prototype.groupFromTarget = function(event) {\n  var clientY = event.center ? event.center.y : event.clientY;\n  for (var i = 0; i < this.groupIds.length; i++) {\n    var groupId = this.groupIds[i];\n    var group = this.groups[groupId];\n    var foreground = group.dom.foreground;\n    var top = util.getAbsoluteTop(foreground);\n    if (clientY > top && clientY < top + foreground.offsetHeight) {\n      return group;\n    }\n\n    if (this.options.orientation.item === 'top') {\n      if (i === this.groupIds.length - 1 && clientY > top) {\n        return group;\n      }\n    }\n    else {\n      if (i === 0 && clientY < top + foreground.offset) {\n        return group;\n      }\n    }\n  }\n\n  return null;\n};\n\n/**\n * Find the ItemSet from an event target:\n * searches for the attribute 'timeline-itemset' in the event target's element tree\n * @param {Event} event\n * @return {ItemSet | null} item\n */\nItemSet.itemSetFromTarget = function(event) {\n  var target = event.target;\n  while (target) {\n    if (target.hasOwnProperty('timeline-itemset')) {\n      return target['timeline-itemset'];\n    }\n    target = target.parentNode;\n  }\n\n  return null;\n};\n\n/**\n * Clone the data of an item, and \"normalize\" it: convert the start and end date\n * to the type (Date, Moment, ...) configured in the DataSet. If not configured,\n * start and end are converted to Date.\n * @param {Object} itemData, typically `item.data`\n * @param {string} [type]  Optional Date type. If not provided, the type from the DataSet is taken\n * @return {Object} The cloned object\n * @private\n */\nItemSet.prototype._cloneItemData = function (itemData, type) {\n  var clone = util.extend({}, itemData);\n\n  if (!type) {\n    // convert start and end date to the type (Date, Moment, ...) configured in the DataSet\n    type = this.itemsData.getDataSet()._options.type;\n  }\n\n  if (clone.start != undefined) {\n    clone.start = util.convert(clone.start, type && type.start || 'Date');\n  }\n  if (clone.end != undefined) {\n    clone.end = util.convert(clone.end , type && type.end || 'Date');\n  }\n\n  return clone;\n};\n\nmodule.exports = ItemSet;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/ItemSet.js","/**\n * Popup is a class to create a popup window with some text\n * @param {Element} container       The container object.\n * @param {string}  overflowMethod  How the popup should act to overflowing ('flip' or 'cap')\n */\nclass Popup {\n  constructor(container, overflowMethod) {\n    this.container = container;\n    this.overflowMethod = overflowMethod || 'cap';\n\n    this.x = 0;\n    this.y = 0;\n    this.padding = 5;\n    this.hidden = false;\n\n    // create the frame\n    this.frame = document.createElement('div');\n    this.frame.className = 'vis-tooltip';\n    this.container.appendChild(this.frame);\n  }\n\n  /**\n   * @param {number} x   Horizontal position of the popup window\n   * @param {number} y   Vertical position of the popup window\n   */\n  setPosition(x, y) {\n    this.x = parseInt(x);\n    this.y = parseInt(y);\n  }\n\n  /**\n   * Set the content for the popup window. This can be HTML code or text.\n   * @param {string | Element} content\n   */\n  setText(content) {\n    if (content instanceof Element) {\n      this.frame.innerHTML = '';\n      this.frame.appendChild(content);\n    }\n    else {\n      this.frame.innerHTML = content; // string containing text or HTML\n    }\n  }\n\n  /**\n   * Show the popup window\n   * @param {boolean} [doShow]    Show or hide the window\n   */\n  show(doShow) {\n    if (doShow === undefined) {\n      doShow = true;\n    }\n\n    if (doShow === true) {\n      var height = this.frame.clientHeight;\n      var width = this.frame.clientWidth;\n      var maxHeight = this.frame.parentNode.clientHeight;\n      var maxWidth = this.frame.parentNode.clientWidth;\n\n      var left = 0, top = 0;\n\n      if (this.overflowMethod == 'flip') {\n        var isLeft = false, isTop = true; // Where around the position it's located\n\n        if (this.y - height < this.padding) {\n          isTop = false;\n        }\n\n        if (this.x + width > maxWidth - this.padding) {\n          isLeft = true;\n        }\n\n        if (isLeft) {\n          left = this.x - width;\n        } else {\n          left = this.x;\n        }\n\n        if (isTop) {\n          top = this.y - height;\n        } else {\n          top = this.y;\n        }\n      } else {\n        top = (this.y - height);\n        if (top + height + this.padding > maxHeight) {\n          top = maxHeight - height - this.padding;\n        }\n        if (top < this.padding) {\n          top = this.padding;\n        }\n\n        left = this.x;\n        if (left + width + this.padding > maxWidth) {\n          left = maxWidth - width - this.padding;\n        }\n        if (left < this.padding) {\n          left = this.padding;\n        }\n      }\n\n      this.frame.style.left = left + \"px\";\n      this.frame.style.top = top + \"px\";\n      this.frame.style.visibility = \"visible\";\n      this.hidden = false;\n    }\n    else {\n      this.hide();\n    }\n  }\n\n  /**\n   * Hide the popup window\n   */\n  hide() {\n    this.hidden = true;\n    this.frame.style.visibility = \"hidden\";\n  }\n\n  /**\n   * Remove the popup window\n   */\n  destroy() {\n    this.frame.parentNode.removeChild(this.frame); // Remove element from DOM\n  }\n}\n\nexport default Popup;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/shared/Popup.js","var moment = require('../module/moment');\nvar DateUtil = require('./DateUtil');\nvar util = require('../util');\n\n/**\n * @constructor  TimeStep\n * The class TimeStep is an iterator for dates. You provide a start date and an\n * end date. The class itself determines the best scale (step size) based on the\n * provided start Date, end Date, and minimumStep.\n *\n * If minimumStep is provided, the step size is chosen as close as possible\n * to the minimumStep but larger than minimumStep. If minimumStep is not\n * provided, the scale is set to 1 DAY.\n * The minimumStep should correspond with the onscreen size of about 6 characters\n *\n * Alternatively, you can set a scale by hand.\n * After creation, you can initialize the class by executing first(). Then you\n * can iterate from the start date to the end date via next(). You can check if\n * the end date is reached with the function hasNext(). After each step, you can\n * retrieve the current date via getCurrent().\n * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours,\n * days, to years.\n *\n * Version: 1.2\n *\n * @param {Date} [start]         The start date, for example new Date(2010, 9, 21)\n *                               or new Date(2010, 9, 21, 23, 45, 00)\n * @param {Date} [end]           The end date\n * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds\n */\nfunction TimeStep(start, end, minimumStep, hiddenDates) {\n  this.moment = moment;\n\n  // variables\n  this.current = this.moment();\n  this._start = this.moment();\n  this._end = this.moment();\n\n  this.autoScale  = true;\n  this.scale = 'day';\n  this.step = 1;\n\n  // initialize the range\n  this.setRange(start, end, minimumStep);\n\n  // hidden Dates options\n  this.switchedDay = false;\n  this.switchedMonth = false;\n  this.switchedYear = false;\n  if (Array.isArray(hiddenDates)) {\n    this.hiddenDates = hiddenDates;\n  }\n  else if (hiddenDates != undefined) {\n    this.hiddenDates = [hiddenDates];\n  }\n  else {\n    this.hiddenDates = [];\n  }\n\n  this.format = TimeStep.FORMAT; // default formatting\n}\n\n// Time formatting\nTimeStep.FORMAT = {\n  minorLabels: {\n    millisecond:'SSS',\n    second:     's',\n    minute:     'HH:mm',\n    hour:       'HH:mm',\n    weekday:    'ddd D',\n    day:        'D',\n    month:      'MMM',\n    year:       'YYYY'\n  },\n  majorLabels: {\n    millisecond:'HH:mm:ss',\n    second:     'D MMMM HH:mm',\n    minute:     'ddd D MMMM',\n    hour:       'ddd D MMMM',\n    weekday:    'MMMM YYYY',\n    day:        'MMMM YYYY',\n    month:      'YYYY',\n    year:       ''\n  }\n};\n\n/**\n * Set custom constructor function for moment. Can be used to set dates\n * to UTC or to set a utcOffset.\n * @param {function} moment\n */\nTimeStep.prototype.setMoment = function (moment) {\n  this.moment = moment;\n\n  // update the date properties, can have a new utcOffset\n  this.current = this.moment(this.current.valueOf());\n  this._start = this.moment(this._start.valueOf());\n  this._end = this.moment(this._end.valueOf());\n};\n\n/**\n * Set custom formatting for the minor an major labels of the TimeStep.\n * Both `minorLabels` and `majorLabels` are an Object with properties:\n * 'millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'month', 'year'.\n * @param {{minorLabels: Object, majorLabels: Object}} format\n */\nTimeStep.prototype.setFormat = function (format) {\n  var defaultFormat = util.deepExtend({}, TimeStep.FORMAT);\n  this.format = util.deepExtend(defaultFormat, format);\n};\n\n/**\n * Set a new range\n * If minimumStep is provided, the step size is chosen as close as possible\n * to the minimumStep but larger than minimumStep. If minimumStep is not\n * provided, the scale is set to 1 DAY.\n * The minimumStep should correspond with the onscreen size of about 6 characters\n * @param {Date} [start]      The start date and time.\n * @param {Date} [end]        The end date and time.\n * @param {int} [minimumStep] Optional. Minimum step size in milliseconds\n */\nTimeStep.prototype.setRange = function(start, end, minimumStep) {\n  if (!(start instanceof Date) || !(end instanceof Date)) {\n    throw  \"No legal start or end date in method setRange\";\n  }\n\n  this._start = (start != undefined) ? this.moment(start.valueOf()) : new Date();\n  this._end = (end != undefined) ? this.moment(end.valueOf()) : new Date();\n\n  if (this.autoScale) {\n    this.setMinimumStep(minimumStep);\n  }\n};\n\n/**\n * Set the range iterator to the start date.\n */\nTimeStep.prototype.start = function() {\n  this.current = this._start.clone();\n  this.roundToMinor();\n};\n\n/**\n * Round the current date to the first minor date value\n * This must be executed once when the current date is set to start Date\n */\nTimeStep.prototype.roundToMinor = function() {\n  // round to floor\n  // IMPORTANT: we have no breaks in this switch! (this is no bug)\n  // noinspection FallThroughInSwitchStatementJS\n  switch (this.scale) {\n    case 'year':\n      this.current.year(this.step * Math.floor(this.current.year() / this.step));\n      this.current.month(0);\n    case 'month':        this.current.date(1);\n    case 'day':          // intentional fall through\n    case 'weekday':      this.current.hours(0);\n    case 'hour':         this.current.minutes(0);\n    case 'minute':       this.current.seconds(0);\n    case 'second':       this.current.milliseconds(0);\n    //case 'millisecond': // nothing to do for milliseconds\n  }\n\n  if (this.step != 1) {\n    // round down to the first minor value that is a multiple of the current step size\n    switch (this.scale) {\n      case 'millisecond':  this.current.subtract(this.current.milliseconds() % this.step, 'milliseconds');  break;\n      case 'second':       this.current.subtract(this.current.seconds() % this.step, 'seconds'); break;\n      case 'minute':       this.current.subtract(this.current.minutes() % this.step, 'minutes'); break;\n      case 'hour':         this.current.subtract(this.current.hours() % this.step, 'hours'); break;\n      case 'weekday':      // intentional fall through\n      case 'day':          this.current.subtract((this.current.date() - 1) % this.step, 'day'); break;\n      case 'month':        this.current.subtract(this.current.month() % this.step, 'month');  break;\n      case 'year':         this.current.subtract(this.current.year() % this.step, 'year'); break;\n      default: break;\n    }\n  }\n};\n\n/**\n * Check if the there is a next step\n * @return {boolean}  true if the current date has not passed the end date\n */\nTimeStep.prototype.hasNext = function () {\n  return (this.current.valueOf() <= this._end.valueOf());\n};\n\n/**\n * Do the next step\n */\nTimeStep.prototype.next = function() {\n  var prev = this.current.valueOf();\n\n  // Two cases, needed to prevent issues with switching daylight savings\n  // (end of March and end of October)\n  if (this.current.month() < 6)   {\n    switch (this.scale) {\n      case 'millisecond':  this.current.add(this.step, 'millisecond'); break;\n      case 'second':       this.current.add(this.step, 'second'); break;\n      case 'minute':       this.current.add(this.step, 'minute'); break;\n      case 'hour':\n        this.current.add(this.step, 'hour');\n        // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...)\n          // TODO: is this still needed now we use the function of moment.js?\n        this.current.subtract(this.current.hours() % this.step, 'hour');\n        break;\n      case 'weekday':      // intentional fall through\n      case 'day':          this.current.add(this.step, 'day'); break;\n      case 'month':        this.current.add(this.step, 'month'); break;\n      case 'year':         this.current.add(this.step, 'year'); break;\n      default: break;\n    }\n  }\n  else {\n    switch (this.scale) {\n      case 'millisecond':  this.current.add(this.step, 'millisecond'); break;\n      case 'second':       this.current.add(this.step, 'second'); break;\n      case 'minute':       this.current.add(this.step, 'minute'); break;\n      case 'hour':\n        this.current.add(this.moment.duration(this.step, 'hour'));\n\n        // correct for daylight saving\n        // FIXME: use this.current.add(moment.duration(this.step, 'hour'))\n        // see http://momentjs.com/docs/#special-considerations-for-months-and-years\n        if (this.current.hours() % this.step !== 0) {\n          this.current.add(this.step - this.current.hours() % this.step, 'hour');\n        }\n\n        break;\n      case 'weekday':      // intentional fall through\n      case 'day':          this.current.add(this.step, 'day'); break;\n      case 'month':        this.current.add(this.step, 'month'); break;\n      case 'year':         this.current.add(this.step, 'year'); break;\n      default:             break;\n    }\n  }\n\n  if (this.step != 1) {\n    // round down to the correct major value\n    switch (this.scale) {\n      case 'millisecond':  if(this.current.milliseconds() > 0 && this.current.milliseconds() < this.step) this.current.milliseconds(0);  break;\n      case 'second':       if(this.current.seconds() > 0 && this.current.seconds() < this.step) this.current.seconds(0);  break;\n      case 'minute':       if(this.current.minutes() > 0 && this.current.minutes() < this.step) this.current.minutes(0); break;\n      case 'hour':         if(this.current.hours() > 0 && this.current.hours() < this.step) this.current.hours(0);  break;\n      case 'weekday':      // intentional fall through\n      case 'day':          if(this.current.date() < this.step+1) this.current.date(1); break;\n      case 'month':        if(this.current.month() < this.step) this.current.month(0);  break;\n      case 'year':         break; // nothing to do for year\n      default:             break;\n    }\n  }\n\n  // safety mechanism: if current time is still unchanged, move to the end\n  if (this.current.valueOf() == prev) {\n    this.current = this._end.clone();\n  }\n\n  // Reset switches for year, month and day. Will get set to true where appropriate in DateUtil.stepOverHiddenDates\n  this.switchedDay = false;\n  this.switchedMonth = false;\n  this.switchedYear = false;\n\n  DateUtil.stepOverHiddenDates(this.moment, this, prev);\n};\n\n\n/**\n * Get the current datetime\n * @return {Moment}  current The current date\n */\nTimeStep.prototype.getCurrent = function() {\n  return this.current;\n};\n\n/**\n * Set a custom scale. Autoscaling will be disabled.\n * For example setScale('minute', 5) will result\n * in minor steps of 5 minutes, and major steps of an hour.\n *\n * @param {{scale: string, step: number}} params\n *                               An object containing two properties:\n *                               - A string 'scale'. Choose from 'millisecond', 'second',\n *                                 'minute', 'hour', 'weekday', 'day', 'month', 'year'.\n *                               - A number 'step'. A step size, by default 1.\n *                                 Choose for example 1, 2, 5, or 10.\n */\nTimeStep.prototype.setScale = function(params) {\n  if (params && typeof params.scale == 'string') {\n    this.scale = params.scale;\n    this.step = params.step > 0 ? params.step : 1;\n    this.autoScale = false;\n  }\n};\n\n/**\n * Enable or disable autoscaling\n * @param {boolean} enable  If true, autoascaling is set true\n */\nTimeStep.prototype.setAutoScale = function (enable) {\n  this.autoScale = enable;\n};\n\n\n/**\n * Automatically determine the scale that bests fits the provided minimum step\n * @param {Number} [minimumStep]  The minimum step size in milliseconds\n */\nTimeStep.prototype.setMinimumStep = function(minimumStep) {\n  if (minimumStep == undefined) {\n    return;\n  }\n\n  //var b = asc + ds;\n\n  var stepYear       = (1000 * 60 * 60 * 24 * 30 * 12);\n  var stepMonth      = (1000 * 60 * 60 * 24 * 30);\n  var stepDay        = (1000 * 60 * 60 * 24);\n  var stepHour       = (1000 * 60 * 60);\n  var stepMinute     = (1000 * 60);\n  var stepSecond     = (1000);\n  var stepMillisecond= (1);\n\n  // find the smallest step that is larger than the provided minimumStep\n  if (stepYear*1000 > minimumStep)        {this.scale = 'year';        this.step = 1000;}\n  if (stepYear*500 > minimumStep)         {this.scale = 'year';        this.step = 500;}\n  if (stepYear*100 > minimumStep)         {this.scale = 'year';        this.step = 100;}\n  if (stepYear*50 > minimumStep)          {this.scale = 'year';        this.step = 50;}\n  if (stepYear*10 > minimumStep)          {this.scale = 'year';        this.step = 10;}\n  if (stepYear*5 > minimumStep)           {this.scale = 'year';        this.step = 5;}\n  if (stepYear > minimumStep)             {this.scale = 'year';        this.step = 1;}\n  if (stepMonth*3 > minimumStep)          {this.scale = 'month';       this.step = 3;}\n  if (stepMonth > minimumStep)            {this.scale = 'month';       this.step = 1;}\n  if (stepDay*5 > minimumStep)            {this.scale = 'day';         this.step = 5;}\n  if (stepDay*2 > minimumStep)            {this.scale = 'day';         this.step = 2;}\n  if (stepDay > minimumStep)              {this.scale = 'day';         this.step = 1;}\n  if (stepDay/2 > minimumStep)            {this.scale = 'weekday';     this.step = 1;}\n  if (stepHour*4 > minimumStep)           {this.scale = 'hour';        this.step = 4;}\n  if (stepHour > minimumStep)             {this.scale = 'hour';        this.step = 1;}\n  if (stepMinute*15 > minimumStep)        {this.scale = 'minute';      this.step = 15;}\n  if (stepMinute*10 > minimumStep)        {this.scale = 'minute';      this.step = 10;}\n  if (stepMinute*5 > minimumStep)         {this.scale = 'minute';      this.step = 5;}\n  if (stepMinute > minimumStep)           {this.scale = 'minute';      this.step = 1;}\n  if (stepSecond*15 > minimumStep)        {this.scale = 'second';      this.step = 15;}\n  if (stepSecond*10 > minimumStep)        {this.scale = 'second';      this.step = 10;}\n  if (stepSecond*5 > minimumStep)         {this.scale = 'second';      this.step = 5;}\n  if (stepSecond > minimumStep)           {this.scale = 'second';      this.step = 1;}\n  if (stepMillisecond*200 > minimumStep)  {this.scale = 'millisecond'; this.step = 200;}\n  if (stepMillisecond*100 > minimumStep)  {this.scale = 'millisecond'; this.step = 100;}\n  if (stepMillisecond*50 > minimumStep)   {this.scale = 'millisecond'; this.step = 50;}\n  if (stepMillisecond*10 > minimumStep)   {this.scale = 'millisecond'; this.step = 10;}\n  if (stepMillisecond*5 > minimumStep)    {this.scale = 'millisecond'; this.step = 5;}\n  if (stepMillisecond > minimumStep)      {this.scale = 'millisecond'; this.step = 1;}\n};\n\n/**\n * Snap a date to a rounded value.\n * The snap intervals are dependent on the current scale and step.\n * Static function\n * @param {Date} date    the date to be snapped.\n * @param {string} scale Current scale, can be 'millisecond', 'second',\n *                       'minute', 'hour', 'weekday, 'day', 'month', 'year'.\n * @param {number} step  Current step (1, 2, 4, 5, ...\n * @return {Date} snappedDate\n */\nTimeStep.snap = function(date, scale, step) {\n  var clone = moment(date);\n\n  if (scale == 'year') {\n    var year = clone.year() + Math.round(clone.month() / 12);\n    clone.year(Math.round(year / step) * step);\n    clone.month(0);\n    clone.date(0);\n    clone.hours(0);\n    clone.minutes(0);\n    clone.seconds(0);\n    clone.milliseconds(0);\n  }\n  else if (scale == 'month') {\n    if (clone.date() > 15) {\n      clone.date(1);\n      clone.add(1, 'month');\n      // important: first set Date to 1, after that change the month.\n    }\n    else {\n      clone.date(1);\n    }\n\n    clone.hours(0);\n    clone.minutes(0);\n    clone.seconds(0);\n    clone.milliseconds(0);\n  }\n  else if (scale == 'day') {\n    //noinspection FallthroughInSwitchStatementJS\n    switch (step) {\n      case 5:\n      case 2:\n        clone.hours(Math.round(clone.hours() / 24) * 24); break;\n      default:\n        clone.hours(Math.round(clone.hours() / 12) * 12); break;\n    }\n    clone.minutes(0);\n    clone.seconds(0);\n    clone.milliseconds(0);\n  }\n  else if (scale == 'weekday') {\n    //noinspection FallthroughInSwitchStatementJS\n    switch (step) {\n      case 5:\n      case 2:\n        clone.hours(Math.round(clone.hours() / 12) * 12); break;\n      default:\n        clone.hours(Math.round(clone.hours() / 6) * 6); break;\n    }\n    clone.minutes(0);\n    clone.seconds(0);\n    clone.milliseconds(0);\n  }\n  else if (scale == 'hour') {\n    switch (step) {\n      case 4:\n        clone.minutes(Math.round(clone.minutes() / 60) * 60); break;\n      default:\n        clone.minutes(Math.round(clone.minutes() / 30) * 30); break;\n    }\n    clone.seconds(0);\n    clone.milliseconds(0);\n  } else if (scale == 'minute') {\n    //noinspection FallthroughInSwitchStatementJS\n    switch (step) {\n      case 15:\n      case 10:\n        clone.minutes(Math.round(clone.minutes() / 5) * 5);\n        clone.seconds(0);\n        break;\n      case 5:\n        clone.seconds(Math.round(clone.seconds() / 60) * 60); break;\n      default:\n        clone.seconds(Math.round(clone.seconds() / 30) * 30); break;\n    }\n    clone.milliseconds(0);\n  }\n  else if (scale == 'second') {\n    //noinspection FallthroughInSwitchStatementJS\n    switch (step) {\n      case 15:\n      case 10:\n        clone.seconds(Math.round(clone.seconds() / 5) * 5);\n        clone.milliseconds(0);\n        break;\n      case 5:\n        clone.milliseconds(Math.round(clone.milliseconds() / 1000) * 1000); break;\n      default:\n        clone.milliseconds(Math.round(clone.milliseconds() / 500) * 500); break;\n    }\n  }\n  else if (scale == 'millisecond') {\n    var _step = step > 5 ? step / 2 : 1;\n    clone.milliseconds(Math.round(clone.milliseconds() / _step) * _step);\n  }\n\n  return clone;\n};\n\n/**\n * Check if the current value is a major value (for example when the step\n * is DAY, a major value is each first day of the MONTH)\n * @return {boolean} true if current date is major, else false.\n */\nTimeStep.prototype.isMajor = function() {\n  if (this.switchedYear == true) {\n    switch (this.scale) {\n      case 'year':\n      case 'month':\n      case 'weekday':\n      case 'day':\n      case 'hour':\n      case 'minute':\n      case 'second':\n      case 'millisecond':\n        return true;\n      default:\n        return false;\n    }\n  }\n  else if (this.switchedMonth == true) {\n    switch (this.scale) {\n      case 'weekday':\n      case 'day':\n      case 'hour':\n      case 'minute':\n      case 'second':\n      case 'millisecond':\n        return true;\n      default:\n        return false;\n    }\n  }\n  else if (this.switchedDay == true) {\n    switch (this.scale) {\n      case 'millisecond':\n      case 'second':\n      case 'minute':\n      case 'hour':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  var date = this.moment(this.current);\n  switch (this.scale) {\n    case 'millisecond':\n      return (date.milliseconds() == 0);\n    case 'second':\n      return (date.seconds() == 0);\n    case 'minute':\n      return (date.hours() == 0) && (date.minutes() == 0);\n    case 'hour':\n      return (date.hours() == 0);\n    case 'weekday': // intentional fall through\n    case 'day':\n      return (date.date() == 1);\n    case 'month':\n      return (date.month() == 0);\n    case 'year':\n      return false;\n    default:\n      return false;\n  }\n};\n\n\n/**\n * Returns formatted text for the minor axislabel, depending on the current\n * date and the scale. For example when scale is MINUTE, the current time is\n * formatted as \"hh:mm\".\n * @param {Date} [date] custom date. if not provided, current date is taken\n */\nTimeStep.prototype.getLabelMinor = function(date) {\n  if (date == undefined) {\n    date = this.current;\n  }\n\n  if (typeof(this.format.minorLabels) === \"function\") {\n    return this.format.minorLabels(date, this.scale, this.step);\n  }\n\n  var format = this.format.minorLabels[this.scale];\n  return (format && format.length > 0) ? this.moment(date).format(format) : '';\n};\n\n/**\n * Returns formatted text for the major axis label, depending on the current\n * date and the scale. For example when scale is MINUTE, the major scale is\n * hours, and the hour will be formatted as \"hh\".\n * @param {Date} [date] custom date. if not provided, current date is taken\n */\nTimeStep.prototype.getLabelMajor = function(date) {\n  if (date == undefined) {\n    date = this.current;\n  }\n  \n  if (typeof(this.format.majorLabels) === \"function\") {\n    return this.format.majorLabels(date, this.scale, this.step);\n  }\n\n  var format = this.format.majorLabels[this.scale];\n  return (format && format.length > 0) ? this.moment(date).format(format) : '';\n};\n\nTimeStep.prototype.getClassName = function() {\n  var _moment = this.moment;\n  var m = this.moment(this.current);\n  var current = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function\n  var step = this.step;\n\n  function even(value) {\n    return (value / step % 2 == 0) ? ' vis-even' : ' vis-odd';\n  }\n\n  function today(date) {\n    if (date.isSame(new Date(), 'day')) {\n      return ' vis-today';\n    }\n    if (date.isSame(_moment().add(1, 'day'), 'day')) {\n      return ' vis-tomorrow';\n    }\n    if (date.isSame(_moment().add(-1, 'day'), 'day')) {\n      return ' vis-yesterday';\n    }\n    return '';\n  }\n\n  function currentWeek(date) {\n    return date.isSame(new Date(), 'week') ? ' vis-current-week' : '';\n  }\n\n  function currentMonth(date) {\n    return date.isSame(new Date(), 'month') ? ' vis-current-month' : '';\n  }\n\n  function currentYear(date) {\n    return date.isSame(new Date(), 'year') ? ' vis-current-year' : '';\n  }\n\n  switch (this.scale) {\n    case 'millisecond':\n      return today(current) +\n        even(current.milliseconds()).trim();\n\n    case 'second':\n      return today(current) +\n        even(current.seconds()).trim();\n\n    case 'minute':\n      return today(current) +\n        even(current.minutes()).trim();\n\n    case 'hour':\n      return 'vis-h' + current.hours() + \n        (this.step == 4 ? '-h' + (current.hours() + 4) : '') +\n        today(current) +\n        even(current.hours());\n\n    case 'weekday':\n      return 'vis-' + current.format('dddd').toLowerCase() +\n        today(current) +\n        currentWeek(current) +\n        even(current.date());\n\n    case 'day':\n      return 'vis-day' + current.date() +\n        ' vis-' + current.format('MMMM').toLowerCase() +\n        today(current) +\n        currentMonth(current) +\n        (this.step <= 2 ? today(current) : '') +\n        (this.step <= 2 ? ' vis-' + current.format('dddd').toLowerCase() : '' + even(current.date() - 1));\n\n    case 'month':\n      return 'vis-' + current.format('MMMM').toLowerCase() +\n        currentMonth(current) +\n        even(current.month());\n\n    case 'year':\n      var year = current.year();\n      return 'vis-year' + year +\n        currentYear(current) +\n        even(year);\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = TimeStep;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/TimeStep.js","var util = require('../../util');\nvar stack = require('../Stack');\nvar RangeItem = require('./item/RangeItem');\n\n/**\n * @constructor Group\n * @param {Number | String} groupId\n * @param {Object} data\n * @param {ItemSet} itemSet\n */\nfunction Group (groupId, data, itemSet) {\n  this.groupId = groupId;\n  this.subgroups = {};\n  this.subgroupIndex = 0;\n  this.subgroupOrderer = data && data.subgroupOrder;\n  this.itemSet = itemSet;\n  this.isVisible = null;\n  \n  if (data && data.nestedGroups) {\n    this.nestedGroups = data.nestedGroups;\n    if (data.showNested == false) {\n      this.showNested = false;\n    } else {\n      this.showNested = true;\n    }\n  }\n\n  this.nestedInGroup = null;\n\n  this.dom = {};\n  this.props = {\n    label: {\n      width: 0,\n      height: 0\n    }\n  };\n  this.className = null;\n\n  this.items = {};        // items filtered by groupId of this group\n  this.visibleItems = []; // items currently visible in window\n  this.itemsInRange = []; // items currently in range\n  this.orderedItems = {\n    byStart: [],\n    byEnd: []\n  };\n  this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap.\n  var me = this;\n  this.itemSet.body.emitter.on(\"checkRangedItems\", function () {\n    me.checkRangedItems = true;\n  })\n\n  this._create();\n\n  this.setData(data);\n}\n\n/**\n * Create DOM elements for the group\n * @private\n */\nGroup.prototype._create = function() {\n  var label = document.createElement('div');\n  if (this.itemSet.options.groupEditable.order) {\n    label.className = 'vis-label draggable';\n  } else {\n    label.className = 'vis-label';\n  }\n  this.dom.label = label;\n\n  var inner = document.createElement('div');\n  inner.className = 'vis-inner';\n  label.appendChild(inner);\n  this.dom.inner = inner;\n\n  var foreground = document.createElement('div');\n  foreground.className = 'vis-group';\n  foreground['timeline-group'] = this;\n  this.dom.foreground = foreground;\n\n  this.dom.background = document.createElement('div');\n  this.dom.background.className = 'vis-group';\n\n  this.dom.axis = document.createElement('div');\n  this.dom.axis.className = 'vis-group';\n\n  // create a hidden marker to detect when the Timelines container is attached\n  // to the DOM, or the style of a parent of the Timeline is changed from\n  // display:none is changed to visible.\n  this.dom.marker = document.createElement('div');\n  this.dom.marker.style.visibility = 'hidden';\n  this.dom.marker.style.position = 'absolute';\n  this.dom.marker.innerHTML = '';\n  this.dom.background.appendChild(this.dom.marker);\n};\n\n/**\n * Set the group data for this group\n * @param {Object} data   Group data, can contain properties content and className\n */\nGroup.prototype.setData = function(data) {\n  // update contents\n  var content;\n  var templateFunction;\n\n  if (this.itemSet.options && this.itemSet.options.groupTemplate) {\n    templateFunction = this.itemSet.options.groupTemplate.bind(this);\n    content = templateFunction(data, this.dom.inner);\n  } else {\n    content = data && data.content;\n  }\n\n  if (content instanceof Element) {\n    this.dom.inner.appendChild(content);\n    while (this.dom.inner.firstChild) {\n      this.dom.inner.removeChild(this.dom.inner.firstChild);\n    }\n    this.dom.inner.appendChild(content);\n  } else if (content instanceof Object) {\n    templateFunction(data, this.dom.inner);\n  } else if (content !== undefined && content !== null) {\n    this.dom.inner.innerHTML = content;\n  } else {\n    this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null\n  }\n\n  // update title\n  this.dom.label.title = data && data.title || '';\n  if (!this.dom.inner.firstChild) {\n    util.addClassName(this.dom.inner, 'vis-hidden');\n  }\n  else {\n    util.removeClassName(this.dom.inner, 'vis-hidden');\n  }\n\n  if (data && data.nestedGroups) {\n     if (data.showNested == false) {\n      this.showNested = false;\n    } else {\n      this.showNested = true;\n    }\n\n    util.addClassName(this.dom.label, 'vis-nesting-group');\n    if (this.showNested) {\n      util.removeClassName(this.dom.label, 'collapsed');\n      util.addClassName(this.dom.label, 'expanded');\n    } else {\n      util.removeClassName(this.dom.label, 'expanded');\n      var collapsedDirClassName = this.itemSet.options.rtl ? 'collapsed-rtl' : 'collapsed'\n      util.addClassName(this.dom.label, collapsedDirClassName);\n    }\n  }\n\n  if (data && data.nestedInGroup) {\n    util.addClassName(this.dom.label, 'vis-nested-group');\n    if (this.itemSet.options && this.itemSet.options.rtl) {\n      this.dom.inner.style.paddingRight = '30px';\n    } else {\n      this.dom.inner.style.paddingLeft = '30px';\n    }\n  }\n\n  // update className\n  var className = data && data.className || null;\n  if (className != this.className) {\n    if (this.className) {\n      util.removeClassName(this.dom.label, this.className);\n      util.removeClassName(this.dom.foreground, this.className);\n      util.removeClassName(this.dom.background, this.className);\n      util.removeClassName(this.dom.axis, this.className);\n    }\n    util.addClassName(this.dom.label, className);\n    util.addClassName(this.dom.foreground, className);\n    util.addClassName(this.dom.background, className);\n    util.addClassName(this.dom.axis, className);\n    this.className = className;\n  }\n\n  // update style\n  if (this.style) {\n    util.removeCssText(this.dom.label, this.style);\n    this.style = null;\n  }\n  if (data && data.style) {\n    util.addCssText(this.dom.label, data.style);\n    this.style = data.style;\n  }\n};\n\n/**\n * Get the width of the group label\n * @return {number} width\n */\nGroup.prototype.getLabelWidth = function() {\n  return this.props.label.width;\n};\n\n\n/**\n * Repaint this group\n * @param {{start: number, end: number}} range\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n * @param {boolean} [restack=false]  Force restacking of all items\n * @return {boolean} Returns true if the group is resized\n */\nGroup.prototype.redraw = function(range, margin, restack) {\n  var resized = false;\n\n  // force recalculation of the height of the items when the marker height changed\n  // (due to the Timeline being attached to the DOM or changed from display:none to visible)\n  var markerHeight = this.dom.marker.clientHeight;\n  if (markerHeight != this.lastMarkerHeight) {\n    this.lastMarkerHeight = markerHeight;\n    util.forEach(this.items, function (item) {\n      item.dirty = true;\n      if (item.displayed) item.redraw();\n    });\n\n    restack = true;\n  }\n\n  // recalculate the height of the subgroups\n  this._calculateSubGroupHeights(margin);\n\n  // calculate actual size and position\n  var foreground = this.dom.foreground;\n  this.top = foreground.offsetTop;\n  this.right = foreground.offsetLeft;\n  this.width = foreground.offsetWidth;\n\n  this.isVisible = this._isGroupVisible(range, margin);\n  // reposition visible items vertically\n  if (typeof this.itemSet.options.order === 'function') {\n    // a custom order function\n\n    if (restack) {\n      // brute force restack of all items\n\n      // show all items\n      var me = this;\n      var limitSize = false;\n      util.forEach(this.items, function (item) {\n        if (!item.displayed) {\n          item.redraw();\n          me.visibleItems.push(item);\n        }\n        item.repositionX(limitSize);\n      });\n\n      // order all items and force a restacking\n      var customOrderedItems = this.orderedItems.byStart.slice().sort(function (a, b) {\n        return me.itemSet.options.order(a.data, b.data);\n      });\n      stack.stack(customOrderedItems, margin, true /* restack=true */);\n    }\n\n    this.visibleItems = this._updateItemsInRange(this.orderedItems, this.visibleItems, range);\n  }\n  else {\n    // no custom order function, lazy stacking\n\n    this.visibleItems = this._updateItemsInRange(this.orderedItems, this.visibleItems, range);\n\n    if (this.itemSet.options.stack) { // TODO: ugly way to access options...\n      stack.stack(this.visibleItems, margin, restack);\n    }\n    else { // no stacking\n      stack.nostack(this.visibleItems, margin, this.subgroups, this.itemSet.options.stackSubgroups);\n    }\n  }\n\t\n  this._updateSubgroupsSizes();\n\n  // recalculate the height of the group\n  var height = this._calculateHeight(margin);\n\n  // calculate actual size and position\n  var foreground = this.dom.foreground;\n  this.top = foreground.offsetTop;\n  this.right = foreground.offsetLeft;\n  this.width = foreground.offsetWidth;\n  resized = util.updateProperty(this, 'height', height) || resized;\n  // recalculate size of label\n  resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized;\n  resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized;\n\n  // apply new height\n  this.dom.background.style.height  = height + 'px';\n  this.dom.foreground.style.height  = height + 'px';\n  this.dom.label.style.height = height + 'px';\n\n  // update vertical position of items after they are re-stacked and the height of the group is calculated\n  for (var i = 0, ii = this.visibleItems.length; i < ii; i++) {\n    var item = this.visibleItems[i];\n    item.repositionY(margin);\n    if (!this.isVisible && this.groupId != \"__background__\") {\n      if (item.displayed) item.hide();\n    }\n  }\n\n  if (!this.isVisible && this.height) {\n    return resized = false;\n  }\n\n  return resized;\n};\n\n/**\n * recalculate the height of the subgroups\n * @private\n */\nGroup.prototype._calculateSubGroupHeights = function (margin) {\n  if (Object.keys(this.subgroups).length > 0) {\n    var me = this;\n\n    this.resetSubgroups();\n\n    util.forEach(this.visibleItems, function (item) {\n      if (item.data.subgroup !== undefined) {\n        me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height, item.height + margin.item.vertical);\n        me.subgroups[item.data.subgroup].visible = true;\n      }\n    });\n  }\n};\n\n/**\n * check if group is visible\n * @private\n  */\nGroup.prototype._isGroupVisible = function (range, margin) {\n  var isVisible = \n  (this.top <= range.body.domProps.centerContainer.height - range.body.domProps.scrollTop + margin.axis) \n  && (this.top + this.height + margin.axis >= - range.body.domProps.scrollTop);\n  return isVisible;\n}\n\n/**\n * recalculate the height of the group\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n * @returns {number} Returns the height\n * @private\n */\nGroup.prototype._calculateHeight = function (margin) {\n  // recalculate the height of the group\n  var height;\n  var itemsInRange = this.visibleItems;\n  if (itemsInRange.length > 0) {\n    var min = itemsInRange[0].top;\n    var max = itemsInRange[0].top + itemsInRange[0].height;\n    util.forEach(itemsInRange, function (item) {\n      min = Math.min(min, item.top);\n      max = Math.max(max, (item.top + item.height));\n    });\n    if (min > margin.axis) {\n      // there is an empty gap between the lowest item and the axis\n      var offset = min - margin.axis;\n      max -= offset;\n      util.forEach(itemsInRange, function (item) {\n        item.top -= offset;\n      });\n    }\n    height = max + margin.item.vertical / 2;\n  }\n  else {\n    height = 0;\n  }\n  height = Math.max(height, this.props.label.height);\n\n  return height;\n};\n\n/**\n * Show this group: attach to the DOM\n */\nGroup.prototype.show = function() {\n  if (!this.dom.label.parentNode) {\n    this.itemSet.dom.labelSet.appendChild(this.dom.label);\n  }\n\n  if (!this.dom.foreground.parentNode) {\n    this.itemSet.dom.foreground.appendChild(this.dom.foreground);\n  }\n\n  if (!this.dom.background.parentNode) {\n    this.itemSet.dom.background.appendChild(this.dom.background);\n  }\n\n  if (!this.dom.axis.parentNode) {\n    this.itemSet.dom.axis.appendChild(this.dom.axis);\n  }\n};\n\n/**\n * Hide this group: remove from the DOM\n */\nGroup.prototype.hide = function() {\n  var label = this.dom.label;\n  if (label.parentNode) {\n    label.parentNode.removeChild(label);\n  }\n\n  var foreground = this.dom.foreground;\n  if (foreground.parentNode) {\n    foreground.parentNode.removeChild(foreground);\n  }\n\n  var background = this.dom.background;\n  if (background.parentNode) {\n    background.parentNode.removeChild(background);\n  }\n\n  var axis = this.dom.axis;\n  if (axis.parentNode) {\n    axis.parentNode.removeChild(axis);\n  }\n};\n\n/**\n * Add an item to the group\n * @param {Item} item\n */\nGroup.prototype.add = function(item) {\n  this.items[item.id] = item;\n  item.setParent(this);\n\n  // add to\n  if (item.data.subgroup !== undefined) {\n    if (this.subgroups[item.data.subgroup] === undefined) {\n      this.subgroups[item.data.subgroup] = {\n        height:0, \n        top: 0,\n        start: item.data.start,\n        end: item.data.end,\n        visible: false, \n        index:this.subgroupIndex, \n        items: []\n      };\n      this.subgroupIndex++;\n    }\n\n\n    if (new Date(item.data.start) < new Date(this.subgroups[item.data.subgroup].start)) { \n      this.subgroups[item.data.subgroup].start = item.data.start; \n    }\n    if (new Date(item.data.end) > new Date(this.subgroups[item.data.subgroup].end)) { \n      this.subgroups[item.data.subgroup].end = item.data.end; \n    }\n\n    this.subgroups[item.data.subgroup].items.push(item);\n  }\n  this.orderSubgroups();\n\n  if (this.visibleItems.indexOf(item) == -1) {\n    var range = this.itemSet.body.range; // TODO: not nice accessing the range like this\n    this._checkIfVisible(item, this.visibleItems, range);\n  }\n};\n\nGroup.prototype._updateSubgroupsSizes = function () {\n  var me = this;\n  if (me.subgroups) {\n    for (var subgroup in me.subgroups) {\n      var newStart = me.subgroups[subgroup].items[0].data.start;\n      var newEnd = me.subgroups[subgroup].items[0].data.end;\n\n      me.subgroups[subgroup].items.forEach(function(item) {\n        if (new Date(item.data.start) < new Date(newStart)) { \n          newStart = item.data.start; \n        }\n        if (new Date(item.data.end) > new Date(newEnd)) { \n          newEnd = item.data.end; \n        }\n      })\n\n      me.subgroups[subgroup].start = newStart;\n      me.subgroups[subgroup].end = newEnd;\n\n    }\n  }\n}\n\nGroup.prototype.orderSubgroups = function() {\n  if (this.subgroupOrderer !== undefined) {\n    var sortArray = [];\n    if (typeof this.subgroupOrderer == 'string') {\n      for (var subgroup in this.subgroups) {\n        sortArray.push({subgroup: subgroup, sortField: this.subgroups[subgroup].items[0].data[this.subgroupOrderer]})\n      }\n      sortArray.sort(function (a, b) {\n        return a.sortField - b.sortField;\n      })\n    }\n    else if (typeof this.subgroupOrderer == 'function') {\n      for (var subgroup in this.subgroups) {\n        sortArray.push(this.subgroups[subgroup].items[0].data);\n      }\n      sortArray.sort(this.subgroupOrderer);\n    }\n\n    if (sortArray.length > 0) {\n      for (var i = 0; i < sortArray.length; i++) {\n        this.subgroups[sortArray[i].subgroup].index = i;\n      }\n    }\n  }\n};\n\nGroup.prototype.resetSubgroups = function() {\n  for (var subgroup in this.subgroups) {\n    if (this.subgroups.hasOwnProperty(subgroup)) {\n      this.subgroups[subgroup].visible = false;\n    }\n  }\n};\n\n/**\n * Remove an item from the group\n * @param {Item} item\n */\nGroup.prototype.remove = function(item) {\n  delete this.items[item.id];\n  item.setParent(null);\n\n  // remove from visible items\n  var index = this.visibleItems.indexOf(item);\n  if (index != -1) this.visibleItems.splice(index, 1);\n\n  if(item.data.subgroup !== undefined){\n    var subgroup = this.subgroups[item.data.subgroup];\n    if (subgroup){\n      var itemIndex = subgroup.items.indexOf(item);\n      subgroup.items.splice(itemIndex,1);\n      if (!subgroup.items.length){\n        delete this.subgroups[item.data.subgroup];\n        this.subgroupIndex--;\n      } else {\n        this._updateSubgroupsSizes();\n      }\n      this.orderSubgroups();\n    }\n  }\n};\n\n\n/**\n * Remove an item from the corresponding DataSet\n * @param {Item} item\n */\nGroup.prototype.removeFromDataSet = function(item) {\n  this.itemSet.removeItem(item.id);\n};\n\n\n/**\n * Reorder the items\n */\nGroup.prototype.order = function() {\n  var array = util.toArray(this.items);\n  var startArray = [];\n  var endArray = [];\n\n  for (var i = 0; i < array.length; i++) {\n    if (array[i].data.end !== undefined) {\n      endArray.push(array[i]);\n    }\n    startArray.push(array[i]);\n  }\n  this.orderedItems = {\n    byStart: startArray,\n    byEnd: endArray\n  };\n\n  stack.orderByStart(this.orderedItems.byStart);\n  stack.orderByEnd(this.orderedItems.byEnd);\n};\n\n\n/**\n * Update the visible items\n * @param {{byStart: Item[], byEnd: Item[]}} orderedItems   All items ordered by start date and by end date\n * @param {Item[]} visibleItems                             The previously visible items.\n * @param {{start: number, end: number}} range              Visible range\n * @return {Item[]} visibleItems                            The new visible items.\n * @private\n */\nGroup.prototype._updateItemsInRange = function(orderedItems, oldVisibleItems, range) {\n  var visibleItems = [];\n  var visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems\n\n  var interval = (range.end - range.start) / 4;\n  var lowerBound = range.start - interval;\n  var upperBound = range.end + interval;\n\n  // this function is used to do the binary search.\n  var searchFunction = function (value) {\n    if      (value < lowerBound)  {return -1;}\n    else if (value <= upperBound) {return  0;}\n    else                          {return  1;}\n  }\n\n  // first check if the items that were in view previously are still in view.\n  // IMPORTANT: this handles the case for the items with startdate before the window and enddate after the window!\n  // also cleans up invisible items.\n  if (oldVisibleItems.length > 0) {\n    for (var i = 0; i < oldVisibleItems.length; i++) {\n      this._checkIfVisibleWithReference(oldVisibleItems[i], visibleItems, visibleItemsLookup, range);\n    }\n  }\n\n  // we do a binary search for the items that have only start values.\n  var initialPosByStart = util.binarySearchCustom(orderedItems.byStart, searchFunction, 'data','start');\n\n  // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the start values.\n  this._traceVisible(initialPosByStart, orderedItems.byStart, visibleItems, visibleItemsLookup, function (item) {\n    return (item.data.start < lowerBound || item.data.start > upperBound);\n  });\n\n  // if the window has changed programmatically without overlapping the old window, the ranged items with start < lowerBound and end > upperbound are not shown.\n  // We therefore have to brute force check all items in the byEnd list\n  if (this.checkRangedItems == true) {\n    this.checkRangedItems = false;\n    for (i = 0; i < orderedItems.byEnd.length; i++) {\n      this._checkIfVisibleWithReference(orderedItems.byEnd[i], visibleItems, visibleItemsLookup, range);\n    }\n  }\n  else {\n    // we do a binary search for the items that have defined end times.\n    var initialPosByEnd = util.binarySearchCustom(orderedItems.byEnd, searchFunction, 'data','end');\n\n    // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the end values.\n    this._traceVisible(initialPosByEnd, orderedItems.byEnd, visibleItems, visibleItemsLookup, function (item) {\n      return (item.data.end < lowerBound || item.data.end > upperBound);\n    });\n  }\n\n  // finally, we reposition all the visible items.\n  for (var i = 0; i < visibleItems.length; i++) {\n    var item = visibleItems[i];\n    if (!item.displayed) item.show();\n    // reposition item horizontally\n    item.repositionX();\n  }\n  \n  return visibleItems;\n};\n\nGroup.prototype._traceVisible = function (initialPos, items, visibleItems, visibleItemsLookup, breakCondition) {\n  if (initialPos != -1) {\n    for (var i = initialPos; i >= 0; i--) {\n      var item = items[i];\n      if (breakCondition(item)) {\n        break;\n      }\n      else {\n        if (visibleItemsLookup[item.id] === undefined) {\n          visibleItemsLookup[item.id] = true;\n          visibleItems.push(item);\n        }\n      }\n    }\n\n    for (var i = initialPos + 1; i < items.length; i++) {\n      var item = items[i];\n      if (breakCondition(item)) {\n        break;\n      }\n      else {\n        if (visibleItemsLookup[item.id] === undefined) {\n          visibleItemsLookup[item.id] = true;\n          visibleItems.push(item);\n        }\n      }\n    }\n  }\n}\n\n\n/**\n * this function is very similar to the _checkIfInvisible() but it does not\n * return booleans, hides the item if it should not be seen and always adds to\n * the visibleItems.\n * this one is for brute forcing and hiding.\n *\n * @param {Item} item\n * @param {Array} visibleItems\n * @param {{start:number, end:number}} range\n * @private\n */\nGroup.prototype._checkIfVisible = function(item, visibleItems, range) {\n    if (item.isVisible(range)) {\n      if (!item.displayed) item.show();\n      // reposition item horizontally\n      item.repositionX();\n      visibleItems.push(item);\n    }\n    else {\n      if (item.displayed) item.hide();\n    }\n};\n\n\n/**\n * this function is very similar to the _checkIfInvisible() but it does not\n * return booleans, hides the item if it should not be seen and always adds to\n * the visibleItems.\n * this one is for brute forcing and hiding.\n *\n * @param {Item} item\n * @param {Array} visibleItems\n * @param {{start:number, end:number}} range\n * @private\n */\nGroup.prototype._checkIfVisibleWithReference = function(item, visibleItems, visibleItemsLookup, range) {\n  if (item.isVisible(range)) {\n    if (visibleItemsLookup[item.id] === undefined) {\n      visibleItemsLookup[item.id] = true;\n      visibleItems.push(item);\n    }\n  }\n  else {\n    if (item.displayed) item.hide();\n  }\n};\n\n\n\nmodule.exports = Group;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/Group.js","// Utility functions for ordering and stacking of items\nvar EPSILON = 0.001; // used when checking collisions, to prevent round-off errors\n\n/**\n * Order items by their start data\n * @param {Item[]} items\n */\nexports.orderByStart = function(items) {\n  items.sort(function (a, b) {\n    return a.data.start - b.data.start;\n  });\n};\n\n/**\n * Order items by their end date. If they have no end date, their start date\n * is used.\n * @param {Item[]} items\n */\nexports.orderByEnd = function(items) {\n  items.sort(function (a, b) {\n    var aTime = ('end' in a.data) ? a.data.end : a.data.start,\n        bTime = ('end' in b.data) ? b.data.end : b.data.start;\n\n    return aTime - bTime;\n  });\n};\n\n/**\n * Adjust vertical positions of the items such that they don't overlap each\n * other.\n * @param {Item[]} items\n *            All visible items\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n *            Margins between items and between items and the axis.\n * @param {boolean} [force=false]\n *            If true, all items will be repositioned. If false (default), only\n *            items having a top===null will be re-stacked\n */\nexports.stack = function(items, margin, force) {\n  if (force) {\n    // reset top position of all items\n    for (var i = 0; i < items.length; i++) {\n      items[i].top = null;\n    }\n  }\n\n  // calculate new, non-overlapping positions\n  for (var i = 0; i < items.length; i++) {\n    var item = items[i];\n    if (item.stack && item.top === null) {\n      // initialize top position\n      item.top = margin.axis;\n\n      do {\n        // TODO: optimize checking for overlap. when there is a gap without items,\n        //       you only need to check for items from the next item on, not from zero\n        var collidingItem = null;\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          var other = items[j];\n          if (other.top !== null && other !== item && other.stack && exports.collision(item, other, margin.item, other.options.rtl)) {\n            collidingItem = other;\n            break;\n          }\n        }\n\n        if (collidingItem != null) {\n          // There is a collision. Reposition the items above the colliding element\n          item.top = collidingItem.top + collidingItem.height + margin.item.vertical;\n        }\n      } while (collidingItem);\n    }\n  }\n};\n\n\n/**\n * Adjust vertical positions of the items without stacking them\n * @param {Item[]} items\n *            All visible items\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n *            Margins between items and between items and the axis.\n* @param {subgroups[]} subgroups\n *            All subgroups\n */\n exports.nostack = function(items, margin, subgroups, stackSubgroups) {\n  for (var i = 0; i < items.length; i++) {\n    if (items[i].data.subgroup == undefined) {\n      items[i].top = margin.item.vertical;\n    } else if (items[i].data.subgroup !== undefined && stackSubgroups) {\n      var newTop = 0;\n      for (var subgroup in subgroups) {\n        if (subgroups.hasOwnProperty(subgroup)) {\n          if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroups[items[i].data.subgroup].index) {\n            newTop += subgroups[subgroup].height;\n            subgroups[items[i].data.subgroup].top = newTop;\n          }\n        }\n      }\n      items[i].top = newTop + 0.5 * margin.item.vertical;\n    }\n  }\n  if (!stackSubgroups) {\n    exports.stackSubgroups(items, margin, subgroups)\n  }\n};\n\n/**\n * Adjust vertical positions of the subgroups such that they don't overlap each\n * other.\n * @param {subgroups[]} subgroups\n *            All subgroups\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n *            Margins between items and between items and the axis.\n */\nexports.stackSubgroups = function(items, margin, subgroups) {\n  for (var subgroup in subgroups) {\n    if (subgroups.hasOwnProperty(subgroup)) {\n\n\n      subgroups[subgroup].top = 0;\n      do {\n        // TODO: optimize checking for overlap. when there is a gap without items,\n        //       you only need to check for items from the next item on, not from zero\n        var collidingItem = null;\n        for (var otherSubgroup in subgroups) {\n          if (subgroups[otherSubgroup].top !== null && otherSubgroup !== subgroup && subgroups[subgroup].index > subgroups[otherSubgroup].index && exports.collisionByTimes(subgroups[subgroup], subgroups[otherSubgroup])) {\n            collidingItem = subgroups[otherSubgroup];\n            break;\n          }\n        }\n\n        if (collidingItem != null) {\n          // There is a collision. Reposition the subgroups above the colliding element\n          subgroups[subgroup].top = collidingItem.top + collidingItem.height;\n        }\n      } while (collidingItem);\n    }\n  }\n  for (var i = 0; i < items.length; i++) {\n    if (items[i].data.subgroup !== undefined) {\n      items[i].top = subgroups[items[i].data.subgroup].top + 0.5 * margin.item.vertical;\n    }\n  }\n}\n\n/**\n * Test if the two provided items collide\n * The items must have parameters left, width, top, and height.\n * @param {Item} a          The first item\n * @param {Item} b          The second item\n * @param {{horizontal: number, vertical: number}} margin\n *                          An object containing a horizontal and vertical\n *                          minimum required margin.\n * @param {boolean} rtl\n * @return {boolean}        true if a and b collide, else false\n */\nexports.collision = function(a, b, margin, rtl) {\n  if (rtl) {\n    return  ((a.right - margin.horizontal + EPSILON)  < (b.right + b.width) &&\n    (a.right + a.width + margin.horizontal - EPSILON) > b.right &&\n    (a.top - margin.vertical + EPSILON)              < (b.top + b.height) &&\n    (a.top + a.height + margin.vertical - EPSILON)   > b.top);\n  } else {\n    return ((a.left - margin.horizontal + EPSILON)   < (b.left + b.width) &&\n    (a.left + a.width + margin.horizontal - EPSILON) > b.left &&\n    (a.top - margin.vertical + EPSILON)              < (b.top + b.height) &&\n    (a.top + a.height + margin.vertical - EPSILON)   > b.top);\n  }\n};\n\n/**\n * Test if the two provided objects collide\n * The objects must have parameters start, end, top, and height.\n * @param {Object} a          The first Object\n * @param {Object} b          The second Object\n * @return {boolean}        true if a and b collide, else false\n */\nexports.collisionByTimes = function(a, b) {\n  return (\n    (a.start <= b.start && a.end >= b.start && a.top < (b.top + b.height) && (a.top + a.height) > b.top ) ||\n    (b.start <= a.start && b.end >= a.start && b.top < (a.top + a.height) && (b.top + b.height) > a.top )\n  )\n}\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/Stack.js","var Hammer = require('../../../module/hammer');\nvar Item = require('./Item');\n\n/**\n * @constructor RangeItem\n * @extends Item\n * @param {Object} data             Object containing parameters start, end\n *                                  content, className.\n * @param {{toScreen: function, toTime: function}} conversion\n *                                  Conversion functions from time to screen and vice versa\n * @param {Object} [options]        Configuration options\n *                                  // TODO: describe options\n */\nfunction RangeItem (data, conversion, options) {\n  this.props = {\n    content: {\n      width: 0\n    }\n  };\n  this.overflow = false; // if contents can overflow (css styling), this flag is set to true\n  this.options = options;\n  // validate data\n  if (data) {\n    if (data.start == undefined) {\n      throw new Error('Property \"start\" missing in item ' + data.id);\n    }\n    if (data.end == undefined) {\n      throw new Error('Property \"end\" missing in item ' + data.id);\n    }\n  }\n\n  Item.call(this, data, conversion, options);\n}\n\nRangeItem.prototype = new Item (null, null, null);\n\nRangeItem.prototype.baseClassName = 'vis-item vis-range';\n\n/**\n * Check whether this item is visible inside given range\n * @returns {{start: Number, end: Number}} range with a timestamp for start and end\n * @returns {boolean} True if visible\n */\nRangeItem.prototype.isVisible = function(range) {\n  // determine visibility\n  return (this.data.start < range.end) && (this.data.end > range.start);\n};\n\n/**\n * Repaint the item\n */\nRangeItem.prototype.redraw = function() {\n  var dom = this.dom;\n  if (!dom) {\n    // create DOM\n    this.dom = {};\n    dom = this.dom;\n\n      // background box\n    dom.box = document.createElement('div');\n    // className is updated in redraw()\n\n    // frame box (to prevent the item contents from overflowing)\n    dom.frame = document.createElement('div');\n    dom.frame.className = 'vis-item-overflow';\n    dom.box.appendChild(dom.frame);\n  \n    // visible frame box (showing the frame that is always visible)\n    dom.visibleFrame = document.createElement('div');\n    dom.visibleFrame.className = 'vis-item-visible-frame';\n    dom.box.appendChild(dom.visibleFrame);\n\n    // contents box\n    dom.content = document.createElement('div');\n    dom.content.className = 'vis-item-content';\n    dom.frame.appendChild(dom.content);\n\n    // attach this item as attribute\n    dom.box['timeline-item'] = this;\n\n    this.dirty = true;\n  }\n\n  // append DOM to parent DOM\n  if (!this.parent) {\n    throw new Error('Cannot redraw item: no parent attached');\n  }\n  if (!dom.box.parentNode) {\n    var foreground = this.parent.dom.foreground;\n    if (!foreground) {\n      throw new Error('Cannot redraw item: parent has no foreground container element');\n    }\n    foreground.appendChild(dom.box);\n  }\n  this.displayed = true;\n\n  // Update DOM when item is marked dirty. An item is marked dirty when:\n  // - the item is not yet rendered\n  // - the item's data is changed\n  // - the item is selected/deselected\n  if (this.dirty) {\n    this._updateContents(this.dom.content);\n    this._updateTitle();\n    this._updateDataAttributes(this.dom.box);\n    this._updateStyle(this.dom.box);\n\n    var editable = (this.options.editable.updateTime || \n                    this.options.editable.updateGroup ||\n                    this.editable === true) &&\n                   this.editable !== false;\n\n    // update class\n    var className = (this.data.className ? (' ' + this.data.className) : '') +\n        (this.selected ? ' vis-selected' : '') + \n        (editable ? ' vis-editable' : ' vis-readonly');\n    dom.box.className = this.baseClassName + className;\n\n    // determine from css whether this box has overflow\n    this.overflow = window.getComputedStyle(dom.frame).overflow !== 'hidden';\n\n    // recalculate size\n    // turn off max-width to be able to calculate the real width\n    // this causes an extra browser repaint/reflow, but so be it\n    this.dom.content.style.maxWidth = 'none';\n    this.props.content.width = this.dom.content.offsetWidth;\n    this.height = this.dom.box.offsetHeight;\n    this.dom.content.style.maxWidth = '';\n\n    this.dirty = false;\n  }\n\n  this._repaintOnItemUpdateTimeTooltip(dom.box);\n  this._repaintDeleteButton(dom.box);\n  this._repaintDragCenter();\n  this._repaintDragLeft();\n  this._repaintDragRight();\n};\n\n/**\n * Show the item in the DOM (when not already visible). The items DOM will\n * be created when needed.\n */\nRangeItem.prototype.show = function() {\n  if (!this.displayed) {\n    this.redraw();\n  }\n};\n\n/**\n * Hide the item from the DOM (when visible)\n * @return {Boolean} changed\n */\nRangeItem.prototype.hide = function() {\n  if (this.displayed) {\n    var box = this.dom.box;\n\n    if (box.parentNode) {\n      box.parentNode.removeChild(box);\n    }\n\n    this.displayed = false;\n  }\n};\n\n/**\n * Reposition the item horizontally\n * @param {boolean} [limitSize=true] If true (default), the width of the range\n *                                   item will be limited, as the browser cannot\n *                                   display very wide divs. This means though\n *                                   that the applied left and width may\n *                                   not correspond to the ranges start and end\n * @Override\n */\nRangeItem.prototype.repositionX = function(limitSize) {\n  var parentWidth = this.parent.width;\n  var start = this.conversion.toScreen(this.data.start);\n  var end = this.conversion.toScreen(this.data.end);\n  var contentStartPosition;\n  var contentWidth;\n\n  // limit the width of the range, as browsers cannot draw very wide divs\n  if (limitSize === undefined || limitSize === true) {\n    if (start < -parentWidth) {\n      start = -parentWidth;\n    }\n    if (end > 2 * parentWidth) {\n      end = 2 * parentWidth;\n    }\n  }\n\n  // add 0.5 to compensate floating-point values rounding\n  var boxWidth = Math.max(end - start + 0.5, 1);\n\n  if (this.overflow) {\n    if (this.options.rtl) {\n      this.right = start;\n    } else {\n      this.left = start;\n    }\n    this.width = boxWidth + this.props.content.width;\n    contentWidth = this.props.content.width;\n\n    // Note: The calculation of width is an optimistic calculation, giving\n    //       a width which will not change when moving the Timeline\n    //       So no re-stacking needed, which is nicer for the eye;\n  }\n  else {\n    if (this.options.rtl) {\n      this.right = start;\n    } else {\n      this.left = start;\n    }\n    this.width = boxWidth;\n    contentWidth = Math.min(end - start, this.props.content.width);\n  }\n\n  if (this.options.rtl) {\n    this.dom.box.style.right = this.right + 'px';\n  } else {\n    this.dom.box.style.left = this.left + 'px'; \n  }\n  this.dom.box.style.width = boxWidth + 'px';\n\n  switch (this.options.align) {\n    case 'left':\n      if (this.options.rtl) {\n        this.dom.content.style.right = '0';\n      } else {\n        this.dom.content.style.left = '0';\n      }\n      break;\n\n    case 'right':\n      if (this.options.rtl) {\n        this.dom.content.style.right = Math.max((boxWidth - contentWidth), 0) + 'px';\n      } else {\n        this.dom.content.style.left = Math.max((boxWidth - contentWidth), 0) + 'px';\n      }\n      break;\n\n    case 'center':\n      if (this.options.rtl) {\n        this.dom.content.style.right = Math.max((boxWidth - contentWidth) / 2, 0) + 'px';\n      } else {\n        this.dom.content.style.left = Math.max((boxWidth - contentWidth) / 2, 0) + 'px';\n      }\n      \n      break;\n\n    default: // 'auto'\n      // when range exceeds left of the window, position the contents at the left of the visible area\n      if (this.overflow) {\n        if (end > 0) {\n          contentStartPosition = Math.max(-start, 0);\n        }\n        else {\n          contentStartPosition = -contentWidth; // ensure it's not visible anymore\n        }\n      }\n      else {\n        if (start < 0) {\n          contentStartPosition = -start;\n        }\n        else {\n          contentStartPosition = 0;\n        }\n      }\n      if (this.options.rtl) {\n        this.dom.content.style.right = contentStartPosition + 'px';\n      } else {\n        this.dom.content.style.left = contentStartPosition + 'px';\n        this.dom.content.style.width = 'calc(100% - ' + contentStartPosition + 'px)';\n      }\n  }\n};\n\n/**\n * Reposition the item vertically\n * @Override\n */\nRangeItem.prototype.repositionY = function() {\n  var orientation = this.options.orientation.item;\n  var box = this.dom.box;\n\n  if (orientation == 'top') {\n    box.style.top = this.top + 'px';\n  }\n  else {\n    box.style.top = (this.parent.height - this.top - this.height) + 'px';\n  }\n};\n\n/**\n * Repaint a drag area on the left side of the range when the range is selected\n * @protected\n */\nRangeItem.prototype._repaintDragLeft = function () {\n  if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) {\n    // create and show drag area\n    var dragLeft = document.createElement('div');\n    dragLeft.className = 'vis-drag-left';\n    dragLeft.dragLeftItem = this;\n\n    this.dom.box.appendChild(dragLeft);\n    this.dom.dragLeft = dragLeft;\n  }\n  else if (!this.selected && this.dom.dragLeft) {\n    // delete drag area\n    if (this.dom.dragLeft.parentNode) {\n      this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft);\n    }\n    this.dom.dragLeft = null;\n  }\n};\n\n/**\n * Repaint a drag area on the right side of the range when the range is selected\n * @protected\n */\nRangeItem.prototype._repaintDragRight = function () {\n  if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) {\n    // create and show drag area\n    var dragRight = document.createElement('div');\n    dragRight.className = 'vis-drag-right';\n    dragRight.dragRightItem = this;\n\n    this.dom.box.appendChild(dragRight);\n    this.dom.dragRight = dragRight;\n  }\n  else if (!this.selected && this.dom.dragRight) {\n    // delete drag area\n    if (this.dom.dragRight.parentNode) {\n      this.dom.dragRight.parentNode.removeChild(this.dom.dragRight);\n    }\n    this.dom.dragRight = null;\n  }\n};\n\nmodule.exports = RangeItem;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/item/RangeItem.js","var Hammer = require('../../../module/hammer');\nvar util = require('../../../util');\nvar moment = require('../../../module/moment');\n\n\n/**\n * @constructor Item\n * @param {Object} data             Object containing (optional) parameters type,\n *                                  start, end, content, group, className.\n * @param {{toScreen: function, toTime: function}} conversion\n *                                  Conversion functions from time to screen and vice versa\n * @param {Object} options          Configuration options\n *                                  // TODO: describe available options\n */\nfunction Item (data, conversion, options) {\n  this.id = null;\n  this.parent = null;\n  this.data = data;\n  this.dom = null;\n  this.conversion = conversion || {};\n  this.options = options || {};  \n  this.selected = false;\n  this.displayed = false;\n  this.groupShowing = true;\n  this.dirty = true;\n  this.popup = null;\n\n  this.top = null;\n  this.right = null;\n  this.left = null;\n  this.width = null;\n  this.height = null;\n\n  this.editable = null;\n  if (this.data && this.data.hasOwnProperty('editable')){\n    if(typeof this.data.editable === 'boolean') {\n        this.editable = {\n          updateTime: this.data.editable,\n          updateGroup: this.data.editable,\n          remove: this.data.editable\n        }\n    }\n    else if(typeof options.editable === 'object') {\n      this.editable = {};\n      util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable);\n    };\n  }\n}\n\nItem.prototype.stack = true;\n\n/**\n * Select current item\n */\nItem.prototype.select = function() {\n  this.selected = true;\n  this.dirty = true;\n  if (this.displayed) this.redraw();\n};\n\n/**\n * Unselect current item\n */\nItem.prototype.unselect = function() {\n  this.selected = false;\n  this.dirty = true;\n  if (this.displayed) this.redraw();\n};\n\n/**\n * Set data for the item. Existing data will be updated. The id should not\n * be changed. When the item is displayed, it will be redrawn immediately.\n * @param {Object} data\n */\nItem.prototype.setData = function(data) {\n  var groupChanged = data.group != undefined && this.data.group != data.group;\n  if (groupChanged) {\n    this.parent.itemSet._moveToGroup(this, data.group);\n  }\n\n  if (data.hasOwnProperty('editable')){\n    if (typeof data.editable === 'boolean') {\n      this.editable = {\n        updateTime: this.data.editable,\n        updateGroup: this.data.editable,\n        remove: this.data.editable\n      }\n    }\n    else if(typeof options.editable === 'object') {\n      this.editable = {};\n      util.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, data.editable);\n    }\n  }\n\n  this.data = data;\n  this.dirty = true;\n  if (this.displayed) this.redraw();\n};\n\n/**\n * Set a parent for the item\n * @param {ItemSet | Group} parent\n */\nItem.prototype.setParent = function(parent) {\n  if (this.displayed) {\n    this.hide();\n    this.parent = parent;\n    if (this.parent) {\n      this.show();\n    }\n  }\n  else {\n    this.parent = parent;\n  }\n};\n\n/**\n * Check whether this item is visible inside given range\n * @returns {{start: Number, end: Number}} range with a timestamp for start and end\n * @returns {boolean} True if visible\n */\nItem.prototype.isVisible = function(range) {\n  return false;\n};\n\n/**\n * Show the Item in the DOM (when not already visible)\n * @return {Boolean} changed\n */\nItem.prototype.show = function() {\n  return false;\n};\n\n/**\n * Hide the Item from the DOM (when visible)\n * @return {Boolean} changed\n */\nItem.prototype.hide = function() {\n  return false;\n};\n\n/**\n * Repaint the item\n */\nItem.prototype.redraw = function() {\n  // should be implemented by the item\n};\n\n/**\n * Reposition the Item horizontally\n */\nItem.prototype.repositionX = function() {\n  // should be implemented by the item\n};\n\n/**\n * Reposition the Item vertically\n */\nItem.prototype.repositionY = function() {\n  // should be implemented by the item\n};\n\n/**\n * Repaint a drag area on the center of the item when the item is selected\n * @protected\n */\nItem.prototype._repaintDragCenter = function () {\n  if (this.selected && this.options.editable.updateTime && !this.dom.dragCenter) {\n    var me = this;\n\n    // create and show drag area\n    var dragCenter = document.createElement('div');\n    dragCenter.className = 'vis-drag-center';\n    dragCenter.dragCenterItem = this;\n\n    new Hammer(dragCenter).on('doubletap', function (event) {\n      event.stopPropagation();\n      me.parent.itemSet._onUpdateItem(me);\n    });\n\n    if (this.dom.box) {\n      this.dom.box.appendChild(dragCenter);\n    } \n    else if (this.dom.point) {\n      this.dom.point.appendChild(dragCenter);\n    }\n    \n    this.dom.dragCenter = dragCenter;\n  }\n  else if (!this.selected && this.dom.dragCenter) {\n    // delete drag area\n    if (this.dom.dragCenter.parentNode) {\n      this.dom.dragCenter.parentNode.removeChild(this.dom.dragCenter);\n    }\n    this.dom.dragCenter = null;\n  }\n};\n\n/**\n * Repaint a delete button on the top right of the item when the item is selected\n * @param {HTMLElement} anchor\n * @protected\n */\nItem.prototype._repaintDeleteButton = function (anchor) {\n  var editable = ((this.options.editable.overrideItems || this.editable == null) && this.options.editable.remove) ||\n                 (!this.options.editable.overrideItems && this.editable != null && this.editable.remove);\n\n  if (this.selected && editable && !this.dom.deleteButton) {\n    // create and show button\n    var me = this;\n\n    var deleteButton = document.createElement('div');\n\n    if (this.options.rtl) {\n      deleteButton.className = 'vis-delete-rtl';\n    } else {\n      deleteButton.className = 'vis-delete';\n    }\n    deleteButton.title = 'Delete this item';\n\n    // TODO: be able to destroy the delete button\n    new Hammer(deleteButton).on('tap', function (event) {\n      event.stopPropagation();\n      me.parent.removeFromDataSet(me);\n    });\n\n    anchor.appendChild(deleteButton);\n    this.dom.deleteButton = deleteButton;\n  }\n  else if (!this.selected && this.dom.deleteButton) {\n    // remove button\n    if (this.dom.deleteButton.parentNode) {\n      this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton);\n    }\n    this.dom.deleteButton = null;\n  }\n};\n\n/**\n * Repaint a onChange tooltip on the top right of the item when the item is selected\n * @param {HTMLElement} anchor\n * @protected\n */\nItem.prototype._repaintOnItemUpdateTimeTooltip = function (anchor) {\n  if (!this.options.tooltipOnItemUpdateTime) return;\n\n  var editable = (this.options.editable.updateTime || \n                  this.data.editable === true) &&\n                 this.data.editable !== false;\n\n  if (this.selected && editable && !this.dom.onItemUpdateTimeTooltip) {\n    // create and show tooltip\n    var me = this;\n\n    var onItemUpdateTimeTooltip = document.createElement('div');\n\n    onItemUpdateTimeTooltip.className = 'vis-onUpdateTime-tooltip';\n    anchor.appendChild(onItemUpdateTimeTooltip);\n    this.dom.onItemUpdateTimeTooltip = onItemUpdateTimeTooltip;\n\n  } else if (!this.selected && this.dom.onItemUpdateTimeTooltip) {\n    // remove button\n    if (this.dom.onItemUpdateTimeTooltip.parentNode) {\n      this.dom.onItemUpdateTimeTooltip.parentNode.removeChild(this.dom.onItemUpdateTimeTooltip);\n    }\n    this.dom.onItemUpdateTimeTooltip = null;\n  }\n\n  // position onChange tooltip\n  if (this.dom.onItemUpdateTimeTooltip) {\n\n    // only show when editing\n    this.dom.onItemUpdateTimeTooltip.style.visibility = this.parent.itemSet.touchParams.itemIsDragging ? 'visible' : 'hidden';\n    \n    // position relative to item's content\n    if (this.options.rtl) {\n      this.dom.onItemUpdateTimeTooltip.style.right = this.dom.content.style.right;\n    } else {\n      this.dom.onItemUpdateTimeTooltip.style.left = this.dom.content.style.left;\n    }\n\n    // position above or below the item depending on the item's position in the window\n    var tooltipOffset = 50; // TODO: should be tooltip height (depends on template)\n    var scrollTop = this.parent.itemSet.body.domProps.scrollTop;\n\n      // TODO: this.top for orientation:true is actually the items distance from the bottom... \n      // (should be this.bottom)\n    var itemDistanceFromTop \n    if (this.options.orientation.item == 'top') {\n      itemDistanceFromTop = this.top;\n    } else {\n      itemDistanceFromTop = (this.parent.height - this.top - this.height)\n    }\n    var isCloseToTop = itemDistanceFromTop + this.parent.top - tooltipOffset < -scrollTop;\n\n    if (isCloseToTop) {\n      this.dom.onItemUpdateTimeTooltip.style.bottom = \"\";\n      this.dom.onItemUpdateTimeTooltip.style.top = this.height + 2 + \"px\";\n    } else {\n      this.dom.onItemUpdateTimeTooltip.style.top = \"\";\n      this.dom.onItemUpdateTimeTooltip.style.bottom = this.height + 2 + \"px\";\n    }\n    \n    // handle tooltip content\n    var content;\n    var templateFunction;\n\n    if (this.options.tooltipOnItemUpdateTime && this.options.tooltipOnItemUpdateTime.template) {\n      templateFunction = this.options.tooltipOnItemUpdateTime.template.bind(this);\n      content = templateFunction(this.data);\n    } else {\n      content = 'start: ' + moment(this.data.start).format('MM/DD/YYYY hh:mm');\n      if (this.data.end) { \n        content += '<br> end: ' + moment(this.data.end).format('MM/DD/YYYY hh:mm');\n      }\n    }\n    this.dom.onItemUpdateTimeTooltip.innerHTML = content;\n  }\n};\n\n\n/**\n * Set HTML contents for the item\n * @param {Element} element   HTML element to fill with the contents\n * @private\n */\nItem.prototype._updateContents = function (element) {\n  var content;\n  var templateFunction;\n  var itemVisibleFrameContent;\n  var visibleFrameTemplateFunction; \n  var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset\n\n  var frameElement = this.dom.box || this.dom.point;\n  var itemVisibleFrameContentElement = frameElement.getElementsByClassName('vis-item-visible-frame')[0]\n\n  if (this.options.visibleFrameTemplate) {\n    visibleFrameTemplateFunction = this.options.visibleFrameTemplate.bind(this);\n    itemVisibleFrameContent = visibleFrameTemplateFunction(itemData, frameElement);\n  } else {\n    itemVisibleFrameContent = '';\n  }\n  \n  if (itemVisibleFrameContentElement) {\n    if ((itemVisibleFrameContent instanceof Object) && !(itemVisibleFrameContent instanceof Element)) {\n      visibleFrameTemplateFunction(itemData, itemVisibleFrameContentElement)\n    } else {\n       var changed = this._contentToString(this.itemVisibleFrameContent) !== this._contentToString(itemVisibleFrameContent);\n       if (changed) {\n        // only replace the content when changed\n        if (itemVisibleFrameContent instanceof Element) {\n          itemVisibleFrameContentElement.innerHTML = '';\n          itemVisibleFrameContentElement.appendChild(itemVisibleFrameContent);\n        }\n        else if (itemVisibleFrameContent != undefined) {\n          itemVisibleFrameContentElement.innerHTML = itemVisibleFrameContent;\n        }\n        else {\n          if (!(this.data.type == 'background' && this.data.content === undefined)) {\n            throw new Error('Property \"content\" missing in item ' + this.id);\n          }\n        }\n\n        this.itemVisibleFrameContent = itemVisibleFrameContent;\n       }\n    }\n  }\n\n  if (this.options.template) {\n    templateFunction = this.options.template.bind(this);\n    content = templateFunction(itemData, element);\n  } else {\n    content = this.data.content;\n  }\n\n  if ((content instanceof Object) && !(content instanceof Element)) {\n    templateFunction(itemData, element)\n  } else {\n    var changed = this._contentToString(this.content) !== this._contentToString(content);\n    if (changed) {\n      // only replace the content when changed\n      if (content instanceof Element) {\n        element.innerHTML = '';\n        element.appendChild(content);\n      }\n      else if (content != undefined) {\n        element.innerHTML = content;\n      }\n      else {\n        if (!(this.data.type == 'background' && this.data.content === undefined)) {\n          throw new Error('Property \"content\" missing in item ' + this.id);\n        }\n      }\n\n      this.content = content;\n    }\n  }\n};\n\n/**\n * Set HTML contents for the item\n * @private\n */\nItem.prototype._updateTitle = function () {\n  if (this.data.title != null) {\n    if (this.popup != null) {\n      this.popup.setText(this.data.title || '');\n    }\n  }\n};\n\n/**\n * Process dataAttributes timeline option and set as data- attributes on dom.content\n * @param {Element} element   HTML element to which the attributes will be attached\n * @private\n */\n Item.prototype._updateDataAttributes = function(element) {\n  if (this.options.dataAttributes && this.options.dataAttributes.length > 0) {\n    var attributes = [];\n\n    if (Array.isArray(this.options.dataAttributes)) {\n      attributes = this.options.dataAttributes;\n    }\n    else if (this.options.dataAttributes == 'all') {\n      attributes = Object.keys(this.data);\n    }\n    else {\n      return;\n    }\n\n    for (var i = 0; i < attributes.length; i++) {\n      var name = attributes[i];\n      var value = this.data[name];\n\n      if (value != null) {\n        element.setAttribute('data-' + name, value);\n      }\n      else {\n        element.removeAttribute('data-' + name);\n      }\n    }\n  }\n};\n\n/**\n * Update custom styles of the element\n * @param element\n * @private\n */\nItem.prototype._updateStyle = function(element) {\n  // remove old styles\n  if (this.style) {\n    util.removeCssText(element, this.style);\n    this.style = null;\n  }\n\n  // append new styles\n  if (this.data.style) {\n    util.addCssText(element, this.data.style);\n    this.style = this.data.style;\n  }\n};\n\n\n/**\n * Stringify the items contents\n * @param {string | Element | undefined} content\n * @returns {string | undefined}\n * @private\n */\nItem.prototype._contentToString = function (content) {\n  if (typeof content === 'string') return content;\n  if (content && 'outerHTML' in content) return content.outerHTML;\n  return content;\n};\n\n/**\n * Return the width of the item left from its start date\n * @return {number}\n */\nItem.prototype.getWidthLeft = function () {\n  return 0;\n};\n\n/**\n * Return the width of the item right from the max of its start and end date\n * @return {number}\n */\nItem.prototype.getWidthRight = function () {\n  return 0;\n};\n\n/**\n * Return the title of the item\n * @return {string | undefined}\n */\nItem.prototype.getTitle = function () {\n  return this.data.title;\n};\n\n/**\n * Set the popup object, and update the title\n * @param {Popup} popup\n */\nItem.prototype.setPopup = function (popup) {\n  this.popup = popup;\n  this._updateTitle();\n};\n\nmodule.exports = Item;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/item/Item.js","var util = require('../../util');\nvar Group = require('./Group');\n\n/**\n * @constructor BackgroundGroup\n * @param {Number | String} groupId\n * @param {Object} data\n * @param {ItemSet} itemSet\n */\nfunction BackgroundGroup (groupId, data, itemSet) {\n  Group.call(this, groupId, data, itemSet);\n\n  this.width = 0;\n  this.height = 0;\n  this.top = 0;\n  this.left = 0;\n}\n\nBackgroundGroup.prototype = Object.create(Group.prototype);\n\n/**\n * Repaint this group\n * @param {{start: number, end: number}} range\n * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin\n * @param {boolean} [restack=false]  Force restacking of all items\n * @return {boolean} Returns true if the group is resized\n */\nBackgroundGroup.prototype.redraw = function(range, margin, restack) {\n  var resized = false;\n\n  this.visibleItems = this._updateItemsInRange(this.orderedItems, this.visibleItems, range);\n\n  // calculate actual size\n  this.width = this.dom.background.offsetWidth;\n\n  // apply new height (just always zero for BackgroundGroup\n  this.dom.background.style.height  = '0';\n\n  // update vertical position of items after they are re-stacked and the height of the group is calculated\n  for (var i = 0, ii = this.visibleItems.length; i < ii; i++) {\n    var item = this.visibleItems[i];\n    item.repositionY(margin);\n  }\n\n  return resized;\n};\n\n/**\n * Show this group: attach to the DOM\n */\nBackgroundGroup.prototype.show = function() {\n  if (!this.dom.background.parentNode) {\n    this.itemSet.dom.background.appendChild(this.dom.background);\n  }\n};\n\nmodule.exports = BackgroundGroup;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/BackgroundGroup.js","var Item = require('./Item');\nvar util = require('../../../util');\n\n/**\n * @constructor BoxItem\n * @extends Item\n * @param {Object} data             Object containing parameters start\n *                                  content, className.\n * @param {{toScreen: function, toTime: function}} conversion\n *                                  Conversion functions from time to screen and vice versa\n * @param {Object} [options]        Configuration options\n *                                  // TODO: describe available options\n */\nfunction BoxItem (data, conversion, options) {\n  this.props = {\n    dot: {\n      width: 0,\n      height: 0\n    },\n    line: {\n      width: 0,\n      height: 0\n    }\n  };\n  this.options = options;\n  // validate data\n  if (data) {\n    if (data.start == undefined) {\n      throw new Error('Property \"start\" missing in item ' + data);\n    }\n  }\n\n  Item.call(this, data, conversion, options);\n}\n\nBoxItem.prototype = new Item (null, null, null);\n\n/**\n * Check whether this item is visible inside given range\n * @returns {{start: Number, end: Number}} range with a timestamp for start and end\n * @returns {boolean} True if visible\n */\nBoxItem.prototype.isVisible = function(range) {\n  // determine visibility\n  var isVisible;\n  var align = this.options.align;\n  var msPerPixel = (range.end - range.start) / range.body.dom.center.clientWidth;\n  var widthInMs = this.width * msPerPixel;\n\n  if (align == 'right') {\n    isVisible = (this.data.start.getTime() > range.start ) && (this.data.start.getTime() - widthInMs < range.end);\n  }\n  else if (align == 'left') {\n    isVisible = (this.data.start.getTime() + widthInMs > range.start ) && (this.data.start.getTime() < range.end);\n  }\n  else {\n    // default or 'center'\n    isVisible = (this.data.start.getTime() + widthInMs/2 > range.start ) && (this.data.start.getTime() - widthInMs/2 < range.end);\n  }\n  return isVisible;\n};\n\n/**\n * Repaint the item\n */\nBoxItem.prototype.redraw = function() {\n  var dom = this.dom;\n  if (!dom) {\n    // create DOM\n    this.dom = {};\n    dom = this.dom;\n\n    // create main box\n    dom.box = document.createElement('DIV');\n\n    // contents box (inside the background box). used for making margins\n    dom.content = document.createElement('DIV');\n    dom.content.className = 'vis-item-content';\n    dom.box.appendChild(dom.content);\n\n    // line to axis\n    dom.line = document.createElement('DIV');\n    dom.line.className = 'vis-line';\n\n    // dot on axis\n    dom.dot = document.createElement('DIV');\n    dom.dot.className = 'vis-dot';\n\n    // attach this item as attribute\n    dom.box['timeline-item'] = this;\n\n    this.dirty = true;\n  }\n\n  // append DOM to parent DOM\n  if (!this.parent) {\n    throw new Error('Cannot redraw item: no parent attached');\n  }\n  if (!dom.box.parentNode) {\n    var foreground = this.parent.dom.foreground;\n    if (!foreground) throw new Error('Cannot redraw item: parent has no foreground container element');\n    foreground.appendChild(dom.box);\n  }\n  if (!dom.line.parentNode) {\n    var background = this.parent.dom.background;\n    if (!background) throw new Error('Cannot redraw item: parent has no background container element');\n    background.appendChild(dom.line);\n  }\n  if (!dom.dot.parentNode) {\n    var axis = this.parent.dom.axis;\n    if (!background) throw new Error('Cannot redraw item: parent has no axis container element');\n    axis.appendChild(dom.dot);\n  }\n  this.displayed = true;\n\n  // Update DOM when item is marked dirty. An item is marked dirty when:\n  // - the item is not yet rendered\n  // - the item's data is changed\n  // - the item is selected/deselected\n  if (this.dirty) {\n    this._updateContents(this.dom.content);\n    this._updateTitle();\n    this._updateDataAttributes(this.dom.box);\n    this._updateStyle(this.dom.box);\n\n    var editable = (this.options.editable.updateTime ||\n                    this.options.editable.updateGroup ||\n                    this.editable === true) &&\n                   this.editable !== false;\n\n    // update class\n    var className = (this.data.className? ' ' + this.data.className : '') +\n        (this.selected ? ' vis-selected' : '') +\n        (editable ? ' vis-editable' : ' vis-readonly');\n    dom.box.className = 'vis-item vis-box' + className;\n    dom.line.className = 'vis-item vis-line' + className;\n    dom.dot.className  = 'vis-item vis-dot' + className;\n\n    // set initial position in the visible range of the grid so that the\n    // rendered box size can be determinated correctly, even the content\n    // has a dynamic width (fixes #2032).\n    var previousRight = dom.box.style.right;\n    var previousLeft = dom.box.style.left;\n    if (this.options.rtl) {\n      dom.box.style.right = \"0px\";\n    } else {\n      dom.box.style.left = \"0px\";\n    }\n\n    // recalculate size\n    this.props.dot.height = dom.dot.offsetHeight;\n    this.props.dot.width = dom.dot.offsetWidth;\n    this.props.line.width = dom.line.offsetWidth;\n    this.width = dom.box.offsetWidth;\n    this.height = dom.box.offsetHeight;\n\n    // restore previous position\n    if (this.options.rtl) {\n      dom.box.style.right = previousRight;\n    } else {\n      dom.box.style.left = previousLeft;\n    }\n\n    this.dirty = false;\n  }\n\n  this._repaintOnItemUpdateTimeTooltip(dom.box);\n  this._repaintDragCenter();\n  this._repaintDeleteButton(dom.box);\n};\n\n/**\n * Show the item in the DOM (when not already displayed). The items DOM will\n * be created when needed.\n */\nBoxItem.prototype.show = function() {\n  if (!this.displayed) {\n    this.redraw();\n  }\n};\n\n/**\n * Hide the item from the DOM (when visible)\n */\nBoxItem.prototype.hide = function() {\n  if (this.displayed) {\n    var dom = this.dom;\n\n    if (dom.box.parentNode)   dom.box.parentNode.removeChild(dom.box);\n    if (dom.line.parentNode)  dom.line.parentNode.removeChild(dom.line);\n    if (dom.dot.parentNode)   dom.dot.parentNode.removeChild(dom.dot);\n\n    this.displayed = false;\n  }\n};\n\n/**\n * Reposition the item horizontally\n * @Override\n */\nBoxItem.prototype.repositionX = function() {\n  var start = this.conversion.toScreen(this.data.start);\n  var align = this.options.align;\n\n  // calculate left position of the box\n  if (align == 'right') {\n    if (this.options.rtl) {\n      this.right = start - this.width;\n\n      // reposition box, line, and dot\n      this.dom.box.style.right = this.right + 'px';\n      this.dom.line.style.right = (start - this.props.line.width) + 'px';\n      this.dom.dot.style.right = (start - this.props.line.width / 2 - this.props.dot.width / 2) + 'px';\n    } else {\n      this.left = start - this.width;\n\n      // reposition box, line, and dot\n      this.dom.box.style.left = this.left + 'px';\n      this.dom.line.style.left = (start - this.props.line.width) + 'px';\n      this.dom.dot.style.left = (start - this.props.line.width / 2 - this.props.dot.width / 2) + 'px';\n    }\n  }\n  else if (align == 'left') {\n    if (this.options.rtl) {\n      this.right = start;\n\n      // reposition box, line, and dot\n      this.dom.box.style.right = this.right + 'px';\n      this.dom.line.style.right = start + 'px';\n      this.dom.dot.style.right = (start + this.props.line.width / 2 - this.props.dot.width / 2) + 'px';\n    } else {\n      this.left = start;\n\n      // reposition box, line, and dot\n      this.dom.box.style.left = this.left + 'px';\n      this.dom.line.style.left = start + 'px';\n      this.dom.dot.style.left = (start + this.props.line.width / 2 - this.props.dot.width / 2) + 'px';\n    }\n  }\n  else {\n    // default or 'center'\n    if (this.options.rtl) {\n      this.right = start - this.width / 2;\n\n      // reposition box, line, and dot\n      this.dom.box.style.right = this.right + 'px';\n      this.dom.line.style.right = (start - this.props.line.width) + 'px';\n      this.dom.dot.style.right = (start - this.props.dot.width / 2) + 'px';\n    } else {\n      this.left = start - this.width / 2;\n\n      // reposition box, line, and dot\n      this.dom.box.style.left = this.left + 'px';\n      this.dom.line.style.left = (start - this.props.line.width / 2) + 'px';\n      this.dom.dot.style.left = (start - this.props.dot.width / 2) + 'px';\n    }\n  }\n};\n\n/**\n * Reposition the item vertically\n * @Override\n */\nBoxItem.prototype.repositionY = function() {\n  var orientation = this.options.orientation.item;\n  var box = this.dom.box;\n  var line = this.dom.line;\n  var dot = this.dom.dot;\n\n  if (orientation == 'top') {\n    box.style.top     = (this.top || 0) + 'px';\n\n    line.style.top    = '0';\n    line.style.height = (this.parent.top + this.top + 1) + 'px';\n    line.style.bottom = '';\n  }\n  else { // orientation 'bottom'\n    var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty\n    var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top;\n\n    box.style.top     = (this.parent.height - this.top - this.height || 0) + 'px';\n    line.style.top    = (itemSetHeight - lineHeight) + 'px';\n    line.style.bottom = '0';\n  }\n\n  dot.style.top = (-this.props.dot.height / 2) + 'px';\n};\n\n/**\n * Return the width of the item left from its start date\n * @return {number}\n */\nBoxItem.prototype.getWidthLeft = function () {\n  return this.width / 2;\n};\n\n/**\n * Return the width of the item right from its start date\n * @return {number}\n */\nBoxItem.prototype.getWidthRight = function () {\n  return this.width / 2;\n};\n\nmodule.exports = BoxItem;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/item/BoxItem.js","var Item = require('./Item');\n\n/**\n * @constructor PointItem\n * @extends Item\n * @param {Object} data             Object containing parameters start\n *                                  content, className.\n * @param {{toScreen: function, toTime: function}} conversion\n *                                  Conversion functions from time to screen and vice versa\n * @param {Object} [options]        Configuration options\n *                                  // TODO: describe available options\n */\nfunction PointItem (data, conversion, options) {\n  this.props = {\n    dot: {\n      top: 0,\n      width: 0,\n      height: 0\n    },\n    content: {\n      height: 0,\n      marginLeft: 0,\n      marginRight: 0\n    }\n  };\n  this.options = options;\n  // validate data\n  if (data) {\n    if (data.start == undefined) {\n      throw new Error('Property \"start\" missing in item ' + data);\n    }\n  }\n\n  Item.call(this, data, conversion, options);\n}\n\nPointItem.prototype = new Item (null, null, null);\n\n/**\n * Check whether this item is visible inside given range\n * @returns {{start: Number, end: Number}} range with a timestamp for start and end\n * @returns {boolean} True if visible\n */\nPointItem.prototype.isVisible = function(range) {\n  // determine visibility\n  var msPerPixel = (range.end - range.start) / range.body.dom.center.clientWidth;\n  var widthInMs = this.width * msPerPixel;\n  \n  return (this.data.start.getTime() + widthInMs > range.start ) && (this.data.start < range.end);\n};\n\n/**\n * Repaint the item\n */\nPointItem.prototype.redraw = function() {\n  var dom = this.dom;\n  if (!dom) {\n    // create DOM\n    this.dom = {};\n    dom = this.dom;\n\n    // background box\n    dom.point = document.createElement('div');\n    // className is updated in redraw()\n\n    // contents box, right from the dot\n    dom.content = document.createElement('div');\n    dom.content.className = 'vis-item-content';\n    dom.point.appendChild(dom.content);\n\n    // dot at start\n    dom.dot = document.createElement('div');\n    dom.point.appendChild(dom.dot);\n\n    // attach this item as attribute\n    dom.point['timeline-item'] = this;\n\n    this.dirty = true;\n  }\n\n  // append DOM to parent DOM\n  if (!this.parent) {\n    throw new Error('Cannot redraw item: no parent attached');\n  }\n  if (!dom.point.parentNode) {\n    var foreground = this.parent.dom.foreground;\n    if (!foreground) {\n      throw new Error('Cannot redraw item: parent has no foreground container element');\n    }\n    foreground.appendChild(dom.point);\n  }\n  this.displayed = true;\n\n  // Update DOM when item is marked dirty. An item is marked dirty when:\n  // - the item is not yet rendered\n  // - the item's data is changed\n  // - the item is selected/deselected\n  if (this.dirty) {\n    this._updateContents(this.dom.content);\n    this._updateTitle();\n    this._updateDataAttributes(this.dom.point);\n    this._updateStyle(this.dom.point);\n\n    var editable = (this.options.editable.updateTime || \n                    this.options.editable.updateGroup ||\n                    this.editable === true) &&\n                   this.editable !== false;\n\n    // update class\n    var className = (this.data.className ? ' ' + this.data.className : '') +\n        (this.selected ? ' vis-selected' : '') +\n        (editable ? ' vis-editable' : ' vis-readonly');\n    dom.point.className  = 'vis-item vis-point' + className;\n    dom.dot.className  = 'vis-item vis-dot' + className;\n\n    // recalculate size of dot and contents\n    this.props.dot.width = dom.dot.offsetWidth;\n    this.props.dot.height = dom.dot.offsetHeight;\n    this.props.content.height = dom.content.offsetHeight;\n\n    // resize contents\n    if (this.options.rtl) {\n      dom.content.style.marginRight = 2 * this.props.dot.width + 'px';\n    } else {\n      dom.content.style.marginLeft = 2 * this.props.dot.width + 'px';\n    }\n    //dom.content.style.marginRight = ... + 'px'; // TODO: margin right\n\n    // recalculate size\n    this.width = dom.point.offsetWidth;\n    this.height = dom.point.offsetHeight;\n\n    // reposition the dot\n    dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px';\n    if (this.options.rtl) {\n      dom.dot.style.right = (this.props.dot.width / 2) + 'px';\n    } else {\n      dom.dot.style.left = (this.props.dot.width / 2) + 'px';\n    }\n\n    this.dirty = false;\n  }\n  \n  this._repaintOnItemUpdateTimeTooltip(dom.point);\n  this._repaintDragCenter();\n  this._repaintDeleteButton(dom.point);\n};\n\n/**\n * Show the item in the DOM (when not already visible). The items DOM will\n * be created when needed.\n */\nPointItem.prototype.show = function() {\n  if (!this.displayed) {\n    this.redraw();\n  }\n};\n\n/**\n * Hide the item from the DOM (when visible)\n */\nPointItem.prototype.hide = function() {\n  if (this.displayed) {\n    if (this.dom.point.parentNode) {\n      this.dom.point.parentNode.removeChild(this.dom.point);\n    }\n\n    this.displayed = false;\n  }\n};\n\n/**\n * Reposition the item horizontally\n * @Override\n */\nPointItem.prototype.repositionX = function() {\n  var start = this.conversion.toScreen(this.data.start);\n\n  if (this.options.rtl) {\n    this.right = start - this.props.dot.width;\n\n    // reposition point\n    this.dom.point.style.right = this.right + 'px';\n  } else {\n    this.left = start - this.props.dot.width;\n\n    // reposition point\n    this.dom.point.style.left = this.left + 'px';\n  }\n};\n\n/**\n * Reposition the item vertically\n * @Override\n */\nPointItem.prototype.repositionY = function() {\n  var orientation = this.options.orientation.item;\n  var point = this.dom.point;\n  if (orientation == 'top') {\n    point.style.top = this.top + 'px';\n  }\n  else {\n    point.style.top = (this.parent.height - this.top - this.height) + 'px';\n  }\n};\n\n/**\n * Return the width of the item left from its start date\n * @return {number}\n */\nPointItem.prototype.getWidthLeft = function () {\n  return this.props.dot.width;\n};\n\n/**\n * Return the width of the item right from  its start date\n * @return {number}\n */\nPointItem.prototype.getWidthRight = function () {\n  return this.props.dot.width;\n};\n\nmodule.exports = PointItem;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/item/PointItem.js","var Hammer = require('../../../module/hammer');\nvar Item = require('./Item');\nvar BackgroundGroup = require('../BackgroundGroup');\nvar RangeItem = require('./RangeItem');\n\n/**\n * @constructor BackgroundItem\n * @extends Item\n * @param {Object} data             Object containing parameters start, end\n *                                  content, className.\n * @param {{toScreen: function, toTime: function}} conversion\n *                                  Conversion functions from time to screen and vice versa\n * @param {Object} [options]        Configuration options\n *                                  // TODO: describe options\n */\n// TODO: implement support for the BackgroundItem just having a start, then being displayed as a sort of an annotation\nfunction BackgroundItem (data, conversion, options) {\n  this.props = {\n    content: {\n      width: 0\n    }\n  };\n  this.overflow = false; // if contents can overflow (css styling), this flag is set to true\n\n  // validate data\n  if (data) {\n    if (data.start == undefined) {\n      throw new Error('Property \"start\" missing in item ' + data.id);\n    }\n    if (data.end == undefined) {\n      throw new Error('Property \"end\" missing in item ' + data.id);\n    }\n  }\n\n  Item.call(this, data, conversion, options);\n}\n\nBackgroundItem.prototype = new Item (null, null, null);\n\nBackgroundItem.prototype.baseClassName = 'vis-item vis-background';\nBackgroundItem.prototype.stack = false;\n\n/**\n * Check whether this item is visible inside given range\n * @returns {{start: Number, end: Number}} range with a timestamp for start and end\n * @returns {boolean} True if visible\n */\nBackgroundItem.prototype.isVisible = function(range) {\n  // determine visibility\n  return (this.data.start < range.end) && (this.data.end > range.start); \n};\n\n/**\n * Repaint the item\n */\nBackgroundItem.prototype.redraw = function() {\n  var dom = this.dom;\n  if (!dom) {\n    // create DOM\n    this.dom = {};\n    dom = this.dom;\n\n    // background box\n    dom.box = document.createElement('div');\n    // className is updated in redraw()\n\n    // frame box (to prevent the item contents from overflowing\n    dom.frame = document.createElement('div');\n    dom.frame.className = 'vis-item-overflow';\n    dom.box.appendChild(dom.frame);\n\n    // contents box\n    dom.content = document.createElement('div');\n    dom.content.className = 'vis-item-content';\n    dom.frame.appendChild(dom.content);\n\n    // Note: we do NOT attach this item as attribute to the DOM,\n    //       such that background items cannot be selected\n    //dom.box['timeline-item'] = this;\n\n    this.dirty = true;\n  }\n\n  // append DOM to parent DOM\n  if (!this.parent) {\n    throw new Error('Cannot redraw item: no parent attached');\n  }\n  if (!dom.box.parentNode) {\n    var background = this.parent.dom.background;\n    if (!background) {\n      throw new Error('Cannot redraw item: parent has no background container element');\n    }\n    background.appendChild(dom.box);\n  }\n  this.displayed = true;\n\n  // Update DOM when item is marked dirty. An item is marked dirty when:\n  // - the item is not yet rendered\n  // - the item's data is changed\n  // - the item is selected/deselected\n  if (this.dirty) {\n    this._updateContents(this.dom.content);\n    this._updateTitle();\n    this._updateDataAttributes(this.dom.content);\n    this._updateStyle(this.dom.box);\n\n    // update class\n    var className = (this.data.className ? (' ' + this.data.className) : '') +\n        (this.selected ? ' vis-selected' : '');\n    dom.box.className = this.baseClassName + className;\n\n    // determine from css whether this box has overflow\n    this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden';\n\n    // recalculate size\n    this.props.content.width = this.dom.content.offsetWidth;\n    this.height = 0; // set height zero, so this item will be ignored when stacking items\n\n    this.dirty = false;\n  }\n};\n\n/**\n * Show the item in the DOM (when not already visible). The items DOM will\n * be created when needed.\n */\nBackgroundItem.prototype.show = RangeItem.prototype.show;\n\n/**\n * Hide the item from the DOM (when visible)\n * @return {Boolean} changed\n */\nBackgroundItem.prototype.hide = RangeItem.prototype.hide;\n\n/**\n * Reposition the item horizontally\n * @Override\n */\nBackgroundItem.prototype.repositionX = RangeItem.prototype.repositionX;\n\n/**\n * Reposition the item vertically\n * @Override\n */\nBackgroundItem.prototype.repositionY = function(margin) {\n  var height;\n\n  // special positioning for subgroups\n  if (this.data.subgroup !== undefined) {\n    // TODO: instead of calculating the top position of the subgroups here for every BackgroundItem, calculate the top of the subgroup once in Itemset\n\n    var itemSubgroup = this.data.subgroup;\n    var subgroups = this.parent.subgroups;\n    var subgroupIndex = subgroups[itemSubgroup].index;\n\n    this.dom.box.style.height = this.parent.subgroups[itemSubgroup].height + 'px';\n\n    var orientation = this.options.orientation.item;\n    if (orientation == 'top') { \n      this.dom.box.style.top = this.parent.top + this.parent.subgroups[itemSubgroup].top + 'px';\n    } else {\n      this.dom.box.style.top = (this.parent.top + this.parent.height - this.parent.subgroups[itemSubgroup].top - this.parent.subgroups[itemSubgroup].height) + 'px';\n    }\n    this.dom.box.style.bottom = '';\n  }\n  // and in the case of no subgroups:\n  else {\n    // we want backgrounds with groups to only show in groups.\n    if (this.parent instanceof BackgroundGroup) {\n      // if the item is not in a group:\n      height = Math.max(this.parent.height,\n          this.parent.itemSet.body.domProps.center.height,\n          this.parent.itemSet.body.domProps.centerContainer.height);\n      this.dom.box.style.top = orientation == 'top' ? '0' : '';\n      this.dom.box.style.bottom = orientation == 'top' ? '' : '0';\n    }\n    else {\n      height = this.parent.height;\n      // same alignment for items when orientation is top or bottom\n      this.dom.box.style.top = this.parent.top + 'px';\n      this.dom.box.style.bottom = '';\n    }\n  }\n  this.dom.box.style.height = height + 'px';\n};\n\nmodule.exports = BackgroundItem;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/item/BackgroundItem.js","var util = require('../../util');\nvar Component = require('./Component');\nvar TimeStep = require('../TimeStep');\nvar DateUtil = require('../DateUtil');\nvar moment = require('../../module/moment');\n\n/**\n * A horizontal time axis\n * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body\n * @param {Object} [options]        See TimeAxis.setOptions for the available\n *                                  options.\n * @constructor TimeAxis\n * @extends Component\n */\nfunction TimeAxis (body, options) {\n  this.dom = {\n    foreground: null,\n    lines: [],\n    majorTexts: [],\n    minorTexts: [],\n    redundant: {\n      lines: [],\n      majorTexts: [],\n      minorTexts: []\n    }\n  };\n  this.props = {\n    range: {\n      start: 0,\n      end: 0,\n      minimumStep: 0\n    },\n    lineTop: 0\n  };\n\n  this.defaultOptions = {\n    orientation: {\n      axis: 'bottom'\n    },  // axis orientation: 'top' or 'bottom'\n    showMinorLabels: true,\n    showMajorLabels: true,\n    maxMinorChars: 7,\n    format: TimeStep.FORMAT,\n    moment: moment,\n    timeAxis: null\n  };\n  this.options = util.extend({}, this.defaultOptions);\n\n  this.body = body;\n\n  // create the HTML DOM\n  this._create();\n\n  this.setOptions(options);\n}\n\nTimeAxis.prototype = new Component();\n\n/**\n * Set options for the TimeAxis.\n * Parameters will be merged in current options.\n * @param {Object} options  Available options:\n *                          {string} [orientation.axis]\n *                          {boolean} [showMinorLabels]\n *                          {boolean} [showMajorLabels]\n */\nTimeAxis.prototype.setOptions = function(options) {\n  if (options) {\n    // copy all options that we know\n    util.selectiveExtend([\n      'showMinorLabels',\n      'showMajorLabels',\n      'maxMinorChars',\n      'hiddenDates',\n      'timeAxis',\n      'moment',\n      'rtl'\n    ], this.options, options);\n\n    // deep copy the format options\n    util.selectiveDeepExtend(['format'], this.options, options);\n\n    if ('orientation' in options) {\n      if (typeof options.orientation === 'string') {\n        this.options.orientation.axis = options.orientation;\n      }\n      else if (typeof options.orientation === 'object' && 'axis' in options.orientation) {\n        this.options.orientation.axis = options.orientation.axis;\n      }\n    }\n\n    // apply locale to moment.js\n    // TODO: not so nice, this is applied globally to moment.js\n    if ('locale' in options) {\n      if (typeof moment.locale === 'function') {\n        // moment.js 2.8.1+\n        moment.locale(options.locale);\n      }\n      else {\n        moment.lang(options.locale);\n      }\n    }\n  }\n};\n\n/**\n * Create the HTML DOM for the TimeAxis\n */\nTimeAxis.prototype._create = function() {\n  this.dom.foreground = document.createElement('div');\n  this.dom.background = document.createElement('div');\n\n  this.dom.foreground.className = 'vis-time-axis vis-foreground';\n  this.dom.background.className = 'vis-time-axis vis-background';\n};\n\n/**\n * Destroy the TimeAxis\n */\nTimeAxis.prototype.destroy = function() {\n  // remove from DOM\n  if (this.dom.foreground.parentNode) {\n    this.dom.foreground.parentNode.removeChild(this.dom.foreground);\n  }\n  if (this.dom.background.parentNode) {\n    this.dom.background.parentNode.removeChild(this.dom.background);\n  }\n\n  this.body = null;\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nTimeAxis.prototype.redraw = function () {\n  var props = this.props;\n  var foreground = this.dom.foreground;\n  var background = this.dom.background;\n\n  // determine the correct parent DOM element (depending on option orientation)\n  var parent = (this.options.orientation.axis == 'top') ? this.body.dom.top : this.body.dom.bottom;\n  var parentChanged = (foreground.parentNode !== parent);\n\n  // calculate character width and height\n  this._calculateCharSize();\n\n  // TODO: recalculate sizes only needed when parent is resized or options is changed\n  var showMinorLabels = this.options.showMinorLabels && this.options.orientation.axis !== 'none';\n  var showMajorLabels = this.options.showMajorLabels && this.options.orientation.axis !== 'none';\n\n  // determine the width and height of the elemens for the axis\n  props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0;\n  props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0;\n  props.height = props.minorLabelHeight + props.majorLabelHeight;\n  props.width = foreground.offsetWidth;\n\n  props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight -\n      (this.options.orientation.axis == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height);\n  props.minorLineWidth = 1; // TODO: really calculate width\n  props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight;\n  props.majorLineWidth = 1; // TODO: really calculate width\n\n  //  take foreground and background offline while updating (is almost twice as fast)\n  var foregroundNextSibling = foreground.nextSibling;\n  var backgroundNextSibling = background.nextSibling;\n  foreground.parentNode && foreground.parentNode.removeChild(foreground);\n  background.parentNode && background.parentNode.removeChild(background);\n\n  foreground.style.height = this.props.height + 'px';\n\n  this._repaintLabels();\n\n  // put DOM online again (at the same place)\n  if (foregroundNextSibling) {\n    parent.insertBefore(foreground, foregroundNextSibling);\n  }\n  else {\n    parent.appendChild(foreground)\n  }\n  if (backgroundNextSibling) {\n    this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling);\n  }\n  else {\n    this.body.dom.backgroundVertical.appendChild(background)\n  }\n  return this._isResized() || parentChanged;\n};\n\n/**\n * Repaint major and minor text labels and vertical grid lines\n * @private\n */\nTimeAxis.prototype._repaintLabels = function () {\n  var orientation = this.options.orientation.axis;\n\n  // calculate range and step (step such that we have space for 7 characters per label)\n  var start = util.convert(this.body.range.start, 'Number');\n  var end = util.convert(this.body.range.end, 'Number');\n  var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * this.options.maxMinorChars).valueOf();\n  var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this.body.range, timeLabelsize);\n  minimumStep -= this.body.util.toTime(0).valueOf();\n\n  var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates);\n  step.setMoment(this.options.moment);\n  if (this.options.format) {\n    step.setFormat(this.options.format);\n  }\n  if (this.options.timeAxis) {\n    step.setScale(this.options.timeAxis);\n  }\n  this.step = step;\n\n  // Move all DOM elements to a \"redundant\" list, where they\n  // can be picked for re-use, and clear the lists with lines and texts.\n  // At the end of the function _repaintLabels, left over elements will be cleaned up\n  var dom = this.dom;\n  dom.redundant.lines = dom.lines;\n  dom.redundant.majorTexts = dom.majorTexts;\n  dom.redundant.minorTexts = dom.minorTexts;\n  dom.lines = [];\n  dom.majorTexts = [];\n  dom.minorTexts = [];\n\n  var current;\n  var next;\n  var x;\n  var xNext;\n  var isMajor, nextIsMajor;\n  var width = 0, prevWidth;\n  var line;\n  var labelMinor;\n  var xFirstMajorLabel = undefined;\n  var count = 0;\n  const MAX = 1000;\n  var className;\n\n  step.start();\n  next = step.getCurrent();\n  xNext = this.body.util.toScreen(next);\n  while (step.hasNext() && count < MAX) {\n    count++;\n\n    isMajor = step.isMajor();\n    className = step.getClassName();\n    labelMinor = step.getLabelMinor();\n\n    current = next;\n    x = xNext;\n\n    step.next();\n    next = step.getCurrent();\n    nextIsMajor = step.isMajor();\n    xNext = this.body.util.toScreen(next);\n\n    prevWidth = width;\n    width = xNext - x;\n    var showMinorGrid = (width >= prevWidth * 0.4); // prevent displaying of the 31th of the month on a scale of 5 days\n\n    if (this.options.showMinorLabels && showMinorGrid) {\n      var label = this._repaintMinorText(x, labelMinor, orientation, className);\n      label.style.width = width + 'px'; // set width to prevent overflow\n    }\n\n    if (isMajor && this.options.showMajorLabels) {\n      if (x > 0) {\n        if (xFirstMajorLabel == undefined) {\n          xFirstMajorLabel = x;\n        }\n        label = this._repaintMajorText(x, step.getLabelMajor(), orientation, className);\n      }\n      line = this._repaintMajorLine(x, width, orientation, className);\n    }\n    else { // minor line\n      if (showMinorGrid) {\n        line = this._repaintMinorLine(x, width, orientation, className);\n      }\n      else {\n        if (line) {\n          // adjust the width of the previous grid\n          line.style.width = (parseInt (line.style.width) + width) + 'px';\n        }\n      }\n    }\n  }\n\n  if (count === MAX && !warnedForOverflow) {\n      console.warn(`Something is wrong with the Timeline scale. Limited drawing of grid lines to ${MAX} lines.`);\n      warnedForOverflow = true;\n  }\n\n  // create a major label on the left when needed\n  if (this.options.showMajorLabels) {\n    var leftTime = this.body.util.toTime(0),\n        leftText = step.getLabelMajor(leftTime),\n        widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation\n\n    if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) {\n      this._repaintMajorText(0, leftText, orientation, className);\n    }\n  }\n\n  // Cleanup leftover DOM elements from the redundant list\n  util.forEach(this.dom.redundant, function (arr) {\n    while (arr.length) {\n      var elem = arr.pop();\n      if (elem && elem.parentNode) {\n        elem.parentNode.removeChild(elem);\n      }\n    }\n  });\n};\n\n/**\n * Create a minor label for the axis at position x\n * @param {Number} x\n * @param {String} text\n * @param {String} orientation   \"top\" or \"bottom\" (default)\n * @param {String} className\n * @return {Element} Returns the HTML element of the created label\n * @private\n */\nTimeAxis.prototype._repaintMinorText = function (x, text, orientation, className) {\n  // reuse redundant label\n  var label = this.dom.redundant.minorTexts.shift();\n\n  if (!label) {\n    // create new label\n    var content = document.createTextNode('');\n    label = document.createElement('div');\n    label.appendChild(content);\n    this.dom.foreground.appendChild(label);\n  }\n  this.dom.minorTexts.push(label);\n  label.innerHTML = text;\n\n  label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0';\n\n  if (this.options.rtl) {\n    label.style.left = \"\";\n    label.style.right = x + 'px';\n  } else {\n    label.style.left = x + 'px';\n  };\n  label.className = 'vis-text vis-minor ' + className;\n  //label.title = title;  // TODO: this is a heavy operation\n\n  return label;\n};\n\n/**\n * Create a Major label for the axis at position x\n * @param {Number} x\n * @param {String} text\n * @param {String} orientation   \"top\" or \"bottom\" (default)\n * @param {String} className\n * @return {Element} Returns the HTML element of the created label\n * @private\n */\nTimeAxis.prototype._repaintMajorText = function (x, text, orientation, className) {\n  // reuse redundant label\n  var label = this.dom.redundant.majorTexts.shift();\n\n  if (!label) {\n    // create label\n    var content = document.createElement('div');\n    label = document.createElement('div');\n    label.appendChild(content);\n    this.dom.foreground.appendChild(label);\n  }\n\n  label.childNodes[0].innerHTML = text;\n  label.className = 'vis-text vis-major ' + className;\n  //label.title = title; // TODO: this is a heavy operation\n\n  label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight  + 'px');\n  if (this.options.rtl) {\n    label.style.left = \"\";\n    label.style.right = x + 'px';\n  } else {\n    label.style.left = x + 'px';\n  };\n\n  this.dom.majorTexts.push(label);\n  return label;\n};\n\n/**\n * Create a minor line for the axis at position x\n * @param {Number} x\n * @param {Number} width\n * @param {String} orientation   \"top\" or \"bottom\" (default)\n * @param {String} className\n * @return {Element} Returns the created line\n * @private\n */\nTimeAxis.prototype._repaintMinorLine = function (x, width, orientation, className) {\n  // reuse redundant line\n  var line = this.dom.redundant.lines.shift();\n  if (!line) {\n    // create vertical line\n    line = document.createElement('div');\n    this.dom.background.appendChild(line);\n  }\n  this.dom.lines.push(line);\n\n  var props = this.props;\n  if (orientation == 'top') {\n    line.style.top = props.majorLabelHeight + 'px';\n  }\n  else {\n    line.style.top = this.body.domProps.top.height + 'px';\n  }\n  line.style.height = props.minorLineHeight + 'px';\n  if (this.options.rtl) {\n    line.style.left = \"\";\n    line.style.right = (x - props.minorLineWidth / 2) + 'px';\n    line.className = 'vis-grid vis-vertical-rtl vis-minor ' + className;\n  } else {\n    line.style.left = (x - props.minorLineWidth / 2) + 'px';\n    line.className = 'vis-grid vis-vertical vis-minor ' + className;\n  };\n  line.style.width = width + 'px';\n\n  \n\n  return line;\n};\n\n/**\n * Create a Major line for the axis at position x\n * @param {Number} x\n * @param {Number} width\n * @param {String} orientation   \"top\" or \"bottom\" (default)\n * @param {String} className\n * @return {Element} Returns the created line\n * @private\n */\nTimeAxis.prototype._repaintMajorLine = function (x, width, orientation, className) {\n  // reuse redundant line\n  var line = this.dom.redundant.lines.shift();\n  if (!line) {\n    // create vertical line\n    line = document.createElement('div');\n    this.dom.background.appendChild(line);\n  }\n  this.dom.lines.push(line);\n\n  var props = this.props;\n  if (orientation == 'top') {\n    line.style.top = '0';\n  }\n  else {\n    line.style.top = this.body.domProps.top.height + 'px';\n  }\n\n  if (this.options.rtl) {\n    line.style.left = \"\";\n    line.style.right = (x - props.majorLineWidth / 2) + 'px';\n    line.className = 'vis-grid vis-vertical-rtl vis-major ' + className;\n  } else {\n    line.style.left = (x - props.majorLineWidth / 2) + 'px';\n    line.className = 'vis-grid vis-vertical vis-major ' + className;\n  }\n\n  line.style.height = props.majorLineHeight + 'px';\n  line.style.width = width  + 'px';\n\n  return line;\n};\n\n/**\n * Determine the size of text on the axis (both major and minor axis).\n * The size is calculated only once and then cached in this.props.\n * @private\n */\nTimeAxis.prototype._calculateCharSize = function () {\n  // Note: We calculate char size with every redraw. Size may change, for\n  // example when any of the timelines parents had display:none for example.\n\n  // determine the char width and height on the minor axis\n  if (!this.dom.measureCharMinor) {\n    this.dom.measureCharMinor = document.createElement('DIV');\n    this.dom.measureCharMinor.className = 'vis-text vis-minor vis-measure';\n    this.dom.measureCharMinor.style.position = 'absolute';\n\n    this.dom.measureCharMinor.appendChild(document.createTextNode('0'));\n    this.dom.foreground.appendChild(this.dom.measureCharMinor);\n  }\n  this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight;\n  this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth;\n\n  // determine the char width and height on the major axis\n  if (!this.dom.measureCharMajor) {\n    this.dom.measureCharMajor = document.createElement('DIV');\n    this.dom.measureCharMajor.className = 'vis-text vis-major vis-measure';\n    this.dom.measureCharMajor.style.position = 'absolute';\n\n    this.dom.measureCharMajor.appendChild(document.createTextNode('0'));\n    this.dom.foreground.appendChild(this.dom.measureCharMajor);\n  }\n  this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight;\n  this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth;\n};\n\n\nvar warnedForOverflow = false;\n\nmodule.exports = TimeAxis;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/TimeAxis.js","var keycharm = require('keycharm');\nvar Emitter = require('emitter-component');\nvar Hammer = require('../module/hammer');\nvar util = require('../util');\n\n/**\n * Turn an element into an clickToUse element.\n * When not active, the element has a transparent overlay. When the overlay is\n * clicked, the mode is changed to active.\n * When active, the element is displayed with a blue border around it, and\n * the interactive contents of the element can be used. When clicked outside\n * the element, the elements mode is changed to inactive.\n * @param {Element} container\n * @constructor\n */\nfunction Activator(container) {\n  this.active = false;\n\n  this.dom = {\n    container: container\n  };\n\n  this.dom.overlay = document.createElement('div');\n  this.dom.overlay.className = 'vis-overlay';\n\n  this.dom.container.appendChild(this.dom.overlay);\n\n  this.hammer = Hammer(this.dom.overlay);\n  this.hammer.on('tap', this._onTapOverlay.bind(this));\n\n  // block all touch events (except tap)\n  var me = this;\n  var events = [\n    'tap', 'doubletap', 'press',\n    'pinch',\n    'pan', 'panstart', 'panmove', 'panend'\n  ];\n  events.forEach(function (event) {\n    me.hammer.on(event, function (event) {\n      event.stopPropagation();\n    });\n  });\n\n  // attach a click event to the window, in order to deactivate when clicking outside the timeline\n  if (document && document.body) {\n    this.onClick = function (event) {\n      if (!_hasParent(event.target, container)) {\n        me.deactivate();\n      }\n    };\n    document.body.addEventListener('click', this.onClick);\n  }\n\n  if (this.keycharm !== undefined) {\n    this.keycharm.destroy();\n  }\n  this.keycharm = keycharm();\n\n  // keycharm listener only bounded when active)\n  this.escListener = this.deactivate.bind(this);\n}\n\n// turn into an event emitter\nEmitter(Activator.prototype);\n\n// The currently active activator\nActivator.current = null;\n\n/**\n * Destroy the activator. Cleans up all created DOM and event listeners\n */\nActivator.prototype.destroy = function () {\n  this.deactivate();\n\n  // remove dom\n  this.dom.overlay.parentNode.removeChild(this.dom.overlay);\n\n  // remove global event listener\n  if (this.onClick) {\n    document.body.removeEventListener('click', this.onClick);\n  }\n\n  // cleanup hammer instances\n  this.hammer.destroy();\n  this.hammer = null;\n  // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory)\n};\n\n/**\n * Activate the element\n * Overlay is hidden, element is decorated with a blue shadow border\n */\nActivator.prototype.activate = function () {\n  // we allow only one active activator at a time\n  if (Activator.current) {\n    Activator.current.deactivate();\n  }\n  Activator.current = this;\n\n  this.active = true;\n  this.dom.overlay.style.display = 'none';\n  util.addClassName(this.dom.container, 'vis-active');\n\n  this.emit('change');\n  this.emit('activate');\n\n  // ugly hack: bind ESC after emitting the events, as the Network rebinds all\n  // keyboard events on a 'change' event\n  this.keycharm.bind('esc', this.escListener);\n};\n\n/**\n * Deactivate the element\n * Overlay is displayed on top of the element\n */\nActivator.prototype.deactivate = function () {\n  this.active = false;\n  this.dom.overlay.style.display = '';\n  util.removeClassName(this.dom.container, 'vis-active');\n  this.keycharm.unbind('esc', this.escListener);\n\n  this.emit('change');\n  this.emit('deactivate');\n};\n\n/**\n * Handle a tap event: activate the container\n * @param event\n * @private\n */\nActivator.prototype._onTapOverlay = function (event) {\n  // activate the container\n  this.activate();\n  event.stopPropagation();\n};\n\n/**\n * Test whether the element has the requested parent element somewhere in\n * its chain of parent nodes.\n * @param {HTMLElement} element\n * @param {HTMLElement} parent\n * @returns {boolean} Returns true when the parent is found somewhere in the\n *                    chain of parent nodes.\n * @private\n */\nfunction _hasParent(element, parent) {\n  while (element) {\n    if (element === parent) {\n      return true\n    }\n    element = element.parentNode;\n  }\n  return false;\n}\n\nmodule.exports = Activator;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/shared/Activator.js","var Hammer = require('../../module/hammer');\nvar util = require('../../util');\nvar Component = require('./Component');\nvar moment = require('../../module/moment');\nvar locales = require('../locales');\n\n/**\n * A custom time bar\n * @param {{range: Range, dom: Object}} body\n * @param {Object} [options]        Available parameters:\n *                                  {number | string} id\n *                                  {string} locales\n *                                  {string} locale\n * @constructor CustomTime\n * @extends Component\n */\n\nfunction CustomTime (body, options) {\n  this.body = body;\n\n  // default options\n  this.defaultOptions = {\n    moment: moment,\n    locales: locales,\n    locale: 'en',\n    id: undefined,\n    title: undefined\n  };\n  this.options = util.extend({}, this.defaultOptions);\n\n  if (options && options.time) {\n    this.customTime = options.time;\n  } else {\n    this.customTime = new Date();\n  }\n\n  this.eventParams = {}; // stores state parameters while dragging the bar\n\n  this.setOptions(options);\n\n  // create the DOM\n  this._create();\n}\n\nCustomTime.prototype = new Component();\n\n/**\n * Set options for the component. Options will be merged in current options.\n * @param {Object} options  Available parameters:\n *                                  {number | string} id\n *                                  {string} locales\n *                                  {string} locale\n */\nCustomTime.prototype.setOptions = function(options) {\n  if (options) {\n    // copy all options that we know\n    util.selectiveExtend(['moment', 'locale', 'locales', 'id'], this.options, options);\n  }\n};\n\n/**\n * Create the DOM for the custom time\n * @private\n */\nCustomTime.prototype._create = function() {\n  var bar = document.createElement('div');\n  bar['custom-time'] = this;\n  bar.className = 'vis-custom-time ' + (this.options.id || '');\n  bar.style.position = 'absolute';\n  bar.style.top = '0px';\n  bar.style.height = '100%';\n  this.bar = bar;\n\n  var drag = document.createElement('div');\n  drag.style.position = 'relative';\n  drag.style.top = '0px';\n  drag.style.left = '-10px';\n  drag.style.height = '100%';\n  drag.style.width = '20px';\n\n  function onMouseWheel (e) {\n    this.body.range._onMouseWheel(e);\n  }\n\n  if (drag.addEventListener) {\n    // IE9, Chrome, Safari, Opera\n    drag.addEventListener(\"mousewheel\", onMouseWheel.bind(this), false);\n    // Firefox\n    drag.addEventListener(\"DOMMouseScroll\", onMouseWheel.bind(this), false);\n  } else {\n    // IE 6/7/8\n    drag.attachEvent(\"onmousewheel\", onMouseWheel.bind(this));\n  }\n\n  bar.appendChild(drag);\n  // attach event listeners\n  this.hammer = new Hammer(drag);\n  this.hammer.on('panstart', this._onDragStart.bind(this));\n  this.hammer.on('panmove',  this._onDrag.bind(this));\n  this.hammer.on('panend',   this._onDragEnd.bind(this));\n  this.hammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_HORIZONTAL});\n};\n\n/**\n * Destroy the CustomTime bar\n */\nCustomTime.prototype.destroy = function () {\n  this.hide();\n\n  this.hammer.destroy();\n  this.hammer = null;\n\n  this.body = null;\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nCustomTime.prototype.redraw = function () {\n  var parent = this.body.dom.backgroundVertical;\n  if (this.bar.parentNode != parent) {\n    // attach to the dom\n    if (this.bar.parentNode) {\n      this.bar.parentNode.removeChild(this.bar);\n    }\n    parent.appendChild(this.bar);\n  }\n\n  var x = this.body.util.toScreen(this.customTime);\n\n  var locale = this.options.locales[this.options.locale];\n  if (!locale) {\n    if (!this.warned) {\n      console.log('WARNING: options.locales[\\'' + this.options.locale + '\\'] not found. See http://visjs.org/docs/timeline/#Localization');\n      this.warned = true;\n    }\n    locale = this.options.locales['en']; // fall back on english when not available\n  }\n\n  var title = this.options.title;\n  // To hide the title completely use empty string ''.\n  if (title === undefined) {\n    title = locale.time + ': ' + this.options.moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss');\n    title = title.charAt(0).toUpperCase() + title.substring(1);\n  }\n\n  this.bar.style.left = x + 'px';\n  this.bar.title = title;\n\n  return false;\n};\n\n/**\n * Remove the CustomTime from the DOM\n */\nCustomTime.prototype.hide = function () {\n  // remove the line from the DOM\n  if (this.bar.parentNode) {\n    this.bar.parentNode.removeChild(this.bar);\n  }\n};\n\n/**\n * Set custom time.\n * @param {Date | number | string} time\n */\nCustomTime.prototype.setCustomTime = function(time) {\n  this.customTime = util.convert(time, 'Date');\n  this.redraw();\n};\n\n/**\n * Retrieve the current custom time.\n * @return {Date} customTime\n */\nCustomTime.prototype.getCustomTime = function() {\n  return new Date(this.customTime.valueOf());\n};\n\n/**\n  * Set custom title.\n  * @param {Date | number | string} title\n  */\nCustomTime.prototype.setCustomTitle = function(title) {\n  this.options.title = title;\n};\n\n/**\n * Start moving horizontally\n * @param {Event} event\n * @private\n */\nCustomTime.prototype._onDragStart = function(event) {\n  this.eventParams.dragging = true;\n  this.eventParams.customTime = this.customTime;\n\n  event.stopPropagation();\n};\n\n/**\n * Perform moving operating.\n * @param {Event} event\n * @private\n */\nCustomTime.prototype._onDrag = function (event) {\n  if (!this.eventParams.dragging) return;\n\n  var x = this.body.util.toScreen(this.eventParams.customTime) + event.deltaX;\n  var time = this.body.util.toTime(x);\n\n  this.setCustomTime(time);\n\n  // fire a timechange event\n  this.body.emitter.emit('timechange', {\n    id: this.options.id,\n    time: new Date(this.customTime.valueOf()),\n    event: util.elementsCensor(event)\n  });\n\n  event.stopPropagation();\n};\n\n/**\n * Stop moving operating.\n * @param {Event} event\n * @private\n */\nCustomTime.prototype._onDragEnd = function (event) {\n  if (!this.eventParams.dragging) return;\n\n  // fire a timechanged event\n  this.body.emitter.emit('timechanged', {\n    id: this.options.id,\n    time: new Date(this.customTime.valueOf()),\n    event: util.elementsCensor(event)\n  });\n\n  event.stopPropagation();\n};\n\n/**\n * Find a custom time from an event target:\n * searches for the attribute 'custom-time' in the event target's element tree\n * @param {Event} event\n * @return {CustomTime | null} customTime\n */\nCustomTime.customTimeFromTarget = function(event) {\n  var target = event.target;\n  while (target) {\n    if (target.hasOwnProperty('custom-time')) {\n      return target['custom-time'];\n    }\n    target = target.parentNode;\n  }\n\n  return null;\n};\n\nmodule.exports = CustomTime;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/CustomTime.js","// English\nexports['en'] = {\n  current: 'current',\n  time: 'time'\n};\nexports['en_EN'] = exports['en'];\nexports['en_US'] = exports['en'];\n\n// Italiano\nexports['it'] = {\n  current: 'attuale',\n  time: 'tempo'\n};\nexports['it_IT'] = exports['it'];\nexports['it_CH'] = exports['it'];\n\n// Dutch\nexports['nl'] = {\n  current: 'huidige',\n  time: 'tijd'\n};\nexports['nl_NL'] = exports['nl'];\nexports['nl_BE'] = exports['nl'];\n\n// German\nexports['de'] = {\n  current: 'Aktuelle',\n  time: 'Zeit'\n};\nexports['de_DE'] = exports['de'];\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/locales.js","var util = require('../../util');\nvar Component = require('./Component');\nvar moment = require('../../module/moment');\nvar locales = require('../locales');\n\n/**\n * A current time bar\n * @param {{range: Range, dom: Object, domProps: Object}} body\n * @param {Object} [options]        Available parameters:\n *                                  {Boolean} [showCurrentTime]\n * @constructor CurrentTime\n * @extends Component\n */\nfunction CurrentTime (body, options) {\n  this.body = body;\n\n  // default options\n  this.defaultOptions = {\n    rtl: false,\n    showCurrentTime: true,\n\n    moment: moment,\n    locales: locales,\n    locale: 'en'\n  };\n  this.options = util.extend({}, this.defaultOptions);\n  this.offset = 0;\n\n  this._create();\n\n  this.setOptions(options);\n}\n\nCurrentTime.prototype = new Component();\n\n/**\n * Create the HTML DOM for the current time bar\n * @private\n */\nCurrentTime.prototype._create = function() {\n  var bar = document.createElement('div');\n  bar.className = 'vis-current-time';\n  bar.style.position = 'absolute';\n  bar.style.top = '0px';\n  bar.style.height = '100%';\n\n  this.bar = bar;\n};\n\n/**\n * Destroy the CurrentTime bar\n */\nCurrentTime.prototype.destroy = function () {\n  this.options.showCurrentTime = false;\n  this.redraw(); // will remove the bar from the DOM and stop refreshing\n\n  this.body = null;\n};\n\n/**\n * Set options for the component. Options will be merged in current options.\n * @param {Object} options  Available parameters:\n *                          {boolean} [showCurrentTime]\n */\nCurrentTime.prototype.setOptions = function(options) {\n  if (options) {\n    // copy all options that we know\n    util.selectiveExtend(['rtl', 'showCurrentTime', 'moment', 'locale', 'locales'], this.options, options);\n  }\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nCurrentTime.prototype.redraw = function() {\n  if (this.options.showCurrentTime) {\n    var parent = this.body.dom.backgroundVertical;\n    if (this.bar.parentNode != parent) {\n      // attach to the dom\n      if (this.bar.parentNode) {\n        this.bar.parentNode.removeChild(this.bar);\n      }\n      parent.appendChild(this.bar);\n\n      this.start();\n    }\n\n    var now = this.options.moment(new Date().valueOf() + this.offset);\n    var x = this.body.util.toScreen(now);\n\n    var locale = this.options.locales[this.options.locale];\n    if (!locale) {\n      if (!this.warned) {\n        console.log('WARNING: options.locales[\\'' + this.options.locale + '\\'] not found. See http://visjs.org/docs/timeline/#Localization');\n        this.warned = true;\n      }\n      locale = this.options.locales['en']; // fall back on english when not available\n    }\n    var title = locale.current + ' ' + locale.time + ': ' + now.format('dddd, MMMM Do YYYY, H:mm:ss');\n    title = title.charAt(0).toUpperCase() + title.substring(1);\n\n    if (this.options.rtl) {\n      this.bar.style.right = x + 'px';\n    } else {\n      this.bar.style.left = x + 'px';\n    }\n    this.bar.title = title;\n  }\n  else {\n    // remove the line from the DOM\n    if (this.bar.parentNode) {\n      this.bar.parentNode.removeChild(this.bar);\n    }\n    this.stop();\n  }\n\n  return false;\n};\n\n/**\n * Start auto refreshing the current time bar\n */\nCurrentTime.prototype.start = function() {\n  var me = this;\n\n  function update () {\n    me.stop();\n\n    // determine interval to refresh\n    var scale = me.body.range.conversion(me.body.domProps.center.width).scale;\n    var interval = 1 / scale / 10;\n    if (interval < 30)   interval = 30;\n    if (interval > 1000) interval = 1000;\n\n    me.redraw();\n    me.body.emitter.emit('currentTimeTick');\n\n    // start a renderTimer to adjust for the new time\n    me.currentTimeTimer = setTimeout(update, interval);\n  }\n\n  update();\n};\n\n/**\n * Stop auto refreshing the current time bar\n */\nCurrentTime.prototype.stop = function() {\n  if (this.currentTimeTimer !== undefined) {\n    clearTimeout(this.currentTimeTimer);\n    delete this.currentTimeTimer;\n  }\n};\n\n/**\n * Set a current time. This can be used for example to ensure that a client's\n * time is synchronized with a shared server time.\n * @param {Date | String | Number} time     A Date, unix timestamp, or\n *                                          ISO date string.\n */\nCurrentTime.prototype.setCurrentTime = function(time) {\n  var t = util.convert(time, 'Date').valueOf();\n  var now = new Date().valueOf();\n  this.offset = t - now;\n  this.redraw();\n};\n\n/**\n * Get the current time.\n * @return {Date} Returns the current time.\n */\nCurrentTime.prototype.getCurrentTime = function() {\n  return new Date(new Date().valueOf() + this.offset);\n};\n\nmodule.exports = CurrentTime;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/CurrentTime.js","/**\n * This object contains all possible options. It will check if the types are correct, if required if the option is one\n * of the allowed values.\n *\n * __any__ means that the name of the property does not matter.\n * __type__ is a required field for all objects and contains the allowed types of all objects\n */\nlet string = 'string';\nlet bool = 'boolean';\nlet number = 'number';\nlet array = 'array';\nlet date = 'date';\nlet object = 'object'; // should only be in a __type__ property\nlet dom = 'dom';\nlet moment = 'moment';\nlet any = 'any';\n\nlet allOptions = {\n  configure: {\n    enabled: { 'boolean': bool},\n    filter: { 'boolean': bool,'function': 'function'},\n    container: {dom},\n    __type__: {object, 'boolean': bool,'function': 'function'}\n  },\n\n  //globals :\n  align: {string},\n  rtl: { 'boolean': bool, 'undefined': 'undefined'},\n  rollingMode: { 'boolean': bool, 'undefined': 'undefined'},\n  verticalScroll: { 'boolean': bool, 'undefined': 'undefined'},\n  horizontalScroll: { 'boolean': bool, 'undefined': 'undefined'},\n  autoResize: { 'boolean': bool},\n  throttleRedraw: {number}, // TODO: DEPRICATED see https://github.com/almende/vis/issues/2511\n  clickToUse: { 'boolean': bool},\n  dataAttributes: {string, array},\n  editable: {\n    add: { 'boolean': bool, 'undefined': 'undefined'},\n    remove: { 'boolean': bool, 'undefined': 'undefined'},\n    updateGroup: { 'boolean': bool, 'undefined': 'undefined'},\n    updateTime: { 'boolean': bool, 'undefined': 'undefined'},\n    overrideItems: { 'boolean': bool, 'undefined': 'undefined'},\n    __type__: { 'boolean': bool, object}\n  },\n  end: {number, date, string, moment},\n  format: {\n    minorLabels: {\n      millisecond: {string,'undefined': 'undefined'},\n      second: {string,'undefined': 'undefined'},\n      minute: {string,'undefined': 'undefined'},\n      hour: {string,'undefined': 'undefined'},\n      weekday: {string,'undefined': 'undefined'},\n      day: {string,'undefined': 'undefined'},\n      month: {string,'undefined': 'undefined'},\n      year: {string,'undefined': 'undefined'},\n      __type__: {object, 'function': 'function'}\n    },\n    majorLabels: {\n      millisecond: {string,'undefined': 'undefined'},\n      second: {string,'undefined': 'undefined'},\n      minute: {string,'undefined': 'undefined'},\n      hour: {string,'undefined': 'undefined'},\n      weekday: {string,'undefined': 'undefined'},\n      day: {string,'undefined': 'undefined'},\n      month: {string,'undefined': 'undefined'},\n      year: {string,'undefined': 'undefined'},\n      __type__: {object, 'function': 'function'}\n    },\n    __type__: {object}\n  },\n  moment: {'function': 'function'},\n  groupOrder: {string, 'function': 'function'},\n  groupEditable: {\n\t add: { 'boolean': bool, 'undefined': 'undefined'},\n\t remove: { 'boolean': bool, 'undefined': 'undefined'},\n\t order: { 'boolean': bool, 'undefined': 'undefined'},\n\t __type__: { 'boolean': bool, object}\n  },\n  groupOrderSwap: {'function': 'function'},\n  height: {string, number},\n  hiddenDates: {\n    start: {date, number, string, moment},\n    end: {date, number, string, moment},\n    repeat: {string},\n    __type__: {object, array}\n  },\n  itemsAlwaysDraggable: { 'boolean': bool},\n  locale:{string},\n  locales:{\n    __any__: {any},\n    __type__: {object}\n  },\n  margin: {\n    axis: {number},\n    item: {\n      horizontal: {number,'undefined': 'undefined'},\n      vertical: {number,'undefined': 'undefined'},\n      __type__: {object,number}\n    },\n    __type__: {object,number}\n  },\n  max: {date, number, string, moment},\n  maxHeight: {number, string},\n  maxMinorChars: {number},\n  min: {date, number, string, moment},\n  minHeight: {number, string},\n  moveable: { 'boolean': bool},\n  multiselect: { 'boolean': bool},\n  multiselectPerGroup: { 'boolean': bool},\n  onAdd: {'function': 'function'},\n  onUpdate: {'function': 'function'},\n  onMove: {'function': 'function'},\n  onMoving: {'function': 'function'},\n  onRemove: {'function': 'function'},\n  onAddGroup: {'function': 'function'},\n  onMoveGroup: {'function': 'function'},\n  onRemoveGroup: {'function': 'function'},\n  order: {'function': 'function'},\n  orientation: {\n    axis: {string,'undefined': 'undefined'},\n    item: {string,'undefined': 'undefined'},\n    __type__: {string, object}\n  },\n  selectable: { 'boolean': bool},\n  showCurrentTime: { 'boolean': bool},\n  showMajorLabels: { 'boolean': bool},\n  showMinorLabels: { 'boolean': bool},\n  stack: { 'boolean': bool},\n  stackSubgroups: { 'boolean': bool},\n  snap: {'function': 'function', 'null': 'null'},\n  start: {date, number, string, moment},\n  template: {'function': 'function'},\n  groupTemplate: {'function': 'function'},\n  visibleFrameTemplate: {string, 'function': 'function'},\n  tooltip: {\n    followMouse: { 'boolean': bool },\n    overflowMethod: { 'string': ['cap', 'flip'] },\n    __type__: {object}\n  },\n  tooltipOnItemUpdateTime: {\n    template: {'function': 'function'},\n    __type__: { 'boolean': bool, object}\n  },\n  timeAxis: {\n    scale: {string,'undefined': 'undefined'},\n    step: {number,'undefined': 'undefined'},\n    __type__: {object}\n  },\n  type: {string},\n  width: {string, number},\n  zoomable: { 'boolean': bool},\n  zoomKey: {string: ['ctrlKey', 'altKey', 'metaKey', '']},\n  zoomMax: {number},\n  zoomMin: {number},\n\n  __type__: {object}\n};\n\nlet configureOptions = {\n  global: {\n    align:  ['center', 'left', 'right'],\n    direction:  false,\n    autoResize: true,\n    clickToUse: false,\n    // dataAttributes: ['all'], // FIXME: can be 'all' or string[]\n    editable: {\n      add: false,\n      remove: false,\n      updateGroup: false,\n      updateTime: false\n    },\n    end: '',\n    format: {\n      minorLabels: {\n        millisecond:'SSS',\n        second:     's',\n        minute:     'HH:mm',\n        hour:       'HH:mm',\n        weekday:    'ddd D',\n        day:        'D',\n        month:      'MMM',\n        year:       'YYYY'\n      },\n      majorLabels: {\n        millisecond:'HH:mm:ss',\n        second:     'D MMMM HH:mm',\n        minute:     'ddd D MMMM',\n        hour:       'ddd D MMMM',\n        weekday:    'MMMM YYYY',\n        day:        'MMMM YYYY',\n        month:      'YYYY',\n        year:       ''\n      }\n    },\n\n    //groupOrder: {string, 'function': 'function'},\n    groupsDraggable: false,\n    height: '',\n    //hiddenDates: {object, array},\n    locale: '',\n    margin: {\n      axis: [20, 0, 100, 1],\n      item: {\n        horizontal: [10, 0, 100, 1],\n        vertical: [10, 0, 100, 1]\n      }\n    },\n    max: '',\n    maxHeight: '',\n    maxMinorChars: [7, 0, 20, 1],\n    min: '',\n    minHeight: '',\n    moveable: false,\n    multiselect: false,\n    multiselectPerGroup: false,\n    //onAdd: {'function': 'function'},\n    //onUpdate: {'function': 'function'},\n    //onMove: {'function': 'function'},\n    //onMoving: {'function': 'function'},\n    //onRename: {'function': 'function'},\n    //order: {'function': 'function'},\n    orientation: {\n      axis: ['both', 'bottom', 'top'],\n      item: ['bottom', 'top']\n    },\n    selectable: true,\n    showCurrentTime: false,\n    showMajorLabels: true,\n    showMinorLabels: true,\n    stack: true,\n    stackSubgroups: true,\n    //snap: {'function': 'function', nada},\n    start: '',\n    //template: {'function': 'function'},\n    //timeAxis: {\n    //  scale: ['millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'month', 'year'],\n    //  step: [1, 1, 10, 1]\n    //},\n    tooltip: {\n      followMouse: false,\n      overflowMethod: 'flip'\n    },\n    tooltipOnItemUpdateTime: false,\n    type: ['box', 'point', 'range', 'background'],\n    width: '100%',\n    zoomable: true,\n    zoomKey: ['ctrlKey', 'altKey', 'metaKey', ''],\n    zoomMax: [315360000000000, 10, 315360000000000, 1],\n    zoomMin: [10, 10, 315360000000000, 1]\n  }\n};\n\nexport {allOptions, configureOptions};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/optionsTimeline.js","var Emitter = require('emitter-component');\nvar Hammer = require('../module/hammer');\nvar moment = require('../module/moment');\nvar util = require('../util');\nvar DataSet = require('../DataSet');\nvar DataView = require('../DataView');\nvar Range = require('./Range');\nvar Core = require('./Core');\nvar TimeAxis = require('./component/TimeAxis');\nvar CurrentTime = require('./component/CurrentTime');\nvar CustomTime = require('./component/CustomTime');\nvar LineGraph = require('./component/LineGraph');\n\nvar printStyle = require('../shared/Validator').printStyle;\nvar allOptions = require('./optionsGraph2d').allOptions;\nvar configureOptions = require('./optionsGraph2d').configureOptions;\n\nimport Configurator from '../shared/Configurator';\nimport Validator from '../shared/Validator';\n\n/**\n * Create a timeline visualization\n * @param {HTMLElement} container\n * @param {vis.DataSet | Array} [items]\n * @param {Object} [options]  See Graph2d.setOptions for the available options.\n * @constructor\n * @extends Core\n */\nfunction Graph2d (container, items, groups, options) {\n  // if the third element is options, the forth is groups (optionally);\n  if (!(Array.isArray(groups) || groups instanceof DataSet || groups instanceof DataView) && groups instanceof Object) {\n    var forthArgument = options;\n    options = groups;\n    groups = forthArgument;\n  }\n\n  // TODO: REMOVE THIS in the next MAJOR release\n  // see https://github.com/almende/vis/issues/2511\n  if (options && options.throttleRedraw) {\n    console.warn(\"Graph2d option \\\"throttleRedraw\\\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.\");\n  }\n\n  var me = this;\n  this.defaultOptions = {\n    start: null,\n    end:   null,\n\n    autoResize: true,\n\n    orientation: {\n      axis: 'bottom',   // axis orientation: 'bottom', 'top', or 'both'\n      item: 'bottom'    // not relevant for Graph2d\n    },\n\n    moment: moment,\n\n    width: null,\n    height: null,\n    maxHeight: null,\n    minHeight: null\n  };\n  this.options = util.deepExtend({}, this.defaultOptions);\n\n  // Create the DOM, props, and emitter\n  this._create(container);\n\n  // all components listed here will be repainted automatically\n  this.components = [];\n\n  this.body = {\n    dom: this.dom,\n    domProps: this.props,\n    emitter: {\n      on: this.on.bind(this),\n      off: this.off.bind(this),\n      emit: this.emit.bind(this)\n    },\n    hiddenDates: [],\n    util: {\n      toScreen: me._toScreen.bind(me),\n      toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width\n      toTime: me._toTime.bind(me),\n      toGlobalTime : me._toGlobalTime.bind(me)\n    }\n  };\n\n  // range\n  this.range = new Range(this.body);\n  this.components.push(this.range);\n  this.body.range = this.range;\n\n  // time axis\n  this.timeAxis = new TimeAxis(this.body);\n  this.components.push(this.timeAxis);\n  //this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis);\n\n  // current time bar\n  this.currentTime = new CurrentTime(this.body);\n  this.components.push(this.currentTime);\n\n  // item set\n  this.linegraph = new LineGraph(this.body);\n\n  this.components.push(this.linegraph);\n\n  this.itemsData = null;      // DataSet\n  this.groupsData = null;     // DataSet\n\n\n  this.on('tap', function (event) {\n    me.emit('click', me.getEventProperties(event))\n  });\n  this.on('doubletap', function (event) {\n    me.emit('doubleClick', me.getEventProperties(event))\n  });\n  this.dom.root.oncontextmenu = function (event) {\n    me.emit('contextmenu', me.getEventProperties(event))\n  };\n\n  // apply options\n  if (options) {\n    this.setOptions(options);\n  }\n\n  // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS!\n  if (groups) {\n    this.setGroups(groups);\n  }\n\n  // create itemset\n  if (items) {\n    this.setItems(items);\n  }\n\n  // draw for the first time\n  this._redraw();\n}\n\n// Extend the functionality from Core\nGraph2d.prototype = new Core();\n\nGraph2d.prototype.setOptions = function (options) {\n  // validate options\n  let errorFound = Validator.validate(options, allOptions);\n  if (errorFound === true) {\n    console.log('%cErrors have been found in the supplied options object.', printStyle);\n  }\n\n  Core.prototype.setOptions.call(this, options);\n};\n\n/**\n * Set items\n * @param {vis.DataSet | Array | null} items\n */\nGraph2d.prototype.setItems = function(items) {\n  var initialLoad = (this.itemsData == null);\n\n  // convert to type DataSet when needed\n  var newDataSet;\n  if (!items) {\n    newDataSet = null;\n  }\n  else if (items instanceof DataSet || items instanceof DataView) {\n    newDataSet = items;\n  }\n  else {\n    // turn an array into a dataset\n    newDataSet = new DataSet(items, {\n      type: {\n        start: 'Date',\n        end: 'Date'\n      }\n    });\n  }\n\n  // set items\n  this.itemsData = newDataSet;\n  this.linegraph && this.linegraph.setItems(newDataSet);\n\n  if (initialLoad) {\n    if (this.options.start != undefined || this.options.end != undefined) {\n      var start = this.options.start != undefined ? this.options.start : null;\n      var end   = this.options.end != undefined   ? this.options.end : null;\n      this.setWindow(start, end, {animation: false});\n    }\n    else {\n      this.fit({animation: false});\n    }\n  }\n};\n\n/**\n * Set groups\n * @param {vis.DataSet | Array} groups\n */\nGraph2d.prototype.setGroups = function(groups) {\n  // convert to type DataSet when needed\n  var newDataSet;\n  if (!groups) {\n    newDataSet = null;\n  }\n  else if (groups instanceof DataSet || groups instanceof DataView) {\n    newDataSet = groups;\n  }\n  else {\n    // turn an array into a dataset\n    newDataSet = new DataSet(groups);\n  }\n\n  this.groupsData = newDataSet;\n  this.linegraph.setGroups(newDataSet);\n};\n\n/**\n * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right).\n * @param groupId\n * @param width\n * @param height\n */\nGraph2d.prototype.getLegend = function(groupId, width, height) {\n  if (width  === undefined) {width  = 15;}\n  if (height === undefined) {height = 15;}\n  if (this.linegraph.groups[groupId] !== undefined) {\n    return this.linegraph.groups[groupId].getLegend(width,height);\n  }\n  else {\n    return \"cannot find group:'\" +  groupId + \"'\";\n  }\n};\n\n/**\n * This checks if the visible option of the supplied group (by ID) is true or false.\n * @param groupId\n * @returns {*}\n */\nGraph2d.prototype.isGroupVisible = function(groupId) {\n  if (this.linegraph.groups[groupId] !== undefined) {\n    return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true));\n  }\n  else {\n    return false;\n  }\n};\n\n\n/**\n * Get the data range of the item set.\n * @returns {{min: Date, max: Date}} range  A range with a start and end Date.\n *                                          When no minimum is found, min==null\n *                                          When no maximum is found, max==null\n */\nGraph2d.prototype.getDataRange = function() {\n  var min = null;\n  var max = null;\n\n  // calculate min from start filed\n  for (var groupId in this.linegraph.groups) {\n    if (this.linegraph.groups.hasOwnProperty(groupId)) {\n      if (this.linegraph.groups[groupId].visible == true) {\n        for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) {\n          var item = this.linegraph.groups[groupId].itemsData[i];\n          var value = util.convert(item.x, 'Date').valueOf();\n          min = min == null ? value : min > value ? value : min;\n          max = max == null ? value : max < value ? value : max;\n        }\n      }\n    }\n  }\n\n  return {\n    min: (min != null) ? new Date(min) : null,\n    max: (max != null) ? new Date(max) : null\n  };\n};\n\n\n/**\n * Generate Timeline related information from an event\n * @param {Event} event\n * @return {Object} An object with related information, like on which area\n *                  The event happened, whether clicked on an item, etc.\n */\nGraph2d.prototype.getEventProperties = function (event) {\n  var clientX = event.center ? event.center.x : event.clientX;\n  var clientY = event.center ? event.center.y : event.clientY;\n  var x = clientX - util.getAbsoluteLeft(this.dom.centerContainer);\n  var y = clientY - util.getAbsoluteTop(this.dom.centerContainer);\n  var time = this._toTime(x);\n\n  var customTime = CustomTime.customTimeFromTarget(event);\n\n  var element = util.getTarget(event);\n  var what = null;\n  if (util.hasParent(element, this.timeAxis.dom.foreground))              {what = 'axis';}\n  else if (this.timeAxis2 && util.hasParent(element, this.timeAxis2.dom.foreground)) {what = 'axis';}\n  else if (util.hasParent(element, this.linegraph.yAxisLeft.dom.frame))   {what = 'data-axis';}\n  else if (util.hasParent(element, this.linegraph.yAxisRight.dom.frame))  {what = 'data-axis';}\n  else if (util.hasParent(element, this.linegraph.legendLeft.dom.frame))  {what = 'legend';}\n  else if (util.hasParent(element, this.linegraph.legendRight.dom.frame)) {what = 'legend';}\n  else if (customTime != null)                {what = 'custom-time';}\n  else if (util.hasParent(element, this.currentTime.bar))                 {what = 'current-time';}\n  else if (util.hasParent(element, this.dom.center))                      {what = 'background';}\n\n  var value = [];\n  var yAxisLeft = this.linegraph.yAxisLeft;\n  var yAxisRight = this.linegraph.yAxisRight;\n  if (!yAxisLeft.hidden && this.itemsData.length > 0) {\n    value.push(yAxisLeft.screenToValue(y));\n  }\n  if (!yAxisRight.hidden && this.itemsData.length > 0) {\n    value.push(yAxisRight.screenToValue(y));\n  }\n\n  return {\n    event: event,\n    what: what,\n    pageX: event.srcEvent ? event.srcEvent.pageX : event.pageX,\n    pageY: event.srcEvent ? event.srcEvent.pageY : event.pageY,\n    x: x,\n    y: y,\n    time: time,\n    value: value\n  }\n};\n\n/**\n * Load a configurator\n * @return {Object}\n * @private\n */\nGraph2d.prototype._createConfigurator = function () {\n  return new Configurator(this, this.dom.container, configureOptions);\n};\n\n\nmodule.exports = Graph2d;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/Graph2d.js","var util = require('../../util');\nvar DOMutil = require('../../DOMutil');\nvar DataSet = require('../../DataSet');\nvar DataView = require('../../DataView');\nvar Component = require('./Component');\nvar DataAxis = require('./DataAxis');\nvar GraphGroup = require('./GraphGroup');\nvar Legend = require('./Legend');\nvar Bars = require('./graph2d_types/bar');\nvar Lines = require('./graph2d_types/line');\nvar Points = require('./graph2d_types/points');\n\nvar UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items\n\n/**\n * This is the constructor of the LineGraph. It requires a Timeline body and options.\n *\n * @param body\n * @param options\n * @constructor\n */\nfunction LineGraph(body, options) {\n  this.id = util.randomUUID();\n  this.body = body;\n\n  this.defaultOptions = {\n    yAxisOrientation: 'left',\n    defaultGroup: 'default',\n    sort: true,\n    sampling: true,\n    stack: false,\n    graphHeight: '400px',\n    shaded: {\n      enabled: false,\n      orientation: 'bottom' // top, bottom, zero\n    },\n    style: 'line', // line, bar\n    barChart: {\n      width: 50,\n      sideBySide: false,\n      align: 'center' // left, center, right\n    },\n    interpolation: {\n      enabled: true,\n      parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5)\n      alpha: 0.5\n    },\n    drawPoints: {\n      enabled: true,\n      size: 6,\n      style: 'square' // square, circle\n    },\n    dataAxis: {}, //Defaults are done on DataAxis level\n    legend: {}, //Defaults are done on Legend level\n    groups: {\n      visibility: {}\n    }\n  };\n\n  // options is shared by this lineGraph and all its items\n  this.options = util.extend({}, this.defaultOptions);\n  this.dom = {};\n  this.props = {};\n  this.hammer = null;\n  this.groups = {};\n  this.abortedGraphUpdate = false;\n  this.updateSVGheight = false;\n  this.updateSVGheightOnResize = false;\n  this.forceGraphUpdate = true;\n\n  var me = this;\n  this.itemsData = null;    // DataSet\n  this.groupsData = null;   // DataSet\n\n  // listeners for the DataSet of the items\n  this.itemListeners = {\n    'add': function (event, params, senderId) {\n      me._onAdd(params.items);\n    },\n    'update': function (event, params, senderId) {\n      me._onUpdate(params.items);\n    },\n    'remove': function (event, params, senderId) {\n      me._onRemove(params.items);\n    }\n  };\n\n  // listeners for the DataSet of the groups\n  this.groupListeners = {\n    'add': function (event, params, senderId) {\n      me._onAddGroups(params.items);\n    },\n    'update': function (event, params, senderId) {\n      me._onUpdateGroups(params.items);\n    },\n    'remove': function (event, params, senderId) {\n      me._onRemoveGroups(params.items);\n    }\n  };\n\n  this.items = {};      // object with an Item for every data item\n  this.selection = [];  // list with the ids of all selected nodes\n  this.lastStart = this.body.range.start;\n  this.touchParams = {}; // stores properties while dragging\n\n  this.svgElements = {};\n  this.setOptions(options);\n  this.groupsUsingDefaultStyles = [0];\n  this.body.emitter.on('rangechanged', function () {\n    me.lastStart = me.body.range.start;\n    me.svg.style.left = util.option.asSize(-me.props.width);\n\n    me.forceGraphUpdate = true;\n    //Is this local redraw necessary? (Core also does a change event!)\n    me.redraw.call(me);\n  });\n\n  // create the HTML DOM\n  this._create();\n  this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups};\n}\n\nLineGraph.prototype = new Component();\n\n/**\n * Create the HTML DOM for the ItemSet\n */\nLineGraph.prototype._create = function () {\n  var frame = document.createElement('div');\n  frame.className = 'vis-line-graph';\n  this.dom.frame = frame;\n\n  // create svg element for graph drawing.\n  this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n  this.svg.style.position = 'relative';\n  this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px';\n  this.svg.style.display = 'block';\n  frame.appendChild(this.svg);\n\n  // data axis\n  this.options.dataAxis.orientation = 'left';\n  this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups);\n\n  this.options.dataAxis.orientation = 'right';\n  this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups);\n  delete this.options.dataAxis.orientation;\n\n  // legends\n  this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups);\n  this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups);\n\n  this.show();\n};\n\n/**\n * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element.\n * @param {object} options\n */\nLineGraph.prototype.setOptions = function (options) {\n  if (options) {\n    var fields = ['sampling', 'defaultGroup', 'stack', 'height', 'graphHeight', 'yAxisOrientation', 'style', 'barChart', 'dataAxis', 'sort', 'groups'];\n    if (options.graphHeight === undefined && options.height !== undefined) {\n      this.updateSVGheight = true;\n      this.updateSVGheightOnResize = true;\n    }\n    else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) {\n      if (parseInt((options.graphHeight + '').replace(\"px\", '')) < this.body.domProps.centerContainer.height) {\n        this.updateSVGheight = true;\n      }\n    }\n    util.selectiveDeepExtend(fields, this.options, options);\n    util.mergeOptions(this.options, options, 'interpolation');\n    util.mergeOptions(this.options, options, 'drawPoints');\n    util.mergeOptions(this.options, options, 'shaded');\n    util.mergeOptions(this.options, options, 'legend');\n\n    if (options.interpolation) {\n      if (typeof options.interpolation == 'object') {\n        if (options.interpolation.parametrization) {\n          if (options.interpolation.parametrization == 'uniform') {\n            this.options.interpolation.alpha = 0;\n          }\n          else if (options.interpolation.parametrization == 'chordal') {\n            this.options.interpolation.alpha = 1.0;\n          }\n          else {\n            this.options.interpolation.parametrization = 'centripetal';\n            this.options.interpolation.alpha = 0.5;\n          }\n        }\n      }\n    }\n\n    if (this.yAxisLeft) {\n      if (options.dataAxis !== undefined) {\n        this.yAxisLeft.setOptions(this.options.dataAxis);\n        this.yAxisRight.setOptions(this.options.dataAxis);\n      }\n    }\n\n    if (this.legendLeft) {\n      if (options.legend !== undefined) {\n        this.legendLeft.setOptions(this.options.legend);\n        this.legendRight.setOptions(this.options.legend);\n      }\n    }\n\n    if (this.groups.hasOwnProperty(UNGROUPED)) {\n      this.groups[UNGROUPED].setOptions(options);\n    }\n  }\n\n  // this is used to redraw the graph if the visibility of the groups is changed.\n  if (this.dom.frame) { //not on initial run?\n    this.forceGraphUpdate=true;\n    this.body.emitter.emit(\"_change\",{queue: true});\n  }\n};\n\n/**\n * Hide the component from the DOM\n */\nLineGraph.prototype.hide = function () {\n  // remove the frame containing the items\n  if (this.dom.frame.parentNode) {\n    this.dom.frame.parentNode.removeChild(this.dom.frame);\n  }\n};\n\n\n/**\n * Show the component in the DOM (when not already visible).\n * @return {Boolean} changed\n */\nLineGraph.prototype.show = function () {\n  // show frame containing the items\n  if (!this.dom.frame.parentNode) {\n    this.body.dom.center.appendChild(this.dom.frame);\n  }\n};\n\n\n/**\n * Set items\n * @param {vis.DataSet | null} items\n */\nLineGraph.prototype.setItems = function (items) {\n  var me = this,\n    ids,\n    oldItemsData = this.itemsData;\n\n  // replace the dataset\n  if (!items) {\n    this.itemsData = null;\n  }\n  else if (items instanceof DataSet || items instanceof DataView) {\n    this.itemsData = items;\n  }\n  else {\n    throw new TypeError('Data must be an instance of DataSet or DataView');\n  }\n\n  if (oldItemsData) {\n    // unsubscribe from old dataset\n    util.forEach(this.itemListeners, function (callback, event) {\n      oldItemsData.off(event, callback);\n    });\n\n    // remove all drawn items\n    ids = oldItemsData.getIds();\n    this._onRemove(ids);\n  }\n\n  if (this.itemsData) {\n    // subscribe to new dataset\n    var id = this.id;\n    util.forEach(this.itemListeners, function (callback, event) {\n      me.itemsData.on(event, callback, id);\n    });\n\n    // add all new items\n    ids = this.itemsData.getIds();\n    this._onAdd(ids);\n  }\n};\n\n\n/**\n * Set groups\n * @param {vis.DataSet} groups\n */\nLineGraph.prototype.setGroups = function (groups) {\n  var me = this;\n  var ids;\n\n  // unsubscribe from current dataset\n  if (this.groupsData) {\n    util.forEach(this.groupListeners, function (callback, event) {\n      me.groupsData.off(event, callback);\n    });\n\n    // remove all drawn groups\n    ids = this.groupsData.getIds();\n    this.groupsData = null;\n    for (var i = 0; i < ids.length; i++) {\n      this._removeGroup(ids[i]);\n    }\n  }\n\n  // replace the dataset\n  if (!groups) {\n    this.groupsData = null;\n  }\n  else if (groups instanceof DataSet || groups instanceof DataView) {\n    this.groupsData = groups;\n  }\n  else {\n    throw new TypeError('Data must be an instance of DataSet or DataView');\n  }\n\n  if (this.groupsData) {\n    // subscribe to new dataset\n    var id = this.id;\n    util.forEach(this.groupListeners, function (callback, event) {\n      me.groupsData.on(event, callback, id);\n    });\n\n    // draw all ms\n    ids = this.groupsData.getIds();\n    this._onAddGroups(ids);\n  }\n};\n\nLineGraph.prototype._onUpdate = function (ids) {\n  this._updateAllGroupData(ids);\n};\nLineGraph.prototype._onAdd = function (ids) {\n  this._onUpdate(ids);\n};\nLineGraph.prototype._onRemove = function (ids) {\n  this._onUpdate(ids);\n};\nLineGraph.prototype._onUpdateGroups = function (groupIds) {\n  this._updateAllGroupData(null, groupIds);\n};\nLineGraph.prototype._onAddGroups = function (groupIds) {\n  this._onUpdateGroups(groupIds);\n};\n\n/**\n * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph\n * @param {Array} groupIds\n * @private\n */\nLineGraph.prototype._onRemoveGroups = function (groupIds) {\n  for (var i = 0; i < groupIds.length; i++) {\n    this._removeGroup(groupIds[i]);\n  }\n  this.forceGraphUpdate = true;\n  this.body.emitter.emit(\"_change\",{queue: true});\n};\n\n/**\n * this cleans the group out off the legends and the dataaxis\n * @param groupId\n * @private\n */\nLineGraph.prototype._removeGroup = function (groupId) {\n  if (this.groups.hasOwnProperty(groupId)) {\n    if (this.groups[groupId].options.yAxisOrientation == 'right') {\n      this.yAxisRight.removeGroup(groupId);\n      this.legendRight.removeGroup(groupId);\n      this.legendRight.redraw();\n    }\n    else {\n      this.yAxisLeft.removeGroup(groupId);\n      this.legendLeft.removeGroup(groupId);\n      this.legendLeft.redraw();\n    }\n    delete this.groups[groupId];\n  }\n}\n\n/**\n * update a group object with the group dataset entree\n *\n * @param group\n * @param groupId\n * @private\n */\nLineGraph.prototype._updateGroup = function (group, groupId) {\n  if (!this.groups.hasOwnProperty(groupId)) {\n    this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles);\n    if (this.groups[groupId].options.yAxisOrientation == 'right') {\n      this.yAxisRight.addGroup(groupId, this.groups[groupId]);\n      this.legendRight.addGroup(groupId, this.groups[groupId]);\n    }\n    else {\n      this.yAxisLeft.addGroup(groupId, this.groups[groupId]);\n      this.legendLeft.addGroup(groupId, this.groups[groupId]);\n    }\n  }\n  else {\n    this.groups[groupId].update(group);\n    if (this.groups[groupId].options.yAxisOrientation == 'right') {\n      this.yAxisRight.updateGroup(groupId, this.groups[groupId]);\n      this.legendRight.updateGroup(groupId, this.groups[groupId]);\n      //If yAxisOrientation changed, clean out the group from the other axis.\n      this.yAxisLeft.removeGroup(groupId);\n      this.legendLeft.removeGroup(groupId);\n    }\n    else {\n      this.yAxisLeft.updateGroup(groupId, this.groups[groupId]);\n      this.legendLeft.updateGroup(groupId, this.groups[groupId]);\n      //If yAxisOrientation changed, clean out the group from the other axis.\n      this.yAxisRight.removeGroup(groupId);\n      this.legendRight.removeGroup(groupId);\n    }\n  }\n  this.legendLeft.redraw();\n  this.legendRight.redraw();\n};\n\n\n/**\n * this updates all groups, it is used when there is an update the the itemset.\n *\n * @param  {Array} ids\n * @param  {Array} groupIds\n * @private\n */\nLineGraph.prototype._updateAllGroupData = function (ids, groupIds) {\n  if (this.itemsData != null) {\n    var groupsContent = {};\n    var items = this.itemsData.get();\n    var fieldId = this.itemsData._fieldId;\n    var idMap = {};\n    if (ids){\n      ids.map(function (id) {\n        idMap[id] = id;\n      });\n    }\n\n    //pre-Determine array sizes, for more efficient memory claim\n    var groupCounts = {};\n    for (var i = 0; i < items.length; i++) {\n      var item = items[i];\n      var groupId = item.group;\n      if (groupId === null || groupId === undefined) {\n        groupId = UNGROUPED;\n      }\n      groupCounts.hasOwnProperty(groupId) ? groupCounts[groupId]++ : groupCounts[groupId] = 1;\n    }\n\n    //Pre-load arrays from existing groups if items are not changed (not in ids)\n    if (!groupIds && ids) {\n      for (var groupId in this.groups) {\n        if (this.groups.hasOwnProperty(groupId)) {\n          var group = this.groups[groupId];\n          var existing_items = group.getItems();\n\n          groupsContent[groupId] = existing_items.filter(function (item) {\n            return (item[fieldId] !== idMap[item[fieldId]]);\n          });\n          var newLength = groupCounts[groupId];\n          groupCounts[groupId] -= groupsContent[groupId].length;\n          if (groupsContent[groupId].length < newLength) {\n            groupsContent[groupId][newLength - 1] = {};\n          }\n        }\n      }\n    }\n\n    //Now insert data into the arrays.\n    for (var i = 0; i < items.length; i++) {\n      var item = items[i];\n      var groupId = item.group;\n      if (groupId === null || groupId === undefined) {\n        groupId = UNGROUPED;\n      }\n      if (!groupIds && ids && (item[fieldId] !== idMap[item[fieldId]])) {\n        continue;\n      }\n      if (!groupsContent.hasOwnProperty(groupId)) {\n        groupsContent[groupId] = new Array(groupCounts[groupId]);\n      }\n      //Copy data (because of unmodifiable DataView input.\n      var extended = util.bridgeObject(item);\n      extended.x = util.convert(item.x, 'Date');\n      extended.orginalY = item.y; //real Y\n      extended.y = Number(item.y);\n      extended[fieldId] = item[fieldId];\n\n      var index= groupsContent[groupId].length - groupCounts[groupId]--;\n      groupsContent[groupId][index] = extended;\n    }\n\n    //Make sure all groups are present, to allow removal of old groups\n    for (var groupId in this.groups){\n      if (this.groups.hasOwnProperty(groupId)){\n        if (!groupsContent.hasOwnProperty(groupId)) {\n          groupsContent[groupId] = new Array(0);\n        }\n      }\n    }\n\n    //Update legendas, style and axis\n    for (var groupId in groupsContent) {\n      if (groupsContent.hasOwnProperty(groupId)) {\n        if (groupsContent[groupId].length == 0) {\n          if (this.groups.hasOwnProperty(groupId)) {\n            this._removeGroup(groupId);\n          }\n        } else {\n          var group = undefined;\n          if (this.groupsData != undefined) {\n            group = this.groupsData.get(groupId);\n          }\n          if (group == undefined) {\n            group = {id: groupId, content: this.options.defaultGroup + groupId};\n          }\n          this._updateGroup(group, groupId);\n          this.groups[groupId].setItems(groupsContent[groupId]);\n        }\n      }\n    }\n    this.forceGraphUpdate = true;\n    this.body.emitter.emit(\"_change\",{queue: true});\n  }\n};\n\n/**\n * Redraw the component, mandatory function\n * @return {boolean} Returns true if the component is resized\n */\nLineGraph.prototype.redraw = function () {\n  var resized = false;\n\n  // calculate actual size and position\n  this.props.width = this.dom.frame.offsetWidth;\n  this.props.height = this.body.domProps.centerContainer.height\n    - this.body.domProps.border.top\n    - this.body.domProps.border.bottom;\n\n  // check if this component is resized\n  resized = this._isResized() || resized;\n\n  // check whether zoomed (in that case we need to re-stack everything)\n  var visibleInterval = this.body.range.end - this.body.range.start;\n  var zoomed = (visibleInterval != this.lastVisibleInterval);\n  this.lastVisibleInterval = visibleInterval;\n\n\n  // the svg element is three times as big as the width, this allows for fully dragging left and right\n  // without reloading the graph. the controls for this are bound to events in the constructor\n  if (resized == true) {\n    this.svg.style.width = util.option.asSize(3 * this.props.width);\n    this.svg.style.left = util.option.asSize(-this.props.width);\n\n    // if the height of the graph is set as proportional, change the height of the svg\n    if ((this.options.height + '').indexOf(\"%\") != -1 || this.updateSVGheightOnResize == true) {\n      this.updateSVGheight = true;\n    }\n  }\n\n  // update the height of the graph on each redraw of the graph.\n  if (this.updateSVGheight == true) {\n    if (this.options.graphHeight != this.props.height + 'px') {\n      this.options.graphHeight = this.props.height + 'px';\n      this.svg.style.height = this.props.height + 'px';\n    }\n    this.updateSVGheight = false;\n  }\n  else {\n    this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px';\n  }\n\n  // zoomed is here to ensure that animations are shown correctly.\n  if (resized == true || zoomed == true || this.abortedGraphUpdate == true || this.forceGraphUpdate == true) {\n    resized = this._updateGraph() || resized;\n    this.forceGraphUpdate = false;\n  }\n  else {\n    // move the whole svg while dragging\n    if (this.lastStart != 0) {\n      var offset = this.body.range.start - this.lastStart;\n      var range = this.body.range.end - this.body.range.start;\n      if (this.props.width != 0) {\n        var rangePerPixelInv = this.props.width / range;\n        var xOffset = offset * rangePerPixelInv;\n        this.svg.style.left = (-this.props.width - xOffset) + 'px';\n      }\n    }\n  }\n  this.legendLeft.redraw();\n  this.legendRight.redraw();\n  return resized;\n};\n\n\nLineGraph.prototype._getSortedGroupIds = function(){\n  // getting group Ids\n  var grouplist = [];\n  for (var groupId in this.groups) {\n    if (this.groups.hasOwnProperty(groupId)) {\n      var group = this.groups[groupId];\n      if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) {\n        grouplist.push({id:groupId,zIndex:group.options.zIndex});\n      }\n    }\n  }\n  util.insertSort(grouplist,function(a,b){\n    var az = a.zIndex;\n    var bz = b.zIndex;\n    if (az === undefined) az=0;\n    if (bz === undefined) bz=0;\n    return az==bz? 0: (az<bz ? -1: 1);\n  });\n  var groupIds = new Array(grouplist.length);\n  for (var i=0; i< grouplist.length; i++){\n    groupIds[i] = grouplist[i].id;\n  }\n  return groupIds;\n}\n\n/**\n * Update and redraw the graph.\n *\n */\nLineGraph.prototype._updateGraph = function () {\n  // reset the svg elements\n  DOMutil.prepareElements(this.svgElements);\n  if (this.props.width != 0 && this.itemsData != null) {\n    var group, i;\n    var groupRanges = {};\n    var changeCalled = false;\n    // this is the range of the SVG canvas\n    var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width);\n    var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width);\n\n    // getting group Ids\n    var groupIds = this._getSortedGroupIds();\n    if (groupIds.length > 0) {\n      var groupsData = {};\n\n      // fill groups data, this only loads the data we require based on the timewindow\n      this._getRelevantData(groupIds, groupsData, minDate, maxDate);\n\n      // apply sampling, if disabled, it will pass through this function.\n      this._applySampling(groupIds, groupsData);\n\n      // we transform the X coordinates to detect collisions\n      for (i = 0; i < groupIds.length; i++) {\n        this._convertXcoordinates(groupsData[groupIds[i]]);\n      }\n\n      // now all needed data has been collected we start the processing.\n      this._getYRanges(groupIds, groupsData, groupRanges);\n\n      // update the Y axis first, we use this data to draw at the correct Y points\n      changeCalled = this._updateYAxis(groupIds, groupRanges);\n\n      //  at changeCalled, abort this update cycle as the graph needs another update with new Width input from the Redraw container.\n      //  Cleanup SVG elements on abort.\n      if (changeCalled == true) {\n        DOMutil.cleanupElements(this.svgElements);\n        this.abortedGraphUpdate = true;\n        return true;\n      }\n      this.abortedGraphUpdate = false;\n\n      // With the yAxis scaled correctly, use this to get the Y values of the points.\n      var below = undefined;\n      for (i = 0; i < groupIds.length; i++) {\n        group = this.groups[groupIds[i]];\n        if (this.options.stack === true && this.options.style === 'line') {\n          if (group.options.excludeFromStacking == undefined || !group.options.excludeFromStacking) {\n            if (below != undefined) {\n              this._stack(groupsData[group.id], groupsData[below.id]);\n              if (group.options.shaded.enabled == true && group.options.shaded.orientation !== \"group\"){\n                if (group.options.shaded.orientation == \"top\" && below.options.shaded.orientation !== \"group\"){\n                  below.options.shaded.orientation=\"group\";\n                  below.options.shaded.groupId=group.id;\n                } else {\n                  group.options.shaded.orientation=\"group\";\n                  group.options.shaded.groupId=below.id;\n                }\n              }\n            }\n            below = group;\n          }\n        }\n        this._convertYcoordinates(groupsData[groupIds[i]], group);\n      }\n\n      //Precalculate paths and draw shading if appropriate. This will make sure the shading is always behind any lines.\n      var paths = {};\n      for (i = 0; i < groupIds.length; i++) {\n        group = this.groups[groupIds[i]];\n        if (group.options.style === 'line' && group.options.shaded.enabled == true) {\n          var dataset = groupsData[groupIds[i]];\n          if (dataset == null || dataset.length == 0) {\n            continue;\n          }\n          if (!paths.hasOwnProperty(groupIds[i])) {\n            paths[groupIds[i]] = Lines.calcPath(dataset, group);\n          }\n          if (group.options.shaded.orientation === \"group\") {\n            var subGroupId = group.options.shaded.groupId;\n            if (groupIds.indexOf(subGroupId) === -1) {\n              console.log(group.id + \": Unknown shading group target given:\" + subGroupId);\n              continue;\n            }\n            if (!paths.hasOwnProperty(subGroupId)) {\n              paths[subGroupId] = Lines.calcPath(groupsData[subGroupId], this.groups[subGroupId]);\n            }\n            Lines.drawShading(paths[groupIds[i]], group, paths[subGroupId], this.framework);\n          }\n          else {\n            Lines.drawShading(paths[groupIds[i]], group, undefined, this.framework);\n          }\n        }\n      }\n\n      // draw the groups, calculating paths if still necessary.\n      Bars.draw(groupIds, groupsData, this.framework);\n      for (i = 0; i < groupIds.length; i++) {\n        group = this.groups[groupIds[i]];\n        if (groupsData[groupIds[i]].length > 0) {\n          switch (group.options.style) {\n            case \"line\":\n              if (!paths.hasOwnProperty(groupIds[i])) {\n                paths[groupIds[i]] = Lines.calcPath(groupsData[groupIds[i]], group);\n              }\n              Lines.draw(paths[groupIds[i]], group, this.framework);\n            //explicit no break;\n            case \"point\":\n            //explicit no break;\n            case \"points\":\n              if (group.options.style == \"point\" || group.options.style == \"points\" || group.options.drawPoints.enabled == true) {\n                Points.draw(groupsData[groupIds[i]], group, this.framework);\n              }\n              break;\n            case \"bar\":\n            // bar needs to be drawn enmasse\n            //explicit no break\n            default:\n            //do nothing...\n          }\n        }\n\n      }\n    }\n  }\n\n  // cleanup unused svg elements\n  DOMutil.cleanupElements(this.svgElements);\n  return false;\n};\n\nLineGraph.prototype._stack = function (data, subData) {\n  var index, dx, dy, subPrevPoint, subNextPoint;\n  index = 0;\n  // for each data point we look for a matching on in the set below\n  for (var j = 0; j < data.length; j++) {\n    subPrevPoint = undefined;\n    subNextPoint = undefined;\n    // we look for time matches or a before-after point\n    for (var k = index; k < subData.length; k++) {\n      // if times match exactly\n      if (subData[k].x === data[j].x) {\n        subPrevPoint = subData[k];\n        subNextPoint = subData[k];\n        index = k;\n        break;\n      }\n      else if (subData[k].x > data[j].x) { // overshoot\n        subNextPoint = subData[k];\n        if (k == 0) {\n          subPrevPoint = subNextPoint;\n        }\n        else {\n          subPrevPoint = subData[k - 1];\n        }\n        index = k;\n        break;\n      }\n    }\n    // in case the last data point has been used, we assume it stays like this.\n    if (subNextPoint === undefined) {\n      subPrevPoint = subData[subData.length - 1];\n      subNextPoint = subData[subData.length - 1];\n    }\n    // linear interpolation\n    dx = subNextPoint.x - subPrevPoint.x;\n    dy = subNextPoint.y - subPrevPoint.y;\n    if (dx == 0) {\n      data[j].y = data[j].orginalY + subNextPoint.y;\n    }\n    else {\n      data[j].y = data[j].orginalY + (dy / dx) * (data[j].x - subPrevPoint.x) + subPrevPoint.y; // ax + b where b is data[j].y\n    }\n  }\n}\n\n\n/**\n * first select and preprocess the data from the datasets.\n * the groups have their preselection of data, we now loop over this data to see\n * what data we need to draw. Sorted data is much faster.\n * more optimization is possible by doing the sampling before and using the binary search\n * to find the end date to determine the increment.\n *\n * @param {array}  groupIds\n * @param {object} groupsData\n * @param {date}   minDate\n * @param {date}   maxDate\n * @private\n */\nLineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) {\n  var group, i, j, item;\n  if (groupIds.length > 0) {\n    for (i = 0; i < groupIds.length; i++) {\n      group = this.groups[groupIds[i]];\n      var itemsData = group.getItems();\n      // optimization for sorted data\n      if (group.options.sort == true) {\n        var dateComparator = function (a, b) {\n          return a.getTime() == b.getTime() ? 0 : a < b ? -1 : 1\n        };\n        var first = Math.max(0, util.binarySearchValue(itemsData, minDate, 'x', 'before', dateComparator));\n        var last = Math.min(itemsData.length, util.binarySearchValue(itemsData, maxDate, 'x', 'after', dateComparator) + 1);\n        if (last <= 0) {\n          last = itemsData.length;\n        }\n        var dataContainer = new Array(last-first);\n        for (j = first; j < last; j++) {\n          item = group.itemsData[j];\n          dataContainer[j-first] = item;\n        }\n        groupsData[groupIds[i]] = dataContainer;\n      }\n      else {\n        // If unsorted data, all data is relevant, just returning entire structure\n        groupsData[groupIds[i]] = group.itemsData;\n      }\n    }\n  }\n};\n\n\n/**\n *\n * @param groupIds\n * @param groupsData\n * @private\n */\nLineGraph.prototype._applySampling = function (groupIds, groupsData) {\n  var group;\n  if (groupIds.length > 0) {\n    for (var i = 0; i < groupIds.length; i++) {\n      group = this.groups[groupIds[i]];\n      if (group.options.sampling == true) {\n        var dataContainer = groupsData[groupIds[i]];\n        if (dataContainer.length > 0) {\n          var increment = 1;\n          var amountOfPoints = dataContainer.length;\n\n          // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop\n          // of width changing of the yAxis.\n          //TODO: This assumes sorted data, but that's not guaranteed!\n          var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x);\n          var pointsPerPixel = amountOfPoints / xDistance;\n          increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel)));\n\n          var sampledData = new Array(amountOfPoints);\n          for (var j = 0; j < amountOfPoints; j += increment) {\n            var idx = Math.round(j/increment);\n            sampledData[idx]=dataContainer[j];\n          }\n          groupsData[groupIds[i]] = sampledData.splice(0,Math.round(amountOfPoints/increment));\n        }\n      }\n    }\n  }\n};\n\n\n/**\n *\n *\n * @param {array}  groupIds\n * @param {object} groupsData\n * @param {object} groupRanges  | this is being filled here\n * @private\n */\nLineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) {\n  var groupData, group, i;\n  var combinedDataLeft = [];\n  var combinedDataRight = [];\n  var options;\n  if (groupIds.length > 0) {\n    for (i = 0; i < groupIds.length; i++) {\n      groupData = groupsData[groupIds[i]];\n      options = this.groups[groupIds[i]].options;\n      if (groupData.length > 0) {\n        group = this.groups[groupIds[i]];\n        // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups.\n        if (options.stack === true && options.style === 'bar') {\n          if (options.yAxisOrientation === 'left') {\n            combinedDataLeft = combinedDataLeft.concat(group.getItems());\n          }\n          else {\n            combinedDataRight = combinedDataRight.concat(group.getItems());\n          }\n        }\n        else {\n          groupRanges[groupIds[i]] = group.getYRange(groupData, groupIds[i]);\n        }\n      }\n    }\n\n    // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups.\n    Bars.getStackedYRange(combinedDataLeft, groupRanges, groupIds, '__barStackLeft', 'left');\n    Bars.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right');\n  }\n};\n\n\n/**\n * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden.\n * @param {Array} groupIds\n * @param {Object} groupRanges\n * @private\n */\nLineGraph.prototype._updateYAxis = function (groupIds, groupRanges) {\n  var resized = false;\n  var yAxisLeftUsed = false;\n  var yAxisRightUsed = false;\n  var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal;\n  // if groups are present\n  if (groupIds.length > 0) {\n    // this is here to make sure that if there are no items in the axis but there are groups, that there is no infinite draw/redraw loop.\n    for (var i = 0; i < groupIds.length; i++) {\n      var group = this.groups[groupIds[i]];\n      if (group && group.options.yAxisOrientation != 'right') {\n        yAxisLeftUsed = true;\n        minLeft = 1e9;\n        maxLeft = -1e9;\n      }\n      else if (group && group.options.yAxisOrientation) {\n        yAxisRightUsed = true;\n        minRight = 1e9;\n        maxRight = -1e9;\n      }\n    }\n\n    // if there are items:\n    for (var i = 0; i < groupIds.length; i++) {\n      if (groupRanges.hasOwnProperty(groupIds[i])) {\n        if (groupRanges[groupIds[i]].ignore !== true) {\n          minVal = groupRanges[groupIds[i]].min;\n          maxVal = groupRanges[groupIds[i]].max;\n\n          if (groupRanges[groupIds[i]].yAxisOrientation != 'right') {\n            yAxisLeftUsed = true;\n            minLeft = minLeft > minVal ? minVal : minLeft;\n            maxLeft = maxLeft < maxVal ? maxVal : maxLeft;\n          }\n          else {\n            yAxisRightUsed = true;\n            minRight = minRight > minVal ? minVal : minRight;\n            maxRight = maxRight < maxVal ? maxVal : maxRight;\n          }\n        }\n      }\n    }\n\n    if (yAxisLeftUsed == true) {\n      this.yAxisLeft.setRange(minLeft, maxLeft);\n    }\n    if (yAxisRightUsed == true) {\n      this.yAxisRight.setRange(minRight, maxRight);\n    }\n  }\n  resized = this._toggleAxisVisiblity(yAxisLeftUsed, this.yAxisLeft) || resized;\n  resized = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || resized;\n\n  if (yAxisRightUsed == true && yAxisLeftUsed == true) {\n    this.yAxisLeft.drawIcons = true;\n    this.yAxisRight.drawIcons = true;\n  }\n  else {\n    this.yAxisLeft.drawIcons = false;\n    this.yAxisRight.drawIcons = false;\n  }\n  this.yAxisRight.master = !yAxisLeftUsed;\n  this.yAxisRight.masterAxis = this.yAxisLeft;\n\n  if (this.yAxisRight.master == false) {\n    if (yAxisRightUsed == true) {\n      this.yAxisLeft.lineOffset = this.yAxisRight.width;\n    }\n    else {\n      this.yAxisLeft.lineOffset = 0;\n    }\n\n    resized = this.yAxisLeft.redraw() || resized;\n    resized = this.yAxisRight.redraw() || resized;\n  }\n  else {\n    resized = this.yAxisRight.redraw() || resized;\n  }\n\n  // clean the accumulated lists\n  var tempGroups = ['__barStackLeft', '__barStackRight', '__lineStackLeft', '__lineStackRight'];\n  for (var i = 0; i < tempGroups.length; i++) {\n    if (groupIds.indexOf(tempGroups[i]) != -1) {\n      groupIds.splice(groupIds.indexOf(tempGroups[i]), 1);\n    }\n  }\n\n  return resized;\n};\n\n\n/**\n * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function\n *\n * @param {boolean} axisUsed\n * @returns {boolean}\n * @private\n * @param axis\n */\nLineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) {\n  var changed = false;\n  if (axisUsed == false) {\n    if (axis.dom.frame.parentNode && axis.hidden == false) {\n      axis.hide();\n      changed = true;\n    }\n  }\n  else {\n    if (!axis.dom.frame.parentNode && axis.hidden == true) {\n      axis.show();\n      changed = true;\n    }\n  }\n  return changed;\n};\n\n\n/**\n * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the\n * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for\n * the yAxis.\n *\n * @param datapoints\n * @returns {Array}\n * @private\n */\nLineGraph.prototype._convertXcoordinates = function (datapoints) {\n  var toScreen = this.body.util.toScreen;\n  for (var i = 0; i < datapoints.length; i++) {\n    datapoints[i].screen_x = toScreen(datapoints[i].x) + this.props.width;\n    datapoints[i].screen_y = datapoints[i].y; //starting point for range calculations\n  }\n};\n\n\n/**\n * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the\n * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for\n * the yAxis.\n *\n * @param datapoints\n * @param group\n * @returns {Array}\n * @private\n */\nLineGraph.prototype._convertYcoordinates = function (datapoints, group) {\n  var axis = this.yAxisLeft;\n  var svgHeight = Number(this.svg.style.height.replace('px', ''));\n  if (group.options.yAxisOrientation == 'right') {\n    axis = this.yAxisRight;\n  }\n  for (var i = 0; i < datapoints.length; i++) {\n    datapoints[i].screen_y = Math.round(axis.convertValue(datapoints[i].y));\n  }\n  group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0)));\n};\n\n\nmodule.exports = LineGraph;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/LineGraph.js","var util = require('../../util');\nvar DOMutil = require('../../DOMutil');\nvar Component = require('./Component');\nvar DataScale = require('./DataScale');\n/**\n * A horizontal time axis\n * @param {Object} [options]        See DataAxis.setOptions for the available\n *                                  options.\n * @constructor DataAxis\n * @extends Component\n * @param body\n */\nfunction DataAxis(body, options, svg, linegraphOptions) {\n  this.id = util.randomUUID();\n  this.body = body;\n\n  this.defaultOptions = {\n    orientation: 'left',  // supported: 'left', 'right'\n    showMinorLabels: true,\n    showMajorLabels: true,\n    icons: false,\n    majorLinesOffset: 7,\n    minorLinesOffset: 4,\n    labelOffsetX: 10,\n    labelOffsetY: 2,\n    iconWidth: 20,\n    width: '40px',\n    visible: true,\n    alignZeros: true,\n    left: {\n      range: {min: undefined, max: undefined},\n      format: function (value) {\n        return '' + parseFloat(value.toPrecision(3));\n      },\n      title: {text: undefined, style: undefined}\n    },\n    right: {\n      range: {min: undefined, max: undefined},\n      format: function (value) {\n        return '' + parseFloat(value.toPrecision(3));\n      },\n      title: {text: undefined, style: undefined}\n    }\n  };\n\n  this.linegraphOptions = linegraphOptions;\n  this.linegraphSVG = svg;\n  this.props = {};\n  this.DOMelements = { // dynamic elements\n    lines: {},\n    labels: {},\n    title: {}\n  };\n\n  this.dom = {};\n  this.scale = undefined;\n  this.range = {start: 0, end: 0};\n\n  this.options = util.extend({}, this.defaultOptions);\n  this.conversionFactor = 1;\n\n  this.setOptions(options);\n  this.width = Number(('' + this.options.width).replace(\"px\", \"\"));\n  this.minWidth = this.width;\n  this.height = this.linegraphSVG.getBoundingClientRect().height;\n  this.hidden = false;\n\n  this.stepPixels = 25;\n  this.zeroCrossing = -1;\n  this.amountOfSteps = -1;\n\n  this.lineOffset = 0;\n  this.master = true;\n  this.masterAxis = null;\n  this.svgElements = {};\n  this.iconsRemoved = false;\n\n  this.groups = {};\n  this.amountOfGroups = 0;\n\n  // create the HTML DOM\n  this._create();\n  this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups};\n\n  var me = this;\n  this.body.emitter.on(\"verticalDrag\", function () {\n    me.dom.lineContainer.style.top = me.body.domProps.scrollTop + 'px';\n  });\n}\n\nDataAxis.prototype = new Component();\n\n\nDataAxis.prototype.addGroup = function (label, graphOptions) {\n  if (!this.groups.hasOwnProperty(label)) {\n    this.groups[label] = graphOptions;\n  }\n  this.amountOfGroups += 1;\n};\n\nDataAxis.prototype.updateGroup = function (label, graphOptions) {\n  if (!this.groups.hasOwnProperty(label)) {\n    this.amountOfGroups += 1;\n  }\n  this.groups[label] = graphOptions;\n};\n\nDataAxis.prototype.removeGroup = function (label) {\n  if (this.groups.hasOwnProperty(label)) {\n    delete this.groups[label];\n    this.amountOfGroups -= 1;\n  }\n};\n\n\nDataAxis.prototype.setOptions = function (options) {\n  if (options) {\n    var redraw = false;\n    if (this.options.orientation != options.orientation && options.orientation !== undefined) {\n      redraw = true;\n    }\n    var fields = [\n      'orientation',\n      'showMinorLabels',\n      'showMajorLabels',\n      'icons',\n      'majorLinesOffset',\n      'minorLinesOffset',\n      'labelOffsetX',\n      'labelOffsetY',\n      'iconWidth',\n      'width',\n      'visible',\n      'left',\n      'right',\n      'alignZeros'\n    ];\n    util.selectiveDeepExtend(fields, this.options, options);\n\n    this.minWidth = Number(('' + this.options.width).replace(\"px\", \"\"));\n    if (redraw === true && this.dom.frame) {\n      this.hide();\n      this.show();\n    }\n  }\n};\n\n\n/**\n * Create the HTML DOM for the DataAxis\n */\nDataAxis.prototype._create = function () {\n  this.dom.frame = document.createElement('div');\n  this.dom.frame.style.width = this.options.width;\n  this.dom.frame.style.height = this.height;\n\n  this.dom.lineContainer = document.createElement('div');\n  this.dom.lineContainer.style.width = '100%';\n  this.dom.lineContainer.style.height = this.height;\n  this.dom.lineContainer.style.position = 'relative';\n\n  // create svg element for graph drawing.\n  this.svg = document.createElementNS('http://www.w3.org/2000/svg', \"svg\");\n  this.svg.style.position = \"absolute\";\n  this.svg.style.top = '0px';\n  this.svg.style.height = '100%';\n  this.svg.style.width = '100%';\n  this.svg.style.display = \"block\";\n  this.dom.frame.appendChild(this.svg);\n};\n\nDataAxis.prototype._redrawGroupIcons = function () {\n  DOMutil.prepareElements(this.svgElements);\n\n  var x;\n  var iconWidth = this.options.iconWidth;\n  var iconHeight = 15;\n  var iconOffset = 4;\n  var y = iconOffset + 0.5 * iconHeight;\n\n  if (this.options.orientation === 'left') {\n    x = iconOffset;\n  }\n  else {\n    x = this.width - iconWidth - iconOffset;\n  }\n\n  var groupArray = Object.keys(this.groups);\n  groupArray.sort(function (a, b) {\n    return (a < b ? -1 : 1);\n  })\n\n  for (var i = 0; i < groupArray.length; i++) {\n    var groupId = groupArray[i];\n    if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) {\n      this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y);\n      y += iconHeight + iconOffset;\n    }\n  }\n\n  DOMutil.cleanupElements(this.svgElements);\n  this.iconsRemoved = false;\n};\n\nDataAxis.prototype._cleanupIcons = function () {\n  if (this.iconsRemoved === false) {\n    DOMutil.prepareElements(this.svgElements);\n    DOMutil.cleanupElements(this.svgElements);\n    this.iconsRemoved = true;\n  }\n}\n\n/**\n * Create the HTML DOM for the DataAxis\n */\nDataAxis.prototype.show = function () {\n  this.hidden = false;\n  if (!this.dom.frame.parentNode) {\n    if (this.options.orientation === 'left') {\n      this.body.dom.left.appendChild(this.dom.frame);\n    }\n    else {\n      this.body.dom.right.appendChild(this.dom.frame);\n    }\n  }\n\n  if (!this.dom.lineContainer.parentNode) {\n    this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer);\n  }\n};\n\n/**\n * Create the HTML DOM for the DataAxis\n */\nDataAxis.prototype.hide = function () {\n  this.hidden = true;\n  if (this.dom.frame.parentNode) {\n    this.dom.frame.parentNode.removeChild(this.dom.frame);\n  }\n\n  if (this.dom.lineContainer.parentNode) {\n    this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer);\n  }\n};\n\n/**\n * Set a range (start and end)\n * @param end\n * @param start\n * @param end\n */\nDataAxis.prototype.setRange = function (start, end) {\n  this.range.start = start;\n  this.range.end = end;\n};\n\n/**\n * Repaint the component\n * @return {boolean} Returns true if the component is resized\n */\nDataAxis.prototype.redraw = function () {\n  var resized = false;\n  var activeGroups = 0;\n\n  // Make sure the line container adheres to the vertical scrolling.\n  this.dom.lineContainer.style.top = this.body.domProps.scrollTop + 'px';\n\n  for (var groupId in this.groups) {\n    if (this.groups.hasOwnProperty(groupId)) {\n      if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) {\n        activeGroups++;\n      }\n    }\n  }\n  if (this.amountOfGroups === 0 || activeGroups === 0) {\n    this.hide();\n  }\n  else {\n    this.show();\n    this.height = Number(this.linegraphSVG.style.height.replace(\"px\", \"\"));\n\n    // svg offsetheight did not work in firefox and explorer...\n    this.dom.lineContainer.style.height = this.height + 'px';\n    this.width = this.options.visible === true ? Number(('' + this.options.width).replace(\"px\", \"\")) : 0;\n\n    var props = this.props;\n    var frame = this.dom.frame;\n\n    // update classname\n    frame.className = 'vis-data-axis';\n\n    // calculate character width and height\n    this._calculateCharSize();\n\n    var orientation = this.options.orientation;\n    var showMinorLabels = this.options.showMinorLabels;\n    var showMajorLabels = this.options.showMajorLabels;\n\n    // determine the width and height of the elements for the axis\n    props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0;\n    props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0;\n\n    props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset;\n    props.minorLineHeight = 1;\n    props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset;\n    props.majorLineHeight = 1;\n\n    //  take frame offline while updating (is almost twice as fast)\n    if (orientation === 'left') {\n      frame.style.top = '0';\n      frame.style.left = '0';\n      frame.style.bottom = '';\n      frame.style.width = this.width + 'px';\n      frame.style.height = this.height + \"px\";\n      this.props.width = this.body.domProps.left.width;\n      this.props.height = this.body.domProps.left.height;\n    }\n    else { // right\n      frame.style.top = '';\n      frame.style.bottom = '0';\n      frame.style.left = '0';\n      frame.style.width = this.width + 'px';\n      frame.style.height = this.height + \"px\";\n      this.props.width = this.body.domProps.right.width;\n      this.props.height = this.body.domProps.right.height;\n    }\n\n    resized = this._redrawLabels();\n    resized = this._isResized() || resized;\n\n    if (this.options.icons === true) {\n      this._redrawGroupIcons();\n    }\n    else {\n      this._cleanupIcons();\n    }\n\n    this._redrawTitle(orientation);\n  }\n  return resized;\n};\n\n/**\n * Repaint major and minor text labels and vertical grid lines\n * @private\n */\nDataAxis.prototype._redrawLabels = function () {\n  var resized = false;\n  DOMutil.prepareElements(this.DOMelements.lines);\n  DOMutil.prepareElements(this.DOMelements.labels);\n  var orientation = this.options['orientation'];\n  var customRange = this.options[orientation].range != undefined ? this.options[orientation].range : {};\n\n  //Override range with manual options:\n  var autoScaleEnd = true;\n  if (customRange.max != undefined) {\n    this.range.end = customRange.max;\n    autoScaleEnd = false;\n  }\n  var autoScaleStart = true;\n  if (customRange.min != undefined) {\n    this.range.start = customRange.min;\n    autoScaleStart = false;\n  }\n\n  this.scale = new DataScale(\n    this.range.start,\n    this.range.end,\n    autoScaleStart,\n    autoScaleEnd,\n    this.dom.frame.offsetHeight,\n    this.props.majorCharHeight,\n    this.options.alignZeros,\n    this.options[orientation].format\n  );\n\n  if (this.master === false && this.masterAxis != undefined) {\n    this.scale.followScale(this.masterAxis.scale);\n  }\n\n  //Is updated in side-effect of _redrawLabel():\n  this.maxLabelSize = 0;\n\n  var lines = this.scale.getLines();\n  lines.forEach(\n    line=> {\n      var y = line.y;\n      var isMajor = line.major;\n      if (this.options['showMinorLabels'] && isMajor === false) {\n        this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-minor', this.props.minorCharHeight);\n      }\n      if (isMajor) {\n        if (y >= 0) {\n          this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-major', this.props.majorCharHeight);\n        }\n      }\n      if (this.master === true) {\n        if (isMajor) {\n          this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', this.options.majorLinesOffset, this.props.majorLineWidth);\n        }\n        else {\n          this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', this.options.minorLinesOffset, this.props.minorLineWidth);\n        }\n      }\n    });\n\n  // Note that title is rotated, so we're using the height, not width!\n  var titleWidth = 0;\n  if (this.options[orientation].title !== undefined && this.options[orientation].title.text !== undefined) {\n    titleWidth = this.props.titleCharHeight;\n  }\n  var offset = this.options.icons === true ? Math.max(this.options.iconWidth, titleWidth) + this.options.labelOffsetX + 15 : titleWidth + this.options.labelOffsetX + 15;\n\n  // this will resize the yAxis to accommodate the labels.\n  if (this.maxLabelSize > (this.width - offset) && this.options.visible === true) {\n    this.width = this.maxLabelSize + offset;\n    this.options.width = this.width + \"px\";\n    DOMutil.cleanupElements(this.DOMelements.lines);\n    DOMutil.cleanupElements(this.DOMelements.labels);\n    this.redraw();\n    resized = true;\n  }\n  // this will resize the yAxis if it is too big for the labels.\n  else if (this.maxLabelSize < (this.width - offset) && this.options.visible === true && this.width > this.minWidth) {\n    this.width = Math.max(this.minWidth, this.maxLabelSize + offset);\n    this.options.width = this.width + \"px\";\n    DOMutil.cleanupElements(this.DOMelements.lines);\n    DOMutil.cleanupElements(this.DOMelements.labels);\n    this.redraw();\n    resized = true;\n  }\n  else {\n    DOMutil.cleanupElements(this.DOMelements.lines);\n    DOMutil.cleanupElements(this.DOMelements.labels);\n    resized = false;\n  }\n\n  return resized;\n};\n\nDataAxis.prototype.convertValue = function (value) {\n  return this.scale.convertValue(value);\n};\n\nDataAxis.prototype.screenToValue = function (x) {\n  return this.scale.screenToValue(x);\n};\n\n/**\n * Create a label for the axis at position x\n * @private\n * @param y\n * @param text\n * @param orientation\n * @param className\n * @param characterHeight\n */\nDataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) {\n  // reuse redundant label\n  var label = DOMutil.getDOMElement('div', this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift();\n  label.className = className;\n  label.innerHTML = text;\n  if (orientation === 'left') {\n    label.style.left = '-' + this.options.labelOffsetX + 'px';\n    label.style.textAlign = \"right\";\n  }\n  else {\n    label.style.right = '-' + this.options.labelOffsetX + 'px';\n    label.style.textAlign = \"left\";\n  }\n\n  label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px';\n\n  text += '';\n\n  var largestWidth = Math.max(this.props.majorCharWidth, this.props.minorCharWidth);\n  if (this.maxLabelSize < text.length * largestWidth) {\n    this.maxLabelSize = text.length * largestWidth;\n  }\n};\n\n/**\n * Create a minor line for the axis at position y\n * @param y\n * @param orientation\n * @param className\n * @param offset\n * @param width\n */\nDataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) {\n  if (this.master === true) {\n    var line = DOMutil.getDOMElement('div', this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift();\n    line.className = className;\n    line.innerHTML = '';\n\n    if (orientation === 'left') {\n      line.style.left = (this.width - offset) + 'px';\n    }\n    else {\n      line.style.right = (this.width - offset) + 'px';\n    }\n\n    line.style.width = width + 'px';\n    line.style.top = y + 'px';\n  }\n};\n\n/**\n * Create a title for the axis\n * @private\n * @param orientation\n */\nDataAxis.prototype._redrawTitle = function (orientation) {\n  DOMutil.prepareElements(this.DOMelements.title);\n\n  // Check if the title is defined for this axes\n  if (this.options[orientation].title !== undefined && this.options[orientation].title.text !== undefined) {\n    var title = DOMutil.getDOMElement('div', this.DOMelements.title, this.dom.frame);\n    title.className = 'vis-y-axis vis-title vis-' + orientation;\n    title.innerHTML = this.options[orientation].title.text;\n\n    // Add style - if provided\n    if (this.options[orientation].title.style !== undefined) {\n      util.addCssText(title, this.options[orientation].title.style);\n    }\n\n    if (orientation === 'left') {\n      title.style.left = this.props.titleCharHeight + 'px';\n    }\n    else {\n      title.style.right = this.props.titleCharHeight + 'px';\n    }\n\n    title.style.width = this.height + 'px';\n  }\n\n  // we need to clean up in case we did not use all elements.\n  DOMutil.cleanupElements(this.DOMelements.title);\n};\n\n\n/**\n * Determine the size of text on the axis (both major and minor axis).\n * The size is calculated only once and then cached in this.props.\n * @private\n */\nDataAxis.prototype._calculateCharSize = function () {\n  // determine the char width and height on the minor axis\n  if (!('minorCharHeight' in this.props)) {\n    var textMinor = document.createTextNode('0');\n    var measureCharMinor = document.createElement('div');\n    measureCharMinor.className = 'vis-y-axis vis-minor vis-measure';\n    measureCharMinor.appendChild(textMinor);\n    this.dom.frame.appendChild(measureCharMinor);\n\n    this.props.minorCharHeight = measureCharMinor.clientHeight;\n    this.props.minorCharWidth = measureCharMinor.clientWidth;\n\n    this.dom.frame.removeChild(measureCharMinor);\n  }\n\n  if (!('majorCharHeight' in this.props)) {\n    var textMajor = document.createTextNode('0');\n    var measureCharMajor = document.createElement('div');\n    measureCharMajor.className = 'vis-y-axis vis-major vis-measure';\n    measureCharMajor.appendChild(textMajor);\n    this.dom.frame.appendChild(measureCharMajor);\n\n    this.props.majorCharHeight = measureCharMajor.clientHeight;\n    this.props.majorCharWidth = measureCharMajor.clientWidth;\n\n    this.dom.frame.removeChild(measureCharMajor);\n  }\n\n  if (!('titleCharHeight' in this.props)) {\n    var textTitle = document.createTextNode('0');\n    var measureCharTitle = document.createElement('div');\n    measureCharTitle.className = 'vis-y-axis vis-title vis-measure';\n    measureCharTitle.appendChild(textTitle);\n    this.dom.frame.appendChild(measureCharTitle);\n\n    this.props.titleCharHeight = measureCharTitle.clientHeight;\n    this.props.titleCharWidth = measureCharTitle.clientWidth;\n\n    this.dom.frame.removeChild(measureCharTitle);\n  }\n};\n\nmodule.exports = DataAxis;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/DataAxis.js","/**\n * Created by ludo on 25-1-16.\n */\n\nfunction DataScale(start, end, autoScaleStart, autoScaleEnd, containerHeight, majorCharHeight, zeroAlign = false, formattingFunction=false) {\n  this.majorSteps = [1, 2, 5, 10];\n  this.minorSteps = [0.25, 0.5, 1, 2];\n  this.customLines = null;\n\n  this.containerHeight = containerHeight;\n  this.majorCharHeight = majorCharHeight;\n  this._start = start;\n  this._end = end;\n\n  this.scale = 1;\n  this.minorStepIdx = -1;\n  this.magnitudefactor = 1;\n  this.determineScale();\n\n  this.zeroAlign = zeroAlign;\n  this.autoScaleStart = autoScaleStart;\n  this.autoScaleEnd = autoScaleEnd;\n\n  this.formattingFunction = formattingFunction;\n\n  if (autoScaleStart || autoScaleEnd) {\n    var me = this;\n    var roundToMinor = function (value) {\n      var rounded = value - (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]));\n      if (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]) > 0.5 * (me.magnitudefactor * me.minorSteps[me.minorStepIdx])) {\n        return rounded + (me.magnitudefactor * me.minorSteps[me.minorStepIdx]);\n      }\n      else {\n        return rounded;\n      }\n    };\n    if (autoScaleStart) {\n      this._start -= this.magnitudefactor * 2 * this.minorSteps[this.minorStepIdx];\n      this._start = roundToMinor(this._start);\n    }\n\n    if (autoScaleEnd) {\n      this._end += this.magnitudefactor * this.minorSteps[this.minorStepIdx];\n      this._end = roundToMinor(this._end);\n    }\n    this.determineScale();\n  }\n}\n\nDataScale.prototype.setCharHeight = function (majorCharHeight) {\n  this.majorCharHeight = majorCharHeight;\n};\n\nDataScale.prototype.setHeight = function (containerHeight) {\n  this.containerHeight = containerHeight;\n};\n\nDataScale.prototype.determineScale = function () {\n  var range = this._end - this._start;\n  this.scale = this.containerHeight / range;\n  var minimumStepValue = this.majorCharHeight / this.scale;\n  var orderOfMagnitude = (range > 0)\n      ? Math.round(Math.log(range) / Math.LN10)\n      : 0;\n\n  this.minorStepIdx = -1;\n  this.magnitudefactor = Math.pow(10, orderOfMagnitude);\n\n  var start = 0;\n  if (orderOfMagnitude < 0) {\n    start = orderOfMagnitude;\n  }\n\n  var solutionFound = false;\n  for (var l = start; Math.abs(l) <= Math.abs(orderOfMagnitude); l++) {\n    this.magnitudefactor = Math.pow(10, l);\n    for (var j = 0; j < this.minorSteps.length; j++) {\n      var stepSize = this.magnitudefactor * this.minorSteps[j];\n      if (stepSize >= minimumStepValue) {\n        solutionFound = true;\n        this.minorStepIdx = j;\n        break;\n      }\n    }\n    if (solutionFound === true) {\n      break;\n    }\n  }\n};\n\nDataScale.prototype.is_major = function (value) {\n  return (value % (this.magnitudefactor * this.majorSteps[this.minorStepIdx]) === 0);\n};\n\nDataScale.prototype.getStep = function(){\n  return this.magnitudefactor * this.minorSteps[this.minorStepIdx];\n};\n\nDataScale.prototype.getFirstMajor = function(){\n  var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx];\n  return this.convertValue(this._start + ((majorStep - (this._start % majorStep)) % majorStep));\n};\n\nDataScale.prototype.formatValue = function(current) {\n  var returnValue = current.toPrecision(5);\n  if (typeof this.formattingFunction === 'function') {\n    returnValue = this.formattingFunction(current);\n  }\n\n  if (typeof returnValue === 'number') {\n    return '' + returnValue;\n  }\n  else if (typeof returnValue === 'string') {\n    return returnValue;\n  }\n  else {\n    return current.toPrecision(5);\n  }\n\n};\n\nDataScale.prototype.getLines = function () {\n  var lines = [];\n  var step = this.getStep();\n  var bottomOffset = (step - (this._start % step)) % step;\n  for (var i = (this._start + bottomOffset); this._end-i > 0.00001; i += step) {\n    if (i != this._start) { //Skip the bottom line\n      lines.push({major: this.is_major(i), y: this.convertValue(i), val: this.formatValue(i)});\n    }\n  }\n  return lines;\n};\n\nDataScale.prototype.followScale = function (other) {\n  var oldStepIdx = this.minorStepIdx;\n  var oldStart = this._start;\n  var oldEnd = this._end;\n\n  var me = this;\n  var increaseMagnitude = function () {\n    me.magnitudefactor *= 2;\n  };\n  var decreaseMagnitude = function () {\n    me.magnitudefactor /= 2;\n  };\n\n  if ((other.minorStepIdx <= 1 && this.minorStepIdx <= 1) || (other.minorStepIdx > 1 && this.minorStepIdx > 1)) {\n    //easy, no need to change stepIdx nor multiplication factor\n  } else if (other.minorStepIdx < this.minorStepIdx) {\n    //I'm 5, they are 4 per major.\n    this.minorStepIdx = 1;\n    if (oldStepIdx == 2) {\n      increaseMagnitude();\n    } else {\n      increaseMagnitude();\n      increaseMagnitude();\n    }\n  } else {\n    //I'm 4, they are 5 per major\n    this.minorStepIdx = 2;\n    if (oldStepIdx == 1) {\n      decreaseMagnitude();\n    } else {\n      decreaseMagnitude();\n      decreaseMagnitude();\n    }\n  }\n\n  //Get masters stats:\n  var lines = other.getLines();\n  var otherZero = other.convertValue(0);\n  var otherStep = other.getStep() * other.scale;\n\n  var done = false;\n  var count = 0;\n  //Loop until magnitude is correct for given constrains.\n  while (!done && count++ <5) {\n\n    //Get my stats:\n    this.scale = otherStep / (this.minorSteps[this.minorStepIdx] * this.magnitudefactor);\n    var newRange = this.containerHeight / this.scale;\n\n    //For the case the magnitudefactor has changed:\n    this._start = oldStart;\n    this._end = this._start + newRange;\n\n    var myOriginalZero = this._end * this.scale;\n    var majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx];\n    var majorOffset = this.getFirstMajor() - other.getFirstMajor();\n\n    if (this.zeroAlign) {\n      var zeroOffset = otherZero - myOriginalZero;\n      this._end += (zeroOffset / this.scale);\n      this._start = this._end - newRange;\n    } else {\n      if (!this.autoScaleStart) {\n        this._start += majorStep - (majorOffset / this.scale);\n        this._end = this._start + newRange;\n      } else {\n        this._start -= majorOffset / this.scale;\n        this._end = this._start + newRange;\n      }\n    }\n    if (!this.autoScaleEnd && this._end > oldEnd+0.00001) {\n      //Need to decrease magnitude to prevent scale overshoot! (end)\n      decreaseMagnitude();\n      done = false;\n      continue;\n    }\n    if (!this.autoScaleStart && this._start < oldStart-0.00001) {\n      if (this.zeroAlign && oldStart >= 0) {\n        console.warn(\"Can't adhere to given 'min' range, due to zeroalign\");\n      } else {\n        //Need to decrease magnitude to prevent scale overshoot! (start)\n        decreaseMagnitude();\n        done = false;\n        continue;\n      }\n    }\n    if (this.autoScaleStart && this.autoScaleEnd && newRange < (oldEnd-oldStart)){\n      increaseMagnitude();\n      done = false;\n      continue;\n    }\n    done = true;\n  }\n};\n\nDataScale.prototype.convertValue = function (value) {\n  return this.containerHeight - ((value - this._start) * this.scale);\n};\n\nDataScale.prototype.screenToValue = function (pixels) {\n  return ((this.containerHeight - pixels) / this.scale) + this._start;\n};\n\nmodule.exports = DataScale;\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/DataScale.js","var util = require('../../util');\nvar DOMutil = require('../../DOMutil');\nvar Bars = require('./graph2d_types/bar');\nvar Lines = require('./graph2d_types/line');\nvar Points = require('./graph2d_types/points');\n\n/**\n * /**\n * @param {object} group            | the object of the group from the dataset\n * @param {string} groupId          | ID of the group\n * @param {object} options          | the default options\n * @param {array} groupsUsingDefaultStyles  | this array has one entree.\n *                                            It is passed as an array so it is passed by reference.\n *                                            It enumerates through the default styles\n * @constructor\n */\nfunction GraphGroup(group, groupId, options, groupsUsingDefaultStyles) {\n  this.id = groupId;\n  var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'drawPoints', 'shaded', 'interpolation', 'zIndex','excludeFromStacking', 'excludeFromLegend'];\n  this.options = util.selectiveBridgeObject(fields, options);\n  this.usingDefaultStyle = group.className === undefined;\n  this.groupsUsingDefaultStyles = groupsUsingDefaultStyles;\n  this.zeroPosition = 0;\n  this.update(group);\n  if (this.usingDefaultStyle == true) {\n    this.groupsUsingDefaultStyles[0] += 1;\n  }\n  this.itemsData = [];\n  this.visible = group.visible === undefined ? true : group.visible;\n}\n\n/**\n * this loads a reference to all items in this group into this group.\n * @param {array} items\n */\nGraphGroup.prototype.setItems = function (items) {\n  if (items != null) {\n    this.itemsData = items;\n    if (this.options.sort == true) {\n      util.insertSort(this.itemsData,function (a, b) {\n        return a.x > b.x ? 1 : -1;\n      });\n    }\n  }\n  else {\n    this.itemsData = [];\n  }\n};\n\nGraphGroup.prototype.getItems = function () {\n  return this.itemsData;\n}\n\n/**\n * this is used for barcharts and shading, this way, we only have to calculate it once.\n * @param pos\n */\nGraphGroup.prototype.setZeroPosition = function (pos) {\n  this.zeroPosition = pos;\n};\n\n/**\n * set the options of the graph group over the default options.\n * @param options\n */\nGraphGroup.prototype.setOptions = function (options) {\n  if (options !== undefined) {\n    var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'zIndex','excludeFromStacking', 'excludeFromLegend'];\n    util.selectiveDeepExtend(fields, this.options, options);\n\n    // if the group's drawPoints is a function delegate the callback to the onRender property\n    if (typeof options.drawPoints == 'function') {\n      options.drawPoints = {\n        onRender: options.drawPoints\n      }\n    }\n\n    util.mergeOptions(this.options, options, 'interpolation');\n    util.mergeOptions(this.options, options, 'drawPoints');\n    util.mergeOptions(this.options, options, 'shaded');\n\n    if (options.interpolation) {\n      if (typeof options.interpolation == 'object') {\n        if (options.interpolation.parametrization) {\n          if (options.interpolation.parametrization == 'uniform') {\n            this.options.interpolation.alpha = 0;\n          }\n          else if (options.interpolation.parametrization == 'chordal') {\n            this.options.interpolation.alpha = 1.0;\n          }\n          else {\n            this.options.interpolation.parametrization = 'centripetal';\n            this.options.interpolation.alpha = 0.5;\n          }\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph\n * @param group\n */\nGraphGroup.prototype.update = function (group) {\n  this.group = group;\n  this.content = group.content || 'graph';\n  this.className = group.className || this.className || 'vis-graph-group' + this.groupsUsingDefaultStyles[0] % 10;\n  this.visible = group.visible === undefined ? true : group.visible;\n  this.style = group.style;\n  this.setOptions(group.options);\n};\n\n/**\n * return the legend entree for this group.\n *\n * @param iconWidth\n * @param iconHeight\n * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}}\n */\nGraphGroup.prototype.getLegend = function (iconWidth, iconHeight, framework, x, y) {\n  if (framework == undefined || framework == null) {\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', \"svg\");\n    framework = {svg: svg, svgElements:{}, options: this.options, groups: [this]}\n  }\n  if (x == undefined || x == null){\n    x = 0;\n  }\n  if (y == undefined || y == null){\n    y = 0.5 * iconHeight;\n  }\n  switch (this.options.style){\n    case \"line\":\n      Lines.drawIcon(this, x, y, iconWidth, iconHeight, framework);\n      break;\n    case \"points\": //explicit no break\n    case \"point\":\n      Points.drawIcon(this, x, y, iconWidth, iconHeight, framework);\n      break;\n    case \"bar\":\n      Bars.drawIcon(this, x, y, iconWidth, iconHeight, framework);\n      break;\n  }\n  return {icon: framework.svg, label: this.content, orientation: this.options.yAxisOrientation};\n};\n\nGraphGroup.prototype.getYRange = function (groupData) {\n  var yMin = groupData[0].y;\n  var yMax = groupData[0].y;\n  for (var j = 0; j < groupData.length; j++) {\n    yMin = yMin > groupData[j].y ? groupData[j].y : yMin;\n    yMax = yMax < groupData[j].y ? groupData[j].y : yMax;\n  }\n  return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation};\n};\n\nmodule.exports = GraphGroup;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/GraphGroup.js","var DOMutil = require('../../../DOMutil');\nvar Points = require('./points');\n\nfunction Bargraph(groupId, options) {\n}\n\nBargraph.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) {\n  var fillHeight = iconHeight * 0.5;\n  var path, fillPath;\n\n  var outline = DOMutil.getSVGElement(\"rect\", framework.svgElements, framework.svg);\n  outline.setAttributeNS(null, \"x\", x);\n  outline.setAttributeNS(null, \"y\", y - fillHeight);\n  outline.setAttributeNS(null, \"width\", iconWidth);\n  outline.setAttributeNS(null, \"height\", 2 * fillHeight);\n  outline.setAttributeNS(null, \"class\", \"vis-outline\");\n\n  var barWidth = Math.round(0.3 * iconWidth);\n  var originalWidth = group.options.barChart.width;\n  var scale = originalWidth / barWidth;\n  var bar1Height = Math.round(0.4 * iconHeight);\n  var bar2Height = Math.round(0.75 * iconHeight);\n\n  var offset = Math.round((iconWidth - (2 * barWidth)) / 3);\n\n  DOMutil.drawBar(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, barWidth, bar1Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style);\n  DOMutil.drawBar(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style);\n\n  if (group.options.drawPoints.enabled == true) {\n    var groupTemplate = {\n      style: group.options.drawPoints.style,\n      styles: group.options.drawPoints.styles,\n      size: (group.options.drawPoints.size / scale),\n      className: group.className\n    };\n    DOMutil.drawPoint(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, groupTemplate, framework.svgElements, framework.svg);\n    DOMutil.drawPoint(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, groupTemplate, framework.svgElements, framework.svg);\n  }\n\n}\n\n/**\n * draw a bar graph\n *\n * @param groupIds\n * @param processedGroupData\n */\nBargraph.draw = function (groupIds, processedGroupData, framework) {\n  var combinedData = [];\n  var intersections = {};\n  var coreDistance;\n  var key, drawData;\n  var group;\n  var i, j;\n  var barPoints = 0;\n\n  // combine all barchart data\n  for (i = 0; i < groupIds.length; i++) {\n    group = framework.groups[groupIds[i]];\n    if (group.options.style === 'bar') {\n      if (group.visible === true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] === true)) {\n        for (j = 0; j < processedGroupData[groupIds[i]].length; j++) {\n          combinedData.push({\n            screen_x: processedGroupData[groupIds[i]][j].screen_x,\n            screen_y: processedGroupData[groupIds[i]][j].screen_y,\n            x: processedGroupData[groupIds[i]][j].x,\n            y: processedGroupData[groupIds[i]][j].y,\n            groupId: groupIds[i],\n            label: processedGroupData[groupIds[i]][j].label\n          });\n          barPoints += 1;\n        }\n      }\n    }\n  }\n\n  if (barPoints === 0) {\n    return;\n  }\n\n  // sort by time and by group\n  combinedData.sort(function (a, b) {\n    if (a.screen_x === b.screen_x) {\n      return a.groupId < b.groupId ? -1 : 1;\n    }\n    else {\n      return a.screen_x - b.screen_x;\n    }\n  });\n\n  // get intersections\n  Bargraph._getDataIntersections(intersections, combinedData);\n\n  // plot barchart\n  for (i = 0; i < combinedData.length; i++) {\n    group = framework.groups[combinedData[i].groupId];\n    var minWidth = group.options.barChart.minWidth != undefined ? group.options.barChart.minWidth : 0.1 * group.options.barChart.width;\n\n    key = combinedData[i].screen_x;\n    var heightOffset = 0;\n    if (intersections[key] === undefined) {\n      if (i + 1 < combinedData.length) {\n        coreDistance = Math.abs(combinedData[i + 1].screen_x - key);\n      }\n      drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth);\n    }\n    else {\n      var nextKey = i + (intersections[key].amount - intersections[key].resolved);\n      var prevKey = i - (intersections[key].resolved + 1);\n      if (nextKey < combinedData.length) {\n        coreDistance = Math.abs(combinedData[nextKey].screen_x - key);\n      }\n      drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth);\n      intersections[key].resolved += 1;\n\n      if (group.options.stack === true && group.options.excludeFromStacking !== true) {\n        if (combinedData[i].screen_y < group.zeroPosition) {\n          heightOffset = intersections[key].accumulatedNegative;\n          intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].screen_y;\n        }\n        else {\n          heightOffset = intersections[key].accumulatedPositive;\n          intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].screen_y;\n        }\n      }\n      else if (group.options.barChart.sideBySide === true) {\n        drawData.width = drawData.width / intersections[key].amount;\n        drawData.offset += (intersections[key].resolved) * drawData.width - (0.5 * drawData.width * (intersections[key].amount + 1));\n      }\n    }\n    DOMutil.drawBar(combinedData[i].screen_x + drawData.offset, combinedData[i].screen_y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].screen_y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style);\n    // draw points\n    if (group.options.drawPoints.enabled === true) {\n      let pointData = {\n        screen_x: combinedData[i].screen_x,\n        screen_y: combinedData[i].screen_y - heightOffset,\n        x: combinedData[i].x,\n        y: combinedData[i].y,\n        groupId: combinedData[i].groupId,\n        label: combinedData[i].label\n      };\n      Points.draw([pointData], group, framework, drawData.offset);\n      //DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg);\n    }\n  }\n};\n\n\n/**\n * Fill the intersections object with counters of how many datapoints share the same x coordinates\n * @param intersections\n * @param combinedData\n * @private\n */\nBargraph._getDataIntersections = function (intersections, combinedData) {\n  // get intersections\n  var coreDistance;\n  for (var i = 0; i < combinedData.length; i++) {\n    if (i + 1 < combinedData.length) {\n      coreDistance = Math.abs(combinedData[i + 1].screen_x - combinedData[i].screen_x);\n    }\n    if (i > 0) {\n      coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].screen_x - combinedData[i].screen_x));\n    }\n    if (coreDistance === 0) {\n      if (intersections[combinedData[i].screen_x] === undefined) {\n        intersections[combinedData[i].screen_x] = {\n          amount: 0,\n          resolved: 0,\n          accumulatedPositive: 0,\n          accumulatedNegative: 0\n        };\n      }\n      intersections[combinedData[i].screen_x].amount += 1;\n    }\n  }\n};\n\n\n/**\n * Get the width and offset for bargraphs based on the coredistance between datapoints\n *\n * @param coreDistance\n * @param group\n * @param minWidth\n * @returns {{width: Number, offset: Number}}\n * @private\n */\nBargraph._getSafeDrawData = function (coreDistance, group, minWidth) {\n  var width, offset;\n  if (coreDistance < group.options.barChart.width && coreDistance > 0) {\n    width = coreDistance < minWidth ? minWidth : coreDistance\n\n    offset = 0; // recalculate offset with the new width;\n    if (group.options.barChart.align === 'left') {\n      offset -= 0.5 * coreDistance;\n    }\n    else if (group.options.barChart.align === 'right') {\n      offset += 0.5 * coreDistance;\n    }\n  }\n  else {\n    // default settings\n    width = group.options.barChart.width;\n    offset = 0;\n    if (group.options.barChart.align === 'left') {\n      offset -= 0.5 * group.options.barChart.width;\n    }\n    else if (group.options.barChart.align === 'right') {\n      offset += 0.5 * group.options.barChart.width;\n    }\n  }\n\n  return {width: width, offset: offset};\n};\n\nBargraph.getStackedYRange = function (combinedData, groupRanges, groupIds, groupLabel, orientation) {\n  if (combinedData.length > 0) {\n    // sort by time and by group\n    combinedData.sort(function (a, b) {\n      if (a.screen_x === b.screen_x) {\n        return a.groupId < b.groupId ? -1 : 1;\n      }\n      else {\n        return a.screen_x - b.screen_x;\n      }\n    });\n    var intersections = {};\n\n    Bargraph._getDataIntersections(intersections, combinedData);\n    groupRanges[groupLabel] = Bargraph._getStackedYRange(intersections, combinedData);\n    groupRanges[groupLabel].yAxisOrientation = orientation;\n    groupIds.push(groupLabel);\n  }\n}\n\nBargraph._getStackedYRange = function (intersections, combinedData) {\n  var key;\n  var yMin = combinedData[0].screen_y;\n  var yMax = combinedData[0].screen_y;\n  for (var i = 0; i < combinedData.length; i++) {\n    key = combinedData[i].screen_x;\n    if (intersections[key] === undefined) {\n      yMin = yMin > combinedData[i].screen_y ? combinedData[i].screen_y : yMin;\n      yMax = yMax < combinedData[i].screen_y ? combinedData[i].screen_y : yMax;\n    }\n    else {\n      if (combinedData[i].screen_y < 0) {\n        intersections[key].accumulatedNegative += combinedData[i].screen_y;\n      }\n      else {\n        intersections[key].accumulatedPositive += combinedData[i].screen_y;\n      }\n    }\n  }\n  for (var xpos in intersections) {\n    if (intersections.hasOwnProperty(xpos)) {\n      yMin = yMin > intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMin;\n      yMin = yMin > intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMin;\n      yMax = yMax < intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMax;\n      yMax = yMax < intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMax;\n    }\n  }\n\n  return {min: yMin, max: yMax};\n};\n\nmodule.exports = Bargraph;\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/graph2d_types/bar.js","var DOMutil = require('../../../DOMutil');\n\nfunction Points(groupId, options) {\n}\n\n/**\n * draw the data points\n *\n * @param {Array} dataset\n * @param {Object} JSONcontainer\n * @param {Object} svg            | SVG DOM element\n * @param {GraphGroup} group\n * @param {Number} [offset]\n */\nPoints.draw = function (dataset, group, framework, offset) {\n  offset = offset || 0;\n  var callback = getCallback(framework, group);\n\n  for (var i = 0; i < dataset.length; i++) {\n    if (!callback) {\n      // draw the point the simple way.\n      DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group), framework.svgElements, framework.svg, dataset[i].label);\n    }\n    else {\n      var callbackResult = callback(dataset[i], group); // result might be true, false or an object\n      if (callbackResult === true || typeof callbackResult === 'object') {\n        DOMutil.drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group, callbackResult), framework.svgElements, framework.svg, dataset[i].label);\n      }\n    }\n  }\n};\n\nPoints.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) {\n  var fillHeight = iconHeight * 0.5;\n  var path, fillPath;\n\n  var outline = DOMutil.getSVGElement(\"rect\", framework.svgElements, framework.svg);\n  outline.setAttributeNS(null, \"x\", x);\n  outline.setAttributeNS(null, \"y\", y - fillHeight);\n  outline.setAttributeNS(null, \"width\", iconWidth);\n  outline.setAttributeNS(null, \"height\", 2 * fillHeight);\n  outline.setAttributeNS(null, \"class\", \"vis-outline\");\n\n  //Don't call callback on icon\n  DOMutil.drawPoint(x + 0.5 * iconWidth, y, getGroupTemplate(group), framework.svgElements, framework.svg);\n};\n\nfunction getGroupTemplate(group, callbackResult) {\n  callbackResult = (typeof callbackResult === 'undefined') ? {} : callbackResult;\n  return {\n    style: callbackResult.style || group.options.drawPoints.style,\n    styles: callbackResult.styles || group.options.drawPoints.styles,\n    size: callbackResult.size || group.options.drawPoints.size,\n    className: callbackResult.className || group.className\n  };\n}\n\nfunction getCallback(framework, group) {\n  var callback = undefined;\n  // check for the graph2d onRender\n  if (framework.options && framework.options.drawPoints && framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') {\n    callback = framework.options.drawPoints.onRender;\n  }\n\n  // override it with the group onRender if defined\n  if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') {\n    callback = group.group.options.drawPoints.onRender;\n  }\n  return callback;\n}\n\n\nmodule.exports = Points;\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/graph2d_types/points.js","var DOMutil = require('../../../DOMutil');\n\nfunction Line(groupId, options) {\n}\n\nLine.calcPath = function (dataset, group) {\n    if (dataset != null) {\n        if (dataset.length > 0) {\n            var d = [];\n\n            // construct path from dataset\n            if (group.options.interpolation.enabled == true) {\n                d = Line._catmullRom(dataset, group);\n            }\n            else {\n                d = Line._linear(dataset);\n            }\n            return d;\n        }\n    }\n}\n\nLine.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) {\n    var fillHeight = iconHeight * 0.5;\n    var path, fillPath;\n\n    var outline = DOMutil.getSVGElement(\"rect\", framework.svgElements, framework.svg);\n    outline.setAttributeNS(null, \"x\", x);\n    outline.setAttributeNS(null, \"y\", y - fillHeight);\n    outline.setAttributeNS(null, \"width\", iconWidth);\n    outline.setAttributeNS(null, \"height\", 2 * fillHeight);\n    outline.setAttributeNS(null, \"class\", \"vis-outline\");\n\n    path = DOMutil.getSVGElement(\"path\", framework.svgElements, framework.svg);\n    path.setAttributeNS(null, \"class\", group.className);\n    if (group.style !== undefined) {\n        path.setAttributeNS(null, \"style\", group.style);\n    }\n\n    path.setAttributeNS(null, \"d\", \"M\" + x + \",\" + y + \" L\" + (x + iconWidth) + \",\" + y + \"\");\n    if (group.options.shaded.enabled == true) {\n        fillPath = DOMutil.getSVGElement(\"path\", framework.svgElements, framework.svg);\n        if (group.options.shaded.orientation == 'top') {\n            fillPath.setAttributeNS(null, \"d\", \"M\" + x + \", \" + (y - fillHeight) +\n              \"L\" + x + \",\" + y + \" L\" + (x + iconWidth) + \",\" + y + \" L\" + (x + iconWidth) + \",\" + (y - fillHeight));\n        }\n        else {\n            fillPath.setAttributeNS(null, \"d\", \"M\" + x + \",\" + y + \" \" +\n              \"L\" + x + \",\" + (y + fillHeight) + \" \" +\n              \"L\" + (x + iconWidth) + \",\" + (y + fillHeight) +\n              \"L\" + (x + iconWidth) + \",\" + y);\n        }\n        fillPath.setAttributeNS(null, \"class\", group.className + \" vis-icon-fill\");\n        if (group.options.shaded.style !== undefined && group.options.shaded.style !== \"\") {\n            fillPath.setAttributeNS(null, \"style\", group.options.shaded.style);\n        }\n    }\n\n    if (group.options.drawPoints.enabled == true) {\n        var groupTemplate = {\n            style: group.options.drawPoints.style,\n            styles: group.options.drawPoints.styles,\n            size: group.options.drawPoints.size,\n            className: group.className\n        };\n        DOMutil.drawPoint(x + 0.5 * iconWidth, y, groupTemplate, framework.svgElements, framework.svg);\n    }\n}\n\nLine.drawShading = function (pathArray, group, subPathArray, framework) {\n    // append shading to the path\n    if (group.options.shaded.enabled == true) {\n        var svgHeight = Number(framework.svg.style.height.replace('px',''));\n        var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg);\n        var type = \"L\";\n        if (group.options.interpolation.enabled == true){\n            type = \"C\";\n        }\n        var dFill;\n        var zero = 0;\n        if (group.options.shaded.orientation == 'top') {\n            zero = 0;\n        }\n        else if (group.options.shaded.orientation == 'bottom') {\n            zero = svgHeight;\n        }\n        else {\n            zero = Math.min(Math.max(0, group.zeroPosition), svgHeight);\n        }\n        if (group.options.shaded.orientation == 'group' && (subPathArray != null && subPathArray != undefined)) {\n            dFill = 'M' + pathArray[0][0]+ \",\"+pathArray[0][1] + \" \" +\n                    this.serializePath(pathArray,type,false) +\n                    ' L'+ subPathArray[subPathArray.length-1][0]+ \",\" + subPathArray[subPathArray.length-1][1] + \" \" +\n                    this.serializePath(subPathArray,type,true) +\n                    subPathArray[0][0]+ \",\"+subPathArray[0][1] + \" Z\";\n        }\n        else {\n            dFill = 'M' + pathArray[0][0]+ \",\"+pathArray[0][1] + \" \" +\n                    this.serializePath(pathArray,type,false) +\n                    ' V' + zero + ' H'+ pathArray[0][0] + \" Z\";\n        }\n\n        fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill');\n        if (group.options.shaded.style !== undefined) {\n            fillPath.setAttributeNS(null, 'style', group.options.shaded.style);\n        }\n        fillPath.setAttributeNS(null, 'd', dFill);\n    }\n}\n\n/**\n * draw a line graph\n *\n * @param dataset\n * @param group\n */\nLine.draw = function (pathArray, group, framework) {\n    if (pathArray != null && pathArray != undefined) {\n        var path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg);\n        path.setAttributeNS(null, \"class\", group.className);\n        if (group.style !== undefined) {\n            path.setAttributeNS(null, \"style\", group.style);\n        }\n\n        var type = \"L\";\n        if (group.options.interpolation.enabled == true){\n            type = \"C\";\n        }\n        // copy properties to path for drawing.\n        path.setAttributeNS(null, 'd', 'M' + pathArray[0][0]+ \",\"+pathArray[0][1] + \" \" + this.serializePath(pathArray,type,false));\n    }\n};\n\nLine.serializePath = function(pathArray,type,inverse){\n    if (pathArray.length < 2){\n        //Too little data to create a path.\n        return \"\";\n    }\n    var d = type;\n    if (inverse){\n        for (var i = pathArray.length-2; i > 0; i--){\n            d += pathArray[i][0] + \",\" + pathArray[i][1] + \" \";\n        }\n    }\n    else {\n        for (var i = 1; i < pathArray.length; i++){\n            d += pathArray[i][0] + \",\" + pathArray[i][1] + \" \";\n        }\n    }\n    return d;\n}\n\n/**\n * This uses an uniform parametrization of the interpolation algorithm:\n * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al.\n * @param data\n * @returns {string}\n * @private\n */\nLine._catmullRomUniform = function (data) {\n    // catmull rom\n    var p0, p1, p2, p3, bp1, bp2;\n    var d = [];\n    d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]);\n    var normalization = 1 / 6;\n    var length = data.length;\n    for (var i = 0; i < length - 1; i++) {\n\n        p0 = (i == 0) ? data[0] : data[i - 1];\n        p1 = data[i];\n        p2 = data[i + 1];\n        p3 = (i + 2 < length) ? data[i + 2] : p2;\n\n\n        // Catmull-Rom to Cubic Bezier conversion matrix\n        //    0       1       0       0\n        //  -1/6      1      1/6      0\n        //    0      1/6      1     -1/6\n        //    0       0       1       0\n\n        //    bp0 = { x: p1.x,                               y: p1.y };\n        bp1 = {\n            screen_x: ((-p0.screen_x + 6 * p1.screen_x + p2.screen_x) * normalization),\n            screen_y: ((-p0.screen_y + 6 * p1.screen_y + p2.screen_y) * normalization)\n        };\n        bp2 = {\n            screen_x: (( p1.screen_x + 6 * p2.screen_x - p3.screen_x) * normalization),\n            screen_y: (( p1.screen_y + 6 * p2.screen_y - p3.screen_y) * normalization)\n        };\n        //    bp0 = { x: p2.x,                               y: p2.y };\n\n        d.push( [ bp1.screen_x , bp1.screen_y ]);\n        d.push( [ bp2.screen_x , bp2.screen_y ]);\n        d.push( [ p2.screen_x  , p2.screen_y  ]);\n    }\n\n    return d;\n};\n\n/**\n * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm.\n * By default, the centripetal parameterization is used because this gives the nicest results.\n * These parameterizations are relatively heavy because the distance between 4 points have to be calculated.\n *\n * One optimization can be used to reuse distances since this is a sliding window approach.\n * @param data\n * @param group\n * @returns {string}\n * @private\n */\nLine._catmullRom = function (data, group) {\n    var alpha = group.options.interpolation.alpha;\n    if (alpha == 0 || alpha === undefined) {\n        return this._catmullRomUniform(data);\n    }\n    else {\n        var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M;\n        var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA;\n        var d = [];\n        d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]);\n        var length = data.length;\n        for (var i = 0; i < length - 1; i++) {\n\n            p0 = (i == 0) ? data[0] : data[i - 1];\n            p1 = data[i];\n            p2 = data[i + 1];\n            p3 = (i + 2 < length) ? data[i + 2] : p2;\n\n            d1 = Math.sqrt(Math.pow(p0.screen_x - p1.screen_x, 2) + Math.pow(p0.screen_y - p1.screen_y, 2));\n            d2 = Math.sqrt(Math.pow(p1.screen_x - p2.screen_x, 2) + Math.pow(p1.screen_y - p2.screen_y, 2));\n            d3 = Math.sqrt(Math.pow(p2.screen_x - p3.screen_x, 2) + Math.pow(p2.screen_y - p3.screen_y, 2));\n\n            // Catmull-Rom to Cubic Bezier conversion matrix\n\n            // A = 2d1^2a + 3d1^a * d2^a + d3^2a\n            // B = 2d3^2a + 3d3^a * d2^a + d2^2a\n\n            // [   0             1            0          0          ]\n            // [   -d2^2a /N     A/N          d1^2a /N   0          ]\n            // [   0             d3^2a /M     B/M        -d2^2a /M  ]\n            // [   0             0            1          0          ]\n\n            d3powA = Math.pow(d3, alpha);\n            d3pow2A = Math.pow(d3, 2 * alpha);\n            d2powA = Math.pow(d2, alpha);\n            d2pow2A = Math.pow(d2, 2 * alpha);\n            d1powA = Math.pow(d1, alpha);\n            d1pow2A = Math.pow(d1, 2 * alpha);\n\n            A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A;\n            B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A;\n            N = 3 * d1powA * (d1powA + d2powA);\n            if (N > 0) {\n                N = 1 / N;\n            }\n            M = 3 * d3powA * (d3powA + d2powA);\n            if (M > 0) {\n                M = 1 / M;\n            }\n\n            bp1 = {\n                screen_x: ((-d2pow2A * p0.screen_x + A * p1.screen_x + d1pow2A * p2.screen_x) * N),\n                screen_y: ((-d2pow2A * p0.screen_y + A * p1.screen_y + d1pow2A * p2.screen_y) * N)\n            };\n\n            bp2 = {\n                screen_x: (( d3pow2A * p1.screen_x + B * p2.screen_x - d2pow2A * p3.screen_x) * M),\n                screen_y: (( d3pow2A * p1.screen_y + B * p2.screen_y - d2pow2A * p3.screen_y) * M)\n            };\n\n            if (bp1.screen_x == 0 && bp1.screen_y == 0) {\n                bp1 = p1;\n            }\n            if (bp2.screen_x == 0 && bp2.screen_y == 0) {\n                bp2 = p2;\n            }\n            d.push( [ bp1.screen_x , bp1.screen_y ]);\n            d.push( [ bp2.screen_x , bp2.screen_y ]);\n            d.push( [ p2.screen_x  , p2.screen_y  ]);\n        }\n\n        return d;\n    }\n};\n\n/**\n * this generates the SVG path for a linear drawing between datapoints.\n * @param data\n * @returns {string}\n * @private\n */\nLine._linear = function (data) {\n    // linear\n    var d = [];\n    for (var i = 0; i < data.length; i++) {\n        d.push([ data[i].screen_x , data[i].screen_y ]);\n    }\n    return d;\n};\n\nmodule.exports = Line;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/graph2d_types/line.js","var util = require('../../util');\nvar DOMutil = require('../../DOMutil');\nvar Component = require('./Component');\n\n/**\n * Legend for Graph2d\n */\nfunction Legend(body, options, side, linegraphOptions) {\n  this.body = body;\n  this.defaultOptions = {\n    enabled: false,\n    icons: true,\n    iconSize: 20,\n    iconSpacing: 6,\n    left: {\n      visible: true,\n      position: 'top-left' // top/bottom - left,center,right\n    },\n    right: {\n      visible: true,\n      position: 'top-right' // top/bottom - left,center,right\n    }\n  }\n\n  this.side = side;\n  this.options = util.extend({},this.defaultOptions);\n  this.linegraphOptions = linegraphOptions;\n\n  this.svgElements = {};\n  this.dom = {};\n  this.groups = {};\n  this.amountOfGroups = 0;\n  this._create();\n  this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups};\n\n  this.setOptions(options);\n}\n\nLegend.prototype = new Component();\n\nLegend.prototype.clear = function() {\n  this.groups = {};\n  this.amountOfGroups = 0;\n};\n\nLegend.prototype.addGroup = function(label, graphOptions) {\n\n  // Include a group only if the group option 'excludeFromLegend: false' is not set.\n  if (graphOptions.options.excludeFromLegend != true) {\n    if (!this.groups.hasOwnProperty(label)) {\n      this.groups[label] = graphOptions;\n    }\n    this.amountOfGroups += 1;\n  }\n};\n\nLegend.prototype.updateGroup = function(label, graphOptions) {\n  this.groups[label] = graphOptions;\n};\n\nLegend.prototype.removeGroup = function(label) {\n  if (this.groups.hasOwnProperty(label)) {\n    delete this.groups[label];\n    this.amountOfGroups -= 1;\n  }\n};\n\nLegend.prototype._create = function() {\n  this.dom.frame = document.createElement('div');\n  this.dom.frame.className = 'vis-legend';\n  this.dom.frame.style.position = \"absolute\";\n  this.dom.frame.style.top = \"10px\";\n  this.dom.frame.style.display = \"block\";\n\n  this.dom.textArea = document.createElement('div');\n  this.dom.textArea.className = 'vis-legend-text';\n  this.dom.textArea.style.position = \"relative\";\n  this.dom.textArea.style.top = \"0px\";\n\n  this.svg = document.createElementNS('http://www.w3.org/2000/svg',\"svg\");\n  this.svg.style.position = 'absolute';\n  this.svg.style.top = 0 +'px';\n  this.svg.style.width = this.options.iconSize + 5 + 'px';\n  this.svg.style.height = '100%';\n\n  this.dom.frame.appendChild(this.svg);\n  this.dom.frame.appendChild(this.dom.textArea);\n};\n\n/**\n * Hide the component from the DOM\n */\nLegend.prototype.hide = function() {\n  // remove the frame containing the items\n  if (this.dom.frame.parentNode) {\n    this.dom.frame.parentNode.removeChild(this.dom.frame);\n  }\n};\n\n/**\n * Show the component in the DOM (when not already visible).\n * @return {Boolean} changed\n */\nLegend.prototype.show = function() {\n  // show frame containing the items\n  if (!this.dom.frame.parentNode) {\n    this.body.dom.center.appendChild(this.dom.frame);\n  }\n};\n\nLegend.prototype.setOptions = function(options) {\n  var fields = ['enabled','orientation','icons','left','right'];\n  util.selectiveDeepExtend(fields, this.options, options);\n};\n\nLegend.prototype.redraw = function() {\n  var activeGroups = 0;\n  var groupArray = Object.keys(this.groups);\n  groupArray.sort(function (a,b) {\n    return (a < b ? -1 : 1);\n  })\n\n  for (var i = 0; i < groupArray.length; i++) {\n    var groupId = groupArray[i];\n    if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) {\n      activeGroups++;\n    }\n  }\n\n  if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) {\n    this.hide();\n  }\n  else {\n    this.show();\n    if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') {\n      this.dom.frame.style.left = '4px';\n      this.dom.frame.style.textAlign = \"left\";\n      this.dom.textArea.style.textAlign = \"left\";\n      this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px';\n      this.dom.textArea.style.right = '';\n      this.svg.style.left = 0 +'px';\n      this.svg.style.right = '';\n    }\n    else {\n      this.dom.frame.style.right = '4px';\n      this.dom.frame.style.textAlign = \"right\";\n      this.dom.textArea.style.textAlign = \"right\";\n      this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px';\n      this.dom.textArea.style.left = '';\n      this.svg.style.right = 0 +'px';\n      this.svg.style.left = '';\n    }\n\n    if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') {\n      this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace(\"px\",\"\")) + 'px';\n      this.dom.frame.style.bottom = '';\n    }\n    else {\n      var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height;\n      this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace(\"px\",\"\")) + 'px';\n      this.dom.frame.style.top = '';\n    }\n\n    if (this.options.icons == false) {\n      this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px';\n      this.dom.textArea.style.right = '';\n      this.dom.textArea.style.left = '';\n      this.svg.style.width = '0px';\n    }\n    else {\n      this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px'\n      this.drawLegendIcons();\n    }\n\n    var content = '';\n    for (var i = 0; i < groupArray.length; i++) {\n      var groupId = groupArray[i];\n      if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) {\n        content += this.groups[groupId].content + '<br />';\n      }\n    }\n    this.dom.textArea.innerHTML = content;\n    this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px';\n  }\n};\n\nLegend.prototype.drawLegendIcons = function() {\n  if (this.dom.frame.parentNode) {\n    var groupArray = Object.keys(this.groups);\n    groupArray.sort(function (a,b) {\n      return (a < b ? -1 : 1);\n    });\n\n    // this resets the elements so the order is maintained\n    DOMutil.resetElements(this.svgElements);\n\n    var padding = window.getComputedStyle(this.dom.frame).paddingTop;\n    var iconOffset = Number(padding.replace('px',''));\n    var x = iconOffset;\n    var iconWidth = this.options.iconSize;\n    var iconHeight = 0.75 * this.options.iconSize;\n    var y = iconOffset + 0.5 * iconHeight + 3;\n\n    this.svg.style.width = iconWidth + 5 + iconOffset + 'px';\n\n    for (var i = 0; i < groupArray.length; i++) {\n      var groupId = groupArray[i];\n      if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) {\n        this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y);\n        y += iconHeight + this.options.iconSpacing;\n      }\n    }\n  }\n};\n\nmodule.exports = Legend;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/component/Legend.js","/**\n * This object contains all possible options. It will check if the types are correct, if required if the option is one\n * of the allowed values.\n *\n * __any__ means that the name of the property does not matter.\n * __type__ is a required field for all objects and contains the allowed types of all objects\n */\nlet string = 'string';\nlet bool = 'boolean';\nlet number = 'number';\nlet array = 'array';\nlet date = 'date';\nlet object = 'object'; // should only be in a __type__ property\nlet dom = 'dom';\nlet moment = 'moment';\nlet any = 'any';\n\n\nlet allOptions = {\n  configure: {\n    enabled: {'boolean': bool},\n    filter: {'boolean': bool,'function': 'function'},\n    container: {dom},\n    __type__: {object,'boolean': bool,'function': 'function'}\n  },\n\n  //globals :\n  yAxisOrientation: {string:['left','right']},\n  defaultGroup: {string},\n  sort: {'boolean': bool},\n  sampling: {'boolean': bool},\n  stack:{'boolean': bool},\n  graphHeight: {string, number},\n  shaded: {\n    enabled: {'boolean': bool},\n    orientation: {string:['bottom','top','zero','group']}, // top, bottom, zero, group\n    groupId: {object},\n    __type__: {'boolean': bool,object}\n  },\n  style: {string:['line','bar','points']}, // line, bar\n  barChart: {\n    width: {number},\n    minWidth: {number},\n    sideBySide: {'boolean': bool},\n    align: {string:['left','center','right']},\n    __type__: {object}\n  },\n  interpolation: {\n    enabled: {'boolean': bool},\n    parametrization: {string:['centripetal', 'chordal','uniform']}, // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5)\n    alpha: {number},\n    __type__: {object,'boolean': bool}\n  },\n  drawPoints: {\n    enabled: {'boolean': bool},\n    onRender: { 'function': 'function' },\n    size: {number},\n    style: {string:['square','circle']}, // square, circle\n    __type__: {object,'boolean': bool,'function': 'function'}\n  },\n  dataAxis: {\n    showMinorLabels: {'boolean': bool},\n    showMajorLabels: {'boolean': bool},\n    icons: {'boolean': bool},\n    width: {string, number},\n    visible: {'boolean': bool},\n    alignZeros: {'boolean': bool},\n    left:{\n      range: {min:{number},max:{number},__type__: {object}},\n      format: {'function': 'function'},\n      title: {text:{string,number},style:{string},__type__: {object}},\n      __type__: {object}\n    },\n    right:{\n      range: {min:{number},max:{number},__type__: {object}},\n      format: {'function': 'function'},\n      title: {text:{string,number},style:{string},__type__: {object}},\n      __type__: {object}\n    },\n    __type__: {object}\n  },\n  legend: {\n    enabled: {'boolean': bool},\n    icons: {'boolean': bool},\n    left: {\n      visible: {'boolean': bool},\n      position: {string:['top-right','bottom-right','top-left','bottom-left']},\n      __type__: {object}\n    },\n    right: {\n      visible: {'boolean': bool},\n      position: {string:['top-right','bottom-right','top-left','bottom-left']},\n      __type__: {object}\n    },\n    __type__: {object,'boolean': bool}\n  },\n  groups: {\n    visibility: {any},\n    __type__: {object}\n  },\n\n  autoResize: {'boolean': bool},\n  throttleRedraw: {number}, // TODO: DEPRICATED see https://github.com/almende/vis/issues/2511\n  clickToUse: {'boolean': bool},\n  end: {number, date, string, moment},\n  format: {\n    minorLabels: {\n      millisecond: {string,'undefined': 'undefined'},\n      second: {string,'undefined': 'undefined'},\n      minute: {string,'undefined': 'undefined'},\n      hour: {string,'undefined': 'undefined'},\n      weekday: {string,'undefined': 'undefined'},\n      day: {string,'undefined': 'undefined'},\n      month: {string,'undefined': 'undefined'},\n      year: {string,'undefined': 'undefined'},\n      __type__: {object}\n    },\n    majorLabels: {\n      millisecond: {string,'undefined': 'undefined'},\n      second: {string,'undefined': 'undefined'},\n      minute: {string,'undefined': 'undefined'},\n      hour: {string,'undefined': 'undefined'},\n      weekday: {string,'undefined': 'undefined'},\n      day: {string,'undefined': 'undefined'},\n      month: {string,'undefined': 'undefined'},\n      year: {string,'undefined': 'undefined'},\n      __type__: {object}\n    },\n    __type__: {object}\n  },\n  moment: {'function': 'function'},\n  height: {string, number},\n  hiddenDates: {\n    start: {date, number, string, moment},\n    end: {date, number, string, moment},\n    repeat: {string},\n    __type__: {object, array}\n  },\n  locale:{string},\n  locales:{\n    __any__: {any},\n    __type__: {object}\n  },\n  max: {date, number, string, moment},\n  maxHeight: {number, string},\n  maxMinorChars: {number},\n  min: {date, number, string, moment},\n  minHeight: {number, string},\n  moveable: {'boolean': bool},\n  multiselect: {'boolean': bool},\n  orientation: {string},\n  showCurrentTime: {'boolean': bool},\n  showMajorLabels: {'boolean': bool},\n  showMinorLabels: {'boolean': bool},\n  start: {date, number, string, moment},\n  timeAxis: {\n    scale: {string,'undefined': 'undefined'},\n    step: {number,'undefined': 'undefined'},\n    __type__: {object}\n  },\n  width: {string, number},\n  zoomable: {'boolean': bool},\n  zoomKey: {string: ['ctrlKey', 'altKey', 'metaKey', '']},\n  zoomMax: {number},\n  zoomMin: {number},\n  zIndex: {number},\n  __type__: {object}\n};\n\nlet configureOptions = {\n  global: {\n    //yAxisOrientation: ['left','right'], // TDOO: enable as soon as Grahp2d doesn't crash when changing this on the fly\n    sort: true,\n    sampling: true,\n    stack:false,\n    shaded: {\n      enabled: false,\n      orientation: ['zero','top','bottom','group'] // zero, top, bottom\n    },\n    style: ['line','bar','points'], // line, bar\n    barChart: {\n      width: [50,5,100,5],\n      minWidth: [50,5,100,5],\n      sideBySide: false,\n      align: ['left','center','right'] // left, center, right\n    },\n    interpolation: {\n      enabled: true,\n      parametrization: ['centripetal','chordal','uniform'] // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5)\n    },\n    drawPoints: {\n      enabled: true,\n      size: [6,2,30,1],\n      style: ['square', 'circle'] // square, circle\n    },\n    dataAxis: {\n      showMinorLabels: true,\n      showMajorLabels: true,\n      icons: false,\n      width: [40,0,200,1],\n      visible: true,\n      alignZeros: true,\n      left:{\n        //range: {min:'undefined': 'undefined'ined,max:'undefined': 'undefined'ined},\n        //format: function (value) {return value;},\n        title: {text:'',style:''}\n      },\n      right:{\n        //range: {min:'undefined': 'undefined'ined,max:'undefined': 'undefined'ined},\n        //format: function (value) {return value;},\n        title: {text:'',style:''}\n      }\n    },\n    legend: {\n      enabled: false,\n      icons: true,\n      left: {\n        visible: true,\n        position: ['top-right','bottom-right','top-left','bottom-left'] // top/bottom - left,right\n      },\n      right: {\n        visible: true,\n        position: ['top-right','bottom-right','top-left','bottom-left'] // top/bottom - left,right\n      }\n    },\n\n    autoResize: true,\n    clickToUse: false,\n    end: '',\n    format: {\n      minorLabels: {\n        millisecond:'SSS',\n        second:     's',\n        minute:     'HH:mm',\n        hour:       'HH:mm',\n        weekday:    'ddd D',\n        day:        'D',\n        month:      'MMM',\n        year:       'YYYY'\n      },\n      majorLabels: {\n        millisecond:'HH:mm:ss',\n        second:     'D MMMM HH:mm',\n        minute:     'ddd D MMMM',\n        hour:       'ddd D MMMM',\n        weekday:    'MMMM YYYY',\n        day:        'MMMM YYYY',\n        month:      'YYYY',\n        year:       ''\n      }\n    },\n\n    height: '',\n    locale: '',\n    max: '',\n    maxHeight: '',\n    maxMinorChars: [7, 0, 20, 1],\n    min: '',\n    minHeight: '',\n    moveable:true,\n    orientation: ['both', 'bottom', 'top'],\n    showCurrentTime: false,\n    showMajorLabels: true,\n    showMinorLabels: true,\n    start: '',\n    width: '100%',\n    zoomable: true,\n    zoomKey: ['ctrlKey', 'altKey', 'metaKey', ''],\n    zoomMax: [315360000000000, 10, 315360000000000, 1],\n    zoomMin: [10, 10, 315360000000000, 1],\n    zIndex: 0\n  }\n};\n\nexport {allOptions, configureOptions};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/timeline/optionsGraph2d.js","// utils\nexports.util = require('./lib/util');\nexports.DOMutil = require('./lib/DOMutil');\n\n// data\nexports.DataSet = require('./lib/DataSet');\nexports.DataView = require('./lib/DataView');\nexports.Queue = require('./lib/Queue');\n\n// Network\nexports.Network = require('./lib/network/Network');\nexports.network = {\n  Images: require('./lib/network/Images'),\n  dotparser: require('./lib/network/dotparser'),\n  gephiParser: require('./lib/network/gephiParser'),\n  allOptions: require('./lib/network/options')\n};\nexports.network.convertDot   = function (input) {return exports.network.dotparser.DOTToGraph(input)};\nexports.network.convertGephi = function (input,options) {return exports.network.gephiParser.parseGephi(input,options)};\n\n// bundled external libraries\nexports.moment = require('./lib/module/moment');\nexports.Hammer = require('./lib/module/hammer');\nexports.keycharm = require('keycharm');\n\n\n// WEBPACK FOOTER //\n// ./index-network.js","// Load custom shapes into CanvasRenderingContext2D\nrequire('./shapes');\n\nlet Emitter = require('emitter-component');\nlet util = require('../util');\nlet DataSet = require('../DataSet');\nlet DataView = require('../DataView');\nlet dotparser = require('./dotparser');\nlet gephiParser = require('./gephiParser');\nlet Activator = require('../shared/Activator');\nlet locales = require('./locales');\n\nimport  Images              from './Images';\nimport  Groups              from './modules/Groups';\nimport  NodesHandler        from './modules/NodesHandler';\nimport  EdgesHandler        from './modules/EdgesHandler';\nimport  PhysicsEngine       from './modules/PhysicsEngine';\nimport  ClusterEngine       from './modules/Clustering';\nimport  CanvasRenderer      from './modules/CanvasRenderer';\nimport  Canvas              from './modules/Canvas';\nimport  View                from './modules/View';\nimport  InteractionHandler  from './modules/InteractionHandler';\nimport  SelectionHandler    from \"./modules/SelectionHandler\";\nimport  LayoutEngine        from \"./modules/LayoutEngine\";\nimport  ManipulationSystem  from \"./modules/ManipulationSystem\";\nimport  Configurator        from \"./../shared/Configurator\";\nimport  Validator           from \"./../shared/Validator\";\nimport  {printStyle}        from \"./../shared/Validator\";\nimport  {allOptions, configureOptions} from './options.js';\nimport  KamadaKawai         from \"./modules/KamadaKawai.js\"\n\n\n/**\n * @constructor Network\n * Create a network visualization, displaying nodes and edges.\n *\n * @param {Element} container   The DOM element in which the Network will\n *                                  be created. Normally a div element.\n * @param {Object} data         An object containing parameters\n *                              {Array} nodes\n *                              {Array} edges\n * @param {Object} options      Options\n */\nfunction Network(container, data, options) {\n  if (!(this instanceof Network)) {\n    throw new SyntaxError('Constructor must be called with the new operator');\n  }\n\n  // set constant values\n  this.options = {};\n  this.defaultOptions = {\n    locale: 'en',\n    locales: locales,\n    clickToUse: false\n  };\n  util.extend(this.options, this.defaultOptions);\n\n  // containers for nodes and edges\n  this.body = {\n    container: container,\n    nodes: {},\n    nodeIndices: [],\n    edges: {},\n    edgeIndices: [],\n    emitter: {\n      on:   this.on.bind(this),\n      off:  this.off.bind(this),\n      emit: this.emit.bind(this),\n      once: this.once.bind(this)\n    },\n    eventListeners: {\n      onTap:        function() {},\n      onTouch:      function() {},\n      onDoubleTap:  function() {},\n      onHold:       function() {},\n      onDragStart:  function() {},\n      onDrag:       function() {},\n      onDragEnd:    function() {},\n      onMouseWheel: function() {},\n      onPinch:      function() {},\n      onMouseMove:  function() {},\n      onRelease:    function() {},\n      onContext:    function() {}\n    },\n    data: {\n      nodes: null,      // A DataSet or DataView\n      edges: null       // A DataSet or DataView\n    },\n    functions: {\n      createNode: function() {},\n      createEdge: function() {},\n      getPointer: function() {}\n    },\n    modules: {},\n    view: {\n      scale: 1,\n      translation: {x: 0, y: 0}\n    }\n  };\n\n\n\n  // bind the event listeners\n  this.bindEventListeners();\n\n  // setting up all modules\n  this.images              = new Images(() => this.body.emitter.emit(\"_requestRedraw\")); // object with images\n  this.groups              = new Groups(); // object with groups\n  this.canvas              = new Canvas(this.body);                         // DOM handler\n  this.selectionHandler    = new SelectionHandler(this.body, this.canvas);  // Selection handler\n  this.interactionHandler  = new InteractionHandler(this.body, this.canvas, this.selectionHandler);  // Interaction handler handles all the hammer bindings (that are bound by canvas), key\n  this.view                = new View(this.body, this.canvas);              // camera handler, does animations and zooms\n  this.renderer            = new CanvasRenderer(this.body, this.canvas);    // renderer, starts renderloop, has events that modules can hook into\n  this.physics             = new PhysicsEngine(this.body);                  // physics engine, does all the simulations\n  this.layoutEngine        = new LayoutEngine(this.body);                   // layout engine for inital layout and hierarchical layout\n  this.clustering          = new ClusterEngine(this.body);                  // clustering api\n  this.manipulation        = new ManipulationSystem(this.body, this.canvas, this.selectionHandler); // data manipulation system\n\n  this.nodesHandler        = new NodesHandler(this.body, this.images, this.groups, this.layoutEngine);   // Handle adding, deleting and updating of nodes as well as global options\n  this.edgesHandler        = new EdgesHandler(this.body, this.images, this.groups);   // Handle adding, deleting and updating of edges as well as global options\n\n  this.body.modules[\"kamadaKawai\"] = new KamadaKawai(this.body,150,0.05);   // Layouting algorithm.\n  this.body.modules[\"clustering\"] = this.clustering;\n\n  // create the DOM elements\n  this.canvas._create();\n\n  // apply options\n  this.setOptions(options);\n\n  // load data (the disable start variable will be the same as the enabled clustering)\n  this.setData(data);\n\n}\n\n// Extend Network with an Emitter mixin\nEmitter(Network.prototype);\n\n\n/**\n * Set options\n * @param {Object} options\n */\nNetwork.prototype.setOptions = function (options) {\n  if (options !== undefined) {\n    let errorFound = Validator.validate(options, allOptions);\n    if (errorFound === true) {\n      console.log('%cErrors have been found in the supplied options object.', printStyle);\n    }\n\n    // copy the global fields over\n    let fields = ['locale','locales','clickToUse'];\n    util.selectiveDeepExtend(fields,this.options, options);\n\n    // the hierarchical system can adapt the edges and the physics to it's own options because not all combinations work with the hierarichical system.\n    options = this.layoutEngine.setOptions(options.layout, options);\n\n    this.canvas.setOptions(options); // options for canvas are in globals\n\n    // pass the options to the modules\n    this.groups.setOptions(options.groups);\n    this.nodesHandler.setOptions(options.nodes);\n    this.edgesHandler.setOptions(options.edges);\n    this.physics.setOptions(options.physics);\n    this.manipulation.setOptions(options.manipulation, options, this.options); // manipulation uses the locales in the globals\n\n    this.interactionHandler.setOptions(options.interaction);\n    this.renderer.setOptions(options.interaction);            // options for rendering are in interaction\n    this.selectionHandler.setOptions(options.interaction);    // options for selection are in interaction\n\n    // reload the settings of the nodes to apply changes in groups that are not referenced by pointer.\n    if (options.groups !== undefined) {\n      this.body.emitter.emit(\"refreshNodes\");\n    }\n    // these two do not have options at the moment, here for completeness\n    //this.view.setOptions(options.view);\n    //this.clustering.setOptions(options.clustering);\n\n    if ('configure' in options) {\n      if (!this.configurator) {\n        this.configurator = new Configurator(this, this.body.container, configureOptions, this.canvas.pixelRatio);\n      }\n\n      this.configurator.setOptions(options.configure);\n    }\n\n    // if the configuration system is enabled, copy all options and put them into the config system\n    if (this.configurator && this.configurator.options.enabled === true) {\n      let networkOptions = {nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};\n      util.deepExtend(networkOptions.nodes,        this.nodesHandler.options);\n      util.deepExtend(networkOptions.edges,        this.edgesHandler.options);\n      util.deepExtend(networkOptions.layout,       this.layoutEngine.options);\n      // load the selectionHandler and render default options in to the interaction group\n      util.deepExtend(networkOptions.interaction,  this.selectionHandler.options);\n      util.deepExtend(networkOptions.interaction,  this.renderer.options);\n\n      util.deepExtend(networkOptions.interaction,  this.interactionHandler.options);\n      util.deepExtend(networkOptions.manipulation, this.manipulation.options);\n      util.deepExtend(networkOptions.physics,      this.physics.options);\n\n      // load globals into the global object\n      util.deepExtend(networkOptions.global,       this.canvas.options);\n      util.deepExtend(networkOptions.global,       this.options);\n\n      this.configurator.setModuleOptions(networkOptions);\n    }\n\n    // handle network global options\n    if (options.clickToUse !== undefined) {\n      if (options.clickToUse === true) {\n        if (this.activator === undefined) {\n          this.activator = new Activator(this.canvas.frame);\n          this.activator.on('change', () => {this.body.emitter.emit(\"activate\")});\n        }\n      }\n      else {\n        if (this.activator !== undefined) {\n          this.activator.destroy();\n          delete this.activator;\n        }\n        this.body.emitter.emit(\"activate\");\n      }\n    }\n    else {\n      this.body.emitter.emit(\"activate\");\n    }\n\n    this.canvas.setSize();\n    // start the physics simulation. Can be safely called multiple times.\n    this.body.emitter.emit(\"startSimulation\");\n  }\n};\n\n\n/**\n * Update the this.body.nodeIndices with the most recent node index list\n * @private\n */\nNetwork.prototype._updateVisibleIndices = function () {\n  let nodes = this.body.nodes;\n  let edges = this.body.edges;\n  this.body.nodeIndices = [];\n  this.body.edgeIndices = [];\n\n  for (let nodeId in nodes) {\n    if (nodes.hasOwnProperty(nodeId)) {\n      if (nodes[nodeId].options.hidden === false) {\n        this.body.nodeIndices.push(nodes[nodeId].id);\n      }\n    }\n  }\n\n  for (let edgeId in edges) {\n    if (edges.hasOwnProperty(edgeId)) {\n      if (edges[edgeId].options.hidden === false) {\n        this.body.edgeIndices.push(edges[edgeId].id);\n      }\n    }\n  }\n};\n\n\n/**\n * Bind all events\n */\nNetwork.prototype.bindEventListeners = function () {\n  // this event will trigger a rebuilding of the cache everything. Used when nodes or edges have been added or removed.\n  this.body.emitter.on(\"_dataChanged\", () => {\n    // update shortcut lists\n    this._updateVisibleIndices();\n    this.body.emitter.emit(\"_requestRedraw\");\n    // call the dataUpdated event because the only difference between the two is the updating of the indices\n    this.body.emitter.emit(\"_dataUpdated\");\n  });\n\n  // this is called when options of EXISTING nodes or edges have changed.\n  this.body.emitter.on(\"_dataUpdated\", () => {\n    // update values\n    this._updateValueRange(this.body.nodes);\n    this._updateValueRange(this.body.edges);\n    // start simulation (can be called safely, even if already running)\n    this.body.emitter.emit(\"startSimulation\");\n    this.body.emitter.emit(\"_requestRedraw\");\n  });\n};\n\n\n/**\n * Set nodes and edges, and optionally options as well.\n *\n * @param {Object} data              Object containing parameters:\n *                                   {Array | DataSet | DataView} [nodes] Array with nodes\n *                                   {Array | DataSet | DataView} [edges] Array with edges\n *                                   {String} [dot] String containing data in DOT format\n *                                   {String} [gephi] String containing data in gephi JSON format\n *                                   {Options} [options] Object with options\n */\nNetwork.prototype.setData = function (data) {\n  // reset the physics engine.\n  this.body.emitter.emit(\"resetPhysics\");\n  this.body.emitter.emit(\"_resetData\");\n\n  // unselect all to ensure no selections from old data are carried over.\n  this.selectionHandler.unselectAll();\n\n  if (data && data.dot && (data.nodes || data.edges)) {\n    throw new SyntaxError('Data must contain either parameter \"dot\" or ' +\n      ' parameter pair \"nodes\" and \"edges\", but not both.');\n  }\n\n  // set options\n  this.setOptions(data && data.options);\n  // set all data\n  if (data && data.dot) {\n    console.log('The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);');\n    // parse DOT file\n    var dotData = dotparser.DOTToGraph(data.dot);\n    this.setData(dotData);\n    return;\n  }\n  else if (data && data.gephi) {\n    // parse DOT file\n    console.log('The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);');\n    var gephiData = gephiParser.parseGephi(data.gephi);\n    this.setData(gephiData);\n    return;\n  }\n  else {\n    this.nodesHandler.setData(data && data.nodes, true);\n    this.edgesHandler.setData(data && data.edges, true);\n  }\n\n  // emit change in data\n  this.body.emitter.emit(\"_dataChanged\");\n\n  // emit data loaded\n  this.body.emitter.emit(\"_dataLoaded\");\n\n  // find a stable position or start animating to a stable position\n  this.body.emitter.emit(\"initPhysics\");\n};\n\n\n/**\n * Cleans up all bindings of the network, removing it fully from the memory IF the variable is set to null after calling this function.\n * var network = new vis.Network(..);\n * network.destroy();\n * network = null;\n */\nNetwork.prototype.destroy = function () {\n  this.body.emitter.emit(\"destroy\");\n  // clear events\n  this.body.emitter.off();\n  this.off();\n\n  // delete modules\n  delete this.groups;\n  delete this.canvas;\n  delete this.selectionHandler;\n  delete this.interactionHandler;\n  delete this.view;\n  delete this.renderer;\n  delete this.physics;\n  delete this.layoutEngine;\n  delete this.clustering;\n  delete this.manipulation;\n  delete this.nodesHandler;\n  delete this.edgesHandler;\n  delete this.configurator;\n  delete this.images;\n\n  for (var nodeId in this.body.nodes) {\n    delete this.body.nodes[nodeId];\n  }\n  for (var edgeId in this.body.edges) {\n    delete this.body.edges[edgeId];\n  }\n\n  // remove the container and everything inside it recursively\n  util.recursiveDOMDelete(this.body.container);\n};\n\n\n/**\n * Update the values of all object in the given array according to the current\n * value range of the objects in the array.\n * @param {Object} obj    An object containing a set of Edges or Nodes\n *                        The objects must have a method getValue() and\n *                        setValueRange(min, max).\n * @private\n */\nNetwork.prototype._updateValueRange = function (obj) {\n  var id;\n\n  // determine the range of the objects\n  var valueMin = undefined;\n  var valueMax = undefined;\n  var valueTotal = 0;\n  for (id in obj) {\n    if (obj.hasOwnProperty(id)) {\n      var value = obj[id].getValue();\n      if (value !== undefined) {\n        valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin);\n        valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax);\n        valueTotal += value;\n      }\n    }\n  }\n\n  // adjust the range of all objects\n  if (valueMin !== undefined && valueMax !== undefined) {\n    for (id in obj) {\n      if (obj.hasOwnProperty(id)) {\n        obj[id].setValueRange(valueMin, valueMax, valueTotal);\n      }\n    }\n  }\n};\n\n\n/**\n * Returns true when the Network is active.\n * @returns {boolean}\n */\nNetwork.prototype.isActive = function () {\n  return !this.activator || this.activator.active;\n};\n\n\nNetwork.prototype.setSize             = function() {return this.canvas.setSize.apply(this.canvas,arguments);};\nNetwork.prototype.canvasToDOM         = function() {return this.canvas.canvasToDOM.apply(this.canvas,arguments);};\nNetwork.prototype.DOMtoCanvas         = function() {return this.canvas.DOMtoCanvas.apply(this.canvas,arguments);};\nNetwork.prototype.findNode            = function() {return this.clustering.findNode.apply(this.clustering,arguments);};\nNetwork.prototype.isCluster           = function() {return this.clustering.isCluster.apply(this.clustering,arguments);};\nNetwork.prototype.openCluster         = function() {return this.clustering.openCluster.apply(this.clustering,arguments);};\nNetwork.prototype.cluster             = function() {return this.clustering.cluster.apply(this.clustering,arguments);};\nNetwork.prototype.getNodesInCluster   = function() {return this.clustering.getNodesInCluster.apply(this.clustering,arguments);};\nNetwork.prototype.clusterByConnection = function() {return this.clustering.clusterByConnection.apply(this.clustering,arguments);};\nNetwork.prototype.clusterByHubsize    = function() {return this.clustering.clusterByHubsize.apply(this.clustering,arguments);};\nNetwork.prototype.clusterOutliers     = function() {return this.clustering.clusterOutliers.apply(this.clustering,arguments);};\nNetwork.prototype.getSeed             = function() {return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments);};\nNetwork.prototype.enableEditMode      = function() {return this.manipulation.enableEditMode.apply(this.manipulation,arguments);};\nNetwork.prototype.disableEditMode     = function() {return this.manipulation.disableEditMode.apply(this.manipulation,arguments);};\nNetwork.prototype.addNodeMode         = function() {return this.manipulation.addNodeMode.apply(this.manipulation,arguments);};\nNetwork.prototype.editNode            = function() {return this.manipulation.editNode.apply(this.manipulation,arguments);};\nNetwork.prototype.editNodeMode        = function() {console.log(\"Deprecated: Please use editNode instead of editNodeMode.\"); return this.manipulation.editNode.apply(this.manipulation,arguments);};\nNetwork.prototype.addEdgeMode         = function() {return this.manipulation.addEdgeMode.apply(this.manipulation,arguments);};\nNetwork.prototype.editEdgeMode        = function() {return this.manipulation.editEdgeMode.apply(this.manipulation,arguments);};\nNetwork.prototype.deleteSelected      = function() {return this.manipulation.deleteSelected.apply(this.manipulation,arguments);};\nNetwork.prototype.getPositions        = function() {return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments);};\nNetwork.prototype.storePositions      = function() {return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments);};\nNetwork.prototype.moveNode            = function() {return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments);};\nNetwork.prototype.getBoundingBox      = function() {return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments);};\nNetwork.prototype.getConnectedNodes   = function(objectId) {\n  if (this.body.nodes[objectId] !== undefined) {\n    return this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments);\n  }\n  else {\n    return this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments);\n  }\n};\nNetwork.prototype.getConnectedEdges   = function() {return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments);};\nNetwork.prototype.startSimulation     = function() {return this.physics.startSimulation.apply(this.physics,arguments);};\nNetwork.prototype.stopSimulation      = function() {return this.physics.stopSimulation.apply(this.physics,arguments);};\nNetwork.prototype.stabilize           = function() {return this.physics.stabilize.apply(this.physics,arguments);};\nNetwork.prototype.getSelection        = function() {return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments);};\nNetwork.prototype.setSelection        = function() {return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments);};\nNetwork.prototype.getSelectedNodes    = function() {return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments);};\nNetwork.prototype.getSelectedEdges    = function() {return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments);};\nNetwork.prototype.getNodeAt           = function() {\n  var node = this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);\n  if (node !== undefined && node.id !== undefined) {\n    return node.id;\n  }\n  return node;\n};\nNetwork.prototype.getEdgeAt           = function() {\n    var edge = this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);\n    if (edge !== undefined && edge.id !== undefined) {\n      return edge.id;\n    }\n    return edge;\n  };\nNetwork.prototype.selectNodes         = function() {return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments);};\nNetwork.prototype.selectEdges         = function() {return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments);};\nNetwork.prototype.unselectAll         = function() {\n  this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments);\n  this.redraw();\n};\nNetwork.prototype.redraw              = function() {return this.renderer.redraw.apply(this.renderer,arguments);};\nNetwork.prototype.getScale            = function() {return this.view.getScale.apply(this.view,arguments);};\nNetwork.prototype.getViewPosition     = function() {return this.view.getViewPosition.apply(this.view,arguments);};\nNetwork.prototype.fit                 = function() {return this.view.fit.apply(this.view,arguments);};\nNetwork.prototype.moveTo              = function() {return this.view.moveTo.apply(this.view,arguments);};\nNetwork.prototype.focus               = function() {return this.view.focus.apply(this.view,arguments);};\nNetwork.prototype.releaseNode         = function() {return this.view.releaseNode.apply(this.view,arguments);};\nNetwork.prototype.getOptionsFromConfigurator = function() {\n  let options = {};\n  if (this.configurator) {\n    options = this.configurator.getOptions.apply(this.configurator);\n  }\n  return options;\n};\n\n\n\nmodule.exports = Network;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/Network.js","/**\n * @class Images\n * This class loads images and keeps them stored.\n */\nclass Images{\n    constructor(callback){\n        this.images = {};\n        this.imageBroken = {};\n        this.callback = callback;\n    }\n    \n    /**\n     * @param {string} url                      The Url to cache the image as \n      * @return {Image} imageToLoadBrokenUrlOn  The image object\n     */    \n    _addImageToCache (url, imageToCache) {\n        // IE11 fix -- thanks dponch!\n        if (imageToCache.width === 0) {\n            document.body.appendChild(imageToCache);\n            imageToCache.width = imageToCache.offsetWidth;\n            imageToCache.height = imageToCache.offsetHeight;\n            document.body.removeChild(imageToCache);\n        }\n    \n        this.images[url] = imageToCache;\n    }  \n    \n    /**\n     * @param {string} url                      The original Url that failed to load, if the broken image is successfully loaded it will be added to the cache using this Url as the key so that subsequent requests for this Url will return the broken image\n     * @param {string} brokenUrl                Url the broken image to try and load\n     * @return {Image} imageToLoadBrokenUrlOn   The image object\n     */    \n    _tryloadBrokenUrl (url, brokenUrl, imageToLoadBrokenUrlOn) {\n        //If any of the parameters aren't specified then exit the function because nothing constructive can be done\n        if (url === undefined || brokenUrl === undefined || imageToLoadBrokenUrlOn === undefined)  return;\n    \n        //Clear the old subscription to the error event and put a new in place that only handle errors in loading the brokenImageUrl\n        imageToLoadBrokenUrlOn.onerror = () => {\n            console.error(\"Could not load brokenImage:\", brokenUrl);\n            //Add an empty image to the cache so that when subsequent load calls are made for the url we don't try load the image and broken image again\n            this._addImageToCache(url, new Image());\n        };\n        \n        //Set the source of the image to the brokenUrl, this is actually what kicks off the loading of the broken image\n        imageToLoadBrokenUrlOn.src = brokenUrl;\n    }\n    \n    /**\n     * @return {Image} imageToRedrawWith The images that will be passed to the callback when it is invoked\n     */    \n    _redrawWithImage (imageToRedrawWith) {\n        if (this.callback) {\n            this.callback(imageToRedrawWith);\n        }\n    }\n    \n    /**\n     * @param {string} url          Url of the image\n     * @param {string} brokenUrl    Url of an image to use if the url image is not found\n     * @return {Image} img          The image object\n     */     \n    load (url, brokenUrl, id) {\n        //Try and get the image from the cache, if successful then return the cached image   \n        var cachedImage = this.images[url]; \n        if (cachedImage) return cachedImage;\n        \n        //Create a new image\n        var img = new Image();\n        \n        //Subscribe to the event that is raised if the image loads successfully \n        img.onload = () => {\n            //Add the image to the cache and then request a redraw\n            this._addImageToCache(url, img);\n            this._redrawWithImage(img);\n        };\n        \n        //Subscribe to the event that is raised if the image fails to load\n        img.onerror = () => {\n            console.error(\"Could not load image:\", url);\n            //Try and load the image specified by the brokenUrl using\n            this._tryloadBrokenUrl(url, brokenUrl, img);\n        }\n        \n        //Set the source of the image to the url, this is actuall what kicks off the loading of the image\n        img.src = url;\n        \n        //Return the new image\n        return img;\n    }          \n}\n\nexport default Images;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/Images.js","let util = require('../../util');\n\n/**\n * @class Groups\n * This class can store groups and options specific for groups.\n */\nclass Groups {\n  constructor() {\n    this.clear();\n    this.defaultIndex = 0;\n    this.groupsArray = [];\n    this.groupIndex = 0;\n\n    this.defaultGroups = [\n      {border: \"#2B7CE9\", background: \"#97C2FC\", highlight: {border: \"#2B7CE9\", background: \"#D2E5FF\"}, hover: {border: \"#2B7CE9\", background: \"#D2E5FF\"}}, // 0: blue\n      {border: \"#FFA500\", background: \"#FFFF00\", highlight: {border: \"#FFA500\", background: \"#FFFFA3\"}, hover: {border: \"#FFA500\", background: \"#FFFFA3\"}}, // 1: yellow\n      {border: \"#FA0A10\", background: \"#FB7E81\", highlight: {border: \"#FA0A10\", background: \"#FFAFB1\"}, hover: {border: \"#FA0A10\", background: \"#FFAFB1\"}}, // 2: red\n      {border: \"#41A906\", background: \"#7BE141\", highlight: {border: \"#41A906\", background: \"#A1EC76\"}, hover: {border: \"#41A906\", background: \"#A1EC76\"}}, // 3: green\n      {border: \"#E129F0\", background: \"#EB7DF4\", highlight: {border: \"#E129F0\", background: \"#F0B3F5\"}, hover: {border: \"#E129F0\", background: \"#F0B3F5\"}}, // 4: magenta\n      {border: \"#7C29F0\", background: \"#AD85E4\", highlight: {border: \"#7C29F0\", background: \"#D3BDF0\"}, hover: {border: \"#7C29F0\", background: \"#D3BDF0\"}}, // 5: purple\n      {border: \"#C37F00\", background: \"#FFA807\", highlight: {border: \"#C37F00\", background: \"#FFCA66\"}, hover: {border: \"#C37F00\", background: \"#FFCA66\"}}, // 6: orange\n      {border: \"#4220FB\", background: \"#6E6EFD\", highlight: {border: \"#4220FB\", background: \"#9B9BFD\"}, hover: {border: \"#4220FB\", background: \"#9B9BFD\"}}, // 7: darkblue\n      {border: \"#FD5A77\", background: \"#FFC0CB\", highlight: {border: \"#FD5A77\", background: \"#FFD1D9\"}, hover: {border: \"#FD5A77\", background: \"#FFD1D9\"}}, // 8: pink\n      {border: \"#4AD63A\", background: \"#C2FABC\", highlight: {border: \"#4AD63A\", background: \"#E6FFE3\"}, hover: {border: \"#4AD63A\", background: \"#E6FFE3\"}}, // 9: mint\n\n      {border: \"#990000\", background: \"#EE0000\", highlight: {border: \"#BB0000\", background: \"#FF3333\"}, hover: {border: \"#BB0000\", background: \"#FF3333\"}}, // 10:bright red\n\n      {border: \"#FF6000\", background: \"#FF6000\", highlight: {border: \"#FF6000\", background: \"#FF6000\"}, hover: {border: \"#FF6000\", background: \"#FF6000\"}}, // 12: real orange\n      {border: \"#97C2FC\", background: \"#2B7CE9\", highlight: {border: \"#D2E5FF\", background: \"#2B7CE9\"}, hover: {border: \"#D2E5FF\", background: \"#2B7CE9\"}}, // 13: blue\n      {border: \"#399605\", background: \"#255C03\", highlight: {border: \"#399605\", background: \"#255C03\"}, hover: {border: \"#399605\", background: \"#255C03\"}}, // 14: green\n      {border: \"#B70054\", background: \"#FF007E\", highlight: {border: \"#B70054\", background: \"#FF007E\"}, hover: {border: \"#B70054\", background: \"#FF007E\"}}, // 15: magenta\n      {border: \"#AD85E4\", background: \"#7C29F0\", highlight: {border: \"#D3BDF0\", background: \"#7C29F0\"}, hover: {border: \"#D3BDF0\", background: \"#7C29F0\"}}, // 16: purple\n      {border: \"#4557FA\", background: \"#000EA1\", highlight: {border: \"#6E6EFD\", background: \"#000EA1\"}, hover: {border: \"#6E6EFD\", background: \"#000EA1\"}}, // 17: darkblue\n      {border: \"#FFC0CB\", background: \"#FD5A77\", highlight: {border: \"#FFD1D9\", background: \"#FD5A77\"}, hover: {border: \"#FFD1D9\", background: \"#FD5A77\"}}, // 18: pink\n      {border: \"#C2FABC\", background: \"#74D66A\", highlight: {border: \"#E6FFE3\", background: \"#74D66A\"}, hover: {border: \"#E6FFE3\", background: \"#74D66A\"}}, // 19: mint\n\n      {border: \"#EE0000\", background: \"#990000\", highlight: {border: \"#FF3333\", background: \"#BB0000\"}, hover: {border: \"#FF3333\", background: \"#BB0000\"}} // 20:bright red\n    ];\n\n    this.options = {};\n    this.defaultOptions = {\n      useDefaultGroups: true\n    };\n    util.extend(this.options, this.defaultOptions);\n  }\n\n\n  setOptions(options) {\n    let optionFields = ['useDefaultGroups'];\n\n    if (options !== undefined) {\n      for (let groupName in options) {\n        if (options.hasOwnProperty(groupName)) {\n          if (optionFields.indexOf(groupName) === -1) {\n            let group = options[groupName];\n            this.add(groupName, group);\n          }\n        }\n      }\n    }\n  }\n\n  \n  /**\n   * Clear all groups\n   */\n  clear() {\n    this.groups = {};\n    this.groupsArray = [];\n  }\n  \n  /**\n   * get group options of a groupname. If groupname is not found, a new group\n   * is added.\n   * @param {*} groupname        Can be a number, string, Date, etc.\n   * @return {Object} group      The created group, containing all group options\n   */\n  get(groupname) {\n    let group = this.groups[groupname];\n    if (group === undefined) {\n      if (this.options.useDefaultGroups === false && this.groupsArray.length > 0) {\n        // create new group\n        let index = this.groupIndex % this.groupsArray.length;\n        this.groupIndex++;\n        group = {};\n        group.color = this.groups[this.groupsArray[index]];\n        this.groups[groupname] = group;\n      }\n      else {\n        // create new group\n        let index = this.defaultIndex % this.defaultGroups.length;\n        this.defaultIndex++;\n        group = {};\n        group.color = this.defaultGroups[index];\n        this.groups[groupname] = group;\n      }\n    }\n  \n    return group;\n  }\n  \n  /**\n   * Add a custom group style\n   * @param {String} groupName\n   * @param {Object} style       An object containing borderColor,\n   *                             backgroundColor, etc.\n   * @return {Object} group      The created group object\n   */\n  add(groupName, style) {\n    this.groups[groupName] = style;\n    this.groupsArray.push(groupName);\n    return style;\n  }\n}\n\nexport default Groups;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/Groups.js","let util = require(\"../../util\");\nlet DataSet = require('../../DataSet');\nlet DataView = require('../../DataView');\n\nimport Node  from \"./components/Node\";\nimport Label from \"./components/shared/Label\";\n\nclass NodesHandler {\n  constructor(body, images, groups, layoutEngine) {\n    this.body = body;\n    this.images = images;\n    this.groups = groups;\n    this.layoutEngine = layoutEngine;\n\n    // create the node API in the body container\n    this.body.functions.createNode = this.create.bind(this);\n\n    this.nodesListeners = {\n      add: (event, params) => { this.add(params.items); },\n      update: (event, params) => { this.update(params.items, params.data); },\n      remove: (event, params) => { this.remove(params.items); }\n    };\n\n    this.options = {};\n    this.defaultOptions = {\n      borderWidth: 1,\n      borderWidthSelected: 2,\n      brokenImage: undefined,\n      color: {\n        border: '#2B7CE9',\n        background: '#97C2FC',\n        highlight: {\n          border: '#2B7CE9',\n          background: '#D2E5FF'\n        },\n        hover: {\n          border: '#2B7CE9',\n          background: '#D2E5FF'\n        }\n      },\n      fixed: {\n        x: false,\n        y: false\n      },\n      font: {\n        color: '#343434',\n        size: 14, // px\n        face: 'arial',\n        background: 'none',\n        strokeWidth: 0, // px\n        strokeColor: '#ffffff',\n        align: 'center',\n        vadjust: 0,\n        multi: false,\n        bold: {\n          mod: 'bold'\n        },\n        boldital: {\n          mod: 'bold italic'\n        },\n        ital: {\n          mod: 'italic'\n        },\n        mono: {\n          mod: '',\n          size: 15, // px\n          face: 'courier new',\n          vadjust: 2\n        }\n      },\n      group: undefined,\n      hidden: false,\n      icon: {\n        face: 'FontAwesome',  //'FontAwesome',\n        code: undefined,  //'\\uf007',\n        size: 50,  //50,\n        color: '#2B7CE9'   //'#aa00ff'\n      },\n      image: undefined, // --> URL\n      label: undefined,\n      labelHighlightBold: true,\n      level: undefined,\n      margin: {\n        top: 5,\n        right: 5,\n        bottom: 5,\n        left: 5\n      },\n      mass: 1,\n      physics: true,\n      scaling: {\n        min: 10,\n        max: 30,\n        label: {\n          enabled: false,\n          min: 14,\n          max: 30,\n          maxVisible: 30,\n          drawThreshold: 5\n        },\n        customScalingFunction: function (min, max, total, value) {\n          if (max === min) {\n            return 0.5;\n          }\n          else {\n            let scale = 1 / (max - min);\n            return Math.max(0, (value - min) * scale);\n          }\n        }\n      },\n      shadow: {\n        enabled: false,\n        color: 'rgba(0,0,0,0.5)',\n        size: 10,\n        x: 5,\n        y: 5\n      },\n      shape: 'ellipse',\n      shapeProperties: {\n        borderDashes: false, // only for borders\n        borderRadius: 6,     // only for box shape\n        interpolation: true,  // only for image and circularImage shapes\n        useImageSize: false,  // only for image and circularImage shapes\n        useBorderWithImage: false  // only for image shape\n      },\n      size: 25,\n      title: undefined,\n      value: undefined,\n      x: undefined,\n      y: undefined\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    // refresh the nodes. Used when reverting from hierarchical layout\n    this.body.emitter.on('refreshNodes', this.refresh.bind(this));\n    this.body.emitter.on('refresh', this.refresh.bind(this));\n    this.body.emitter.on('destroy', () => {\n      util.forEach(this.nodesListeners, (callback, event) => {\n        if (this.body.data.nodes)\n          this.body.data.nodes.off(event, callback);\n      });\n      delete this.body.functions.createNode;\n      delete this.nodesListeners.add;\n      delete this.nodesListeners.update;\n      delete this.nodesListeners.remove;\n      delete this.nodesListeners;\n    });\n  }\n\n  setOptions(options) {\n    this.nodeOptions = options;\n    if (options !== undefined) {\n      Node.parseOptions(this.options, options);\n\n      // update the shape in all nodes\n      if (options.shape !== undefined) {\n        for (let nodeId in this.body.nodes) {\n          if (this.body.nodes.hasOwnProperty(nodeId)) {\n            this.body.nodes[nodeId].updateShape();\n          }\n        }\n      }\n\n      // update the font in all nodes\n      if (options.font !== undefined) {\n        Label.parseOptions(this.options.font, options);\n        for (let nodeId in this.body.nodes) {\n          if (this.body.nodes.hasOwnProperty(nodeId)) {\n            this.body.nodes[nodeId].updateLabelModule();\n            this.body.nodes[nodeId]._reset();\n          }\n        }\n      }\n\n      // update the shape size in all nodes\n      if (options.size !== undefined) {\n        for (let nodeId in this.body.nodes) {\n          if (this.body.nodes.hasOwnProperty(nodeId)) {\n            this.body.nodes[nodeId]._reset();\n          }\n        }\n      }\n\n      // update the state of the letiables if needed\n      if (options.hidden !== undefined || options.physics !== undefined) {\n        this.body.emitter.emit('_dataChanged');\n      }\n    }\n  }\n\n  /**\n   * Set a data set with nodes for the network\n   * @param {Array | DataSet | DataView} nodes         The data containing the nodes.\n   * @private\n   */\n  setData(nodes, doNotEmit = false) {\n    let oldNodesData = this.body.data.nodes;\n\n    if (nodes instanceof DataSet || nodes instanceof DataView) {\n      this.body.data.nodes = nodes;\n    }\n    else if (Array.isArray(nodes)) {\n      this.body.data.nodes = new DataSet();\n      this.body.data.nodes.add(nodes);\n    }\n    else if (!nodes) {\n      this.body.data.nodes = new DataSet();\n    }\n    else {\n      throw new TypeError('Array or DataSet expected');\n    }\n\n    if (oldNodesData) {\n      // unsubscribe from old dataset\n      util.forEach(this.nodesListeners, function (callback, event) {\n        oldNodesData.off(event, callback);\n      });\n    }\n\n    // remove drawn nodes\n    this.body.nodes = {};\n\n    if (this.body.data.nodes) {\n      // subscribe to new dataset\n      let me = this;\n      util.forEach(this.nodesListeners, function (callback, event) {\n        me.body.data.nodes.on(event, callback);\n      });\n\n      // draw all new nodes\n      let ids = this.body.data.nodes.getIds();\n      this.add(ids, true);\n    }\n\n    if (doNotEmit === false) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n  }\n\n\n  /**\n   * Add nodes\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  add(ids, doNotEmit = false) {\n    let id;\n    let newNodes = [];\n    for (let i = 0; i < ids.length; i++) {\n      id = ids[i];\n      let properties = this.body.data.nodes.get(id);\n      let node = this.create(properties);\n      newNodes.push(node);\n      this.body.nodes[id] = node; // note: this may replace an existing node\n    }\n\n    this.layoutEngine.positionInitially(newNodes);\n\n    if (doNotEmit === false) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n  }\n\n  /**\n   * Update existing nodes, or create them when not yet existing\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  update(ids, changedData) {\n    let nodes = this.body.nodes;\n    let dataChanged = false;\n    for (let i = 0; i < ids.length; i++) {\n      let id = ids[i];\n      let node = nodes[id];\n      let data = changedData[i];\n      if (node !== undefined) {\n        // update node\n        dataChanged = node.setOptions(data);\n      }\n      else {\n        dataChanged = true;\n        // create node\n        node = this.create(data);\n        nodes[id] = node;\n      }\n    }\n    if (dataChanged === true) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n    else {\n      this.body.emitter.emit(\"_dataUpdated\");\n    }\n  }\n\n  /**\n   * Remove existing nodes. If nodes do not exist, the method will just ignore it.\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  remove(ids) {\n    let nodes = this.body.nodes;\n\n    for (let i = 0; i < ids.length; i++) {\n      let id = ids[i];\n      delete nodes[id];\n    }\n\n    this.body.emitter.emit(\"_dataChanged\");\n  }\n\n\n  /**\n   * create a node\n   * @param properties\n   * @param constructorClass\n   */\n  create(properties, constructorClass = Node) {\n    return new constructorClass(properties, this.body, this.images, this.groups, this.options, this.defaultOptions, this.nodeOptions)\n  }\n\n\n  refresh(clearPositions = false) {\n    let nodes = this.body.nodes;\n    for (let nodeId in nodes) {\n      let node = undefined;\n      if (nodes.hasOwnProperty(nodeId)) {\n        node = nodes[nodeId];\n      }\n      let data = this.body.data.nodes._data[nodeId];\n      if (node !== undefined && data !== undefined) {\n        if (clearPositions === true) {\n          node.setOptions({x:null, y:null});\n        }\n        node.setOptions({ fixed: false });\n        node.setOptions(data);\n      }\n    }\n  }\n\n  /**\n   * Returns the positions of the nodes.\n   * @param ids  --> optional, can be array of nodeIds, can be string\n   * @returns {{}}\n   */\n  getPositions(ids) {\n    let dataArray = {};\n    if (ids !== undefined) {\n      if (Array.isArray(ids) === true) {\n        for (let i = 0; i < ids.length; i++) {\n          if (this.body.nodes[ids[i]] !== undefined) {\n            let node = this.body.nodes[ids[i]];\n            dataArray[ids[i]] = { x: Math.round(node.x), y: Math.round(node.y) };\n          }\n        }\n      }\n      else {\n        if (this.body.nodes[ids] !== undefined) {\n          let node = this.body.nodes[ids];\n          dataArray[ids] = { x: Math.round(node.x), y: Math.round(node.y) };\n        }\n      }\n    }\n    else {\n      for (let i = 0; i < this.body.nodeIndices.length; i++) {\n        let node = this.body.nodes[this.body.nodeIndices[i]];\n        dataArray[this.body.nodeIndices[i]] = { x: Math.round(node.x), y: Math.round(node.y) };\n      }\n    }\n    return dataArray;\n  }\n\n\n  /**\n   * Load the XY positions of the nodes into the dataset.\n   */\n  storePositions() {\n    // todo: add support for clusters and hierarchical.\n    let dataArray = [];\n    var dataset = this.body.data.nodes.getDataSet();\n\n    for (let nodeId in dataset._data) {\n      if (dataset._data.hasOwnProperty(nodeId)) {\n        let node = this.body.nodes[nodeId];\n        if (dataset._data[nodeId].x != Math.round(node.x) || dataset._data[nodeId].y != Math.round(node.y)) {\n          dataArray.push({ id: node.id, x: Math.round(node.x), y: Math.round(node.y) });\n        }\n      }\n    }\n    dataset.update(dataArray);\n  }\n\n  /**\n   * get the bounding box of a node.\n   * @param nodeId\n   * @returns {j|*}\n   */\n  getBoundingBox(nodeId) {\n    if (this.body.nodes[nodeId] !== undefined) {\n      return this.body.nodes[nodeId].shape.boundingBox;\n    }\n  }\n\n\n  /**\n   * Get the Ids of nodes connected to this node.\n   * @param nodeId\n   * @returns {Array}\n   */\n  getConnectedNodes(nodeId) {\n    let nodeList = [];\n    if (this.body.nodes[nodeId] !== undefined) {\n      let node = this.body.nodes[nodeId];\n      let nodeObj = {}; // used to quickly check if node already exists\n      for (let i = 0; i < node.edges.length; i++) {\n        let edge = node.edges[i];\n        if (edge.toId == node.id) { // these are double equals since ids can be numeric or string\n          if (nodeObj[edge.fromId] === undefined) {\n            nodeList.push(edge.fromId);\n            nodeObj[edge.fromId] = true;\n          }\n        }\n        else if (edge.fromId == node.id) { // these are double equals since ids can be numeric or string\n          if (nodeObj[edge.toId] === undefined) {\n            nodeList.push(edge.toId);\n            nodeObj[edge.toId] = true;\n          }\n        }\n      }\n    }\n    return nodeList;\n  }\n\n  /**\n   * Get the ids of the edges connected to this node.\n   * @param nodeId\n   * @returns {*}\n   */\n  getConnectedEdges(nodeId) {\n    let edgeList = [];\n    if (this.body.nodes[nodeId] !== undefined) {\n      let node = this.body.nodes[nodeId];\n      for (let i = 0; i < node.edges.length; i++) {\n        edgeList.push(node.edges[i].id)\n      }\n    }\n    else {\n      console.log(\"NodeId provided for getConnectedEdges does not exist. Provided: \", nodeId);\n    }\n    return edgeList;\n  }\n\n\n  /**\n   * Move a node.\n   * @param String nodeId\n   * @param Number x\n   * @param Number y\n   */\n  moveNode(nodeId, x, y) {\n    if (this.body.nodes[nodeId] !== undefined) {\n      this.body.nodes[nodeId].x = Number(x);\n      this.body.nodes[nodeId].y = Number(y);\n      setTimeout(() => {this.body.emitter.emit(\"startSimulation\")},0);\n    }\n    else {\n      console.log(\"Node id supplied to moveNode does not exist. Provided: \", nodeId);\n    }\n  }\n}\n\nexport default NodesHandler;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/NodesHandler.js","var util = require('../../../util');\n\nimport Label from './shared/Label'\n\nimport Box           from './nodes/shapes/Box'\nimport Circle        from './nodes/shapes/Circle'\nimport CircularImage from './nodes/shapes/CircularImage'\nimport Database      from './nodes/shapes/Database'\nimport Diamond       from './nodes/shapes/Diamond'\nimport Dot           from './nodes/shapes/Dot'\nimport Ellipse       from './nodes/shapes/Ellipse'\nimport Icon          from './nodes/shapes/Icon'\nimport Image         from './nodes/shapes/Image'\nimport Square        from './nodes/shapes/Square'\nimport Star          from './nodes/shapes/Star'\nimport Text          from './nodes/shapes/Text'\nimport Triangle      from './nodes/shapes/Triangle'\nimport TriangleDown  from './nodes/shapes/TriangleDown'\nimport  Validator    from \"../../../shared/Validator\";\nimport  {printStyle} from \"../../../shared/Validator\";\n\n\n/**\n * @class Node\n * A node. A node can be connected to other nodes via one or multiple edges.\n * @param {object} options An object containing options for the node. All\n *                            options are optional, except for the id.\n *                              {number} id     Id of the node. Required\n *                              {string} label  Text label for the node\n *                              {number} x      Horizontal position of the node\n *                              {number} y      Vertical position of the node\n *                              {string} shape  Node shape, available:\n *                                              \"database\", \"circle\", \"ellipse\",\n *                                              \"box\", \"image\", \"text\", \"dot\",\n *                                              \"star\", \"triangle\", \"triangleDown\",\n *                                              \"square\", \"icon\"\n *                              {string} image  An image url\n *                              {string} title  An title text, can be HTML\n *                              {anytype} group A group name or number\n * @param {Network.Images} imagelist    A list with images. Only needed\n *                                            when the node has an image\n * @param {Network.Groups} grouplist    A list with groups. Needed for\n *                                            retrieving group options\n * @param {Object}               constants    An object with default values for\n *                                            example for the color\n *\n */\nclass Node {\n  constructor(options, body, imagelist, grouplist, globalOptions, defaultOptions, nodeOptions) {\n    this.options = util.bridgeObject(globalOptions);\n    this.globalOptions = globalOptions;\n    this.defaultOptions = defaultOptions;\n    this.nodeOptions = nodeOptions;\n    this.body = body;\n\n    this.edges = []; // all edges connected to this node\n\n    // set defaults for the options\n    this.id = undefined;\n    this.imagelist = imagelist;\n    this.grouplist = grouplist;\n\n    // state options\n    this.x = undefined;\n    this.y = undefined;\n    this.baseSize = this.options.size;\n    this.baseFontSize = this.options.font.size;\n    this.predefinedPosition = false; // used to check if initial fit should just take the range or approximate\n    this.selected = false;\n    this.hover = false;\n\n    this.labelModule = new Label(this.body, this.options, false /* Not edge label */);\n    this.setOptions(options);\n  }\n\n\n  /**\n   * Attach a edge to the node\n   * @param {Edge} edge\n   */\n  attachEdge(edge) {\n    if (this.edges.indexOf(edge) === -1) {\n      this.edges.push(edge);\n    }\n  }\n\n\n  /**\n   * Detach a edge from the node\n   * @param {Edge} edge\n   */\n  detachEdge(edge) {\n    var index = this.edges.indexOf(edge);\n    if (index != -1) {\n      this.edges.splice(index, 1);\n    }\n  }\n\n\n  /**\n   * Set or overwrite options for the node\n   * @param {Object} options an object with options\n   * @param {Object} constants  and object with default, global options\n   */\n  setOptions(options) {\n    let currentShape = this.options.shape;\n    if (!options) {\n      return;\n    }\n    // basic options\n    if (options.id !== undefined)    {this.id = options.id;}\n\n    if (this.id === undefined) {\n      throw \"Node must have an id\";\n    }\n\n\n    // set these options locally\n    // clear x and y positions\n    if (options.x !== undefined) {\n      if (options.x === null) {this.x = undefined; this.predefinedPosition = false;}\n      else                    {this.x = parseInt(options.x); this.predefinedPosition = true;}\n    }\n    if (options.y !== undefined) {\n      if (options.y === null) {this.y = undefined; this.predefinedPosition = false;}\n      else                    {this.y = parseInt(options.y); this.predefinedPosition = true;}\n    }\n    if (options.size !== undefined)  {this.baseSize = options.size;}\n    if (options.value !== undefined) {options.value = parseFloat(options.value);}\n\n    // copy group options\n    if (typeof options.group === 'number' || (typeof options.group === 'string' && options.group != '')) {\n      var groupObj = this.grouplist.get(options.group);\n      util.deepExtend(this.options, groupObj);\n      // the color object needs to be completely defined. Since groups can partially overwrite the colors, we parse it again, just in case.\n      this.options.color = util.parseColor(this.options.color);\n    }\n\n    // this transforms all shorthands into fully defined options\n    Node.parseOptions(this.options, options, true, this.globalOptions);\n\n    this.choosify(options);\n\n    // load the images\n    if (this.options.image !== undefined) {\n      if (this.imagelist) {\n        this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage, this.id);\n      }\n      else {\n        throw \"No imagelist provided\";\n      }\n    }\n\n    this.updateLabelModule(options);\n    this.updateShape(currentShape);\n    this.labelModule.propagateFonts(this.nodeOptions, options, this.defaultOptions);\n\n    if (options.hidden !== undefined || options.physics !== undefined) {\n      return true;\n    }\n    return false;\n  }\n\n\n  /**\n   * This process all possible shorthands in the new options and makes sure that the parentOptions are fully defined.\n   * Static so it can also be used by the handler.\n   * @param parentOptions\n   * @param newOptions\n   * @param allowDeletion\n   * @param globalOptions\n   */\n  static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}) {\n    var fields = [\n      'color',\n      'font',\n      'fixed',\n      'shadow'\n    ];\n    util.selectiveNotDeepExtend(fields, parentOptions, newOptions, allowDeletion);\n\n    // merge the shadow options into the parent.\n    util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions);\n\n    // individual shape newOptions\n    if (newOptions.color !== undefined && newOptions.color !== null) {\n      let parsedColor = util.parseColor(newOptions.color);\n      util.fillIfDefined(parentOptions.color, parsedColor);\n    }\n    else if (allowDeletion === true && newOptions.color === null) {\n      parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options\n    }\n\n    // handle the fixed options\n    if (newOptions.fixed !== undefined && newOptions.fixed !== null) {\n      if (typeof newOptions.fixed === 'boolean') {\n        parentOptions.fixed.x = newOptions.fixed;\n        parentOptions.fixed.y = newOptions.fixed;\n      }\n      else {\n        if (newOptions.fixed.x !== undefined && typeof newOptions.fixed.x === 'boolean') {\n          parentOptions.fixed.x = newOptions.fixed.x;\n        }\n        if (newOptions.fixed.y !== undefined && typeof newOptions.fixed.y === 'boolean') {\n          parentOptions.fixed.y = newOptions.fixed.y;\n        }\n      }\n    }\n\n    // handle the font options\n    if (newOptions.font !== undefined && newOptions.font !== null) {\n      Label.parseOptions(parentOptions.font, newOptions);\n    }\n    else if (allowDeletion === true && newOptions.font === null) {\n      parentOptions.font =  util.bridgeObject(globalOptions.font); // set the object back to the global options\n    }\n\n    // handle the scaling options, specifically the label part\n    if (newOptions.scaling !== undefined) {\n      util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling);\n    }\n  }\n\n  choosify(options) {\n    this.chooser = true;\n\n    let pile = [options, this.options, this.defaultOptions];\n\n    let chosen = util.topMost(pile, 'chosen');\n    if (typeof chosen === 'boolean') {\n      this.chooser = chosen;\n    } else if (typeof chosen === 'object') {\n      let chosenNode = util.topMost(pile, ['chosen', 'node']);\n      if ((typeof chosenNode === 'boolean') || (typeof chosenNode === 'function')) {\n        this.chooser = chosenNode;\n      }\n    }\n  }\n\n  getFormattingValues() {\n    let values = {\n      color: this.options.color.background,\n      borderWidth: this.options.borderWidth,\n      borderColor: this.options.color.border,\n      size: this.options.size,\n      borderDashes: this.options.shapeProperties.borderDashes,\n      borderRadius: this.options.shapeProperties.borderRadius,\n      shadow: this.options.shadow.enabled,\n      shadowColor: this.options.shadow.color,\n      shadowSize: this.options.shadow.size,\n      shadowX: this.options.shadow.x,\n      shadowY: this.options.shadow.y\n    };\n    if (this.selected || this.hover) {\n      if (this.chooser === true) {\n        if (this.selected) {\n          values.borderWidth *= 2;\n          values.color = this.options.color.highlight.background;\n          values.borderColor = this.options.color.highlight.border;\n          values.shadow = this.options.shadow.enabled;\n        } else if (this.hover) {\n          values.color = this.options.color.hover.background;\n          values.borderColor = this.options.color.hover.border;\n          values.shadow = this.options.shadow.enabled;\n        }\n      } else if (typeof this.chooser === 'function') {\n        this.chooser(values, this.options.id, this.selected, this.hover);\n        if (values.shadow === false) {\n          if ((values.shadowColor !== this.options.shadow.color) ||\n              (values.shadowSize !== this.options.shadow.size) ||\n              (values.shadowX !== this.options.shadow.x) ||\n              (values.shadowY !== this.options.shadow.y)) {\n            values.shadow = true;\n          }\n        }\n      }\n    } else {\n      values.shadow = this.options.shadow.enabled;\n    }\n    return values;\n  }\n\n\n  updateLabelModule(options) {\n    if (this.options.label === undefined || this.options.label === null) {\n      this.options.label = '';\n    }\n    this.labelModule.setOptions(this.options, true);\n    if (this.labelModule.baseSize !== undefined) {\n      this.baseFontSize = this.labelModule.baseSize;\n    }\n    this.labelModule.constrain(this.nodeOptions, options, this.defaultOptions);\n    this.labelModule.choosify(this.nodeOptions, options, this.defaultOptions);\n  }\n\n  updateShape(currentShape) {\n    if (currentShape === this.options.shape && this.shape) {\n      this.shape.setOptions(this.options, this.imageObj);\n    }\n    else {\n      // choose draw method depending on the shape\n      switch (this.options.shape) {\n        case 'box':\n          this.shape = new Box(this.options, this.body, this.labelModule);\n          break;\n        case 'circle':\n          this.shape = new Circle(this.options, this.body, this.labelModule);\n          break;\n        case 'circularImage':\n          this.shape = new CircularImage(this.options, this.body, this.labelModule, this.imageObj);\n          break;\n        case 'database':\n          this.shape = new Database(this.options, this.body, this.labelModule);\n          break;\n        case 'diamond':\n          this.shape = new Diamond(this.options, this.body, this.labelModule);\n          break;\n        case 'dot':\n          this.shape = new Dot(this.options, this.body, this.labelModule);\n          break;\n        case 'ellipse':\n          this.shape = new Ellipse(this.options, this.body, this.labelModule);\n          break;\n        case 'icon':\n          this.shape = new Icon(this.options, this.body, this.labelModule);\n          break;\n        case 'image':\n          this.shape = new Image(this.options, this.body, this.labelModule, this.imageObj);\n          break;\n        case 'square':\n          this.shape = new Square(this.options, this.body, this.labelModule);\n          break;\n        case 'star':\n          this.shape = new Star(this.options, this.body, this.labelModule);\n          break;\n        case 'text':\n          this.shape = new Text(this.options, this.body, this.labelModule);\n          break;\n        case 'triangle':\n          this.shape = new Triangle(this.options, this.body, this.labelModule);\n          break;\n        case 'triangleDown':\n          this.shape = new TriangleDown(this.options, this.body, this.labelModule);\n          break;\n        default:\n          this.shape = new Ellipse(this.options, this.body, this.labelModule);\n          break;\n      }\n    }\n    this._reset();\n  }\n\n\n  /**\n   * select this node\n   */\n  select() {\n    this.selected = true;\n    this._reset();\n  }\n\n\n  /**\n   * unselect this node\n   */\n  unselect() {\n    this.selected = false;\n    this._reset();\n  }\n\n\n\n  /**\n   * Reset the calculated size of the node, forces it to recalculate its size\n   * @private\n   */\n  _reset() {\n    this.shape.width = undefined;\n    this.shape.height = undefined;\n  }\n\n\n  /**\n   * get the title of this node.\n   * @return {string} title    The title of the node, or undefined when no title\n   *                           has been set.\n   */\n  getTitle() {\n    return this.options.title;\n  }\n\n\n  /**\n   * Calculate the distance to the border of the Node\n   * @param {CanvasRenderingContext2D}   ctx\n   * @param {Number} angle        Angle in radians\n   * @returns {number} distance   Distance to the border in pixels\n   */\n  distanceToBorder(ctx, angle) {\n    return this.shape.distanceToBorder(ctx,angle);\n  }\n\n\n  /**\n   * Check if this node has a fixed x and y position\n   * @return {boolean}      true if fixed, false if not\n   */\n  isFixed() {\n    return (this.options.fixed.x && this.options.fixed.y);\n  }\n\n\n  /**\n   * check if this node is selecte\n   * @return {boolean} selected   True if node is selected, else false\n   */\n  isSelected() {\n    return this.selected;\n  }\n\n\n  /**\n   * Retrieve the value of the node. Can be undefined\n   * @return {Number} value\n   */\n  getValue() {\n    return this.options.value;\n  }\n\n\n  /**\n   * Adjust the value range of the node. The node will adjust it's size\n   * based on its value.\n   * @param {Number} min\n   * @param {Number} max\n   */\n  setValueRange(min, max, total) {\n    if (this.options.value !== undefined) {\n      var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value);\n      var sizeDiff = this.options.scaling.max - this.options.scaling.min;\n      if (this.options.scaling.label.enabled === true) {\n        var fontDiff = this.options.scaling.label.max - this.options.scaling.label.min;\n        this.options.font.size = this.options.scaling.label.min + scale * fontDiff;\n      }\n      this.options.size = this.options.scaling.min + scale * sizeDiff;\n    }\n    else {\n      this.options.size = this.baseSize;\n      this.options.font.size = this.baseFontSize;\n    }\n\n    this.updateLabelModule();\n  }\n\n\n  /**\n   * Draw this node in the given canvas\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext(\"2d\");\n   * @param {CanvasRenderingContext2D}   ctx\n   */\n  draw(ctx) {\n    let values = this.getFormattingValues();\n    this.shape.draw(ctx, this.x, this.y, this.selected, this.hover, values);\n  }\n\n\n  /**\n   * Update the bounding box of the shape\n   */\n  updateBoundingBox(ctx) {\n    this.shape.updateBoundingBox(this.x,this.y,ctx);\n  }\n\n  /**\n   * Recalculate the size of this node in the given canvas\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext(\"2d\");\n   * @param {CanvasRenderingContext2D}   ctx\n   */\n  resize(ctx) {\n    let values = this.getFormattingValues();\n    this.shape.resize(ctx, this.selected, this.hover, values);\n  }\n\n\n  /**\n   * Check if this object is overlapping with the provided object\n   * @param {Object} obj   an object with parameters left, top, right, bottom\n   * @return {boolean}     True if location is located on node\n   */\n  isOverlappingWith(obj) {\n    return (\n      this.shape.left < obj.right &&\n      this.shape.left + this.shape.width > obj.left &&\n      this.shape.top < obj.bottom &&\n      this.shape.top + this.shape.height > obj.top\n    );\n  }\n\n  /**\n   * Check if this object is overlapping with the provided object\n   * @param {Object} obj   an object with parameters left, top, right, bottom\n   * @return {boolean}     True if location is located on node\n   */\n  isBoundingBoxOverlappingWith(obj) {\n    return (\n      this.shape.boundingBox.left < obj.right &&\n      this.shape.boundingBox.right > obj.left &&\n      this.shape.boundingBox.top < obj.bottom &&\n      this.shape.boundingBox.bottom > obj.top\n    );\n  }\n}\n\nexport default Node;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/Node.js","let util = require('../../../../util');\n\nclass Label {\n  constructor(body, options, edgelabel = false) {\n    this.body = body;\n\n    this.pointToSelf = false;\n    this.baseSize = undefined;\n    this.fontOptions = {};\n    this.setOptions(options);\n    this.size = {top: 0, left: 0, width: 0, height: 0, yLine: 0}; // could be cached\n    this.isEdgeLabel = edgelabel;\n  }\n\n  setOptions(options, allowDeletion = false) {\n    this.elementOptions = options;\n\n    // We want to keep the font options seperated from the node options.\n    // The node options have to mirror the globals when they are not overruled.\n    this.fontOptions = util.deepExtend({},options.font, true);\n\n    if (options.label !== undefined) {\n      this.labelDirty = true;\n    }\n\n    if (options.font !== undefined) {\n      Label.parseOptions(this.fontOptions, options, allowDeletion);\n      if (typeof options.font === 'string') {\n        this.baseSize = this.fontOptions.size;\n      }\n      else if (typeof options.font === 'object') {\n        if (options.font.size !== undefined) {\n          this.baseSize = options.font.size;\n        }\n      }\n    }\n  }\n\n  static parseOptions(parentOptions, newOptions, allowDeletion = false) {\n    if (typeof newOptions.font === 'string') {\n      let newOptionsArray = newOptions.font.split(\" \");\n      parentOptions.size    = newOptionsArray[0].replace(\"px\",'');\n      parentOptions.face    = newOptionsArray[1];\n      parentOptions.color   = newOptionsArray[2];\n      parentOptions.vadjust = 0;\n    }\n    else if (typeof newOptions.font === 'object') {\n      util.fillIfDefined(parentOptions, newOptions.font, allowDeletion);\n    }\n    parentOptions.size    = Number(parentOptions.size);\n    parentOptions.vadjust = Number(parentOptions.vadjust);\n  }\n\n  // set the width and height constraints based on 'nearest' value\n  constrain(elementOptions, options, defaultOptions) {\n    this.fontOptions.constrainWidth = false;\n    this.fontOptions.maxWdt = -1;\n    this.fontOptions.minWdt = -1;\n\n    let pile = [options, elementOptions, defaultOptions];\n\n    let widthConstraint = util.topMost(pile, 'widthConstraint');\n    if (typeof widthConstraint === 'number') {\n      this.fontOptions.maxWdt = Number(widthConstraint);\n      this.fontOptions.minWdt = Number(widthConstraint);\n    } else if (typeof widthConstraint === 'object') {\n      let widthConstraintMaximum = util.topMost(pile, ['widthConstraint', 'maximum']);\n      if (typeof widthConstraintMaximum === 'number') {\n        this.fontOptions.maxWdt = Number(widthConstraintMaximum);\n      }\n      let widthConstraintMinimum = util.topMost(pile, ['widthConstraint', 'minimum'])\n      if (typeof widthConstraintMinimum === 'number') {\n        this.fontOptions.minWdt = Number(widthConstraintMinimum);\n      }\n    }\n\n    this.fontOptions.constrainHeight = false;\n    this.fontOptions.minHgt = -1;\n    this.fontOptions.valign = 'middle';\n\n    let heightConstraint = util.topMost(pile, 'heightConstraint');\n    if (typeof heightConstraint === 'number') {\n      this.fontOptions.minHgt = Number(heightConstraint);\n    } else if (typeof heightConstraint === 'object') {\n      let heightConstraintMinimum = util.topMost(pile, ['heightConstraint', 'minimum']);\n      if (typeof heightConstraintMinimum === 'number') {\n        this.fontOptions.minHgt = Number(heightConstraintMinimum);\n      }\n      let heightConstraintValign = util.topMost(pile, ['heightConstraint', 'valign']);\n      if (typeof heightConstraintValign === 'string') {\n        if ((heightConstraintValign === 'top')||(heightConstraintValign === 'bottom')) {\n            this.fontOptions.valign = heightConstraintValign;\n        }\n      }\n    }\n  }\n\n  // set the selected functions based on 'nearest' value\n  choosify(elementOptions, options, defaultOptions) {\n    this.fontOptions.chooser = true;\n\n    let pile = [options, elementOptions, defaultOptions];\n\n    let chosen = util.topMost(pile, 'chosen');\n    if (typeof chosen === 'boolean') {\n      this.fontOptions.chooser = chosen;\n    } else if (typeof chosen === 'object') {\n      let chosenLabel = util.topMost(pile, ['chosen', 'label']);\n      if ((typeof chosenLabel === 'boolean') || (typeof chosenLabel === 'function')) {\n        this.fontOptions.chooser = chosenLabel;\n      }\n    }\n  }\n\n  // When margins are set in an element, adjust sizes is called to remove them\n  // from the width/height constraints. This must be done prior to label sizing.\n  adjustSizes(margins) {\n    let widthBias =  (margins) ? (margins.right + margins.left) : 0;\n    if (this.fontOptions.constrainWidth) {\n      this.fontOptions.maxWdt -= widthBias;\n      this.fontOptions.minWdt -= widthBias;\n    }\n    let heightBias = (margins) ? (margins.top + margins.bottom)  : 0;\n    if (this.fontOptions.constrainHeight) {\n      this.fontOptions.minHgt -= heightBias;\n    }\n  }\n\n  propagateFonts(options, groupOptions, defaultOptions) {\n    if (this.fontOptions.multi) {\n      let mods = [ 'bold', 'ital', 'boldital', 'mono' ];\n      for (const mod of mods) {\n        let optionsFontMod;\n        if (options.font) {\n          optionsFontMod = options.font[mod];\n        }\n        if (typeof optionsFontMod === 'string') {\n          let modOptionsArray = optionsFontMod.split(\" \");\n          this.fontOptions[mod].size  = modOptionsArray[0].replace(\"px\",\"\");\n          this.fontOptions[mod].face  = modOptionsArray[1];\n          this.fontOptions[mod].color = modOptionsArray[2];\n          this.fontOptions[mod].vadjust = this.fontOptions.vadjust;\n          this.fontOptions[mod].mod = defaultOptions.font[mod].mod;\n        } else {\n          // We need to be crafty about loading the modded fonts. We want as\n          // much 'natural' versatility as we can get, so a simple global\n          // change propagates in an expected way, even if not stictly logical.\n\n          // face: We want to capture any direct settings and overrides, but\n          //       fall back to the base font if there aren't any. We make a\n          //       special exception for mono, since we probably don't want to\n          //       sync to a the base font face.\n          //\n          //   if the mod face is in the node's options, use it\n          //   else if the mod face is in the global options, use it\n          //   else if the face is in the global options, use it\n          //   else use the base font's face.\n          if (optionsFontMod && optionsFontMod.hasOwnProperty('face')) {\n            this.fontOptions[mod].face = optionsFontMod.face;\n          } else if (groupOptions.font && groupOptions.font[mod] &&\n                     groupOptions.font[mod].hasOwnProperty('face')) {\n            this.fontOptions[mod].face = groupOptions.font[mod].face;\n          } else if (mod === 'mono') {\n            this.fontOptions[mod].face = defaultOptions.font[mod].face;\n          } else if (groupOptions.font &&\n                     groupOptions.font.hasOwnProperty('face')) {\n            this.fontOptions[mod].face = groupOptions.font.face;\n          } else {\n            this.fontOptions[mod].face = this.fontOptions.face;\n          }\n\n          // color: this is handled just like the face.\n          if (optionsFontMod && optionsFontMod.hasOwnProperty('color')) {\n            this.fontOptions[mod].color = optionsFontMod.color;\n          } else if (groupOptions.font && groupOptions.font[mod] &&\n                     groupOptions.font[mod].hasOwnProperty('color')) {\n            this.fontOptions[mod].color = groupOptions.font[mod].color;\n          } else if (groupOptions.font &&\n                     groupOptions.font.hasOwnProperty('color')) {\n            this.fontOptions[mod].color = groupOptions.font.color;\n          } else {\n            this.fontOptions[mod].color = this.fontOptions.color;\n          }\n\n          // mod: this is handled just like the face, except we never grab the\n          // base font's mod. We know they're in the defaultOptions, and unless\n          // we've been steered away from them, we use the default.\n          if (optionsFontMod && optionsFontMod.hasOwnProperty('mod')) {\n            this.fontOptions[mod].mod = optionsFontMod.mod;\n          } else if (groupOptions.font && groupOptions.font[mod] &&\n                     groupOptions.font[mod].hasOwnProperty('mod')) {\n            this.fontOptions[mod].mod = groupOptions.font[mod].mod;\n          } else if (groupOptions.font &&\n                     groupOptions.font.hasOwnProperty('mod')) {\n            this.fontOptions[mod].mod = groupOptions.font.mod;\n          } else {\n            this.fontOptions[mod].mod = defaultOptions.font[mod].mod;\n          }\n\n          // size: It's important that we size up defaults similarly if we're\n          //       using default faces unless overriden. We want to preserve the\n          //       ratios closely - but if faces have changed, all bets are off.\n          //\n          //   if the mod size is in the node's options, use it\n          //   else if the mod size is in the global options, use it\n          //   else if the mod face is the same as the default and the base face\n          //     is the same as the default, scale the mod size using the same\n          //     ratio\n          //   else if the size is in the global options, use it\n          //   else use the base font's size.\n          if (optionsFontMod && optionsFontMod.hasOwnProperty('size')) {\n            this.fontOptions[mod].size = optionsFontMod.size;\n          } else if (groupOptions.font && groupOptions.font[mod] &&\n                     groupOptions.font[mod].hasOwnProperty('size')) {\n            this.fontOptions[mod].size = groupOptions.font[mod].size;\n          } else if ((this.fontOptions[mod].face === defaultOptions.font[mod].face) &&\n                     (this.fontOptions.face === defaultOptions.font.face)) {\n            let ratio = this.fontOptions.size / Number(defaultOptions.font.size);\n            this.fontOptions[mod].size = defaultOptions.font[mod].size * ratio;\n          } else if (groupOptions.font &&\n                     groupOptions.font.hasOwnProperty('size')) {\n            this.fontOptions[mod].size = groupOptions.font.size;\n          } else {\n            this.fontOptions[mod].size = this.fontOptions.size;\n          }\n\n          // vadjust: this is handled just like the size.\n          if (optionsFontMod && optionsFontMod.hasOwnProperty('vadjust')) {\n            this.fontOptions[mod].vadjust = optionsFontMod.vadjust;\n          } else if (groupOptions.font &&\n                     groupOptions.font[mod] && groupOptions.font[mod].hasOwnProperty('vadjust')) {\n            this.fontOptions[mod].vadjust = groupOptions.font[mod].vadjust;\n          } else if ((this.fontOptions[mod].face === defaultOptions.font[mod].face) &&\n                     (this.fontOptions.face === defaultOptions.font.face)) {\n            let ratio = this.fontOptions.size / Number(defaultOptions.font.size);\n            this.fontOptions[mod].vadjust = defaultOptions.font[mod].vadjust * Math.round(ratio);\n          } else if (groupOptions.font &&\n                     groupOptions.font.hasOwnProperty('vadjust')) {\n            this.fontOptions[mod].vadjust = groupOptions.font.vadjust;\n          } else {\n            this.fontOptions[mod].vadjust = this.fontOptions.vadjust;\n          }\n        }\n        this.fontOptions[mod].size    = Number(this.fontOptions[mod].size);\n        this.fontOptions[mod].vadjust = Number(this.fontOptions[mod].vadjust);\n      }\n    }\n  }\n\n\n  /**\n   * Main function. This is called from anything that wants to draw a label.\n   * @param ctx\n   * @param x\n   * @param y\n   * @param selected\n   * @param baseline\n   */\n  draw(ctx, x, y, selected, hover, baseline = 'middle') {\n    // if no label, return\n    if (this.elementOptions.label === undefined)\n      return;\n\n    // check if we have to render the label\n    let viewFontSize = this.fontOptions.size * this.body.view.scale;\n    if (this.elementOptions.label && viewFontSize < this.elementOptions.scaling.label.drawThreshold - 1)\n      return;\n\n    // update the size cache if required\n    this.calculateLabelSize(ctx, selected, hover, x, y, baseline);\n\n    // create the fontfill background\n    this._drawBackground(ctx);\n    // draw text\n    this._drawText(ctx, selected, hover, x, y, baseline);\n  }\n\n  /**\n   * Draws the label background\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _drawBackground(ctx) {\n    if (this.fontOptions.background !== undefined && this.fontOptions.background !== \"none\") {\n      ctx.fillStyle = this.fontOptions.background;\n\n      let lineMargin = 2;\n\n      if (this.isEdgeLabel) {\n        switch (this.fontOptions.align) {\n          case 'middle':\n            ctx.fillRect(-this.size.width * 0.5, -this.size.height * 0.5, this.size.width, this.size.height);\n            break;\n          case 'top':\n            ctx.fillRect(-this.size.width * 0.5, -(this.size.height + lineMargin), this.size.width, this.size.height);\n            break;\n          case 'bottom':\n            ctx.fillRect(-this.size.width * 0.5, lineMargin, this.size.width, this.size.height);\n            break;\n          default:\n            ctx.fillRect(this.size.left, this.size.top - 0.5*lineMargin, this.size.width, this.size.height);\n            break;\n        }\n      } else {\n        ctx.fillRect(this.size.left, this.size.top - 0.5*lineMargin, this.size.width, this.size.height);\n      }\n    }\n  }\n\n\n  /**\n   *\n   * @param ctx\n   * @param x\n   * @param baseline\n   * @private\n   */\n  _drawText(ctx, selected, hover, x, y, baseline = 'middle') {\n    let fontSize = this.fontOptions.size;\n    let viewFontSize = fontSize * this.body.view.scale;\n    // this ensures that there will not be HUGE letters on screen by setting an upper limit on the visible text size (regardless of zoomLevel)\n    if (viewFontSize >= this.elementOptions.scaling.label.maxVisible) {\n      fontSize = Number(this.elementOptions.scaling.label.maxVisible) / this.body.view.scale;\n    }\n\n    let yLine = this.size.yLine;\n    [x, yLine] = this._setAlignment(ctx, x, yLine, baseline);\n\n    ctx.textAlign = 'left'\n    x = x - this.size.width / 2; // Shift label 1/2-distance to the left\n    if ((this.fontOptions.valign) && (this.size.height > this.size.labelHeight)) {\n      if (this.fontOptions.valign === 'top') {\n        yLine -= (this.size.height - this.size.labelHeight) / 2;\n      }\n      if (this.fontOptions.valign === 'bottom') {\n        yLine += (this.size.height - this.size.labelHeight) / 2;\n      }\n    }\n\n    // draw the text\n    for (let i = 0; i < this.lineCount; i++) {\n      if (this.lines[i] && this.lines[i].blocks) {\n        let width = 0;\n        if (this.isEdgeLabel || this.fontOptions.align === 'center') {\n          width += (this.size.width - this.lines[i].width) / 2\n        } else if (this.fontOptions.align === 'right') {\n          width += (this.size.width - this.lines[i].width)\n        }\n        for (let j = 0; j < this.lines[i].blocks.length; j++) {\n          let block = this.lines[i].blocks[j];\n          ctx.font = block.font;\n          let [fontColor, strokeColor] = this._getColor(block.color, viewFontSize, block.strokeColor);\n          if (block.strokeWidth > 0) {\n            ctx.lineWidth = block.strokeWidth;\n            ctx.strokeStyle = strokeColor;\n            ctx.lineJoin = 'round';\n          }\n          ctx.fillStyle = fontColor;\n\n          if (block.strokeWidth > 0) {\n            ctx.strokeText(block.text, x + width, yLine + block.vadjust);\n          }\n          ctx.fillText(block.text, x + width, yLine + block.vadjust);\n          width += block.width;\n        }\n        yLine += this.lines[i].height;\n      }\n    }\n  }\n\n  _setAlignment(ctx, x, yLine, baseline) {\n    // check for label alignment (for edges)\n    // TODO: make alignment for nodes\n    if (this.isEdgeLabel && this.fontOptions.align !== 'horizontal' && this.pointToSelf === false) {\n      x = 0;\n      yLine = 0;\n\n      let lineMargin = 2;\n      if (this.fontOptions.align === 'top') {\n        ctx.textBaseline = 'alphabetic';\n        yLine -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers\n      }\n      else if (this.fontOptions.align === 'bottom') {\n        ctx.textBaseline = 'hanging';\n        yLine += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers\n      }\n      else {\n        ctx.textBaseline = 'middle';\n      }\n    }\n    else {\n      ctx.textBaseline = baseline;\n    }\n    return [x,yLine];\n  }\n\n  /**\n   * fade in when relative scale is between threshold and threshold - 1.\n   * If the relative scale would be smaller than threshold -1 the draw function would have returned before coming here.\n   *\n   * @param viewFontSize\n   * @returns {*[]}\n   * @private\n   */\n  _getColor(color, viewFontSize, initialStrokeColor) {\n    let fontColor = color || '#000000';\n    let strokeColor = initialStrokeColor || '#ffffff';\n    if (viewFontSize <= this.elementOptions.scaling.label.drawThreshold) {\n      let opacity = Math.max(0, Math.min(1, 1 - (this.elementOptions.scaling.label.drawThreshold - viewFontSize)));\n      fontColor = util.overrideOpacity(fontColor, opacity);\n      strokeColor = util.overrideOpacity(strokeColor, opacity);\n    }\n    return [fontColor, strokeColor];\n  }\n\n\n  /**\n   *\n   * @param ctx\n   * @param selected\n   * @returns {{width: number, height: number}}\n   */\n  getTextSize(ctx, selected = false, hover = false) {\n    this._processLabel(ctx, selected, hover);\n    return {\n      width: this.size.width,\n      height: this.size.height,\n      lineCount: this.lineCount\n    };\n  }\n\n\n  /**\n   *\n   * @param ctx\n   * @param selected\n   * @param x\n   * @param y\n   * @param baseline\n   */\n  calculateLabelSize(ctx, selected, hover, x = 0, y = 0, baseline = 'middle') {\n    if (this.labelDirty === true) {\n      this._processLabel(ctx, selected, hover);\n    }\n    this.size.left = x - this.size.width * 0.5;\n    this.size.top = y - this.size.height * 0.5;\n    this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.fontOptions.size;\n    if (baseline === \"hanging\") {\n      this.size.top += 0.5 * this.fontOptions.size;\n      this.size.top += 4;   // distance from node, required because we use hanging. Hanging has less difference between browsers\n      this.size.yLine += 4; // distance from node\n    }\n    this.labelDirty = false;\n  }\n\n  /**\n   * normalize the markup system\n   */\n  decodeMarkupSystem(markupSystem) {\n    let system = 'none';\n    if (markupSystem === 'markdown' || markupSystem === 'md') {\n      system = 'markdown';\n    } else if (markupSystem === true || markupSystem === 'html') {\n      system = 'html'\n    }\n    return system;\n  }\n\n  /**\n   * Explodes a piece of text into single-font blocks using a given markup\n   * @param text\n   * @param markupSystem\n   * @returns [{ text, mod }]\n   */\n  splitBlocks(text, markupSystem) {\n    let system = this.decodeMarkupSystem(markupSystem);\n    if (system === 'none') {\n      return [{\n        text: text,\n        mod: 'normal'\n      }]\n    } else if (system === 'markdown') {\n      return this.splitMarkdownBlocks(text);\n    } else if (system === 'html') {\n      return this.splitHtmlBlocks(text);\n    }\n  }\n\n  splitMarkdownBlocks(text) {\n    let blocks = [];\n    let s = {\n      bold: false,\n      ital: false,\n      mono: false,\n      beginable: true,\n      spacing: false,\n      position: 0,\n      buffer: \"\",\n      modStack: []\n    };\n    s.mod = function() {\n      return (this.modStack.length === 0) ? 'normal' : this.modStack[0];\n    }\n    s.modName = function() {\n      if (this.modStack.length === 0)\n        return 'normal';\n      else if (this.modStack[0] === 'mono')\n        return 'mono';\n      else {\n        if (s.bold && s.ital) {\n          return 'boldital';\n        } else if (s.bold) {\n          return 'bold';\n        } else if (s.ital) {\n          return 'ital';\n        }\n      }\n    }\n    s.emitBlock = function(override = false) {\n      if (this.spacing) {\n        this.add(\" \");\n        this.spacing = false;\n      }\n      if (this.buffer.length > 0) {\n        blocks.push({ text: this.buffer, mod: this.modName() });\n        this.buffer = \"\";\n      }\n    }\n    s.add = function(text) {\n      if (text === \" \") {\n        s.spacing = true;\n      }\n      if (s.spacing) {\n        this.buffer += \" \";\n        this.spacing = false;\n      }\n      if (text != \" \") {\n        this.buffer += text;\n      }\n    }\n    while (s.position < text.length) {\n      let ch = text.charAt(s.position);\n      if (/[ \\t]/.test(ch)) {\n        if (!s.mono) {\n          s.spacing = true;\n        } else {\n          s.add(ch);\n        }\n        s.beginable = true\n      } else if (/\\\\/.test(ch)) {\n        if (s.position < text.length+1) {\n          s.position++;\n          ch = text.charAt(s.position);\n          if (/ \\t/.test(ch)) {\n            s.spacing = true;\n          } else {\n            s.add(ch);\n            s.beginable = false;\n          }\n        }\n      } else if (!s.mono && !s.bold && (s.beginable || s.spacing) && /\\*/.test(ch)) {\n        s.emitBlock();\n        s.bold = true;\n        s.modStack.unshift(\"bold\");\n      } else if (!s.mono && !s.ital && (s.beginable || s.spacing) && /\\_/.test(ch)) {\n        s.emitBlock();\n        s.ital = true;\n        s.modStack.unshift(\"ital\");\n      } else if (!s.mono && (s.beginable || s.spacing) && /`/.test(ch)) {\n        s.emitBlock();\n        s.mono = true;\n        s.modStack.unshift(\"mono\");\n      } else if (!s.mono && (s.mod() === \"bold\") && /\\*/.test(ch)) {\n        if ((s.position === text.length-1) || /[.,_` \\t\\n]/.test(text.charAt(s.position+1))) {\n          s.emitBlock();\n          s.bold = false;\n          s.modStack.shift();\n        } else {\n          s.add(ch);\n        }\n      } else if (!s.mono && (s.mod() === \"ital\") && /\\_/.test(ch)) {\n        if ((s.position === text.length-1) || /[.,*` \\t\\n]/.test(text.charAt(s.position+1))) {\n          s.emitBlock();\n          s.ital = false;\n          s.modStack.shift();\n        } else {\n          s.add(ch);\n        }\n      } else if (s.mono && (s.mod() === \"mono\") && /`/.test(ch)) {\n        if ((s.position === text.length-1) || (/[.,*_ \\t\\n]/.test(text.charAt(s.position+1)))) {\n          s.emitBlock();\n          s.mono = false;\n          s.modStack.shift();\n        } else {\n          s.add(ch);\n        }\n      } else {\n        s.add(ch);\n        s.beginable = false;\n      }\n      s.position++\n    }\n    s.emitBlock();\n    return blocks;\n  }\n\n  splitHtmlBlocks(text) {\n    let blocks = [];\n    let s = {\n      bold: false,\n      ital: false,\n      mono: false,\n      spacing: false,\n      position: 0,\n      buffer: \"\",\n      modStack: []\n    };\n    s.mod = function() {\n      return (this.modStack.length === 0) ? 'normal' : this.modStack[0];\n    }\n    s.modName = function() {\n      if (this.modStack.length === 0)\n        return 'normal';\n      else if (this.modStack[0] === 'mono')\n        return 'mono';\n      else {\n        if (s.bold && s.ital) {\n          return 'boldital';\n        } else if (s.bold) {\n          return 'bold';\n        } else if (s.ital) {\n          return 'ital';\n        }\n      }\n    }\n    s.emitBlock = function(override = false) {\n      if (this.spacing) {\n        this.add(\" \");\n        this.spacing = false;\n      }\n      if (this.buffer.length > 0) {\n        blocks.push({ text: this.buffer, mod: this.modName() });\n        this.buffer = \"\";\n      }\n    }\n    s.add = function(text) {\n      if (text === \" \") {\n        s.spacing = true;\n      }\n      if (s.spacing) {\n        this.buffer += \" \";\n        this.spacing = false;\n      }\n      if (text != \" \") {\n        this.buffer += text;\n      }\n    }\n    while (s.position < text.length) {\n      let ch = text.charAt(s.position);\n      if (/[ \\t]/.test(ch)) {\n        if (!s.mono) {\n          s.spacing = true;\n        } else {\n          s.add(ch);\n        }\n      } else if (/</.test(ch)) {\n        if (!s.mono && !s.bold && /<b>/.test(text.substr(s.position,3))) {\n          s.emitBlock();\n          s.bold = true;\n          s.modStack.unshift(\"bold\");\n          s.position += 2;\n        } else if (!s.mono && !s.ital && /<i>/.test(text.substr(s.position,3))) {\n          s.emitBlock();\n          s.ital = true;\n          s.modStack.unshift(\"ital\");\n          s.position += 2;\n        } else if (!s.mono && /<code>/.test(text.substr(s.position,6))) {\n          s.emitBlock();\n          s.mono = true;\n          s.modStack.unshift(\"mono\");\n          s.position += 5;\n        } else if (!s.mono && (s.mod() === 'bold') && /<\\/b>/.test(text.substr(s.position,4))) {\n          s.emitBlock();\n          s.bold = false;\n          s.modStack.shift();\n          s.position += 3;\n        } else if (!s.mono && (s.mod() === 'ital') && /<\\/i>/.test(text.substr(s.position,4))) {\n          s.emitBlock();\n          s.ital = false;\n          s.modStack.shift();\n          s.position += 3;\n        } else if ((s.mod() === 'mono') && /<\\/code>/.test(text.substr(s.position,7))) {\n          s.emitBlock();\n          s.mono = false;\n          s.modStack.shift();\n          s.position += 6;\n        } else {\n          s.add(ch);\n        }\n      } else if (/&/.test(ch)) {\n        if (/&lt;/.test(text.substr(s.position,4))) {\n          s.add(\"<\");\n          s.position += 3;\n        } else if (/&amp;/.test(text.substr(s.position,5))) {\n          s.add(\"&\");\n          s.position += 4;\n        } else {\n          s.add(\"&\");\n        }\n      } else {\n        s.add(ch);\n      }\n      s.position++\n    }\n    s.emitBlock();\n    return blocks;\n  }\n\n  getFormattingValues(ctx, selected, hover, mod) {\n    let values = {\n      color: (mod === \"normal\") ? this.fontOptions.color : this.fontOptions[mod].color,\n      size: (mod === \"normal\") ? this.fontOptions.size : this.fontOptions[mod].size,\n      face: (mod === \"normal\") ? this.fontOptions.face : this.fontOptions[mod].face,\n      mod: (mod === \"normal\") ? \"\" : this.fontOptions[mod].mod,\n      vadjust: (mod === \"normal\") ? this.fontOptions.vadjust : this.fontOptions[mod].vadjust,\n      strokeWidth: this.fontOptions.strokeWidth,\n      strokeColor: this.fontOptions.strokeColor\n    };\n    if (mod === \"normal\") {\n      if (selected || hover) {\n        if ((this.fontOptions.chooser === true) && (this.elementOptions.labelHighlightBold)) {\n          values.mod = 'bold';\n        } else if (typeof this.fontOptions.chooser === 'function') {\n          this.fontOptions.chooser(ctx, values, this.elementOptions.id, selected, hover);\n        }\n      }\n    } else {\n      if ((selected || hover) && (typeof this.fontOptions.chooser === 'function')) {\n        this.fontOptions.chooser(ctx, values, this.elementOptions.id, selected, hover);\n      }\n    }\n    ctx.font = (values.mod + \" \" + values.size + \"px \" + values.face).replace(/\"/g, \"\");\n    values.font = ctx.font;\n    values.height = values.size;\n    return values;\n  }\n\n  differentState(selected, hover) {\n    return ((selected !== this.fontOptions.selectedState) && (hover !== this.fontOptions.hoverState));\n  }\n\n  /**\n   * This explodes the label string into lines and sets the width, height and number of lines.\n   * @param ctx\n   * @param selected\n   * @private\n   */\n  _processLabel(ctx, selected, hover) {\n    let width = 0;\n    let height = 0;\n    let nlLines = [];\n    let lines = [];\n    let k = 0;\n    lines.add = function(l, text, font, color, width, height, vadjust, mod, strokeWidth, strokeColor) {\n      if (this.length == l) {\n        this[l] = { width: 0, height: 0, blocks: [] };\n      }\n      this[l].blocks.push({ text, font, color, width, height, vadjust, mod, strokeWidth, strokeColor });\n    }\n    lines.accumulate = function(l, width, height) {\n      this[l].width += width;\n      this[l].height = height > this[l].height ? height : this[l].height;\n    }\n    lines.addAndAccumulate = function(l, text, font, color, width, height, vadjust, mod, strokeWidth, strokeColor) {\n      this.add(l, text, font, color, width, height, vadjust, mod, strokeWidth, strokeColor);\n      this.accumulate(l, width, height);\n    }\n    if (this.elementOptions.label !== undefined) {\n      let nlLines = String(this.elementOptions.label).split('\\n');\n      let lineCount = nlLines.length;\n      if (this.elementOptions.font.multi) {\n        for (let i = 0; i < lineCount; i++) {\n          let blocks = this.splitBlocks(nlLines[i], this.elementOptions.font.multi);\n          let lineWidth = 0;\n          let lineHeight = 0;\n          if (blocks) {\n            if (blocks.length == 0) {\n              let values = this.getFormattingValues(ctx, selected, hover, \"normal\");\n              lines.addAndAccumulate(k, \"\", values.font, values.color, 0, values.size, values.vadjust, \"normal\", values.strokeWidth, values.strokeColor);\n              height += lines[k].height;\n              k++;\n              continue;\n            }\n            for (let j = 0; j < blocks.length; j++) {\n              if (this.fontOptions.maxWdt > 0) {\n                let values = this.getFormattingValues(ctx, selected, hover, blocks[j].mod);\n                let words = blocks[j].text.split(\" \");\n                let atStart = true\n                let text = \"\";\n                let measure;\n                let lastMeasure;\n                let w = 0;\n                while (w < words.length) {\n                  let pre = atStart ? \"\" : \" \";\n                  lastMeasure = measure;\n                  measure = ctx.measureText(text + pre + words[w]);\n                  if (lineWidth + measure.width > this.fontOptions.maxWdt) {\n                    lineHeight = (values.height > lineHeight) ? values.height : lineHeight;\n                    lines.add(k, text, values.font, values.color, lastMeasure.width, values.height, values.vadjust, blocks[j].mod, values.strokeWidth, values.strokeColor);\n                    lines.accumulate(k, lastMeasure.width, lineHeight);\n                    text = \"\";\n                    atStart = true;\n                    lineWidth = 0;\n                    width = lines[k].width > width ? lines[k].width : width;\n                    height += lines[k].height;\n                    k++;\n                  } else {\n                    text = text + pre + words[w];\n                    if (w === words.length-1) {\n                      lineHeight = (values.height > lineHeight) ? values.height : lineHeight;\n                      lineWidth += measure.width;\n                      lines.add(k, text, values.font, values.color, measure.width, values.height, values.vadjust, blocks[j].mod, values.strokeWidth, values.strokeColor);\n                      lines.accumulate(k, measure.width, lineHeight);\n                      if (j === blocks.length-1) {\n                        width = lines[k].width > width ? lines[k].width : width;\n                        height += lines[k].height;\n                        k++;\n                      }\n                    }\n                    w++;\n                    atStart = false;\n                  }\n                }\n              } else {\n                let values = this.getFormattingValues(ctx, selected, hover, blocks[j].mod);\n                let measure = ctx.measureText(blocks[j].text);\n                lines.addAndAccumulate(k, blocks[j].text, values.font, values.color, measure.width, values.height, values.vadjust, blocks[j].mod, values.strokeWidth, values.strokeColor);\n                width = lines[k].width > width ? lines[k].width : width;\n                if (blocks.length-1 === j) {\n                  height += lines[k].height;\n                  k++;\n                }\n              }\n            }\n          }\n        }\n      } else {\n        for (let i = 0; i < lineCount; i++) {\n          let values = this.getFormattingValues(ctx, selected, hover, \"normal\");\n          if (this.fontOptions.maxWdt > 0) {\n            let words = nlLines[i].split(\" \");\n            let text = \"\";\n            let measure;\n            let lastMeasure;\n            let w = 0;\n            while (w < words.length) {\n              let pre = (text === \"\") ? \"\" : \" \";\n              lastMeasure = measure;\n              measure = ctx.measureText(text + pre + words[w]);\n              if (measure.width > this.fontOptions.maxWdt) {\n                lines.addAndAccumulate(k, text, values.font, values.color, lastMeasure.width, values.size, values.vadjust, \"normal\", values.strokeWidth, values.strokeColor)\n                width = lines[k].width > width ? lines[k].width : width;\n                height += lines[k].height;\n                text = \"\";\n                k++;\n              } else {\n                text = text + pre + words[w];\n                if (w === words.length-1) {\n                  lines.addAndAccumulate(k, text, values.font, values.color, measure.width, values.size, values.vadjust, \"normal\", values.strokeWidth, values.strokeColor)\n                  width = lines[k].width > width ? lines[k].width : width;\n                  height += lines[k].height;\n                  k++;\n                }\n                w++;\n              }\n            }\n          } else {\n            let text = nlLines[i];\n            let measure = ctx.measureText(text);\n            lines.addAndAccumulate(k, text, values.font, values.color, measure.width, values.size, values.vadjust, \"normal\", values.strokeWidth, values.strokeColor);\n            width = lines[k].width > width ? lines[k].width : width;\n            height += lines[k].height;\n            k++;\n          }\n        }\n      }\n    }\n    if ((this.fontOptions.minWdt > 0) && (width < this.fontOptions.minWdt)) {\n      width = this.fontOptions.minWdt;\n    }\n    this.size.labelHeight = height;\n    if ((this.fontOptions.minHgt > 0) && (height < this.fontOptions.minHgt)) {\n      height = this.fontOptions.minHgt;\n    }\n    this.lines = lines;\n    this.lineCount = lines.length;\n    this.size.width = width;\n    this.size.height = height;\n    this.selectedState = selected;\n    this.hoverState = hover;\n  }\n}\n\nexport default Label;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/shared/Label.js","\"use strict\";\n\nexports.__esModule = true;\n\nvar _isIterable2 = require(\"../core-js/is-iterable\");\n\nvar _isIterable3 = _interopRequireDefault(_isIterable2);\n\nvar _getIterator2 = require(\"../core-js/get-iterator\");\n\nvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if ((0, _isIterable3.default)(Object(arr))) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/slicedToArray.js\n// module id = 161\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/is-iterable\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/is-iterable.js\n// module id = 162\n// module chunks = 0","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.is-iterable');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/is-iterable.js\n// module id = 163\n// module chunks = 0","var classof   = require('./_classof')\n  , ITERATOR  = require('./_wks')('iterator')\n  , Iterators = require('./_iterators');\nmodule.exports = require('./_core').isIterable = function(it){\n  var O = Object(it);\n  return O[ITERATOR] !== undefined\n    || '@@iterator' in O\n    || Iterators.hasOwnProperty(classof(O));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/core.is-iterable.js\n// module id = 164\n// module chunks = 0","'use strict';\n\nimport NodeBase from '../util/NodeBase'\n\nclass Box extends NodeBase {\n  constructor (options, body, labelModule) {\n    super(options,body,labelModule);\n    this._setMargins(labelModule);\n  }\n\n  resize(ctx, selected = this.selected, hover = this.hover) {\n    if ((this.width === undefined) || this.labelModule.differentState(selected, hover)) {\n      this.textSize = this.labelModule.getTextSize(ctx, selected, hover);\n      this.width = this.textSize.width + this.margin.right + this.margin.left;\n      this.height = this.textSize.height + this.margin.top + this.margin.bottom;\n      this.radius = this.width / 2;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    ctx.strokeStyle = values.borderColor;\n    ctx.lineWidth = values.borderWidth;\n    ctx.lineWidth /= this.body.view.scale;\n    ctx.lineWidth = Math.min(this.width, ctx.lineWidth);\n\n    ctx.fillStyle = values.color;\n\n    ctx.roundRect(this.left, this.top, this.width, this.height, values.borderRadius);\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    // draw the background\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n    ctx.save();\n    // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n    if (values.borderWidth > 0) {\n      this.enableBorderDashes(ctx, values);\n      //draw the border\n      ctx.stroke();\n      //disable dashed border for other elements\n      this.disableBorderDashes(ctx, values);\n    }\n    ctx.restore();\n\n    this.updateBoundingBox(x, y, ctx, selected, hover);\n    this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,\n                               this.top + this.textSize.height / 2 + this.margin.top, selected, hover);\n  }\n\n  updateBoundingBox(x, y, ctx, selected, hover) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    let borderRadius = this.options.shapeProperties.borderRadius; // only effective for box\n    this.boundingBox.left = this.left - borderRadius;\n    this.boundingBox.top = this.top - borderRadius;\n    this.boundingBox.bottom = this.top + this.height + borderRadius;\n    this.boundingBox.right = this.left + this.width + borderRadius;\n  }\n\n  distanceToBorder(ctx, angle) {\n    this.resize(ctx);\n    let borderWidth = this.options.borderWidth;\n\n    return Math.min(\n        Math.abs((this.width) / 2 / Math.cos(angle)),\n        Math.abs((this.height)  / 2 / Math.sin(angle))) + borderWidth;\n  }\n}\n\nexport default Box;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Box.js","module.exports = { \"default\": require(\"core-js/library/fn/object/get-prototype-of\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/get-prototype-of.js\n// module id = 166\n// module chunks = 0","require('../../modules/es6.object.get-prototype-of');\nmodule.exports = require('../../modules/_core').Object.getPrototypeOf;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/object/get-prototype-of.js\n// module id = 167\n// module chunks = 0","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject        = require('./_to-object')\n  , $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function(){\n  return function getPrototypeOf(it){\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.object.get-prototype-of.js\n// module id = 168\n// module chunks = 0","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof2 = require(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && ((typeof call === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(call)) === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/possibleConstructorReturn.js\n// module id = 169\n// module chunks = 0","\"use strict\";\n\nexports.__esModule = true;\n\nvar _setPrototypeOf = require(\"../core-js/object/set-prototype-of\");\n\nvar _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);\n\nvar _create = require(\"../core-js/object/create\");\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _typeof2 = require(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(superClass)));\n  }\n\n  subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/inherits.js\n// module id = 170\n// module chunks = 0","module.exports = { \"default\": require(\"core-js/library/fn/object/set-prototype-of\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/set-prototype-of.js\n// module id = 171\n// module chunks = 0","require('../../modules/es6.object.set-prototype-of');\nmodule.exports = require('../../modules/_core').Object.setPrototypeOf;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/fn/object/set-prototype-of.js\n// module id = 172\n// module chunks = 0","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', {setPrototypeOf: require('./_set-proto').set});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/es6.object.set-prototype-of.js\n// module id = 173\n// module chunks = 0","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object')\n  , anObject = require('./_an-object');\nvar check = function(O, proto){\n  anObject(O);\n  if(!isObject(proto) && proto !== null)throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function(test, buggy, set){\n      try {\n        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch(e){ buggy = true; }\n      return function setPrototypeOf(O, proto){\n        check(O, proto);\n        if(buggy)O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/core-js/library/modules/_set-proto.js\n// module id = 174\n// module chunks = 0","class NodeBase {\n  constructor(options, body, labelModule) {\n    this.body = body;\n    this.labelModule = labelModule;\n    this.setOptions(options);\n    this.top = undefined;\n    this.left = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this.radius = undefined;\n    this.margin = undefined;\n    this.boundingBox = {top: 0, left: 0, right: 0, bottom: 0};\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n\n  _setMargins(labelModule) {\n    this.margin = {};\n    if (this.options.margin) {\n      if (typeof this.options.margin == 'object') {\n        this.margin.top = this.options.margin.top;\n        this.margin.right = this.options.margin.right;\n        this.margin.bottom = this.options.margin.bottom;\n        this.margin.left = this.options.margin.left;\n      } else {\n        this.margin.top = this.options.margin;\n        this.margin.right = this.options.margin;\n        this.margin.bottom = this.options.margin;\n        this.margin.left = this.options.margin;\n      }\n    }\n    labelModule.adjustSizes(this.margin)\n  }\n\n  _distanceToBorder(ctx,angle) {\n    var borderWidth = this.options.borderWidth;\n    this.resize(ctx);\n    return Math.min(\n        Math.abs(this.width / 2 / Math.cos(angle)),\n        Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth;\n  }\n\n  enableShadow(ctx, values) {\n    if (values.shadow) {\n      ctx.shadowColor = values.shadowColor;\n      ctx.shadowBlur = values.shadowSize;\n      ctx.shadowOffsetX = values.shadowX;\n      ctx.shadowOffsetY = values.shadowY;\n    }\n  }\n\n  disableShadow(ctx, values) {\n    if (values.shadow) {\n      ctx.shadowColor = 'rgba(0,0,0,0)';\n      ctx.shadowBlur = 0;\n      ctx.shadowOffsetX = 0;\n      ctx.shadowOffsetY = 0;\n    }\n  }\n\n  enableBorderDashes(ctx, values) {\n    if (values.borderDashes !== false) {\n      if (ctx.setLineDash !== undefined) {\n        let dashes = values.borderDashes;\n        if (dashes === true) {\n          dashes = [5,15]\n        }\n        ctx.setLineDash(dashes);\n      }\n      else {\n        console.warn(\"setLineDash is not supported in this browser. The dashed borders cannot be used.\");\n        this.options.shapeProperties.borderDashes = false;\n        values.borderDashes = false;\n      }\n    }\n  }\n\n  disableBorderDashes(ctx, values) {\n    if (values.borderDashes !== false) {\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash([0]);\n      }\n      else {\n        console.warn(\"setLineDash is not supported in this browser. The dashed borders cannot be used.\");\n        this.options.shapeProperties.borderDashes = false;\n        values.borderDashes = false;\n      }\n    }\n  }\n}\n\nexport default NodeBase;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/util/NodeBase.js","'use strict';\n\nimport CircleImageBase from '../util/CircleImageBase'\n\nclass Circle extends CircleImageBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n    this._setMargins(labelModule);\n  }\n\n  resize(ctx, selected = this.selected, hover = this.hover, values = { size: this.options.size}) {\n    if ((this.width === undefined) || (this.labelModule.differentState(selected, hover))) {\n      this.textSize = this.labelModule.getTextSize(ctx, selected, hover);\n      var diameter = Math.max(this.textSize.width + this.margin.right + this.margin.left,\n                              this.textSize.height + this.margin.top + this.margin.bottom);\n      this.options.size = diameter / 2;\n\n      this.width = diameter;\n      this.height = diameter;\n      this.radius = this.width / 2;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    this._drawRawCircle(ctx, x, y, selected, hover, values);\n\n    this.boundingBox.top = y - values.size;\n    this.boundingBox.left = x - values.size;\n    this.boundingBox.right = x + values.size;\n    this.boundingBox.bottom = y + values.size;\n\n    this.updateBoundingBox(x,y);\n    this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,\n                               this.top + this.textSize.height / 2 + this.margin.top, selected, hover);\n  }\n\n  updateBoundingBox(x,y) {\n    this.boundingBox.top = y - this.options.size;\n    this.boundingBox.left = x - this.options.size;\n    this.boundingBox.right = x + this.options.size;\n    this.boundingBox.bottom = y + this.options.size;\n  }\n\n  distanceToBorder(ctx, angle) {\n    this.resize(ctx);\n    return this.width * 0.5;\n  }\n}\n\nexport default Circle;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Circle.js","import NodeBase from '../util/NodeBase'\n\nclass CircleImageBase extends NodeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n    this.labelOffset = 0;\n    this.imageLoaded = false;\n  }\n\n  setOptions(options, imageObj) {\n    this.options = options;\n    if (imageObj) {\n      this.imageObj = imageObj;\n    }\n  }\n\n  /**\n   * This function resizes the image by the options size when the image has not yet loaded. If the image has loaded, we\n   * force the update of the size again.\n   *\n   * @private\n   */\n  _resizeImage() {\n    let force = false;\n    if (!this.imageObj.width || !this.imageObj.height) { // undefined or 0\n      this.imageLoaded = false;\n    }\n    else if (this.imageLoaded === false) {\n      this.imageLoaded = true;\n      force = true;\n    }\n\n    if (!this.width || !this.height || force === true) {  // undefined or 0\n      var width, height, ratio;\n      if (this.imageObj.width && this.imageObj.height) { // not undefined or 0\n        width = 0;\n        height = 0;\n      }\n      if (this.options.shapeProperties.useImageSize === false) {\n        if (this.imageObj.width > this.imageObj.height) {\n          ratio = this.imageObj.width / this.imageObj.height;\n          width = this.options.size * 2 * ratio || this.imageObj.width;\n          height = this.options.size * 2 || this.imageObj.height;\n        }\n        else {\n          if (this.imageObj.width && this.imageObj.height) { // not undefined or 0\n            ratio = this.imageObj.height / this.imageObj.width;\n          }\n          else {\n            ratio = 1;\n          }\n          width = this.options.size * 2;\n          height = this.options.size * 2 * ratio;\n        }\n      }\n      else {\n        // when not using the size property, we use the image size\n        width = this.imageObj.width;\n        height = this.imageObj.height;\n      }\n      this.width = width;\n      this.height = height;\n      this.radius = 0.5 * this.width;\n    }\n\n  }\n\n  _drawRawCircle(ctx, x, y, selected, hover, values) {\n    var borderWidth = values.borderWidth / this.body.view.scale;\n    ctx.lineWidth = Math.min(this.width, borderWidth);\n\n    ctx.strokeStyle = values.borderColor;\n    ctx.fillStyle = values.color;\n    ctx.circle(x, y, values.size);\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    // draw the background\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n    ctx.save();\n    // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n    if (borderWidth > 0) {\n      this.enableBorderDashes(ctx, values);\n      //draw the border\n      ctx.stroke();\n      //disable dashed border for other elements\n      this.disableBorderDashes(ctx, values);\n    }\n    ctx.restore();\n  }\n\n  _drawImageAtPosition(ctx, values) {\n    if (this.imageObj.width != 0) {\n      // draw the image\n      ctx.globalAlpha = 1.0;\n\n      // draw shadow if enabled\n      this.enableShadow(ctx, values);\n\n      let factor = (this.imageObj.width / this.width) / this.body.view.scale;\n      if (factor > 2 && this.options.shapeProperties.interpolation === true) {\n        let w = this.imageObj.width;\n        let h = this.imageObj.height;\n        var can2 = document.createElement('canvas');\n        can2.width = w;\n        can2.height = w;\n        var ctx2 = can2.getContext('2d');\n\n        factor *= 0.5;\n        w *= 0.5;\n        h *= 0.5;\n        ctx2.drawImage(this.imageObj, 0, 0, w, h);\n\n        let distance = 0;\n        let iterations = 1;\n        while (factor > 2 && iterations < 4) {\n          ctx2.drawImage(can2, distance, 0, w, h, distance+w, 0, w/2, h/2);\n          distance += w;\n          factor *= 0.5;\n          w *= 0.5;\n          h *= 0.5;\n          iterations += 1;\n        }\n        ctx.drawImage(can2, distance, 0, w, h, this.left, this.top, this.width, this.height);\n      }\n      else {\n        // draw image\n        ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height);\n      }\n\n\n      // disable shadows for other elements.\n      this.disableShadow(ctx, values);\n    }\n  }\n\n  _drawImageLabel(ctx, x, y, selected, hover) {\n    var yLabel;\n    var offset = 0;\n\n    if (this.height !== undefined) {\n      offset = this.height * 0.5;\n      var labelDimensions = this.labelModule.getTextSize(ctx, selected, hover);\n      if (labelDimensions.lineCount >= 1) {\n        offset += labelDimensions.height / 2;\n      }\n    }\n\n    yLabel = y + offset;\n\n    if (this.options.label) {\n      this.labelOffset = offset;\n    }\n    this.labelModule.draw(ctx, x, yLabel, selected, hover, 'hanging');\n  }\n}\n\nexport default CircleImageBase;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/util/CircleImageBase.js","'use strict';\n\n\nimport CircleImageBase from '../util/CircleImageBase'\n\nclass CircularImage extends CircleImageBase {\n  constructor (options, body, labelModule, imageObj) {\n    super(options, body, labelModule);\n    this.imageObj = imageObj;\n    this._swapToImageResizeWhenImageLoaded = true;\n  }\n\n  resize(ctx, selected = this.selected, hover = this.hover) {\n    if ((this.imageObj.src === undefined) ||\n        (this.imageObj.width === undefined) ||\n        (this.imageObj.height === undefined) ||\n        (this.labelModule.differentState(selected, hover))) {\n      var diameter = this.options.size * 2;\n      this.width = diameter;\n      this.height = diameter;\n      this._swapToImageResizeWhenImageLoaded = true;\n      this.radius = 0.5*this.width;\n    } else {\n      if (this._swapToImageResizeWhenImageLoaded) {\n        this.width = undefined;\n        this.height = undefined;\n        this._swapToImageResizeWhenImageLoaded = false;\n      }\n      this._resizeImage();\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize();\n\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    let size = Math.min(0.5*this.height, 0.5*this.width);\n\n    // draw the background circle. IMPORTANT: the stroke in this method is used by the clip method below.\n    this._drawRawCircle(ctx, x, y, selected, hover, values);\n\n    // now we draw in the circle, we save so we can revert the clip operation after drawing.\n    ctx.save();\n    // clip is used to use the stroke in drawRawCircle as an area that we can draw in.\n    ctx.clip();\n    // draw the image\n    this._drawImageAtPosition(ctx, values);\n    // restore so we can again draw on the full canvas\n    ctx.restore();\n\n    this._drawImageLabel(ctx, x, y, selected, hover);\n\n    this.updateBoundingBox(x,y);\n  }\n\n  updateBoundingBox(x,y) {\n    this.boundingBox.top = y - this.options.size;\n    this.boundingBox.left = x - this.options.size;\n    this.boundingBox.right = x + this.options.size;\n    this.boundingBox.bottom = y + this.options.size;\n    this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);\n    this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);\n    this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelOffset);\n  }\n\n\n  distanceToBorder(ctx, angle) {\n    this.resize(ctx);\n    return this.width * 0.5;\n  }\n}\n\nexport default CircularImage;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/CircularImage.js","'use strict';\n\nimport NodeBase from '../util/NodeBase'\n\nclass Database extends NodeBase {\n  constructor (options, body, labelModule) {\n    super(options, body, labelModule);\n    this._setMargins(labelModule);\n  }\n\n  resize(ctx, selected, hover) {\n    if ((this.width === undefined) || (this.labelModule.differentState(selected, hover))) {\n      this.textSize = this.labelModule.getTextSize(ctx, selected, hover);\n      var size = this.textSize.width + this.margin.right + this.margin.left;\n      this.width = size;\n      this.height = size;\n      this.radius = this.width / 2;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width / 2;\n    this.top  = y - this.height / 2;\n\n    var borderWidth = values.borderWidth / this.body.view.scale;\n    ctx.lineWidth = Math.min(this.width, borderWidth);\n\n    ctx.strokeStyle = values.borderColor;\n\n    ctx.fillStyle = values.color;\n    ctx.database(x - this.width / 2, y - this.height / 2, this.width, this.height);\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    // draw the background\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n    ctx.save();\n    // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n    if (borderWidth > 0) {\n      this.enableBorderDashes(ctx, values);\n      //draw the border\n      ctx.stroke();\n      //disable dashed border for other elements\n      this.disableBorderDashes(ctx, values);\n    }\n    ctx.restore();\n\n    this.updateBoundingBox(x, y, ctx, selected, hover);\n    this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,\n                               this.top + this.textSize.height / 2 + this.margin.top, selected, hover);\n  }\n\n  updateBoundingBox(x, y, ctx, selected, hover) {\n    this.resize(ctx, selected, hover);\n\n    this.left = x - this.width * 0.5;\n    this.top = y - this.height * 0.5;\n\n    this.boundingBox.left = this.left;\n    this.boundingBox.top = this.top;\n    this.boundingBox.bottom = this.top + this.height;\n    this.boundingBox.right = this.left + this.width;\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Database;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Database.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass Diamond extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize(ctx, values, selected = this.selected, hover = this.hover) {\n    this._resizeShape(selected, hover, values);\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'diamond', 4, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Diamond;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Diamond.js","import NodeBase from '../util/NodeBase'\n\nclass ShapeBase extends NodeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  _resizeShape(selected = this.selected, hover = this.hover, values = { size: this.options.size }) {\n    if ((this.width === undefined) || (this.labelModule.differentState(selected, hover))) {\n      var size = 2 * values.size;\n      this.width = size;\n      this.height = size;\n      this.radius = 0.5*this.width;\n    }\n  }\n\n  _drawShape(ctx, shape, sizeMultiplier, x, y, selected, hover, values) {\n    this._resizeShape(selected, hover, values);\n\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    var borderWidth = values.borderWidth / this.body.view.scale;\n    ctx.lineWidth = Math.min(this.width, borderWidth);\n\n    ctx.strokeStyle = values.borderColor;\n    ctx.fillStyle = values.color;\n    ctx[shape](x, y, values.size);\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    // draw the background\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n    ctx.save();\n    // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n    if (borderWidth > 0) {\n      this.enableBorderDashes(ctx, values);\n      //draw the border\n      ctx.stroke();\n      //disable dashed border for other elements\n      this.disableBorderDashes(ctx, values);\n    }\n    ctx.restore();\n\n    if (this.options.label !== undefined) {\n      let yLabel = y + 0.5 * this.height + 3; // the + 3 is to offset it a bit below the node.\n      this.labelModule.draw(ctx, x, yLabel, selected, hover, 'hanging');\n    }\n\n    this.updateBoundingBox(x,y);\n  }\n\n  updateBoundingBox(x,y) {\n    this.boundingBox.top = y - this.options.size;\n    this.boundingBox.left = x - this.options.size;\n    this.boundingBox.right = x + this.options.size;\n    this.boundingBox.bottom = y + this.options.size;\n\n    if (this.options.label !== undefined && this.labelModule.size.width > 0) {\n      this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);\n      this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);\n      this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelModule.size.height + 3);\n    }\n  }\n\n\n\n}\n\nexport default ShapeBase;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/util/ShapeBase.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass Dot extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize(ctx, values, selected = this.selected, hover = this.hover) {\n    this._resizeShape(selected, hover, values);\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'circle', 2, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    this.resize(ctx);\n    return this.options.size;\n  }\n}\n\nexport default Dot;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Dot.js","'use strict';\n\nimport NodeBase from '../util/NodeBase'\n\nclass Ellipse extends NodeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  resize(ctx, selected = this.selected, hover = this.hover) {\n    if ((this.width === undefined) || (this.labelModule.differentState(selected, hover))) {\n      var textSize = this.labelModule.getTextSize(ctx, selected, hover);\n\n      this.height = textSize.height * 2;\n      this.width = textSize.width + this.height;\n      this.radius = 0.5*this.width;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width * 0.5;\n    this.top = y - this.height * 0.5;\n\n    var borderWidth = values.borderWidth / this.body.view.scale;\n    ctx.lineWidth = Math.min(this.width, borderWidth);\n\n    ctx.strokeStyle = values.borderColor;\n\n    ctx.fillStyle = values.color;\n    ctx.ellipse(this.left, this.top, this.width, this.height);\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    // draw the background\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n    ctx.save();\n\n    // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n    if (borderWidth > 0) {\n      this.enableBorderDashes(ctx, values);\n      //draw the border\n      ctx.stroke();\n      //disable dashed border for other elements\n      this.disableBorderDashes(ctx, values);\n    }\n\n    ctx.restore();\n\n    this.updateBoundingBox(x, y, ctx, selected, hover);\n    this.labelModule.draw(ctx, x, y, selected, hover);\n  }\n\n  updateBoundingBox(x, y, ctx, selected, hover) {\n    this.resize(ctx, selected, hover); // just in case\n\n    this.left = x - this.width * 0.5;\n    this.top = y - this.height * 0.5;\n\n    this.boundingBox.left = this.left;\n    this.boundingBox.top = this.top;\n    this.boundingBox.bottom = this.top + this.height;\n    this.boundingBox.right = this.left + this.width;\n  }\n\n  distanceToBorder(ctx, angle) {\n    this.resize(ctx);\n    var a = this.width * 0.5;\n    var b = this.height * 0.5;\n    var w = (Math.sin(angle) * a);\n    var h = (Math.cos(angle) * b);\n    return a * b / Math.sqrt(w * w + h * h);\n  }\n}\n\nexport default Ellipse;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Ellipse.js","'use strict';\n\nimport NodeBase from '../util/NodeBase'\n\nclass Icon extends NodeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n    this._setMargins(labelModule);\n  }\n\n  resize(ctx, selected, hover) {\n    if ((this.width === undefined) || (this.labelModule.differentState(selected, hover))) {\n      this.iconSize = {\n        width: Number(this.options.icon.size),\n        height: Number(this.options.icon.size)\n      };\n      this.width = this.iconSize.width + this.margin.right + this.margin.left;\n      this.height = this.iconSize.height + this.margin.top + this.margin.bottom;\n      this.radius = 0.5*this.width;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.options.icon.size = this.options.icon.size || 50;\n\n    this.left = x - this.width / 2;\n    this.top  = y - this.height / 2;\n    this._icon(ctx, x, y, selected, hover, values);\n\n    if (this.options.label !== undefined) {\n      var iconTextSpacing = 5;\n      this.labelModule.draw(ctx, this.left + this.iconSize.width / 2 + this.margin.left,\n                                 y + this.height / 2 + iconTextSpacing, selected);\n    }\n\n    this.updateBoundingBox(x, y)\n  }\n\n  updateBoundingBox(x, y) {\n    this.boundingBox.top    = y - this.options.icon.size * 0.5;\n    this.boundingBox.left   = x - this.options.icon.size * 0.5;\n    this.boundingBox.right  = x + this.options.icon.size * 0.5;\n    this.boundingBox.bottom = y + this.options.icon.size * 0.5;\n\n    if (this.options.label !== undefined && this.labelModule.size.width > 0) {\n      var iconTextSpacing = 5;\n      this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);\n      this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);\n      this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelModule.size.height + iconTextSpacing);\n    }\n  }\n\n  _icon(ctx, x, y, selected, hover, values) {\n    let iconSize = Number(this.options.icon.size);\n\n    if (this.options.icon.code !== undefined) {\n      ctx.font = (selected ? \"bold \" : \"\") + iconSize + \"px \" + this.options.icon.face;\n\n      // draw icon\n      ctx.fillStyle = this.options.icon.color || \"black\";\n      ctx.textAlign = \"center\";\n      ctx.textBaseline = \"middle\";\n\n      // draw shadow if enabled\n      this.enableShadow(ctx, values);\n      ctx.fillText(this.options.icon.code, x, y);\n\n      // disable shadows for other elements.\n      this.disableShadow(ctx, values);\n    } else {\n      console.error('When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.')\n    }\n\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Icon;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Icon.js","'use strict';\n\nimport CircleImageBase from '../util/CircleImageBase'\n\nclass Image extends CircleImageBase {\n  constructor (options, body, labelModule, imageObj) {\n    super(options, body, labelModule);\n    this.imageObj = imageObj;\n  }\n\n  resize() {\n    this._resizeImage();\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize();\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    if (this.options.shapeProperties.useBorderWithImage === true) {\n      var neutralborderWidth = this.options.borderWidth;\n      var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth;\n      var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale;\n      ctx.lineWidth = Math.min(this.width, borderWidth);\n\n      ctx.beginPath();\n\n      // setup the line properties.\n      ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border;\n\n      // set a fillstyle\n      ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background;\n\n      // draw a rectangle to form the border around. This rectangle is filled so the opacity of a picture (in future vis releases?) can be used to tint the image\n      ctx.rect(this.left - 0.5 * ctx.lineWidth,\n        this.top - 0.5 * ctx.lineWidth,\n        this.width + ctx.lineWidth,\n        this.height + ctx.lineWidth);\n      ctx.fill();\n\n      //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.\n      ctx.save();\n      // if borders are zero width, they will be drawn with width 1 by default. This prevents that\n      if (borderWidth > 0) {\n        this.enableBorderDashes(ctx);\n        //draw the border\n        ctx.stroke();\n        //disable dashed border for other elements\n        this.disableBorderDashes(ctx);\n      }\n      ctx.restore();\n\n      ctx.closePath();\n    }\n\n    this._drawImageAtPosition(ctx, values);\n\n    this._drawImageLabel(ctx, x, y, selected, hover);\n\n    this.updateBoundingBox(x,y);\n  }\n\n  updateBoundingBox(x,y) {\n    this.resize();\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    this.boundingBox.top = this.top;\n    this.boundingBox.left = this.left;\n    this.boundingBox.right = this.left + this.width;\n    this.boundingBox.bottom = this.top + this.height;\n\n    if (this.options.label !== undefined && this.labelModule.size.width > 0) {\n      this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);\n      this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);\n      this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelOffset);\n    }\n  }\n\n  distanceToBorder(ctx, angle) {\n     return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Image;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Image.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass Square extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize() {\n    this._resizeShape();\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'square', 2, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Square;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Square.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass Star extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize(ctx, values, selected, hover) {\n    this._resizeShape(selected, hover, values);\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'star', 4, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Star;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Star.js","'use strict';\n\nimport NodeBase from '../util/NodeBase'\n\nclass Text extends NodeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n    this._setMargins(labelModule);\n  }\n\n  resize(ctx, selected, hover) {\n    if ((this.width === undefined) || this.labelModule.differentState(selected, hover)) {\n      this.textSize = this.labelModule.getTextSize(ctx, selected, hover);\n      this.width = this.textSize.width + this.margin.right + this.margin.left;\n      this.height = this.textSize.height + this.margin.top + this.margin.bottom;\n      this.radius = 0.5*this.width;\n    }\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this.resize(ctx, selected, hover);\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,\n                               this.top + this.textSize.height / 2 + this.margin.top, selected, hover);\n\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n\n    this.updateBoundingBox(x, y, ctx, selected, hover);\n  }\n\n  updateBoundingBox(x, y, ctx, selected, hover) {\n    this.resize(ctx, selected, hover);\n\n    this.left = x - this.width / 2;\n    this.top = y - this.height / 2;\n\n    this.boundingBox.top = this.top;\n    this.boundingBox.left = this.left;\n    this.boundingBox.right = this.left + this.width;\n    this.boundingBox.bottom = this.top + this.height;\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Text;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Text.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass Triangle extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize(ctx) {\n    this._resizeShape();\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'triangle', 3, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default Triangle;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/Triangle.js","'use strict';\n\nimport ShapeBase from '../util/ShapeBase'\n\nclass TriangleDown extends ShapeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule)\n  }\n\n  resize(ctx) {\n    this._resizeShape();\n  }\n\n  draw(ctx, x, y, selected, hover, values) {\n    this._drawShape(ctx, 'triangleDown', 3, x, y, selected, hover, values);\n  }\n\n  distanceToBorder(ctx, angle) {\n    return this._distanceToBorder(ctx,angle);\n  }\n}\n\nexport default TriangleDown;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/shapes/TriangleDown.js","var util = require(\"../../util\");\nvar DataSet = require('../../DataSet');\nvar DataView = require('../../DataView');\n\nimport Edge  from \"./components/Edge\"\nimport Label from \"./components/shared/Label\"\n\nclass EdgesHandler {\n  constructor(body, images, groups) {\n    this.body = body;\n    this.images = images;\n    this.groups = groups;\n\n    // create the edge API in the body container\n    this.body.functions.createEdge = this.create.bind(this);\n\n    this.edgesListeners = {\n      add:    (event, params) => {this.add(params.items);},\n      update: (event, params) => {this.update(params.items);},\n      remove: (event, params) => {this.remove(params.items);}\n    };\n\n    this.options = {};\n    this.defaultOptions = {\n      arrows: {\n        to:     {enabled: false, scaleFactor:1, type: 'arrow'}, // boolean / {arrowScaleFactor:1} / {enabled: false, arrowScaleFactor:1}\n        middle: {enabled: false, scaleFactor:1, type: 'arrow'},\n        from:   {enabled: false, scaleFactor:1, type: 'arrow'}\n      },\n      arrowStrikethrough: true,\n      color: {\n        color:'#848484',\n        highlight:'#848484',\n        hover: '#848484',\n        inherit: 'from',\n        opacity:1.0\n      },\n      dashes: false,\n      font: {\n        color: '#343434',\n        size: 14, // px\n        face: 'arial',\n        background: 'none',\n        strokeWidth: 2, // px\n        strokeColor: '#ffffff',\n        align:'horizontal',\n        multi: false,\n        vadjust: 0,\n        bold: {\n          mod: 'bold'\n        },\n        boldital: {\n          mod: 'bold italic'\n        },\n        ital: {\n          mod: 'italic'\n        },\n        mono: {\n          mod: '',\n          size: 15, // px\n          face: 'courier new',\n          vadjust: 2\n        }\n      },\n      hidden: false,\n      hoverWidth: 1.5,\n      label: undefined,\n      labelHighlightBold: true,\n      length: undefined,\n      physics: true,\n      scaling:{\n        min: 1,\n        max: 15,\n        label: {\n          enabled: true,\n          min: 14,\n          max: 30,\n          maxVisible: 30,\n          drawThreshold: 5\n        },\n        customScalingFunction: function (min,max,total,value) {\n          if (max === min) {\n            return 0.5;\n          }\n          else {\n            var scale = 1 / (max - min);\n            return Math.max(0,(value - min)*scale);\n          }\n        }\n      },\n      selectionWidth: 1.5,\n      selfReferenceSize:20,\n      shadow:{\n        enabled: false,\n        color: 'rgba(0,0,0,0.5)',\n        size:10,\n        x:5,\n        y:5\n      },\n      smooth: {\n        enabled: true,\n        type: \"dynamic\",\n        forceDirection:'none',\n        roundness: 0.5\n      },\n      title:undefined,\n      width: 1,\n      value: undefined\n    };\n\n    util.extend(this.options, this.defaultOptions);\n\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    // this allows external modules to force all dynamic curves to turn static.\n    this.body.emitter.on(\"_forceDisableDynamicCurves\", (type) => {\n      if (type === 'dynamic') {\n        type = 'continuous';\n      }\n      let emitChange = false;\n      for (let edgeId in this.body.edges) {\n        if (this.body.edges.hasOwnProperty(edgeId)) {\n          let edge = this.body.edges[edgeId];\n          let edgeData = this.body.data.edges._data[edgeId];\n\n          // only forcibly remove the smooth curve if the data has been set of the edge has the smooth curves defined.\n          // this is because a change in the global would not affect these curves.\n          if (edgeData !== undefined) {\n            let edgeOptions = edgeData.smooth;\n            if (edgeOptions !== undefined) {\n              if (edgeOptions.enabled === true && edgeOptions.type === 'dynamic') {\n                if (type === undefined) {\n                  edge.setOptions({smooth: false});\n                }\n                else {\n                  edge.setOptions({smooth: {type: type}});\n                }\n                emitChange = true;\n              }\n            }\n          }\n        }\n      }\n      if (emitChange === true) {\n        this.body.emitter.emit(\"_dataChanged\");\n      }\n    });\n\n    // this is called when options of EXISTING nodes or edges have changed.\n    this.body.emitter.on(\"_dataUpdated\", () => {\n      this.reconnectEdges();\n    });\n\n    // refresh the edges. Used when reverting from hierarchical layout\n    this.body.emitter.on(\"refreshEdges\", this.refresh.bind(this));\n    this.body.emitter.on(\"refresh\",      this.refresh.bind(this));\n    this.body.emitter.on(\"destroy\",      () => {\n      util.forEach(this.edgesListeners, (callback, event) => {\n        if (this.body.data.edges)\n          this.body.data.edges.off(event, callback);\n      });\n      delete this.body.functions.createEdge;\n      delete this.edgesListeners.add;\n      delete this.edgesListeners.update;\n      delete this.edgesListeners.remove;\n      delete this.edgesListeners;\n    });\n\n  }\n\n  setOptions(options) {\n    this.edgeOptions = options;\n    if (options !== undefined) {\n      // use the parser from the Edge class to fill in all shorthand notations\n      Edge.parseOptions(this.options, options);\n\n      // update smooth settings in all edges\n      let dataChanged = false;\n      if (options.smooth !== undefined) {\n        for (let edgeId in this.body.edges) {\n          if (this.body.edges.hasOwnProperty(edgeId)) {\n            dataChanged = this.body.edges[edgeId].updateEdgeType() || dataChanged;\n          }\n        }\n      }\n\n      // update fonts in all edges\n      if (options.font !== undefined) {\n        // use the parser from the Label class to fill in all shorthand notations\n        Label.parseOptions(this.options.font, options);\n        for (let edgeId in this.body.edges) {\n          if (this.body.edges.hasOwnProperty(edgeId)) {\n            this.body.edges[edgeId].updateLabelModule();\n          }\n        }\n      }\n\n      // update the state of the variables if needed\n      if (options.hidden !== undefined || options.physics !== undefined  || dataChanged === true) {\n        this.body.emitter.emit('_dataChanged');\n      }\n    }\n  }\n\n\n  /**\n   * Load edges by reading the data table\n   * @param {Array | DataSet | DataView} edges    The data containing the edges.\n   * @private\n   * @private\n   */\n  setData(edges, doNotEmit = false) {\n    var oldEdgesData = this.body.data.edges;\n\n    if (edges instanceof DataSet || edges instanceof DataView) {\n      this.body.data.edges = edges;\n    }\n    else if (Array.isArray(edges)) {\n      this.body.data.edges = new DataSet();\n      this.body.data.edges.add(edges);\n    }\n    else if (!edges) {\n      this.body.data.edges = new DataSet();\n    }\n    else {\n      throw new TypeError('Array or DataSet expected');\n    }\n\n    // TODO: is this null or undefined or false?\n    if (oldEdgesData) {\n      // unsubscribe from old dataset\n      util.forEach(this.edgesListeners, (callback, event) => {oldEdgesData.off(event, callback);});\n    }\n\n    // remove drawn edges\n    this.body.edges = {};\n\n    // TODO: is this null or undefined or false?\n    if (this.body.data.edges) {\n      // subscribe to new dataset\n      util.forEach(this.edgesListeners, (callback, event) =>  {this.body.data.edges.on(event, callback);});\n\n      // draw all new nodes\n      var ids = this.body.data.edges.getIds();\n      this.add(ids, true);\n    }\n\n    if (doNotEmit === false) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n  }\n\n\n  /**\n   * Add edges\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  add(ids, doNotEmit = false) {\n    var edges = this.body.edges;\n    var edgesData = this.body.data.edges;\n\n    for (let i = 0; i < ids.length; i++) {\n      var id = ids[i];\n\n      var oldEdge = edges[id];\n      if (oldEdge) {\n        oldEdge.disconnect();\n      }\n\n      var data = edgesData.get(id, {\"showInternalIds\" : true});\n      edges[id] = this.create(data);\n    }\n\n    if (doNotEmit === false) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n  }\n\n\n\n  /**\n   * Update existing edges, or create them when not yet existing\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  update(ids) {\n    var edges = this.body.edges;\n    var edgesData = this.body.data.edges;\n    var dataChanged = false;\n    for (var i = 0; i < ids.length; i++) {\n      var id = ids[i];\n      var data = edgesData.get(id);\n      var edge = edges[id];\n      if (edge !== undefined) {\n        // update edge\n        edge.disconnect();\n        dataChanged = edge.setOptions(data) || dataChanged; // if a support node is added, data can be changed.\n        edge.connect();\n      }\n      else {\n        // create edge\n        this.body.edges[id] = this.create(data);\n        dataChanged = true;\n      }\n    }\n\n    if (dataChanged === true) {\n      this.body.emitter.emit(\"_dataChanged\");\n    }\n    else {\n      this.body.emitter.emit(\"_dataUpdated\");\n    }\n  }\n\n\n\n  /**\n   * Remove existing edges. Non existing ids will be ignored\n   * @param {Number[] | String[]} ids\n   * @private\n   */\n  remove(ids) {\n    var edges = this.body.edges;\n    for (var i = 0; i < ids.length; i++) {\n      var id = ids[i];\n      var edge = edges[id];\n      if (edge !== undefined) {\n        edge.cleanup();\n        edge.disconnect();\n        delete edges[id];\n      }\n    }\n\n    this.body.emitter.emit(\"_dataChanged\");\n  }\n\n  refresh() {\n    let edges = this.body.edges;\n    for (let edgeId in edges) {\n      let edge = undefined;\n      if (edges.hasOwnProperty(edgeId)) {\n        edge = edges[edgeId];\n      }\n      let data = this.body.data.edges._data[edgeId];\n      if (edge !== undefined && data !== undefined) {\n        edge.setOptions(data);\n      }\n    }\n  }\n\n  create(properties) {\n    return new Edge(properties, this.body, this.options, this.defaultOptions, this.edgeOptions)\n  }\n\n  /**\n   * Reconnect all edges\n   * @private\n   */\n  reconnectEdges() {\n    var id;\n    var nodes = this.body.nodes;\n    var edges = this.body.edges;\n\n    for (id in nodes) {\n      if (nodes.hasOwnProperty(id)) {\n        nodes[id].edges = [];\n      }\n    }\n\n    for (id in edges) {\n      if (edges.hasOwnProperty(id)) {\n        var edge = edges[id];\n        edge.from = null;\n        edge.to = null;\n        edge.connect();\n      }\n    }\n  }\n\n\n  getConnectedNodes(edgeId) {\n    let nodeList = [];\n    if (this.body.edges[edgeId] !== undefined) {\n      let edge = this.body.edges[edgeId];\n      if (edge.fromId) {nodeList.push(edge.fromId);}\n      if (edge.toId)   {nodeList.push(edge.toId);}\n    }\n    return nodeList;\n  }\n\n}\n\nexport default EdgesHandler;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/EdgesHandler.js","var util = require('../../../util');\n\nimport Label              from './shared/Label'\nimport CubicBezierEdge    from './edges/CubicBezierEdge'\nimport BezierEdgeDynamic  from './edges/BezierEdgeDynamic'\nimport BezierEdgeStatic   from './edges/BezierEdgeStatic'\nimport StraightEdge       from './edges/StraightEdge'\n\n/**\n * @class Edge\n *\n * A edge connects two nodes\n * @param {Object} properties     Object with options. Must contain\n *                                At least options from and to.\n *                                Available options: from (number),\n *                                to (number), label (string, color (string),\n *                                width (number), style (string),\n *                                length (number), title (string)\n * @param {Network} network       A Network object, used to find and edge to\n *                                nodes.\n * @param {Object} constants      An object with default values for\n *                                example for the color\n */\nclass Edge {\n  constructor(options, body, globalOptions, defaultOptions, edgeOptions) {\n    if (body === undefined) {\n      throw \"No body provided\";\n    }\n    this.options = util.bridgeObject(globalOptions);\n    this.globalOptions = globalOptions;\n    this.defaultOptions = defaultOptions;\n    this.edgeOptions = edgeOptions;\n    this.body = body;\n\n    // initialize variables\n    this.id = undefined;\n    this.fromId = undefined;\n    this.toId = undefined;\n    this.selected = false;\n    this.hover = false;\n    this.labelDirty = true;\n\n    this.baseWidth = this.options.width;\n    this.baseFontSize = this.options.font.size;\n\n    this.from = undefined; // a node\n    this.to   = undefined; // a node\n\n    this.edgeType = undefined;\n\n    this.connected = false;\n\n    this.labelModule = new Label(this.body, this.options, true /* It's an edge label */);\n    this.setOptions(options);\n  }\n\n\n  /**\n   * Set or overwrite options for the edge\n   * @param {Object} options  an object with options\n   * @param doNotEmit\n   */\n  setOptions(options) {\n    if (!options) {\n      return;\n    }\n\n    Edge.parseOptions(this.options, options, true, this.globalOptions);\n\n    if (options.id !== undefined) {\n      this.id = options.id;\n    }\n    if (options.from !== undefined) {\n      this.fromId = options.from;\n    }\n    if (options.to !== undefined) {\n      this.toId = options.to;\n    }\n    if (options.title !== undefined) {\n      this.title = options.title;\n    }\n    if (options.value !== undefined)  {\n      options.value = parseFloat(options.value);\n    }\n\n    this.choosify(options);\n\n    // update label Module\n    this.updateLabelModule(options);\n    this.labelModule.propagateFonts(this.edgeOptions, options, this.defaultOptions);\n\n    let dataChanged = this.updateEdgeType();\n\n    // if anything has been updates, reset the selection width and the hover width\n    this._setInteractionWidths();\n\n    // A node is connected when it has a from and to node that both exist in the network.body.nodes.\n    this.connect();\n\n    if (options.hidden !== undefined || options.physics !== undefined) {\n      dataChanged = true;\n    }\n\n    return dataChanged;\n  }\n\n  static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}) {\n    var fields = [\n      'arrowStrikethrough',\n      'id',\n      'from',\n      'hidden',\n      'hoverWidth',\n      'label',\n      'labelHighlightBold',\n      'length',\n      'line',\n      'opacity',\n      'physics',\n      'scaling',\n      'selectionWidth',\n      'selfReferenceSize',\n      'to',\n      'title',\n      'value',\n      'width'\n    ];\n\n    // only deep extend the items in the field array. These do not have shorthand.\n    util.selectiveDeepExtend(fields, parentOptions, newOptions, allowDeletion);\n\n    util.mergeOptions(parentOptions, newOptions, 'smooth', allowDeletion, globalOptions);\n    util.mergeOptions(parentOptions, newOptions, 'shadow', allowDeletion, globalOptions);\n\n    if (newOptions.dashes !== undefined && newOptions.dashes !== null) {\n      parentOptions.dashes = newOptions.dashes;\n    }\n    else if (allowDeletion === true && newOptions.dashes === null) {\n      parentOptions.dashes = Object.create(globalOptions.dashes); // this sets the pointer of the option back to the global option.\n    }\n\n    // set the scaling newOptions\n    if (newOptions.scaling !== undefined && newOptions.scaling !== null) {\n      if (newOptions.scaling.min !== undefined) {parentOptions.scaling.min = newOptions.scaling.min;}\n      if (newOptions.scaling.max !== undefined) {parentOptions.scaling.max = newOptions.scaling.max;}\n      util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', allowDeletion, globalOptions.scaling);\n    }\n    else if (allowDeletion === true && newOptions.scaling === null) {\n      parentOptions.scaling = Object.create(globalOptions.scaling); // this sets the pointer of the option back to the global option.\n    }\n\n    // handle multiple input cases for arrows\n    if (newOptions.arrows !== undefined && newOptions.arrows !== null) {\n      if (typeof newOptions.arrows === 'string') {\n        let arrows = newOptions.arrows.toLowerCase();\n        parentOptions.arrows.to.enabled     = arrows.indexOf(\"to\")     != -1;\n        parentOptions.arrows.middle.enabled = arrows.indexOf(\"middle\") != -1;\n        parentOptions.arrows.from.enabled   = arrows.indexOf(\"from\")   != -1;\n      }\n      else if (typeof newOptions.arrows === 'object') {\n        util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to',     allowDeletion, globalOptions.arrows);\n        util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle', allowDeletion, globalOptions.arrows);\n        util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from',   allowDeletion, globalOptions.arrows);\n      }\n      else {\n        throw new Error(\"The arrow newOptions can only be an object or a string. Refer to the documentation. You used:\" + JSON.stringify(newOptions.arrows));\n      }\n    }\n    else if (allowDeletion === true && newOptions.arrows === null) {\n      parentOptions.arrows = Object.create(globalOptions.arrows); // this sets the pointer of the option back to the global option.\n    }\n\n    // handle multiple input cases for color\n    if (newOptions.color !== undefined && newOptions.color !== null) {\n      // make a copy of the parent object in case this is referring to the global one (due to object create once, then update)\n      parentOptions.color = util.deepExtend({}, parentOptions.color, true);\n      if (util.isString(newOptions.color)) {\n        parentOptions.color.color     = newOptions.color;\n        parentOptions.color.highlight = newOptions.color;\n        parentOptions.color.hover     = newOptions.color;\n        parentOptions.color.inherit   = false;\n      }\n      else {\n        let colorsDefined = false;\n        if (newOptions.color.color     !== undefined) {parentOptions.color.color     = newOptions.color.color;     colorsDefined = true;}\n        if (newOptions.color.highlight !== undefined) {parentOptions.color.highlight = newOptions.color.highlight; colorsDefined = true;}\n        if (newOptions.color.hover     !== undefined) {parentOptions.color.hover     = newOptions.color.hover;     colorsDefined = true;}\n        if (newOptions.color.inherit   !== undefined) {parentOptions.color.inherit   = newOptions.color.inherit;}\n        if (newOptions.color.opacity   !== undefined) {parentOptions.color.opacity   = Math.min(1,Math.max(0,newOptions.color.opacity));}\n\n        if (newOptions.color.inherit === undefined && colorsDefined === true) {\n          parentOptions.color.inherit = false;\n        }\n      }\n    }\n    else if (allowDeletion === true && newOptions.color === null) {\n      parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options\n    }\n\n    // handle the font settings\n    if (newOptions.font !== undefined && newOptions.font !== null) {\n      Label.parseOptions(parentOptions.font, newOptions);\n    }\n    else if (allowDeletion === true && newOptions.font === null) {\n      parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options\n    }\n  }\n\n  choosify(options) {\n    this.chooser = true;\n\n    let pile = [options, this.options, this.defaultOptions];\n\n    let chosen = util.topMost(pile, 'chosen');\n    if (typeof chosen === 'boolean') {\n      this.chooser = chosen;\n    } else if (typeof chosen === 'object') {\n      let chosenEdge = util.topMost(pile, ['chosen', 'edge']);\n      if ((typeof chosenEdge === 'boolean') || (typeof chosenEdge === 'function')) {\n        this.chooser = chosenEdge;\n      }\n    }\n  }\n\n  getFormattingValues() {\n    let toArrow = (this.options.arrows.to === true) || (this.options.arrows.to.enabled === true)\n    let fromArrow = (this.options.arrows.from === true) || (this.options.arrows.from.enabled === true)\n    let middleArrow = (this.options.arrows.middle === true) || (this.options.arrows.middle.enabled === true)\n    let inheritsColor = this.options.color.inherit;\n    let values = {\n      toArrow: toArrow,\n      toArrowScale: this.options.arrows.to.scaleFactor,\n      toArrowType: this.options.arrows.to.type,\n      middleArrow: middleArrow,\n      middleArrowScale: this.options.arrows.middle.scaleFactor,\n      middleArrowType: this.options.arrows.middle.type,\n      fromArrow: fromArrow,\n      fromArrowScale: this.options.arrows.from.scaleFactor,\n      fromArrowType: this.options.arrows.from.type,\n      arrowStrikethrough: this.options.arrowStrikethrough,\n      color: (inheritsColor? undefined : this.options.color.color),\n      inheritsColor: inheritsColor,\n      opacity: this.options.color.opacity,\n      hidden: this.options.hidden,\n      length: this.options.length,\n      shadow: this.options.shadow.enabled,\n      shadowColor: this.options.shadow.color,\n      shadowSize: this.options.shadow.size,\n      shadowX: this.options.shadow.x,\n      shadowY: this.options.shadow.y,\n      dashes: this.options.dashes,\n      width: this.options.width\n    };\n    if (this.selected || this.hover) {\n      if (this.chooser === true) {\n        if (this.selected) {\n          let selectedWidth = this.options.selectionWidth;\n          if (typeof selectedWidth === 'function') {\n            values.width = selectedWidth(values.width);\n          } else if (typeof selectedWidth === 'number') {\n            values.width += selectedWidth;\n          }\n          values.width = Math.max(values.width, 0.3 / this.body.view.scale);\n          values.color = this.options.color.highlight;\n          values.shadow = this.options.shadow.enabled;\n        } else if (this.hover) {\n          let hoverWidth = this.options.hoverWidth;\n          if (typeof hoverWidth === 'function') {\n            values.width = hoverWidth(values.width);\n          } else if (typeof hoverWidth === 'number') {\n            values.width += hoverWidth;\n          }\n          values.width = Math.max(values.width, 0.3 / this.body.view.scale);\n          values.color = this.options.color.hover;\n          values.shadow = this.options.shadow.enabled;\n        }\n      } else if (typeof this.chooser === 'function') {\n        this.chooser(values, this.options.id, this.selected, this.hover);\n        if (values.color !== undefined) {\n          values.inheritsColor = false;\n        }\n        if (values.shadow === false) {\n          if ((values.shadowColor !== this.options.shadow.color) ||\n              (values.shadowSize !== this.options.shadow.size) ||\n              (values.shadowX !== this.options.shadow.x) ||\n              (values.shadowY !== this.options.shadow.y)) {\n            values.shadow = true;\n          }\n        }\n      }\n    } else {\n      values.shadow = this.options.shadow.enabled;\n      values.width = Math.max(values.width, 0.3 / this.body.view.scale);\n    }\n    return values;\n  }\n\n  /**\n   * update the options in the label module\n   */\n  updateLabelModule(options) {\n    this.labelModule.setOptions(this.options, true);\n    if (this.labelModule.baseSize !== undefined) {\n      this.baseFontSize = this.labelModule.baseSize;\n    }\n    this.labelModule.constrain(this.edgeOptions, options, this.defaultOptions);\n    this.labelModule.choosify(this.edgeOptions, options, this.defaultOptions);\n  }\n\n  /**\n   * update the edge type, set the options\n   * @returns {boolean}\n   */\n  updateEdgeType() {\n    let smooth = this.options.smooth;\n    let dataChanged = false;\n    let changeInType = true;\n    if (this.edgeType !== undefined) {\n      if ((((this.edgeType instanceof BezierEdgeDynamic) &&\n            (smooth.enabled === true) &&\n            (smooth.type === 'dynamic'))) ||\n          (((this.edgeType instanceof CubicBezierEdge) &&\n            (smooth.enabled === true) &&\n            (smooth.type === 'cubicBezier'))) ||\n          (((this.edgeType instanceof BezierEdgeStatic) &&\n            (smooth.enabled === true) &&\n            (smooth.type !== 'dynamic') &&\n            (smooth.type !== 'cubicBezier'))) ||\n          (((this.edgeType instanceof StraightEdge) &&\n            (smooth.type.enabled === false)))) {\n        changeInType = false;\n      }\n      if (changeInType === true) {\n        dataChanged = this.cleanup();\n      }\n    }\n    if (changeInType === true) {\n      if (smooth.enabled === true) {\n        if (smooth.type === 'dynamic') {\n          dataChanged = true;\n          this.edgeType = new BezierEdgeDynamic(this.options, this.body, this.labelModule);\n        } else if (smooth.type === 'cubicBezier') {\n          this.edgeType = new CubicBezierEdge(this.options, this.body, this.labelModule);\n        } else {\n          this.edgeType = new BezierEdgeStatic(this.options, this.body, this.labelModule);\n        }\n      } else {\n        this.edgeType = new StraightEdge(this.options, this.body, this.labelModule);\n      }\n    } else { // if nothing changes, we just set the options.\n      this.edgeType.setOptions(this.options);\n    }\n    return dataChanged;\n  }\n\n  /**\n   * Connect an edge to its nodes\n   */\n  connect() {\n    this.disconnect();\n\n    this.from = this.body.nodes[this.fromId] || undefined;\n    this.to = this.body.nodes[this.toId] || undefined;\n    this.connected = (this.from !== undefined && this.to !== undefined);\n\n    if (this.connected === true) {\n      this.from.attachEdge(this);\n      this.to.attachEdge(this);\n    }\n    else {\n      if (this.from) {\n        this.from.detachEdge(this);\n      }\n      if (this.to) {\n        this.to.detachEdge(this);\n      }\n    }\n\n    this.edgeType.connect();\n  }\n\n\n  /**\n   * Disconnect an edge from its nodes\n   */\n  disconnect() {\n    if (this.from) {\n      this.from.detachEdge(this);\n      this.from = undefined;\n    }\n    if (this.to) {\n      this.to.detachEdge(this);\n      this.to = undefined;\n    }\n\n    this.connected = false;\n  }\n\n\n  /**\n   * get the title of this edge.\n   * @return {string} title    The title of the edge, or undefined when no title\n   *                           has been set.\n   */\n  getTitle() {\n    return this.title;\n  }\n\n\n  /**\n   * check if this node is selecte\n   * @return {boolean} selected   True if node is selected, else false\n   */\n  isSelected() {\n    return this.selected;\n  }\n\n\n\n  /**\n   * Retrieve the value of the edge. Can be undefined\n   * @return {Number} value\n   */\n  getValue() {\n    return this.options.value;\n  }\n\n\n  /**\n   * Adjust the value range of the edge. The edge will adjust it's width\n   * based on its value.\n   * @param {Number} min\n   * @param {Number} max\n   * @param total\n   */\n  setValueRange(min, max, total) {\n    if (this.options.value !== undefined) {\n      var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value);\n      var widthDiff = this.options.scaling.max - this.options.scaling.min;\n      if (this.options.scaling.label.enabled === true) {\n        var fontDiff = this.options.scaling.label.max - this.options.scaling.label.min;\n        this.options.font.size = this.options.scaling.label.min + scale * fontDiff;\n      }\n      this.options.width = this.options.scaling.min + scale * widthDiff;\n    }\n    else {\n      this.options.width = this.baseWidth;\n      this.options.font.size = this.baseFontSize;\n    }\n\n    this._setInteractionWidths();\n    this.updateLabelModule();\n  }\n\n  _setInteractionWidths() {\n    if (typeof this.options.hoverWidth === 'function') {\n      this.edgeType.hoverWidth = this.options.hoverWidth(this.options.width);\n    } else {\n      this.edgeType.hoverWidth = this.options.hoverWidth + this.options.width;\n    }\n    if (typeof this.options.selectionWidth === 'function') {\n      this.edgeType.selectionWidth = this.options.selectionWidth(this.options.width);\n    } else {\n      this.edgeType.selectionWidth = this.options.selectionWidth + this.options.width;\n    }\n  }\n\n\n  /**\n   * Redraw a edge\n   * Draw this edge in the given canvas\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext(\"2d\");\n   * @param {CanvasRenderingContext2D}   ctx\n   */\n  draw(ctx) {\n    let values = this.getFormattingValues();\n    if (values.hidden) {\n      return;\n    }\n\n    // get the via node from the edge type\n    let viaNode = this.edgeType.getViaNode();\n    let arrowData = {};\n\n    // restore edge targets to defaults\n    this.edgeType.fromPoint = this.edgeType.from;\n    this.edgeType.toPoint = this.edgeType.to;\n\n    // from and to arrows give a different end point for edges. we set them here\n    if (values.fromArrow) {\n      arrowData.from = this.edgeType.getArrowData(ctx, 'from', viaNode, this.selected, this.hover, values);\n      if (values.arrowStrikethrough === false)\n        this.edgeType.fromPoint = arrowData.from.core;\n    }\n    if (values.toArrow) {\n      arrowData.to = this.edgeType.getArrowData(ctx, 'to', viaNode, this.selected, this.hover, values);\n      if (values.arrowStrikethrough === false)\n        this.edgeType.toPoint = arrowData.to.core;\n    }\n\n    // the middle arrow depends on the line, which can depend on the to and from arrows so we do this one lastly.\n    if (values.middleArrow) {\n      arrowData.middle = this.edgeType.getArrowData(ctx,'middle', viaNode, this.selected, this.hover, values);\n    }\n\n    // draw everything\n    this.edgeType.drawLine(ctx, values, this.selected, this.hover, viaNode);\n    this.drawArrows(ctx, arrowData, values);\n    this.drawLabel (ctx, viaNode);\n  }\n\n\n  drawArrows(ctx, arrowData, values) {\n    if (values.fromArrow) {\n      this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.from);\n    }\n    if (values.middleArrow) {\n      this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.middle);\n    }\n    if (values.toArrow) {\n      this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.to);\n    }\n  }\n\n\n  drawLabel(ctx, viaNode) {\n    if (this.options.label !== undefined) {\n      // set style\n      var node1 = this.from;\n      var node2 = this.to;\n      var selected = (this.from.selected || this.to.selected || this.selected);\n      if (node1.id != node2.id) {\n        this.labelModule.pointToSelf = false;\n        var point = this.edgeType.getPoint(0.5, viaNode);\n        ctx.save();\n\n        // if the label has to be rotated:\n        if (this.options.font.align !== \"horizontal\") {\n          this.labelModule.calculateLabelSize(ctx, selected, this.hover, point.x, point.y);\n          ctx.translate(point.x, this.labelModule.size.yLine);\n          this._rotateForLabelAlignment(ctx);\n        }\n\n        // draw the label\n        this.labelModule.draw(ctx, point.x, point.y, selected, this.hover);\n        ctx.restore();\n      }\n      else {\n        // Ignore the orientations.\n        this.labelModule.pointToSelf = true;\n        var x, y;\n        var radius = this.options.selfReferenceSize;\n        if (node1.shape.width > node1.shape.height) {\n          x = node1.x + node1.shape.width * 0.5;\n          y = node1.y - radius;\n        }\n        else {\n          x = node1.x + radius;\n          y = node1.y - node1.shape.height * 0.5;\n        }\n        point = this._pointOnCircle(x, y, radius, 0.125);\n        this.labelModule.draw(ctx, point.x, point.y, selected, this.hover);\n      }\n    }\n  }\n\n\n  /**\n   * Check if this object is overlapping with the provided object\n   * @param {Object} obj   an object with parameters left, top\n   * @return {boolean}     True if location is located on the edge\n   */\n  isOverlappingWith(obj) {\n    if (this.connected) {\n      var distMax = 10;\n      var xFrom = this.from.x;\n      var yFrom = this.from.y;\n      var xTo = this.to.x;\n      var yTo = this.to.y;\n      var xObj = obj.left;\n      var yObj = obj.top;\n\n      var dist = this.edgeType.getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj);\n\n      return (dist < distMax);\n    }\n    else {\n      return false\n    }\n  }\n\n\n  /**\n   * Rotates the canvas so the text is most readable\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _rotateForLabelAlignment(ctx) {\n    var dy = this.from.y - this.to.y;\n    var dx = this.from.x - this.to.x;\n    var angleInDegrees = Math.atan2(dy, dx);\n\n    // rotate so label it is readable\n    if ((angleInDegrees < -1 && dx < 0) || (angleInDegrees > 0 && dx < 0)) {\n      angleInDegrees = angleInDegrees + Math.PI;\n    }\n\n    ctx.rotate(angleInDegrees);\n  }\n\n\n  /**\n   * Get a point on a circle\n   * @param {Number} x\n   * @param {Number} y\n   * @param {Number} radius\n   * @param {Number} percentage. Value between 0 (line start) and 1 (line end)\n   * @return {Object} point\n   * @private\n   */\n  _pointOnCircle(x, y, radius, percentage) {\n    var angle = percentage * 2 * Math.PI;\n    return {\n      x: x + radius * Math.cos(angle),\n      y: y - radius * Math.sin(angle)\n    }\n  }\n\n\n  select() {\n    this.selected = true;\n  }\n\n\n  unselect() {\n    this.selected = false;\n  }\n\n\n  /**\n   * cleans all required things on delete\n   * @returns {*}\n   */\n  cleanup() {\n    return this.edgeType.cleanup();\n  }\n}\n\nexport default Edge;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/Edge.js","import CubicBezierEdgeBase from './util/CubicBezierEdgeBase'\n\nclass CubicBezierEdge extends CubicBezierEdgeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  /**\n   * Draw a line between two nodes\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _line(ctx, values, viaNodes) {\n    // get the coordinates of the support points.\n    let via1 = viaNodes[0];\n    let via2 = viaNodes[1];\n\n    // start drawing the line.\n    ctx.beginPath();\n    ctx.moveTo(this.fromPoint.x, this.fromPoint.y);\n\n    // fallback to normal straight edges\n    if (viaNodes === undefined || via1.x === undefined) {\n      ctx.lineTo(this.toPoint.x, this.toPoint.y);\n    }\n    else {\n      ctx.bezierCurveTo(via1.x, via1.y, via2.x, via2.y, this.toPoint.x, this.toPoint.y);\n    }\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    ctx.stroke();\n    this.disableShadow(ctx, values);\n  }\n\n  _getViaCoordinates() {\n    let dx = this.from.x - this.to.x;\n    let dy = this.from.y - this.to.y;\n\n    let x1, y1, x2, y2;\n    let roundness =  this.options.smooth.roundness;\n\n    // horizontal if x > y or if direction is forced or if direction is horizontal\n    if ((Math.abs(dx) > Math.abs(dy) || this.options.smooth.forceDirection === true || this.options.smooth.forceDirection === 'horizontal') && this.options.smooth.forceDirection !== 'vertical') {\n      y1 = this.from.y;\n      y2 = this.to.y;\n      x1 = this.from.x - roundness * dx;\n      x2 = this.to.x + roundness * dx;\n    }\n    else {\n      y1 = this.from.y - roundness * dy;\n      y2 = this.to.y + roundness * dy;\n      x1 = this.from.x;\n      x2 = this.to.x;\n    }\n\n    return [{x: x1, y: y1},{x: x2, y: y2}];\n  }\n\n  getViaNode() {\n    return this._getViaCoordinates();\n  }\n\n  _findBorderPosition(nearNode, ctx) {\n    return this._findBorderPositionBezier(nearNode, ctx);\n  }\n\n  _getDistanceToEdge(x1, y1, x2, y2, x3, y3, [via1, via2] = this._getViaCoordinates()) { // x3,y3 is the point\n    return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2);\n  }\n\n  /**\n   * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way\n   * @param percentage\n   * @param via\n   * @returns {{x: number, y: number}}\n   * @private\n   */\n  getPoint(percentage, [via1, via2] = this._getViaCoordinates()) {\n    let t = percentage;\n    let vec = [];\n    vec[0] = Math.pow(1 - t, 3);\n    vec[1] = 3 * t * Math.pow(1 - t, 2);\n    vec[2] = 3 * Math.pow(t,2) * (1 - t);\n    vec[3] = Math.pow(t, 3);\n    let x = vec[0] * this.fromPoint.x + vec[1] * via1.x + vec[2] * via2.x + vec[3] * this.toPoint.x;\n    let y = vec[0] * this.fromPoint.y + vec[1] * via1.y + vec[2] * via2.y + vec[3] * this.toPoint.y;\n\n    return {x: x, y: y};\n  }\n}\n\n\nexport default CubicBezierEdge;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/CubicBezierEdge.js","import BezierEdgeBase from './BezierEdgeBase'\n\nclass CubicBezierEdgeBase extends BezierEdgeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  /**\n   * Calculate the distance between a point (x3,y3) and a line segment from\n   * (x1,y1) to (x2,y2).\n   * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment\n   * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n   * @param {number} x1 from x\n   * @param {number} y1 from y\n   * @param {number} x2 to x\n   * @param {number} y2 to y\n   * @param {number} x3 point to check x\n   * @param {number} y3 point to check y\n   * @private\n   */\n  _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2) { // x3,y3 is the point\n    let minDistance = 1e9;\n    let distance;\n    let i, t, x, y;\n    let lastX = x1;\n    let lastY = y1;\n    let vec = [0,0,0,0]\n    for (i = 1; i < 10; i++) {\n      t = 0.1 * i;\n      vec[0] = Math.pow(1 - t, 3);\n      vec[1] = 3 * t * Math.pow(1 - t, 2);\n      vec[2] = 3 * Math.pow(t,2) * (1 - t);\n      vec[3] = Math.pow(t, 3);\n      x = vec[0] * x1 + vec[1] * via1.x + vec[2] * via2.x + vec[3] * x2;\n      y = vec[0] * y1 + vec[1] * via1.y + vec[2] * via2.y + vec[3] * y2;\n      if (i > 0) {\n        distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3);\n        minDistance = distance < minDistance ? distance : minDistance;\n      }\n      lastX = x;\n      lastY = y;\n    }\n\n    return minDistance;\n  }\n}\n\nexport default CubicBezierEdgeBase;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/util/CubicBezierEdgeBase.js","import EdgeBase from './EdgeBase'\n\nclass BezierEdgeBase extends EdgeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  /**\n   * This function uses binary search to look for the point where the bezier curve crosses the border of the node.\n   *\n   * @param nearNode\n   * @param ctx\n   * @param viaNode\n   * @param nearNode\n   * @param ctx\n   * @param viaNode\n   * @param nearNode\n   * @param ctx\n   * @param viaNode\n   */\n  _findBorderPositionBezier(nearNode, ctx, viaNode = this._getViaCoordinates()) {\n    var maxIterations = 10;\n    var iteration = 0;\n    var low = 0;\n    var high = 1;\n    var pos, angle, distanceToBorder, distanceToPoint, difference;\n    var threshold = 0.2;\n    var node = this.to;\n    var from = false;\n    if (nearNode.id === this.from.id) {\n      node = this.from;\n      from = true;\n    }\n\n    while (low <= high && iteration < maxIterations) {\n      var middle = (low + high) * 0.5;\n\n      pos = this.getPoint(middle, viaNode);\n      angle = Math.atan2((node.y - pos.y), (node.x - pos.x));\n      distanceToBorder = node.distanceToBorder(ctx, angle);\n      distanceToPoint = Math.sqrt(Math.pow(pos.x - node.x, 2) + Math.pow(pos.y - node.y, 2));\n      difference = distanceToBorder - distanceToPoint;\n      if (Math.abs(difference) < threshold) {\n        break; // found\n      }\n      else if (difference < 0) { // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node.\n        if (from === false) {\n          low = middle;\n        }\n        else {\n          high = middle;\n        }\n      }\n      else {\n        if (from === false) {\n          high = middle;\n        }\n        else {\n          low = middle;\n        }\n      }\n\n      iteration++;\n    }\n    pos.t = middle;\n\n    return pos;\n  }\n\n\n\n  /**\n   * Calculate the distance between a point (x3,y3) and a line segment from\n   * (x1,y1) to (x2,y2).\n   * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment\n   * @param {number} x1 from x\n   * @param {number} y1 from y\n   * @param {number} x2 to x\n   * @param {number} y2 to y\n   * @param {number} x3 point to check x\n   * @param {number} y3 point to check y\n   * @private\n   */\n  _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via) { // x3,y3 is the point\n    let minDistance = 1e9;\n    let distance;\n    let i, t, x, y;\n    let lastX = x1;\n    let lastY = y1;\n    for (i = 1; i < 10; i++) {\n      t = 0.1 * i;\n      x = Math.pow(1 - t, 2) * x1 + (2 * t * (1 - t)) * via.x + Math.pow(t, 2) * x2;\n      y = Math.pow(1 - t, 2) * y1 + (2 * t * (1 - t)) * via.y + Math.pow(t, 2) * y2;\n      if (i > 0) {\n        distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3);\n        minDistance = distance < minDistance ? distance : minDistance;\n      }\n      lastX = x;\n      lastY = y;\n    }\n\n    return minDistance;\n  }\n}\n\nexport default BezierEdgeBase;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/util/BezierEdgeBase.js","let util = require(\"../../../../../util\");\n\nclass EdgeBase {\n  constructor(options, body, labelModule) {\n    this.body = body;\n    this.labelModule = labelModule;\n    this.options = {};\n    this.setOptions(options);\n    this.colorDirty = true;\n    this.color = {};\n    this.selectionWidth = 2;\n    this.hoverWidth = 1.5;\n    this.fromPoint = this.from;\n    this.toPoint = this.to;\n  }\n\n  connect() {\n    this.from = this.body.nodes[this.options.from];\n    this.to = this.body.nodes[this.options.to];\n  }\n\n  cleanup() {\n    return false;\n  }\n\n  setOptions(options) {\n    this.options = options;\n    this.from = this.body.nodes[this.options.from];\n    this.to = this.body.nodes[this.options.to];\n    this.id = this.options.id;\n  }\n\n  /**\n   * Redraw a edge as a line\n   * Draw this edge in the given canvas\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext(\"2d\");\n   * @param {CanvasRenderingContext2D}   ctx\n   * @private\n   */\n  drawLine(ctx, values, selected, hover, viaNode) {\n    // set style\n    ctx.strokeStyle = this.getColor(ctx, values, selected, hover);\n    ctx.lineWidth = values.width;\n\n    if (values.dashes !== false) {\n      this._drawDashedLine(ctx, values, viaNode);\n    }\n    else {\n      this._drawLine(ctx, values, viaNode);\n    }\n  }\n\n\n  _drawLine(ctx, values, viaNode, fromPoint, toPoint) {\n    if (this.from != this.to) {\n      // draw line\n      this._line(ctx, values, viaNode, fromPoint, toPoint);\n    }\n    else {\n      let [x,y,radius] = this._getCircleData(ctx, values);\n      this._circle(ctx, values, x, y, radius);\n    }\n  }\n\n  _drawDashedLine(ctx, values, viaNode, fromPoint, toPoint) {\n    ctx.lineCap = 'round';\n    let pattern = [5,5];\n    if (Array.isArray(values.dashes) === true) {\n      pattern = values.dashes;\n    }\n\n    // only firefox and chrome support this method, else we use the legacy one.\n    if (ctx.setLineDash !== undefined) {\n      ctx.save();\n\n      // set dash settings for chrome or firefox\n      ctx.setLineDash(pattern);\n      ctx.lineDashOffset = 0;\n\n      // draw the line\n      if (this.from != this.to) {\n        // draw line\n        this._line(ctx, values, viaNode);\n      }\n      else {\n        let [x,y,radius] = this._getCircleData(ctx, values);\n        this._circle(ctx, values, x, y, radius);\n      }\n\n      // restore the dash settings.\n      ctx.setLineDash([0]);\n      ctx.lineDashOffset = 0;\n      ctx.restore();\n    }\n    else { // unsupporting smooth lines\n      if (this.from != this.to) {\n        // draw line\n        ctx.dashedLine(this.from.x, this.from.y, this.to.x, this.to.y, pattern);\n      }\n      else {\n        let [x,y,radius] = this._getCircleData(ctx, values);\n        this._circle(ctx, values, x, y, radius);\n      }\n      // draw shadow if enabled\n      this.enableShadow(ctx, values);\n\n      ctx.stroke();\n\n      // disable shadows for other elements.\n      this.disableShadow(ctx, values);\n    }\n  }\n\n\n  findBorderPosition(nearNode, ctx, options) {\n    if (this.from != this.to) {\n      return this._findBorderPosition(nearNode, ctx, options);\n    }\n    else {\n      return this._findBorderPositionCircle(nearNode, ctx, options);\n    }\n  }\n\n  findBorderPositions(ctx) {\n    let from = {};\n    let to = {};\n    if (this.from != this.to) {\n      from = this._findBorderPosition(this.from, ctx);\n      to = this._findBorderPosition(this.to, ctx);\n    }\n    else {\n      let [x,y,radius] = this._getCircleData(ctx);\n\n      from = this._findBorderPositionCircle(this.from, ctx, {x, y, low:0.25, high:0.6, direction:-1});\n      to = this._findBorderPositionCircle(this.from, ctx, {x, y, low:0.6, high:0.8, direction:1});\n    }\n    return {from, to};\n  }\n\n  _getCircleData(ctx) {\n    let x, y;\n    let node = this.from;\n    let radius = this.options.selfReferenceSize;\n\n    if (ctx !== undefined) {\n      if (node.shape.width === undefined) {\n        node.shape.resize(ctx);\n      }\n    }\n\n    // get circle coordinates\n    if (node.shape.width > node.shape.height) {\n      x = node.x + node.shape.width * 0.5;\n      y = node.y - radius;\n    }\n    else {\n      x = node.x + radius;\n      y = node.y - node.shape.height * 0.5;\n    }\n    return [x,y,radius];\n  }\n\n  /**\n   * Get a point on a circle\n   * @param {Number} x\n   * @param {Number} y\n   * @param {Number} radius\n   * @param {Number} percentage. Value between 0 (line start) and 1 (line end)\n   * @return {Object} point\n   * @private\n   */\n  _pointOnCircle(x, y, radius, percentage) {\n    let angle = percentage * 2 * Math.PI;\n    return {\n      x: x + radius * Math.cos(angle),\n      y: y - radius * Math.sin(angle)\n    }\n  }\n\n  /**\n   * This function uses binary search to look for the point where the circle crosses the border of the node.\n   * @param node\n   * @param ctx\n   * @param options\n   * @returns {*}\n   * @private\n   */\n  _findBorderPositionCircle(node, ctx, options) {\n    let x = options.x;\n    let y = options.y;\n    let low = options.low;\n    let high = options.high;\n    let direction = options.direction;\n\n    let maxIterations = 10;\n    let iteration = 0;\n    let radius = this.options.selfReferenceSize;\n    let pos, angle, distanceToBorder, distanceToPoint, difference;\n    let threshold = 0.05;\n    let middle = (low + high) * 0.5;\n\n    while (low <= high && iteration < maxIterations) {\n      middle = (low + high) * 0.5;\n\n      pos = this._pointOnCircle(x, y, radius, middle);\n      angle = Math.atan2((node.y - pos.y), (node.x - pos.x));\n      distanceToBorder = node.distanceToBorder(ctx, angle);\n      distanceToPoint = Math.sqrt(Math.pow(pos.x - node.x, 2) + Math.pow(pos.y - node.y, 2));\n      difference = distanceToBorder - distanceToPoint;\n      if (Math.abs(difference) < threshold) {\n        break; // found\n      }\n      else if (difference > 0) { // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node.\n        if (direction > 0) {\n          low = middle;\n        }\n        else {\n          high = middle;\n        }\n      }\n      else {\n        if (direction > 0) {\n          high = middle;\n        }\n        else {\n          low = middle;\n        }\n      }\n      iteration++;\n\n    }\n    pos.t = middle;\n\n    return pos;\n  }\n\n  /**\n   * Get the line width of the edge. Depends on width and whether one of the\n   * connected nodes is selected.\n   * @return {Number} width\n   * @private\n   */\n  getLineWidth(selected, hover) {\n    if (selected === true) {\n      return Math.max(this.selectionWidth, 0.3 / this.body.view.scale);\n    }\n    else {\n      if (hover === true) {\n        return Math.max(this.hoverWidth, 0.3 / this.body.view.scale);\n      }\n      else {\n        return Math.max(this.options.width, 0.3 / this.body.view.scale);\n      }\n    }\n  }\n\n\n  getColor(ctx, values, selected, hover) {\n    if (values.inheritsColor !== false) {\n      // when this is a loop edge, just use the 'from' method\n      if ((values.inheritsColor === 'both') && (this.from.id !== this.to.id)) {\n        let grd = ctx.createLinearGradient(this.from.x, this.from.y, this.to.x, this.to.y);\n        let fromColor, toColor;\n        fromColor = this.from.options.color.highlight.border;\n        toColor = this.to.options.color.highlight.border;\n\n        if ((this.from.selected === false) && (this.to.selected === false)) {\n          fromColor = util.overrideOpacity(this.from.options.color.border, values.opacity);\n          toColor = util.overrideOpacity(this.to.options.color.border, values.opacity);\n        }\n        else if ((this.from.selected === true) && (this.to.selected === false)) {\n          toColor = this.to.options.color.border;\n        }\n        else if ((this.from.selected === false) && (this.to.selected === true)) {\n          fromColor = this.from.options.color.border;\n        }\n        grd.addColorStop(0, fromColor);\n        grd.addColorStop(1, toColor);\n\n        // -------------------- this returns -------------------- //\n        return grd;\n      }\n\n      if (values.inheritsColor === \"to\") {\n        return util.overrideOpacity(this.to.options.color.border, values.opacity);\n      } else { // \"from\"\n        return util.overrideOpacity(this.from.options.color.border, values.opacity);\n      }\n    } else {\n      return util.overrideOpacity(values.color, values.opacity);\n    }\n  }\n\n  /**\n   * Draw a line from a node to itself, a circle\n   * @param {CanvasRenderingContext2D} ctx\n   * @param {Number} x\n   * @param {Number} y\n   * @param {Number} radius\n   * @private\n   */\n  _circle(ctx, values, x, y, radius) {\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n\n    // draw a circle\n    ctx.beginPath();\n    ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n    ctx.stroke();\n\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n  }\n\n\n  /**\n   * Calculate the distance between a point (x3,y3) and a line segment from\n   * (x1,y1) to (x2,y2).\n   * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment\n   * @param {number} x1\n   * @param {number} y1\n   * @param {number} x2\n   * @param {number} y2\n   * @param {number} x3\n   * @param {number} y3\n   * @private\n   */\n  getDistanceToEdge(x1, y1, x2, y2, x3, y3, via, values) { // x3,y3 is the point\n    let returnValue = 0;\n    if (this.from != this.to) {\n      returnValue = this._getDistanceToEdge(x1, y1, x2, y2, x3, y3, via)\n    }\n    else {\n      let [x,y,radius] = this._getCircleData(undefined, values);\n      let dx = x - x3;\n      let dy = y - y3;\n      returnValue = Math.abs(Math.sqrt(dx * dx + dy * dy) - radius);\n    }\n\n    if (this.labelModule.size.left < x3 &&\n      this.labelModule.size.left + this.labelModule.size.width > x3 &&\n      this.labelModule.size.top < y3 &&\n      this.labelModule.size.top + this.labelModule.size.height > y3) {\n      return 0;\n    }\n    else {\n      return returnValue;\n    }\n  }\n\n  _getDistanceToLine(x1, y1, x2, y2, x3, y3) {\n    let px = x2 - x1;\n    let py = y2 - y1;\n    let something = px * px + py * py;\n    let u = ((x3 - x1) * px + (y3 - y1) * py) / something;\n\n    if (u > 1) {\n      u = 1;\n    }\n    else if (u < 0) {\n      u = 0;\n    }\n\n    let x = x1 + u * px;\n    let y = y1 + u * py;\n    let dx = x - x3;\n    let dy = y - y3;\n\n    //# Note: If the actual distance does not matter,\n    //# if you only want to compare what this function\n    //# returns to other results of this function, you\n    //# can just return the squared distance instead\n    //# (i.e. remove the sqrt) to gain a little performance\n\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n\n\n  /**\n   *\n   * @param ctx\n   * @param position\n   * @param viaNode\n   */\n  getArrowData(ctx, position, viaNode, selected, hover, values) {\n    // set lets\n    let angle;\n    let arrowPoint;\n    let node1;\n    let node2;\n    let guideOffset;\n    let scaleFactor;\n    let type;\n    let lineWidth = values.width;\n\n    if (position === 'from') {\n      node1 = this.from;\n      node2 = this.to;\n      guideOffset = 0.1;\n      scaleFactor = values.fromArrowScale;\n      type = values.fromArrowType;\n    }\n    else if (position === 'to') {\n      node1 = this.to;\n      node2 = this.from;\n      guideOffset = -0.1;\n      scaleFactor = values.toArrowScale;\n      type = values.toArrowType;\n    }\n    else {\n      node1 = this.to;\n      node2 = this.from;\n      scaleFactor = values.middleArrowScale;\n      type = values.middleArrowType;\n    }\n\n    // if not connected to itself\n    if (node1 != node2) {\n      if (position !== 'middle') {\n        // draw arrow head\n        if (this.options.smooth.enabled === true) {\n          arrowPoint = this.findBorderPosition(node1, ctx, { via: viaNode });\n          let guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPoint.t + guideOffset)), viaNode);\n          angle = Math.atan2((arrowPoint.y - guidePos.y), (arrowPoint.x - guidePos.x));\n        } else {\n          angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));\n          arrowPoint = this.findBorderPosition(node1, ctx);\n        }\n      } else {\n        angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));\n        arrowPoint = this.getPoint(0.5, viaNode); // this is 0.6 to account for the size of the arrow.\n      }\n    } else {\n      // draw circle\n      let [x,y,radius] = this._getCircleData(ctx);\n\n      if (position === 'from') {\n        arrowPoint = this.findBorderPosition(this.from, ctx, { x, y, low: 0.25, high: 0.6, direction: -1 });\n        angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI;\n      } else if (position === 'to') {\n        arrowPoint = this.findBorderPosition(this.from, ctx, { x, y, low: 0.6, high: 1.0, direction: 1 });\n        angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI;\n      } else {\n        arrowPoint = this._pointOnCircle(x, y, radius, 0.175);\n        angle = 3.9269908169872414; // === 0.175 * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI;\n      }\n    }\n\n    let length = 15 * scaleFactor + 3 * lineWidth; // 3* lineWidth is the width of the edge.\n\n    var xi = arrowPoint.x - length * 0.9 * Math.cos(angle);\n    var yi = arrowPoint.y - length * 0.9 * Math.sin(angle);\n    let arrowCore = { x: xi, y: yi };\n\n    return { point: arrowPoint, core: arrowCore, angle: angle, length: length, type: type };\n  }\n\n  /**\n   *\n   * @param ctx\n   * @param selected\n   * @param hover\n   * @param arrowData\n   */\n  drawArrowHead(ctx, values, selected, hover, arrowData) {\n    // set style\n    ctx.strokeStyle = this.getColor(ctx, values, selected, hover);\n    ctx.fillStyle = ctx.strokeStyle;\n    ctx.lineWidth = values.width;\n\n    if (arrowData.type && arrowData.type.toLowerCase() === 'circle') {\n      // draw circle at the end of the line\n      ctx.circleEndpoint(arrowData.point.x, arrowData.point.y, arrowData.angle, arrowData.length);\n    } else {\n      // draw arrow at the end of the line\n      ctx.arrowEndpoint(arrowData.point.x, arrowData.point.y, arrowData.angle, arrowData.length);\n    }\n\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    ctx.fill();\n    // disable shadows for other elements.\n    this.disableShadow(ctx, values);\n  }\n\n\n  enableShadow(ctx, values) {\n    if (values.shadow === true) {\n      ctx.shadowColor = values.shadowColor;\n      ctx.shadowBlur = values.shadowSize;\n      ctx.shadowOffsetX = values.shadowX;\n      ctx.shadowOffsetY = values.shadowY;\n    }\n  }\n\n  disableShadow(ctx, values) {\n    if (values.shadow === true) {\n      ctx.shadowColor = 'rgba(0,0,0,0)';\n      ctx.shadowBlur = 0;\n      ctx.shadowOffsetX = 0;\n      ctx.shadowOffsetY = 0;\n    }\n  }\n}\n\nexport default EdgeBase;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/util/EdgeBase.js","import BezierEdgeBase from './util/BezierEdgeBase'\n\nclass BezierEdgeDynamic extends BezierEdgeBase {\n  constructor(options, body, labelModule) {\n    //this.via = undefined; // Here for completeness but not allowed to defined before super() is invoked.\n    super(options, body, labelModule); // --> this calls the setOptions below\n    this._boundFunction = () => {this.positionBezierNode();};\n    this.body.emitter.on(\"_repositionBezierNodes\", this._boundFunction);\n  }\n\n  setOptions(options) {\n    // check if the physics has changed.\n    let physicsChange = false;\n    if (this.options.physics !== options.physics) {\n      physicsChange = true;\n    }\n\n    // set the options and the to and from nodes\n    this.options = options;\n    this.id = this.options.id;\n    this.from = this.body.nodes[this.options.from];\n    this.to = this.body.nodes[this.options.to];\n\n    // setup the support node and connect\n    this.setupSupportNode();\n    this.connect();\n\n    // when we change the physics state of the edge, we reposition the support node.\n    if (physicsChange === true) {\n      this.via.setOptions({physics: this.options.physics})\n      this.positionBezierNode();\n    }\n  }\n\n  connect() {\n    this.from = this.body.nodes[this.options.from];\n    this.to = this.body.nodes[this.options.to];\n    if (this.from === undefined || this.to === undefined || this.options.physics === false) {\n      this.via.setOptions({physics:false})\n    }\n    else {\n      // fix weird behaviour where a self referencing node has physics enabled\n      if (this.from.id === this.to.id) {\n        this.via.setOptions({physics: false})\n      }\n      else {\n        this.via.setOptions({physics: true})\n      }\n    }\n  }\n\n  /**\n   * remove the support nodes\n   * @returns {boolean}\n   */\n  cleanup() {\n    this.body.emitter.off(\"_repositionBezierNodes\", this._boundFunction);\n    if (this.via !== undefined) {\n      delete this.body.nodes[this.via.id];\n      this.via = undefined;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but\n   * are used for the force calculation.\n   *\n   * The changed data is not called, if needed, it is returned by the main edge constructor.\n   * @private\n   */\n  setupSupportNode() {\n    if (this.via === undefined) {\n      var nodeId = \"edgeId:\" + this.id;\n      var node = this.body.functions.createNode({\n        id: nodeId,\n        shape: 'circle',\n        physics:true,\n        hidden:true\n      });\n      this.body.nodes[nodeId] = node;\n      this.via = node;\n      this.via.parentEdgeId = this.id;\n      this.positionBezierNode();\n    }\n  }\n\n  positionBezierNode() {\n    if (this.via !== undefined && this.from !== undefined && this.to !== undefined) {\n      this.via.x = 0.5 * (this.from.x + this.to.x);\n      this.via.y = 0.5 * (this.from.y + this.to.y);\n    }\n    else if (this.via !== undefined) {\n      this.via.x = 0;\n      this.via.y = 0;\n    }\n  }\n\n  /**\n   * Draw a line between two nodes\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _line(ctx, values, viaNode) {\n    // draw a straight line\n    ctx.beginPath();\n    ctx.moveTo(this.fromPoint.x, this.fromPoint.y);\n    // fallback to normal straight edges\n    if (viaNode.x === undefined) {\n      ctx.lineTo(this.toPoint.x, this.toPoint.y);\n    }\n    else {\n      ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y);\n    }\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    ctx.stroke();\n    this.disableShadow(ctx, values);\n  }\n\n  getViaNode() {\n    return this.via;\n  }\n\n\n  /**\n   * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way\n   * @param percentage\n   * @param viaNode\n   * @returns {{x: number, y: number}}\n   * @private\n   */\n  getPoint(percentage, viaNode = this.via) {\n    let t = percentage;\n    let x, y;\n    if (this.from === this.to){\n      let [cx,cy,cr]  = this._getCircleData(this.from)\n      let a = 2 * Math.PI * (1 - t);\n      x = cx + cr * Math.sin(a);\n      y = cy + cr - cr * (1 - Math.cos(a));\n    } else {\n      x = Math.pow(1 - t, 2) * this.fromPoint.x + 2 * t * (1 - t) * viaNode.x + Math.pow(t, 2) * this.toPoint.x;\n      y = Math.pow(1 - t, 2) * this.fromPoint.y + 2 * t * (1 - t) * viaNode.y + Math.pow(t, 2) * this.toPoint.y;\n    }\n\n    return {x: x, y: y};\n  }\n\n  _findBorderPosition(nearNode, ctx) {\n    return this._findBorderPositionBezier(nearNode, ctx, this.via);\n  }\n\n  _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { // x3,y3 is the point\n    return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, this.via);\n  }\n\n\n}\n\n\nexport default BezierEdgeDynamic;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/BezierEdgeDynamic.js","import BezierEdgeBase from './util/BezierEdgeBase'\n\nclass BezierEdgeStatic extends BezierEdgeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  /**\n   * Draw a line between two nodes\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _line(ctx, values, viaNode) {\n    // draw a straight line\n    ctx.beginPath();\n    ctx.moveTo(this.fromPoint.x, this.fromPoint.y);\n\n    // fallback to normal straight edges\n    if (viaNode.x === undefined) {\n      ctx.lineTo(this.toPoint.x, this.toPoint.y);\n    }\n    else {\n      ctx.quadraticCurveTo(viaNode.x, viaNode.y, this.toPoint.x, this.toPoint.y);\n    }\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    ctx.stroke();\n    this.disableShadow(ctx, values);\n  }\n\n  getViaNode() {\n    return this._getViaCoordinates();\n  }\n\n\n  /**\n   * We do not use the to and fromPoints here to make the via nodes the same as edges without arrows.\n   * @returns {{x: undefined, y: undefined}}\n   * @private\n   */\n  _getViaCoordinates() {\n    let xVia = undefined;\n    let yVia = undefined;\n    let factor = this.options.smooth.roundness;\n    let type = this.options.smooth.type;\n    let dx = Math.abs(this.from.x - this.to.x);\n    let dy = Math.abs(this.from.y - this.to.y);\n    if (type === 'discrete' || type === 'diagonalCross') {\n      if (Math.abs(this.from.x - this.to.x) <= Math.abs(this.from.y - this.to.y)) {\n        if (this.from.y >= this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dy;\n            yVia = this.from.y - factor * dy;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dy;\n            yVia = this.from.y - factor * dy;\n          }\n        }\n        else if (this.from.y < this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dy;\n            yVia = this.from.y + factor * dy;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dy;\n            yVia = this.from.y + factor * dy;\n          }\n        }\n        if (type === \"discrete\") {\n          xVia = dx < factor * dy ? this.from.x : xVia;\n        }\n      }\n      else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) {\n        if (this.from.y >= this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dx;\n            yVia = this.from.y - factor * dx;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dx;\n            yVia = this.from.y - factor * dx;\n          }\n        }\n        else if (this.from.y < this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dx;\n            yVia = this.from.y + factor * dx;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dx;\n            yVia = this.from.y + factor * dx;\n          }\n        }\n        if (type === \"discrete\") {\n          yVia = dy < factor * dx ? this.from.y : yVia;\n        }\n      }\n    }\n    else if (type === \"straightCross\") {\n      if (Math.abs(this.from.x - this.to.x) <= Math.abs(this.from.y - this.to.y)) {  // up - down\n        xVia = this.from.x;\n        if (this.from.y < this.to.y) {\n          yVia = this.to.y - (1 - factor) * dy;\n        }\n        else {\n          yVia = this.to.y + (1 - factor) * dy;\n        }\n      }\n      else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right\n        if (this.from.x < this.to.x) {\n          xVia = this.to.x - (1 - factor) * dx;\n        }\n        else {\n          xVia = this.to.x + (1 - factor) * dx;\n        }\n        yVia = this.from.y;\n      }\n    }\n    else if (type === 'horizontal') {\n      if (this.from.x < this.to.x) {\n        xVia = this.to.x - (1 - factor) * dx;\n      }\n      else {\n        xVia = this.to.x + (1 - factor) * dx;\n      }\n      yVia = this.from.y;\n    }\n    else if (type === 'vertical') {\n      xVia = this.from.x;\n      if (this.from.y < this.to.y) {\n        yVia = this.to.y - (1 - factor) * dy;\n      }\n      else {\n        yVia = this.to.y + (1 - factor) * dy;\n      }\n    }\n    else if (type === 'curvedCW') {\n      dx = this.to.x - this.from.x;\n      dy = this.from.y - this.to.y;\n      let radius = Math.sqrt(dx * dx + dy * dy);\n      let pi = Math.PI;\n\n      let originalAngle = Math.atan2(dy, dx);\n      let myAngle = (originalAngle + ((factor * 0.5) + 0.5) * pi) % (2 * pi);\n\n      xVia = this.from.x + (factor * 0.5 + 0.5) * radius * Math.sin(myAngle);\n      yVia = this.from.y + (factor * 0.5 + 0.5) * radius * Math.cos(myAngle);\n    }\n    else if (type === 'curvedCCW') {\n      dx = this.to.x - this.from.x;\n      dy = this.from.y - this.to.y;\n      let radius = Math.sqrt(dx * dx + dy * dy);\n      let pi = Math.PI;\n\n      let originalAngle = Math.atan2(dy, dx);\n      let myAngle = (originalAngle + ((-factor * 0.5) + 0.5) * pi) % (2 * pi);\n\n      xVia = this.from.x + (factor * 0.5 + 0.5) * radius * Math.sin(myAngle);\n      yVia = this.from.y + (factor * 0.5 + 0.5) * radius * Math.cos(myAngle);\n    }\n    else { // continuous\n      if (Math.abs(this.from.x - this.to.x) <= Math.abs(this.from.y - this.to.y)) {\n        if (this.from.y >= this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dy;\n            yVia = this.from.y - factor * dy;\n            xVia = this.to.x < xVia ? this.to.x : xVia;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dy;\n            yVia = this.from.y - factor * dy;\n            xVia = this.to.x > xVia ? this.to.x : xVia;\n          }\n        }\n        else if (this.from.y < this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dy;\n            yVia = this.from.y + factor * dy;\n            xVia = this.to.x < xVia ? this.to.x : xVia;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dy;\n            yVia = this.from.y + factor * dy;\n            xVia = this.to.x > xVia ? this.to.x : xVia;\n          }\n        }\n      }\n      else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) {\n        if (this.from.y >= this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dx;\n            yVia = this.from.y - factor * dx;\n            yVia = this.to.y > yVia ? this.to.y : yVia;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dx;\n            yVia = this.from.y - factor * dx;\n            yVia = this.to.y > yVia ? this.to.y : yVia;\n          }\n        }\n        else if (this.from.y < this.to.y) {\n          if (this.from.x <= this.to.x) {\n            xVia = this.from.x + factor * dx;\n            yVia = this.from.y + factor * dx;\n            yVia = this.to.y < yVia ? this.to.y : yVia;\n          }\n          else if (this.from.x > this.to.x) {\n            xVia = this.from.x - factor * dx;\n            yVia = this.from.y + factor * dx;\n            yVia = this.to.y < yVia ? this.to.y : yVia;\n          }\n        }\n      }\n    }\n    return {x: xVia, y: yVia};\n  }\n\n  _findBorderPosition(nearNode, ctx, options = {}) {\n    return this._findBorderPositionBezier(nearNode, ctx, options.via);\n  }\n\n  _getDistanceToEdge(x1, y1, x2, y2, x3, y3, viaNode = this._getViaCoordinates()) { // x3,y3 is the point\n    return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, viaNode);\n  }\n\n  /**\n   * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way\n   * @param percentage\n   * @param viaNode\n   * @returns {{x: number, y: number}}\n   * @private\n   */\n  getPoint(percentage, viaNode = this._getViaCoordinates()) {\n    var t = percentage;\n    var x = Math.pow(1 - t, 2) * this.fromPoint.x + (2 * t * (1 - t)) * viaNode.x + Math.pow(t, 2) * this.toPoint.x;\n    var y = Math.pow(1 - t, 2) * this.fromPoint.y + (2 * t * (1 - t)) * viaNode.y + Math.pow(t, 2) * this.toPoint.y;\n\n    return {x: x, y: y};\n  }\n}\n\n\nexport default BezierEdgeStatic;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/BezierEdgeStatic.js","import EdgeBase from './util/EdgeBase'\n\nclass StraightEdge extends EdgeBase {\n  constructor(options, body, labelModule) {\n    super(options, body, labelModule);\n  }\n\n  /**\n   * Draw a line between two nodes\n   * @param {CanvasRenderingContext2D} ctx\n   * @private\n   */\n  _line(ctx, values) {\n    // draw a straight line\n    ctx.beginPath();\n    ctx.moveTo(this.fromPoint.x, this.fromPoint.y);\n    ctx.lineTo(this.toPoint.x, this.toPoint.y);\n    // draw shadow if enabled\n    this.enableShadow(ctx, values);\n    ctx.stroke();\n    this.disableShadow(ctx, values);\n  }\n\n  getViaNode() {\n    return undefined;\n  }\n\n  /**\n   * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way\n   * @param percentage\n   * @param via\n   * @returns {{x: number, y: number}}\n   * @private\n   */\n  getPoint(percentage) {\n    return {\n      x: (1 - percentage) * this.fromPoint.x + percentage * this.toPoint.x,\n      y: (1 - percentage) * this.fromPoint.y + percentage * this.toPoint.y\n    }\n  }\n\n  _findBorderPosition(nearNode, ctx) {\n    let node1 = this.to;\n    let node2 = this.from;\n    if (nearNode.id === this.from.id) {\n      node1 = this.from;\n      node2 = this.to;\n    }\n\n    let angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));\n    let dx = (node1.x - node2.x);\n    let dy = (node1.y - node2.y);\n    let edgeSegmentLength = Math.sqrt(dx * dx + dy * dy);\n    let toBorderDist = nearNode.distanceToBorder(ctx, angle);\n    let toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength;\n\n    let borderPos = {};\n    borderPos.x = (1 - toBorderPoint) * node2.x + toBorderPoint * node1.x;\n    borderPos.y = (1 - toBorderPoint) * node2.y + toBorderPoint * node1.y;\n\n    return borderPos;\n  }\n\n  _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { // x3,y3 is the point\n    return this._getDistanceToLine(x1, y1, x2, y2, x3, y3);\n  }\n\n}\n\nexport default StraightEdge;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/edges/StraightEdge.js","import BarnesHutSolver                      from './components/physics/BarnesHutSolver';\nimport Repulsion                            from './components/physics/RepulsionSolver';\nimport HierarchicalRepulsion                from './components/physics/HierarchicalRepulsionSolver';\nimport SpringSolver                         from './components/physics/SpringSolver';\nimport HierarchicalSpringSolver             from './components/physics/HierarchicalSpringSolver';\nimport CentralGravitySolver                 from './components/physics/CentralGravitySolver';\nimport ForceAtlas2BasedRepulsionSolver      from './components/physics/FA2BasedRepulsionSolver';\nimport ForceAtlas2BasedCentralGravitySolver from './components/physics/FA2BasedCentralGravitySolver';\n\nvar util = require('../../util');\n\n\nclass PhysicsEngine {\n  constructor(body) {\n    this.body = body;\n    this.physicsBody = {physicsNodeIndices:[], physicsEdgeIndices:[], forces: {}, velocities: {}};\n\n    this.physicsEnabled = true;\n    this.simulationInterval = 1000 / 60;\n    this.requiresTimeout = true;\n    this.previousStates = {};\n    this.referenceState = {};\n    this.freezeCache = {};\n    this.renderTimer = undefined;\n\n    // parameters for the adaptive timestep\n    this.adaptiveTimestep = false;\n    this.adaptiveTimestepEnabled = false;\n    this.adaptiveCounter = 0;\n    this.adaptiveInterval = 3;\n\n    this.stabilized = false;\n    this.startedStabilization = false;\n    this.stabilizationIterations = 0;\n    this.ready = false; // will be set to true if the stabilize\n\n    // default options\n    this.options = {};\n    this.defaultOptions = {\n      enabled: true,\n      barnesHut: {\n        theta: 0.5,\n        gravitationalConstant: -2000,\n        centralGravity: 0.3,\n        springLength: 95,\n        springConstant: 0.04,\n        damping: 0.09,\n        avoidOverlap: 0\n      },\n      forceAtlas2Based: {\n        theta: 0.5,\n        gravitationalConstant: -50,\n        centralGravity: 0.01,\n        springConstant: 0.08,\n        springLength: 100,\n        damping: 0.4,\n        avoidOverlap: 0\n      },\n      repulsion: {\n        centralGravity: 0.2,\n        springLength: 200,\n        springConstant: 0.05,\n        nodeDistance: 100,\n        damping: 0.09,\n        avoidOverlap: 0\n      },\n      hierarchicalRepulsion: {\n        centralGravity: 0.0,\n        springLength: 100,\n        springConstant: 0.01,\n        nodeDistance: 120,\n        damping: 0.09\n      },\n      maxVelocity: 50,\n      minVelocity: 0.75,    // px/s\n      solver: 'barnesHut',\n      stabilization: {\n        enabled: true,\n        iterations: 1000,   // maximum number of iteration to stabilize\n        updateInterval: 50,\n        onlyDynamicEdges: false,\n        fit: true\n      },\n      timestep: 0.5,\n      adaptiveTimestep: true\n    };\n    util.extend(this.options, this.defaultOptions);\n    this.timestep = 0.5;\n    this.layoutFailed = false;\n\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    this.body.emitter.on('initPhysics',     () => {this.initPhysics();});\n    this.body.emitter.on('_layoutFailed',   () => {this.layoutFailed = true;});\n    this.body.emitter.on('resetPhysics',    () => {this.stopSimulation(); this.ready = false;});\n    this.body.emitter.on('disablePhysics',  () => {this.physicsEnabled = false; this.stopSimulation();});\n    this.body.emitter.on('restorePhysics',  () => {\n      this.setOptions(this.options);\n      if (this.ready === true) {\n        this.startSimulation();\n      }\n    });\n    this.body.emitter.on('startSimulation', () => {\n      if (this.ready === true) {\n        this.startSimulation();\n      }\n    });\n    this.body.emitter.on('stopSimulation',  () => {this.stopSimulation();});\n    this.body.emitter.on('destroy',         () => {\n      this.stopSimulation(false);\n      this.body.emitter.off();\n    });\n    // this event will trigger a rebuilding of the cache everything. Used when nodes or edges have been added or removed.\n    this.body.emitter.on(\"_dataChanged\", () => {\n      // update shortcut lists\n      this.updatePhysicsData();\n    });\n\n    // debug: show forces\n    // this.body.emitter.on(\"afterDrawing\", (ctx) => {this._drawForces(ctx);});\n  }\n\n\n  /**\n   * set the physics options\n   * @param options\n   */\n  setOptions(options) {\n    if (options !== undefined) {\n      if (options === false) {\n        this.options.enabled = false;\n        this.physicsEnabled = false;\n        this.stopSimulation();\n      }\n      else {\n        this.physicsEnabled = true;\n        util.selectiveNotDeepExtend(['stabilization'], this.options, options);\n        util.mergeOptions(this.options, options, 'stabilization');\n\n        if (options.enabled === undefined) {\n          this.options.enabled = true;\n        }\n\n        if (this.options.enabled === false) {\n          this.physicsEnabled = false;\n          this.stopSimulation();\n        }\n\n        // set the timestep\n        this.timestep = this.options.timestep;\n      }\n    }\n    this.init();\n  }\n\n\n  /**\n   * configure the engine.\n   */\n  init() {\n    var options;\n    if (this.options.solver === 'forceAtlas2Based') {\n      options = this.options.forceAtlas2Based;\n      this.nodesSolver = new ForceAtlas2BasedRepulsionSolver(this.body, this.physicsBody, options);\n      this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);\n      this.gravitySolver = new ForceAtlas2BasedCentralGravitySolver(this.body, this.physicsBody, options);\n    }\n    else if (this.options.solver === 'repulsion') {\n      options = this.options.repulsion;\n      this.nodesSolver = new Repulsion(this.body, this.physicsBody, options);\n      this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);\n      this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);\n    }\n    else if (this.options.solver === 'hierarchicalRepulsion') {\n      options = this.options.hierarchicalRepulsion;\n      this.nodesSolver = new HierarchicalRepulsion(this.body, this.physicsBody, options);\n      this.edgesSolver = new HierarchicalSpringSolver(this.body, this.physicsBody, options);\n      this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);\n    }\n    else { // barnesHut\n      options = this.options.barnesHut;\n      this.nodesSolver = new BarnesHutSolver(this.body, this.physicsBody, options);\n      this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);\n      this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);\n    }\n\n    this.modelOptions = options;\n  }\n\n\n  /**\n   * initialize the engine\n   */\n  initPhysics() {\n    if (this.physicsEnabled === true && this.options.enabled === true) {\n      if (this.options.stabilization.enabled === true) {\n        this.stabilize();\n      }\n      else {\n        this.stabilized = false;\n        this.ready = true;\n        this.body.emitter.emit('fit', {}, this.layoutFailed); // if the layout failed, we use the approximation for the zoom\n        this.startSimulation();\n      }\n    }\n    else {\n      this.ready = true;\n      this.body.emitter.emit('fit');\n    }\n  }\n\n  /**\n   * Start the simulation\n   */\n  startSimulation() {\n    if (this.physicsEnabled === true && this.options.enabled === true) {\n      this.stabilized = false;\n\n      // when visible, adaptivity is disabled.\n      this.adaptiveTimestep = false;\n\n      // this sets the width of all nodes initially which could be required for the avoidOverlap\n      this.body.emitter.emit(\"_resizeNodes\");\n      if (this.viewFunction === undefined) {\n        this.viewFunction = this.simulationStep.bind(this);\n        this.body.emitter.on('initRedraw', this.viewFunction);\n        this.body.emitter.emit('_startRendering');\n      }\n    }\n    else {\n      this.body.emitter.emit('_redraw');\n    }\n  }\n\n\n  /**\n   * Stop the simulation, force stabilization.\n   */\n  stopSimulation(emit = true) {\n    this.stabilized = true;\n    if (emit === true) {\n      this._emitStabilized();\n    }\n    if (this.viewFunction !== undefined) {\n      this.body.emitter.off('initRedraw', this.viewFunction);\n      this.viewFunction = undefined;\n      if (emit === true) {\n        this.body.emitter.emit('_stopRendering');\n      }\n    }\n  }\n\n\n  /**\n   * The viewFunction inserts this step into each render loop. It calls the physics tick and handles the cleanup at stabilized.\n   *\n   */\n  simulationStep() {\n    // check if the physics have settled\n    var startTime = Date.now();\n    this.physicsTick();\n    var physicsTime = Date.now() - startTime;\n\n    // run double speed if it is a little graph\n    if ((physicsTime < 0.4 * this.simulationInterval || this.runDoubleSpeed === true) && this.stabilized === false) {\n      this.physicsTick();\n\n      // this makes sure there is no jitter. The decision is taken once to run it at double speed.\n      this.runDoubleSpeed = true;\n    }\n\n    if (this.stabilized === true) {\n      this.stopSimulation();\n    }\n  }\n\n\n  /**\n   * trigger the stabilized event.\n   * @private\n   */\n  _emitStabilized(amountOfIterations = this.stabilizationIterations) {\n    if (this.stabilizationIterations > 1 || this.startedStabilization === true) {\n      setTimeout(() => {\n        this.body.emitter.emit('stabilized', {iterations: amountOfIterations});\n        this.startedStabilization = false;\n        this.stabilizationIterations = 0;\n      }, 0);\n    }\n  }\n\n  /**\n   * A single simulation step (or 'tick') in the physics simulation\n   *\n   * @private\n   */\n  physicsTick() {\n    // this is here to ensure that there is no start event when the network is already stable.\n    if (this.startedStabilization === false) {\n      this.body.emitter.emit('startStabilizing');\n      this.startedStabilization = true;\n    }\n\n    if (this.stabilized === false) {\n      // adaptivity means the timestep adapts to the situation, only applicable for stabilization\n      if (this.adaptiveTimestep === true && this.adaptiveTimestepEnabled === true) {\n        // this is the factor for increasing the timestep on success.\n        let factor = 1.2;\n\n        // we assume the adaptive interval is\n        if (this.adaptiveCounter % this.adaptiveInterval === 0) { // we leave the timestep stable for \"interval\" iterations.\n          // first the big step and revert. Revert saves the reference state.\n          this.timestep = 2 * this.timestep;\n          this.calculateForces();\n          this.moveNodes();\n          this.revert();\n\n          // now the normal step. Since this is the last step, it is the more stable one and we will take this.\n          this.timestep = 0.5 * this.timestep;\n\n          // since it's half the step, we do it twice.\n          this.calculateForces();\n          this.moveNodes();\n          this.calculateForces();\n          this.moveNodes();\n\n          // we compare the two steps. if it is acceptable we double the step.\n          if (this._evaluateStepQuality() === true) {\n            this.timestep = factor * this.timestep;\n          }\n          else {\n            // if not, we decrease the step to a minimum of the options timestep.\n            // if the decreased timestep is smaller than the options step, we do not reset the counter\n            // we assume that the options timestep is stable enough.\n            if (this.timestep/factor < this.options.timestep) {\n              this.timestep = this.options.timestep;\n            }\n            else {\n              // if the timestep was larger than 2 times the option one we check the adaptivity again to ensure\n              // that large instabilities do not form.\n              this.adaptiveCounter = -1; // check again next iteration\n              this.timestep = Math.max(this.options.timestep, this.timestep/factor);\n            }\n          }\n        }\n        else {\n          // normal step, keeping timestep constant\n          this.calculateForces();\n          this.moveNodes();\n        }\n\n        // increment the counter\n        this.adaptiveCounter += 1;\n      }\n      else {\n        // case for the static timestep, we reset it to the one in options and take a normal step.\n        this.timestep = this.options.timestep;\n        this.calculateForces();\n        this.moveNodes();\n      }\n\n      // determine if the network has stabilzied\n      if (this.stabilized === true) {\n        this.revert();\n      }\n\n      this.stabilizationIterations++;\n    }\n  }\n\n  /**\n   * Nodes and edges can have the physics toggles on or off. A collection of indices is created here so we can skip the check all the time.\n   *\n   * @private\n   */\n  updatePhysicsData() {\n    this.physicsBody.forces = {};\n    this.physicsBody.physicsNodeIndices = [];\n    this.physicsBody.physicsEdgeIndices = [];\n    let nodes = this.body.nodes;\n    let edges = this.body.edges;\n\n    // get node indices for physics\n    for (let nodeId in nodes) {\n      if (nodes.hasOwnProperty(nodeId)) {\n        if (nodes[nodeId].options.physics === true) {\n          this.physicsBody.physicsNodeIndices.push(nodes[nodeId].id);\n        }\n      }\n    }\n\n    // get edge indices for physics\n    for (let edgeId in edges) {\n      if (edges.hasOwnProperty(edgeId)) {\n        if (edges[edgeId].options.physics === true) {\n          this.physicsBody.physicsEdgeIndices.push(edges[edgeId].id);\n        }\n      }\n    }\n\n    // get the velocity and the forces vector\n    for (let i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) {\n      let nodeId = this.physicsBody.physicsNodeIndices[i];\n      this.physicsBody.forces[nodeId] = {x:0,y:0};\n\n      // forces can be reset because they are recalculated. Velocities have to persist.\n      if (this.physicsBody.velocities[nodeId] === undefined) {\n        this.physicsBody.velocities[nodeId] = {x:0,y:0};\n      }\n    }\n\n    // clean deleted nodes from the velocity vector\n    for (let nodeId in this.physicsBody.velocities) {\n      if (nodes[nodeId] === undefined) {\n        delete this.physicsBody.velocities[nodeId];\n      }\n    }\n  }\n\n\n  /**\n   * Revert the simulation one step. This is done so after stabilization, every new start of the simulation will also say stabilized.\n   */\n  revert() {\n    var nodeIds = Object.keys(this.previousStates);\n    var nodes = this.body.nodes;\n    var velocities = this.physicsBody.velocities;\n    this.referenceState = {};\n\n    for (let i = 0; i < nodeIds.length; i++) {\n      let nodeId = nodeIds[i];\n      if (nodes[nodeId] !== undefined) {\n        if (nodes[nodeId].options.physics === true) {\n          this.referenceState[nodeId] = {\n            positions: {x:nodes[nodeId].x, y:nodes[nodeId].y}\n          };\n          velocities[nodeId].x = this.previousStates[nodeId].vx;\n          velocities[nodeId].y = this.previousStates[nodeId].vy;\n          nodes[nodeId].x = this.previousStates[nodeId].x;\n          nodes[nodeId].y = this.previousStates[nodeId].y;\n        }\n      }\n      else {\n        delete this.previousStates[nodeId];\n      }\n    }\n  }\n\n  /**\n   * This compares the reference state to the current state\n   */\n  _evaluateStepQuality() {\n    let dx, dy, dpos;\n    let nodes = this.body.nodes;\n    let reference = this.referenceState;\n    let posThreshold = 0.3;\n\n    for (let nodeId in this.referenceState) {\n      if (this.referenceState.hasOwnProperty(nodeId) && nodes[nodeId] !== undefined) {\n        dx = nodes[nodeId].x - reference[nodeId].positions.x;\n        dy = nodes[nodeId].y - reference[nodeId].positions.y;\n\n        dpos = Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2))\n\n        if (dpos > posThreshold) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * move the nodes one timestep and check if they are stabilized\n   * @returns {boolean}\n   */\n  moveNodes() {\n    var nodeIndices = this.physicsBody.physicsNodeIndices;\n    var maxVelocity = this.options.maxVelocity ? this.options.maxVelocity : 1e9;\n    var maxNodeVelocity = 0;\n    var averageNodeVelocity = 0;\n\n    // the velocity threshold (energy in the system) for the adaptivity toggle\n    var velocityAdaptiveThreshold = 5;\n\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      let nodeVelocity = this._performStep(nodeId, maxVelocity);\n      // stabilized is true if stabilized is true and velocity is smaller than vmin --> all nodes must be stabilized\n      maxNodeVelocity = Math.max(maxNodeVelocity,nodeVelocity);\n      averageNodeVelocity += nodeVelocity;\n    }\n\n    // evaluating the stabilized and adaptiveTimestepEnabled conditions\n    this.adaptiveTimestepEnabled = (averageNodeVelocity/nodeIndices.length) < velocityAdaptiveThreshold;\n    this.stabilized = maxNodeVelocity < this.options.minVelocity;\n  }\n\n\n  /**\n   * Perform the actual step\n   *\n   * @param nodeId\n   * @param maxVelocity\n   * @returns {number}\n   * @private\n   */\n  _performStep(nodeId,maxVelocity) {\n    let node = this.body.nodes[nodeId];\n    let timestep = this.timestep;\n    let forces = this.physicsBody.forces;\n    let velocities = this.physicsBody.velocities;\n\n    // store the state so we can revert\n    this.previousStates[nodeId] = {x:node.x, y:node.y, vx:velocities[nodeId].x, vy:velocities[nodeId].y};\n\n    if (node.options.fixed.x === false) {\n      let dx   = this.modelOptions.damping * velocities[nodeId].x;   // damping force\n      let ax   = (forces[nodeId].x - dx) / node.options.mass;        // acceleration\n      velocities[nodeId].x += ax * timestep;                         // velocity\n      velocities[nodeId].x = (Math.abs(velocities[nodeId].x) > maxVelocity) ? ((velocities[nodeId].x > 0) ? maxVelocity : -maxVelocity) : velocities[nodeId].x;\n      node.x   += velocities[nodeId].x * timestep;                    // position\n    }\n    else {\n      forces[nodeId].x = 0;\n      velocities[nodeId].x = 0;\n    }\n\n    if (node.options.fixed.y === false) {\n      let dy   = this.modelOptions.damping * velocities[nodeId].y;    // damping force\n      let ay   = (forces[nodeId].y - dy) / node.options.mass;         // acceleration\n      velocities[nodeId].y += ay * timestep;                          // velocity\n      velocities[nodeId].y = (Math.abs(velocities[nodeId].y) > maxVelocity) ? ((velocities[nodeId].y > 0) ? maxVelocity : -maxVelocity) : velocities[nodeId].y;\n      node.y   += velocities[nodeId].y * timestep;                     // position\n    }\n    else {\n      forces[nodeId].y = 0;\n      velocities[nodeId].y = 0;\n    }\n\n    let totalVelocity = Math.sqrt(Math.pow(velocities[nodeId].x,2) + Math.pow(velocities[nodeId].y,2));\n    return totalVelocity;\n  }\n\n\n  /**\n   * calculate the forces for one physics iteration.\n   */\n  calculateForces() {\n    this.gravitySolver.solve();\n    this.nodesSolver.solve();\n    this.edgesSolver.solve();\n  }\n\n\n\n  /**\n   * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization\n   * because only the supportnodes for the smoothCurves have to settle.\n   *\n   * @private\n   */\n  _freezeNodes() {\n    var nodes = this.body.nodes;\n    for (var id in nodes) {\n      if (nodes.hasOwnProperty(id)) {\n        if (nodes[id].x && nodes[id].y) {\n          this.freezeCache[id] = {x:nodes[id].options.fixed.x,y:nodes[id].options.fixed.y};\n          nodes[id].options.fixed.x = true;\n          nodes[id].options.fixed.y = true;\n        }\n      }\n    }\n  }\n\n  /**\n   * Unfreezes the nodes that have been frozen by _freezeDefinedNodes.\n   *\n   * @private\n   */\n  _restoreFrozenNodes() {\n    var nodes = this.body.nodes;\n    for (var id in nodes) {\n      if (nodes.hasOwnProperty(id)) {\n        if (this.freezeCache[id] !== undefined) {\n          nodes[id].options.fixed.x = this.freezeCache[id].x;\n          nodes[id].options.fixed.y = this.freezeCache[id].y;\n        }\n      }\n    }\n    this.freezeCache = {};\n  }\n\n  /**\n   * Find a stable position for all nodes\n   */\n  stabilize(iterations = this.options.stabilization.iterations) {\n    if (typeof iterations !== 'number') {\n      console.log('The stabilize method needs a numeric amount of iterations. Switching to default: ', this.options.stabilization.iterations);\n      iterations = this.options.stabilization.iterations;\n    }\n\n    if (this.physicsBody.physicsNodeIndices.length === 0) {\n      this.ready = true;\n      return;\n    }\n\n    // enable adaptive timesteps\n    this.adaptiveTimestep = true && this.options.adaptiveTimestep;\n\n    // this sets the width of all nodes initially which could be required for the avoidOverlap\n    this.body.emitter.emit(\"_resizeNodes\");\n\n    // stop the render loop\n    this.stopSimulation();\n\n    // set stabilze to false\n    this.stabilized = false;\n\n    // block redraw requests\n    this.body.emitter.emit('_blockRedraw');\n    this.targetIterations = iterations;\n\n    // start the stabilization\n    if (this.options.stabilization.onlyDynamicEdges === true) {\n      this._freezeNodes();\n    }\n    this.stabilizationIterations = 0;\n\n    setTimeout(() => this._stabilizationBatch(),0);\n  }\n\n\n  /**\n   * One batch of stabilization\n   * @private\n   */\n  _stabilizationBatch() {\n    // this is here to ensure that there is at least one start event.\n    if (this.startedStabilization === false) {\n      this.body.emitter.emit('startStabilizing');\n      this.startedStabilization = true;\n    }\n\n    var count = 0;\n    while (this.stabilized === false && count < this.options.stabilization.updateInterval && this.stabilizationIterations < this.targetIterations) {\n      this.physicsTick();\n      count++;\n    }\n\n    if (this.stabilized === false && this.stabilizationIterations < this.targetIterations) {\n      this.body.emitter.emit('stabilizationProgress', {iterations: this.stabilizationIterations, total: this.targetIterations});\n      setTimeout(this._stabilizationBatch.bind(this),0);\n    }\n    else {\n      this._finalizeStabilization();\n    }\n  }\n\n\n  /**\n   * Wrap up the stabilization, fit and emit the events.\n   * @private\n   */\n  _finalizeStabilization() {\n    this.body.emitter.emit('_allowRedraw');\n    if (this.options.stabilization.fit === true) {\n      this.body.emitter.emit('fit');\n    }\n\n    if (this.options.stabilization.onlyDynamicEdges === true) {\n      this._restoreFrozenNodes();\n    }\n\n    this.body.emitter.emit('stabilizationIterationsDone');\n    this.body.emitter.emit('_requestRedraw');\n\n    if (this.stabilized === true) {\n      this._emitStabilized();\n    }\n    else {\n      this.startSimulation();\n    }\n\n    this.ready = true;\n  }\n\n\n  _drawForces(ctx) {\n    for (var i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) {\n      let node = this.body.nodes[this.physicsBody.physicsNodeIndices[i]];\n      let force = this.physicsBody.forces[this.physicsBody.physicsNodeIndices[i]];\n      let factor = 20;\n      let colorFactor = 0.03;\n      let forceSize = Math.sqrt(Math.pow(force.x,2) + Math.pow(force.x,2));\n\n      let size = Math.min(Math.max(5,forceSize),15);\n      let arrowSize = 3*size;\n\n      let color = util.HSVToHex((180 - Math.min(1,Math.max(0,colorFactor*forceSize))*180) / 360,1,1);\n\n      ctx.lineWidth = size;\n      ctx.strokeStyle = color;\n      ctx.beginPath();\n      ctx.moveTo(node.x,node.y);\n      ctx.lineTo(node.x+factor*force.x, node.y+factor*force.y);\n      ctx.stroke();\n\n      let angle = Math.atan2(force.y, force.x);\n      ctx.fillStyle = color;\n      ctx.arrowEndpoint(node.x + factor*force.x + Math.cos(angle)*arrowSize, node.y + factor*force.y+Math.sin(angle)*arrowSize, angle, arrowSize);\n      ctx.fill();\n    }\n  }\n\n}\n\nexport default PhysicsEngine;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/PhysicsEngine.js","\nclass BarnesHutSolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.barnesHutTree;\n    this.setOptions(options);\n    this.randomSeed = 5;\n\n    // debug: show grid\n    //this.body.emitter.on(\"afterDrawing\", (ctx) => {this._debug(ctx,'#ff0000')})\n  }\n\n  setOptions(options) {\n    this.options = options;\n    this.thetaInversed = 1 / this.options.theta;\n    this.overlapAvoidanceFactor = 1 - Math.max(0, Math.min(1,this.options.avoidOverlap)); // if 1 then min distance = 0.5, if 0.5 then min distance = 0.5 + 0.5*node.shape.radius\n  }\n\n  seededRandom() {\n    var x = Math.sin(this.randomSeed++) * 10000;\n    return x - Math.floor(x);\n  }\n\n\n  /**\n   * This function calculates the forces the nodes apply on each other based on a gravitational model.\n   * The Barnes Hut method is used to speed up this N-body simulation.\n   *\n   * @private\n   */\n  solve() {\n    if (this.options.gravitationalConstant !== 0 && this.physicsBody.physicsNodeIndices.length > 0) {\n      let node;\n      let nodes = this.body.nodes;\n      let nodeIndices = this.physicsBody.physicsNodeIndices;\n      let nodeCount = nodeIndices.length;\n\n      // create the tree\n      let barnesHutTree = this._formBarnesHutTree(nodes, nodeIndices);\n\n      // for debugging\n      this.barnesHutTree = barnesHutTree;\n\n      // place the nodes one by one recursively\n      for (let i = 0; i < nodeCount; i++) {\n        node = nodes[nodeIndices[i]];\n        if (node.options.mass > 0) {\n          // starting with root is irrelevant, it never passes the BarnesHutSolver condition\n          this._getForceContribution(barnesHutTree.root.children.NW, node);\n          this._getForceContribution(barnesHutTree.root.children.NE, node);\n          this._getForceContribution(barnesHutTree.root.children.SW, node);\n          this._getForceContribution(barnesHutTree.root.children.SE, node);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass.\n   * If a region contains a single node, we check if it is not itself, then we apply the force.\n   *\n   * @param parentBranch\n   * @param node\n   * @private\n   */\n  _getForceContribution(parentBranch, node) {\n    // we get no force contribution from an empty region\n    if (parentBranch.childrenCount > 0) {\n      let dx, dy, distance;\n\n      // get the distance from the center of mass to the node.\n      dx = parentBranch.centerOfMass.x - node.x;\n      dy = parentBranch.centerOfMass.y - node.y;\n      distance = Math.sqrt(dx * dx + dy * dy);\n\n      // BarnesHutSolver condition\n      // original condition : s/d < theta = passed  ===  d/s > 1/theta = passed\n      // calcSize = 1/s --> d * 1/s > 1/theta = passed\n      if (distance * parentBranch.calcSize > this.thetaInversed) {\n        this._calculateForces(distance, dx, dy, node, parentBranch);\n      }\n      else {\n        // Did not pass the condition, go into children if available\n        if (parentBranch.childrenCount === 4) {\n          this._getForceContribution(parentBranch.children.NW, node);\n          this._getForceContribution(parentBranch.children.NE, node);\n          this._getForceContribution(parentBranch.children.SW, node);\n          this._getForceContribution(parentBranch.children.SE, node);\n        }\n        else { // parentBranch must have only one node, if it was empty we wouldnt be here\n          if (parentBranch.children.data.id != node.id) { // if it is not self\n            this._calculateForces(distance, dx, dy, node, parentBranch);\n          }\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Calculate the forces based on the distance.\n   *\n   * @param distance\n   * @param dx\n   * @param dy\n   * @param node\n   * @param parentBranch\n   * @private\n   */\n  _calculateForces(distance, dx, dy, node, parentBranch) {\n    if (distance === 0) {\n      distance = 0.1;\n      dx = distance;\n    }\n\n    if (this.overlapAvoidanceFactor < 1 && node.shape.radius) {\n      distance = Math.max(0.1 + (this.overlapAvoidanceFactor * node.shape.radius), distance - node.shape.radius);\n    }\n\n    // the dividing by the distance cubed instead of squared allows us to get the fx and fy components without sines and cosines\n    // it is shorthand for gravityforce with distance squared and fx = dx/distance * gravityForce\n    let gravityForce = this.options.gravitationalConstant * parentBranch.mass * node.options.mass / Math.pow(distance,3);\n    let fx = dx * gravityForce;\n    let fy = dy * gravityForce;\n\n    this.physicsBody.forces[node.id].x += fx;\n    this.physicsBody.forces[node.id].y += fy;\n  }\n\n\n  /**\n   * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes.\n   *\n   * @param nodes\n   * @param nodeIndices\n   * @private\n   */\n  _formBarnesHutTree(nodes, nodeIndices) {\n    let node;\n    let nodeCount = nodeIndices.length;\n\n    let minX = nodes[nodeIndices[0]].x;\n    let minY = nodes[nodeIndices[0]].y;\n    let maxX = nodes[nodeIndices[0]].x;\n    let maxY = nodes[nodeIndices[0]].y;\n\n    // get the range of the nodes\n    for (let i = 1; i < nodeCount; i++) {\n      let x = nodes[nodeIndices[i]].x;\n      let y = nodes[nodeIndices[i]].y;\n      if (nodes[nodeIndices[i]].options.mass > 0) {\n        if (x < minX) {\n          minX = x;\n        }\n        if (x > maxX) {\n          maxX = x;\n        }\n        if (y < minY) {\n          minY = y;\n        }\n        if (y > maxY) {\n          maxY = y;\n        }\n      }\n    }\n    // make the range a square\n    let sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y\n    if (sizeDiff > 0) {\n      minY -= 0.5 * sizeDiff;\n      maxY += 0.5 * sizeDiff;\n    } // xSize > ySize\n    else {\n      minX += 0.5 * sizeDiff;\n      maxX -= 0.5 * sizeDiff;\n    } // xSize < ySize\n\n\n    let minimumTreeSize = 1e-5;\n    let rootSize = Math.max(minimumTreeSize, Math.abs(maxX - minX));\n    let halfRootSize = 0.5 * rootSize;\n    let centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY);\n\n    // construct the barnesHutTree\n    let barnesHutTree = {\n      root: {\n        centerOfMass: {x: 0, y: 0},\n        mass: 0,\n        range: {\n          minX: centerX - halfRootSize, maxX: centerX + halfRootSize,\n          minY: centerY - halfRootSize, maxY: centerY + halfRootSize\n        },\n        size: rootSize,\n        calcSize: 1 / rootSize,\n        children: {data: null},\n        maxWidth: 0,\n        level: 0,\n        childrenCount: 4\n      }\n    };\n    this._splitBranch(barnesHutTree.root);\n\n    // place the nodes one by one recursively\n    for (let i = 0; i < nodeCount; i++) {\n      node = nodes[nodeIndices[i]];\n      if (node.options.mass > 0) {\n        this._placeInTree(barnesHutTree.root, node);\n      }\n    }\n\n    // make global\n    return barnesHutTree\n  }\n\n\n  /**\n   * this updates the mass of a branch. this is increased by adding a node.\n   *\n   * @param parentBranch\n   * @param node\n   * @private\n   */\n  _updateBranchMass(parentBranch, node) {\n    let totalMass = parentBranch.mass + node.options.mass;\n    let totalMassInv = 1 / totalMass;\n\n    parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass;\n    parentBranch.centerOfMass.x *= totalMassInv;\n\n    parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass;\n    parentBranch.centerOfMass.y *= totalMassInv;\n\n    parentBranch.mass = totalMass;\n    let biggestSize = Math.max(Math.max(node.height, node.radius), node.width);\n    parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth;\n\n  }\n\n\n  /**\n   * determine in which branch the node will be placed.\n   *\n   * @param parentBranch\n   * @param node\n   * @param skipMassUpdate\n   * @private\n   */\n  _placeInTree(parentBranch, node, skipMassUpdate) {\n    if (skipMassUpdate != true || skipMassUpdate === undefined) {\n      // update the mass of the branch.\n      this._updateBranchMass(parentBranch, node);\n    }\n\n    if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW\n      if (parentBranch.children.NW.range.maxY > node.y) { // in NW\n        this._placeInRegion(parentBranch, node, \"NW\");\n      }\n      else { // in SW\n        this._placeInRegion(parentBranch, node, \"SW\");\n      }\n    }\n    else { // in NE or SE\n      if (parentBranch.children.NW.range.maxY > node.y) { // in NE\n        this._placeInRegion(parentBranch, node, \"NE\");\n      }\n      else { // in SE\n        this._placeInRegion(parentBranch, node, \"SE\");\n      }\n    }\n  }\n\n\n  /**\n   * actually place the node in a region (or branch)\n   *\n   * @param parentBranch\n   * @param node\n   * @param region\n   * @private\n   */\n  _placeInRegion(parentBranch, node, region) {\n    switch (parentBranch.children[region].childrenCount) {\n      case 0: // place node here\n        parentBranch.children[region].children.data = node;\n        parentBranch.children[region].childrenCount = 1;\n        this._updateBranchMass(parentBranch.children[region], node);\n        break;\n      case 1: // convert into children\n              // if there are two nodes exactly overlapping (on init, on opening of cluster etc.)\n              // we move one node a little bit and we do not put it in the tree.\n        if (parentBranch.children[region].children.data.x === node.x &&\n          parentBranch.children[region].children.data.y === node.y) {\n          node.x += this.seededRandom();\n          node.y += this.seededRandom();\n        }\n        else {\n          this._splitBranch(parentBranch.children[region]);\n          this._placeInTree(parentBranch.children[region], node);\n        }\n        break;\n      case 4: // place in branch\n        this._placeInTree(parentBranch.children[region], node);\n        break;\n    }\n  }\n\n\n  /**\n   * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch\n   * after the split is complete.\n   *\n   * @param parentBranch\n   * @private\n   */\n  _splitBranch(parentBranch) {\n    // if the branch is shaded with a node, replace the node in the new subset.\n    let containedNode = null;\n    if (parentBranch.childrenCount === 1) {\n      containedNode = parentBranch.children.data;\n      parentBranch.mass = 0;\n      parentBranch.centerOfMass.x = 0;\n      parentBranch.centerOfMass.y = 0;\n    }\n    parentBranch.childrenCount = 4;\n    parentBranch.children.data = null;\n    this._insertRegion(parentBranch, \"NW\");\n    this._insertRegion(parentBranch, \"NE\");\n    this._insertRegion(parentBranch, \"SW\");\n    this._insertRegion(parentBranch, \"SE\");\n\n    if (containedNode != null) {\n      this._placeInTree(parentBranch, containedNode);\n    }\n  }\n\n\n  /**\n   * This function subdivides the region into four new segments.\n   * Specifically, this inserts a single new segment.\n   * It fills the children section of the parentBranch\n   *\n   * @param parentBranch\n   * @param region\n   * @param parentRange\n   * @private\n   */\n  _insertRegion(parentBranch, region) {\n    let minX, maxX, minY, maxY;\n    let childSize = 0.5 * parentBranch.size;\n    switch (region) {\n      case \"NW\":\n        minX = parentBranch.range.minX;\n        maxX = parentBranch.range.minX + childSize;\n        minY = parentBranch.range.minY;\n        maxY = parentBranch.range.minY + childSize;\n        break;\n      case \"NE\":\n        minX = parentBranch.range.minX + childSize;\n        maxX = parentBranch.range.maxX;\n        minY = parentBranch.range.minY;\n        maxY = parentBranch.range.minY + childSize;\n        break;\n      case \"SW\":\n        minX = parentBranch.range.minX;\n        maxX = parentBranch.range.minX + childSize;\n        minY = parentBranch.range.minY + childSize;\n        maxY = parentBranch.range.maxY;\n        break;\n      case \"SE\":\n        minX = parentBranch.range.minX + childSize;\n        maxX = parentBranch.range.maxX;\n        minY = parentBranch.range.minY + childSize;\n        maxY = parentBranch.range.maxY;\n        break;\n    }\n\n\n    parentBranch.children[region] = {\n      centerOfMass: {x: 0, y: 0},\n      mass: 0,\n      range: {minX: minX, maxX: maxX, minY: minY, maxY: maxY},\n      size: 0.5 * parentBranch.size,\n      calcSize: 2 * parentBranch.calcSize,\n      children: {data: null},\n      maxWidth: 0,\n      level: parentBranch.level + 1,\n      childrenCount: 0\n    };\n  }\n\n\n\n\n  //---------------------------  DEBUGGING BELOW  ---------------------------//\n\n\n  /**\n   * This function is for debugging purposed, it draws the tree.\n   *\n   * @param ctx\n   * @param color\n   * @private\n   */\n  _debug(ctx, color) {\n    if (this.barnesHutTree !== undefined) {\n\n      ctx.lineWidth = 1;\n\n      this._drawBranch(this.barnesHutTree.root, ctx, color);\n    }\n  }\n\n\n  /**\n   * This function is for debugging purposes. It draws the branches recursively.\n   *\n   * @param branch\n   * @param ctx\n   * @param color\n   * @private\n   */\n  _drawBranch(branch, ctx, color) {\n    if (color === undefined) {\n      color = \"#FF0000\";\n    }\n\n    if (branch.childrenCount === 4) {\n      this._drawBranch(branch.children.NW, ctx);\n      this._drawBranch(branch.children.NE, ctx);\n      this._drawBranch(branch.children.SE, ctx);\n      this._drawBranch(branch.children.SW, ctx);\n    }\n    ctx.strokeStyle = color;\n    ctx.beginPath();\n    ctx.moveTo(branch.range.minX, branch.range.minY);\n    ctx.lineTo(branch.range.maxX, branch.range.minY);\n    ctx.stroke();\n\n    ctx.beginPath();\n    ctx.moveTo(branch.range.maxX, branch.range.minY);\n    ctx.lineTo(branch.range.maxX, branch.range.maxY);\n    ctx.stroke();\n\n    ctx.beginPath();\n    ctx.moveTo(branch.range.maxX, branch.range.maxY);\n    ctx.lineTo(branch.range.minX, branch.range.maxY);\n    ctx.stroke();\n\n    ctx.beginPath();\n    ctx.moveTo(branch.range.minX, branch.range.maxY);\n    ctx.lineTo(branch.range.minX, branch.range.minY);\n    ctx.stroke();\n\n    /*\n     if (branch.mass > 0) {\n     ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass);\n     ctx.stroke();\n     }\n     */\n  }\n}\n\n\nexport default BarnesHutSolver;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/BarnesHutSolver.js","class RepulsionSolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n  /**\n   * Calculate the forces the nodes apply on each other based on a repulsion field.\n   * This field is linearly approximated.\n   *\n   * @private\n   */\n  solve() {\n    var dx, dy, distance, fx, fy, repulsingForce, node1, node2;\n\n    var nodes = this.body.nodes;\n    var nodeIndices = this.physicsBody.physicsNodeIndices;\n    var forces = this.physicsBody.forces;\n\n    // repulsing forces between nodes\n    var nodeDistance = this.options.nodeDistance;\n\n    // approximation constants\n    var a = (-2 / 3) / nodeDistance;\n    var b = 4 / 3;\n\n    // we loop from i over all but the last entree in the array\n    // j loops from i+1 to the last. This way we do not double count any of the indices, nor i === j\n    for (let i = 0; i < nodeIndices.length - 1; i++) {\n      node1 = nodes[nodeIndices[i]];\n      for (let j = i + 1; j < nodeIndices.length; j++) {\n        node2 = nodes[nodeIndices[j]];\n\n        dx = node2.x - node1.x;\n        dy = node2.y - node1.y;\n        distance = Math.sqrt(dx * dx + dy * dy);\n\n        // same condition as BarnesHutSolver, making sure nodes are never 100% overlapping.\n        if (distance === 0) {\n          distance = 0.1*Math.random();\n          dx = distance;\n        }\n\n        if (distance < 2 * nodeDistance) {\n          if (distance < 0.5 * nodeDistance) {\n            repulsingForce = 1.0;\n          }\n          else {\n            repulsingForce = a * distance + b; // linear approx of  1 / (1 + Math.exp((distance / nodeDistance - 1) * steepness))\n          }\n          repulsingForce = repulsingForce / distance;\n\n          fx = dx * repulsingForce;\n          fy = dy * repulsingForce;\n\n          forces[node1.id].x -= fx;\n          forces[node1.id].y -= fy;\n          forces[node2.id].x += fx;\n          forces[node2.id].y += fy;\n        }\n      }\n    }\n  }\n}\n\n\nexport default RepulsionSolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/RepulsionSolver.js","class HierarchicalRepulsionSolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n\n  /**\n   * Calculate the forces the nodes apply on each other based on a repulsion field.\n   * This field is linearly approximated.\n   *\n   * @private\n   */\n  solve() {\n    var dx, dy, distance, fx, fy, repulsingForce, node1, node2, i, j;\n\n    var nodes = this.body.nodes;\n    var nodeIndices = this.physicsBody.physicsNodeIndices;\n    var forces = this.physicsBody.forces;\n\n    // repulsing forces between nodes\n    var nodeDistance = this.options.nodeDistance;\n\n    // we loop from i over all but the last entree in the array\n    // j loops from i+1 to the last. This way we do not double count any of the indices, nor i === j\n    for (i = 0; i < nodeIndices.length - 1; i++) {\n      node1 = nodes[nodeIndices[i]];\n      for (j = i + 1; j < nodeIndices.length; j++) {\n        node2 = nodes[nodeIndices[j]];\n\n        // nodes only affect nodes on their level\n        if (node1.level === node2.level) {\n          dx = node2.x - node1.x;\n          dy = node2.y - node1.y;\n          distance = Math.sqrt(dx * dx + dy * dy);\n\n          var steepness = 0.05;\n          if (distance < nodeDistance) {\n            repulsingForce = -Math.pow(steepness * distance, 2) + Math.pow(steepness * nodeDistance, 2);\n          }\n          else {\n            repulsingForce = 0;\n          }\n          // normalize force with\n          if (distance === 0) {\n            distance = 0.01;\n          }\n          else {\n            repulsingForce = repulsingForce / distance;\n          }\n          fx = dx * repulsingForce;\n          fy = dy * repulsingForce;\n\n          forces[node1.id].x -= fx;\n          forces[node1.id].y -= fy;\n          forces[node2.id].x += fx;\n          forces[node2.id].y += fy;\n        }\n      }\n    }\n  }\n}\n\n\nexport default HierarchicalRepulsionSolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/HierarchicalRepulsionSolver.js","class SpringSolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n\n  /**\n   * This function calculates the springforces on the nodes, accounting for the support nodes.\n   *\n   * @private\n   */\n  solve() {\n    let edgeLength, edge;\n    let edgeIndices = this.physicsBody.physicsEdgeIndices;\n    let edges = this.body.edges;\n    let node1, node2, node3;\n\n    // forces caused by the edges, modelled as springs\n    for (let i = 0; i < edgeIndices.length; i++) {\n      edge = edges[edgeIndices[i]];\n      if (edge.connected === true && edge.toId !== edge.fromId) {\n        // only calculate forces if nodes are in the same sector\n        if (this.body.nodes[edge.toId] !== undefined && this.body.nodes[edge.fromId] !== undefined) {\n          if (edge.edgeType.via !== undefined) {\n            edgeLength = edge.options.length === undefined ? this.options.springLength : edge.options.length;\n            node1 = edge.to;\n            node2 = edge.edgeType.via;\n            node3 = edge.from;\n\n            this._calculateSpringForce(node1, node2, 0.5 * edgeLength);\n            this._calculateSpringForce(node2, node3, 0.5 * edgeLength);\n          }\n          else {\n            // the * 1.5 is here so the edge looks as large as a smooth edge. It does not initially because the smooth edges use\n            // the support nodes which exert a repulsive force on the to and from nodes, making the edge appear larger.\n            edgeLength = edge.options.length === undefined ? this.options.springLength * 1.5: edge.options.length;\n            this._calculateSpringForce(edge.from, edge.to, edgeLength);\n          }\n        }\n      }\n    }\n  }\n\n\n  /**\n   * This is the code actually performing the calculation for the function above.\n   *\n   * @param node1\n   * @param node2\n   * @param edgeLength\n   * @private\n   */\n  _calculateSpringForce(node1, node2, edgeLength) {\n    let dx = (node1.x - node2.x);\n    let dy = (node1.y - node2.y);\n    let distance = Math.max(Math.sqrt(dx * dx + dy * dy),0.01);\n\n    // the 1/distance is so the fx and fy can be calculated without sine or cosine.\n    let springForce = this.options.springConstant * (edgeLength - distance) / distance;\n\n    let fx = dx * springForce;\n    let fy = dy * springForce;\n\n    // handle the case where one node is not part of the physcis\n    if (this.physicsBody.forces[node1.id] !== undefined) {\n      this.physicsBody.forces[node1.id].x += fx;\n      this.physicsBody.forces[node1.id].y += fy;\n    }\n\n    if (this.physicsBody.forces[node2.id] !== undefined) {\n      this.physicsBody.forces[node2.id].x -= fx;\n      this.physicsBody.forces[node2.id].y -= fy;\n    }\n  }\n}\n\nexport default SpringSolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/SpringSolver.js","class HierarchicalSpringSolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n\n  /**\n   * This function calculates the springforces on the nodes, accounting for the support nodes.\n   *\n   * @private\n   */\n  solve() {\n    var edgeLength, edge;\n    var dx, dy, fx, fy, springForce, distance;\n    var edges = this.body.edges;\n    var factor = 0.5;\n\n    var edgeIndices = this.physicsBody.physicsEdgeIndices;\n    var nodeIndices = this.physicsBody.physicsNodeIndices;\n    var forces = this.physicsBody.forces;\n\n    // initialize the spring force counters\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      forces[nodeId].springFx = 0;\n      forces[nodeId].springFy = 0;\n    }\n\n\n    // forces caused by the edges, modelled as springs\n    for (let i = 0; i < edgeIndices.length; i++) {\n      edge = edges[edgeIndices[i]];\n      if (edge.connected === true) {\n        edgeLength = edge.options.length === undefined ? this.options.springLength : edge.options.length;\n\n        dx = (edge.from.x - edge.to.x);\n        dy = (edge.from.y - edge.to.y);\n        distance = Math.sqrt(dx * dx + dy * dy);\n        distance = distance === 0 ? 0.01 : distance;\n\n        // the 1/distance is so the fx and fy can be calculated without sine or cosine.\n        springForce = this.options.springConstant * (edgeLength - distance) / distance;\n\n        fx = dx * springForce;\n        fy = dy * springForce;\n\n        if (edge.to.level != edge.from.level) {\n          if (forces[edge.toId] !== undefined) {\n            forces[edge.toId].springFx -= fx;\n            forces[edge.toId].springFy -= fy;\n          }\n          if (forces[edge.fromId] !== undefined) {\n            forces[edge.fromId].springFx += fx;\n            forces[edge.fromId].springFy += fy;\n          }\n        }\n        else {\n          if (forces[edge.toId] !== undefined) {\n            forces[edge.toId].x -= factor * fx;\n            forces[edge.toId].y -= factor * fy;\n          }\n          if (forces[edge.fromId] !== undefined) {\n            forces[edge.fromId].x += factor * fx;\n            forces[edge.fromId].y += factor * fy;\n          }\n        }\n      }\n    }\n\n    // normalize spring forces\n    var springForce = 1;\n    var springFx, springFy;\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      springFx = Math.min(springForce,Math.max(-springForce,forces[nodeId].springFx));\n      springFy = Math.min(springForce,Math.max(-springForce,forces[nodeId].springFy));\n\n      forces[nodeId].x += springFx;\n      forces[nodeId].y += springFy;\n    }\n\n    // retain energy balance\n    var totalFx = 0;\n    var totalFy = 0;\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      totalFx += forces[nodeId].x;\n      totalFy += forces[nodeId].y;\n    }\n    var correctionFx = totalFx / nodeIndices.length;\n    var correctionFy = totalFy / nodeIndices.length;\n\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      forces[nodeId].x -= correctionFx;\n      forces[nodeId].y -= correctionFy;\n    }\n  }\n\n}\n\nexport default HierarchicalSpringSolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/HierarchicalSpringSolver.js","class CentralGravitySolver {\n  constructor(body, physicsBody, options) {\n    this.body = body;\n    this.physicsBody = physicsBody;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    this.options = options;\n  }\n\n  solve() {\n    let dx, dy, distance, node;\n    let nodes = this.body.nodes;\n    let nodeIndices = this.physicsBody.physicsNodeIndices;\n    let forces = this.physicsBody.forces;\n\n    for (let i = 0; i < nodeIndices.length; i++) {\n      let nodeId = nodeIndices[i];\n      node = nodes[nodeId];\n      dx = -node.x;\n      dy = -node.y;\n      distance = Math.sqrt(dx * dx + dy * dy);\n\n      this._calculateForces(distance, dx, dy, forces, node);\n    }\n  }\n\n  /**\n   * Calculate the forces based on the distance.\n   * @private\n   */\n  _calculateForces(distance, dx, dy, forces, node) {\n    let gravityForce = (distance === 0) ? 0 : (this.options.centralGravity / distance);\n    forces[node.id].x = dx * gravityForce;\n    forces[node.id].y = dy * gravityForce;\n  }\n}\n\n\nexport default CentralGravitySolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/CentralGravitySolver.js","import BarnesHutSolver from \"./BarnesHutSolver\"\n\nclass ForceAtlas2BasedRepulsionSolver extends BarnesHutSolver {\n  constructor(body, physicsBody, options) {\n    super(body, physicsBody, options);\n  }\n\n  /**\n   * Calculate the forces based on the distance.\n   *\n   * @param distance\n   * @param dx\n   * @param dy\n   * @param node\n   * @param parentBranch\n   * @private\n   */\n  _calculateForces(distance, dx, dy, node, parentBranch) {\n    if (distance === 0) {\n      distance = 0.1 * Math.random();\n      dx = distance;\n    }\n\n    if (this.overlapAvoidanceFactor < 1 && node.shape.radius) {\n      distance = Math.max(0.1 + (this.overlapAvoidanceFactor * node.shape.radius), distance - node.shape.radius);\n    }\n\n    let degree = (node.edges.length + 1);\n    // the dividing by the distance cubed instead of squared allows us to get the fx and fy components without sines and cosines\n    // it is shorthand for gravityforce with distance squared and fx = dx/distance * gravityForce\n    let gravityForce = this.options.gravitationalConstant * parentBranch.mass * node.options.mass * degree / Math.pow(distance,2);\n    let fx = dx * gravityForce;\n    let fy = dy * gravityForce;\n\n    this.physicsBody.forces[node.id].x += fx;\n    this.physicsBody.forces[node.id].y += fy;\n  }\n}\n\nexport default ForceAtlas2BasedRepulsionSolver;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/FA2BasedRepulsionSolver.js","import CentralGravitySolver from \"./CentralGravitySolver\"\n\nclass ForceAtlas2BasedCentralGravitySolver extends CentralGravitySolver {\n  constructor(body, physicsBody, options) {\n    super(body, physicsBody, options);\n  }\n\n\n  /**\n   * Calculate the forces based on the distance.\n   * @private\n   */\n  _calculateForces(distance, dx, dy, forces, node) {\n    if (distance > 0) {\n      let degree = (node.edges.length + 1);\n      let gravityForce = this.options.centralGravity * degree * node.options.mass;\n      forces[node.id].x = dx * gravityForce;\n      forces[node.id].y = dy * gravityForce;\n    }\n  }\n}\n\nexport default ForceAtlas2BasedCentralGravitySolver;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/physics/FA2BasedCentralGravitySolver.js","let util = require(\"../../util\");\nimport NetworkUtil from '../NetworkUtil';\nimport Cluster from './components/nodes/Cluster'\n\nclass ClusterEngine {\n  constructor(body) {\n    this.body = body;\n    this.clusteredNodes = {};\n    this.clusteredEdges = {};\n\n    this.options = {};\n    this.defaultOptions = {};\n    util.extend(this.options, this.defaultOptions);\n\n    this.body.emitter.on('_resetData', () => {this.clusteredNodes = {}; this.clusteredEdges = {};})\n  }\n\n  /**\n  *\n  * @param hubsize\n  * @param options\n  */\n  clusterByHubsize(hubsize, options) {\n    if (hubsize === undefined) {\n      hubsize = this._getHubSize();\n    }\n    else if (typeof(hubsize) === \"object\") {\n      options = this._checkOptions(hubsize);\n      hubsize = this._getHubSize();\n    }\n\n    let nodesToCluster = [];\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      let node = this.body.nodes[this.body.nodeIndices[i]];\n      if (node.edges.length >= hubsize) {\n        nodesToCluster.push(node.id);\n      }\n    }\n\n    for (let i = 0; i < nodesToCluster.length; i++) {\n      this.clusterByConnection(nodesToCluster[i],options,true);\n    }\n\n    this.body.emitter.emit('_dataChanged');\n  }\n\n\n  /**\n  * loop over all nodes, check if they adhere to the condition and cluster if needed.\n  * @param options\n  * @param refreshData\n  */\n  cluster(options = {}, refreshData = true) {\n    if (options.joinCondition === undefined) {throw new Error(\"Cannot call clusterByNodeData without a joinCondition function in the options.\");}\n\n    // check if the options object is fine, append if needed\n    options = this._checkOptions(options);\n\n    let childNodesObj = {};\n    let childEdgesObj = {};\n\n    // collect the nodes that will be in the cluster\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      let nodeId = this.body.nodeIndices[i];\n      let node = this.body.nodes[nodeId];\n      let clonedOptions = NetworkUtil.cloneOptions(node);\n      if (options.joinCondition(clonedOptions) === true) {\n        childNodesObj[nodeId] = this.body.nodes[nodeId];\n\n        // collect the nodes that will be in the cluster\n        for (let i = 0; i < node.edges.length; i++) {\n          let edge = node.edges[i];\n          if (this.clusteredEdges[edge.id] === undefined) {\n            childEdgesObj[edge.id] = edge;\n          }\n        }\n      }\n    }\n\n    this._cluster(childNodesObj, childEdgesObj, options, refreshData);\n  }\n\n\n  /**\n   * Cluster all nodes in the network that have only X edges\n   * @param edgeCount\n   * @param options\n   * @param refreshData\n   */\n  clusterByEdgeCount(edgeCount, options, refreshData = true) {\n    options = this._checkOptions(options);\n    let clusters = [];\n    let usedNodes = {};\n    let edge, edges, node, nodeId, relevantEdgeCount;\n    // collect the nodes that will be in the cluster\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      let childNodesObj = {};\n      let childEdgesObj = {};\n      nodeId = this.body.nodeIndices[i];\n\n      // if this node is already used in another cluster this session, we do not have to re-evaluate it.\n      if (usedNodes[nodeId] === undefined) {\n        relevantEdgeCount = 0;\n        node = this.body.nodes[nodeId];\n        edges = [];\n        for (let j = 0; j < node.edges.length; j++) {\n          edge = node.edges[j];\n          if (this.clusteredEdges[edge.id] === undefined) {\n            if (edge.toId !== edge.fromId) {\n              relevantEdgeCount++;\n            }\n            edges.push(edge);\n          }\n        }\n\n        // this node qualifies, we collect its neighbours to start the clustering process.\n        if (relevantEdgeCount === edgeCount) {\n          let gatheringSuccessful = true;\n          for (let j = 0; j < edges.length; j++) {\n            edge = edges[j];\n            let childNodeId = this._getConnectedId(edge, nodeId);\n            // add the nodes to the list by the join condition.\n            if (options.joinCondition === undefined) {\n              childEdgesObj[edge.id] = edge;\n              childNodesObj[nodeId] = this.body.nodes[nodeId];\n              childNodesObj[childNodeId] = this.body.nodes[childNodeId];\n              usedNodes[nodeId] = true;\n            }\n            else {\n              let clonedOptions = NetworkUtil.cloneOptions(this.body.nodes[nodeId]);\n              if (options.joinCondition(clonedOptions) === true) {\n                childEdgesObj[edge.id] = edge;\n                childNodesObj[nodeId] = this.body.nodes[nodeId];\n                usedNodes[nodeId] = true;\n              }\n              else {\n                // this node does not qualify after all.\n                gatheringSuccessful = false;\n                break;\n              }\n            }\n          }\n\n          // add to the cluster queue\n          if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0 && gatheringSuccessful === true) {\n            clusters.push({nodes: childNodesObj, edges: childEdgesObj})\n          }\n        }\n      }\n    }\n\n    for (let i = 0; i < clusters.length; i++) {\n      this._cluster(clusters[i].nodes, clusters[i].edges, options, false)\n    }\n\n    if (refreshData === true) {\n      this.body.emitter.emit('_dataChanged');\n    }\n  }\n\n  /**\n  * Cluster all nodes in the network that have only 1 edge\n  * @param options\n  * @param refreshData\n  */\n  clusterOutliers(options, refreshData = true) {\n    this.clusterByEdgeCount(1,options,refreshData);\n  }\n\n  /**\n   * Cluster all nodes in the network that have only 2 edge\n   * @param options\n   * @param refreshData\n   */\n  clusterBridges(options, refreshData = true) {\n    this.clusterByEdgeCount(2,options,refreshData);\n  }\n\n\n\n  /**\n  * suck all connected nodes of a node into the node.\n  * @param nodeId\n  * @param options\n  * @param refreshData\n  */\n  clusterByConnection(nodeId, options, refreshData = true) {\n    // kill conditions\n    if (nodeId === undefined)             {throw new Error(\"No nodeId supplied to clusterByConnection!\");}\n    if (this.body.nodes[nodeId] === undefined) {throw new Error(\"The nodeId given to clusterByConnection does not exist!\");}\n\n    let node = this.body.nodes[nodeId];\n    options = this._checkOptions(options, node);\n    if (options.clusterNodeProperties.x === undefined) {options.clusterNodeProperties.x = node.x;}\n    if (options.clusterNodeProperties.y === undefined) {options.clusterNodeProperties.y = node.y;}\n    if (options.clusterNodeProperties.fixed === undefined) {\n      options.clusterNodeProperties.fixed = {};\n      options.clusterNodeProperties.fixed.x = node.options.fixed.x;\n      options.clusterNodeProperties.fixed.y = node.options.fixed.y;\n    }\n\n\n    let childNodesObj = {};\n    let childEdgesObj = {};\n    let parentNodeId = node.id;\n    let parentClonedOptions = NetworkUtil.cloneOptions(node);\n    childNodesObj[parentNodeId] = node;\n\n    // collect the nodes that will be in the cluster\n    for (let i = 0; i < node.edges.length; i++) {\n      let edge = node.edges[i];\n      if (this.clusteredEdges[edge.id] === undefined) {\n        let childNodeId = this._getConnectedId(edge, parentNodeId);\n\n        // if the child node is not in a cluster\n        if (this.clusteredNodes[childNodeId] === undefined) {\n          if (childNodeId !== parentNodeId) {\n            if (options.joinCondition === undefined) {\n              childEdgesObj[edge.id] = edge;\n              childNodesObj[childNodeId] = this.body.nodes[childNodeId];\n            }\n            else {\n              // clone the options and insert some additional parameters that could be interesting.\n              let childClonedOptions = NetworkUtil.cloneOptions(this.body.nodes[childNodeId]);\n              if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) {\n                childEdgesObj[edge.id] = edge;\n                childNodesObj[childNodeId] = this.body.nodes[childNodeId];\n              }\n            }\n          }\n          else {\n            // swallow the edge if it is self-referencing.\n            childEdgesObj[edge.id] = edge;\n          }\n        }\n      }\n    }\n    var childNodeIDs = Object.keys(childNodesObj).map(function(childNode){\n      return childNodesObj[childNode].id;\n    })\n\n    for (childNode in childNodesObj) {\n      var childNode = childNodesObj[childNode];\n      for (var y=0; y < childNode.edges.length; y++){\n        var childEdge = childNode.edges[y];\n        if (childNodeIDs.indexOf(this._getConnectedId(childEdge,childNode.id)) > -1){\n          childEdgesObj[childEdge.id] = childEdge;\n        }\n      }\n    }\n    this._cluster(childNodesObj, childEdgesObj, options, refreshData);\n  }\n\n\n  /**\n  * This function creates the edges that will be attached to the cluster\n  * It looks for edges that are connected to the nodes from the \"outside' of the cluster.\n  *\n  * @param childNodesObj\n  * @param childEdgesObj\n  * @param clusterNodeProperties\n  * @param clusterEdgeProperties\n  * @private\n  */\n  _createClusterEdges (childNodesObj, childEdgesObj, clusterNodeProperties, clusterEdgeProperties) {\n    let edge, childNodeId, childNode, toId, fromId, otherNodeId;\n\n    // loop over all child nodes and their edges to find edges going out of the cluster\n    // these edges will be replaced by clusterEdges.\n    let childKeys = Object.keys(childNodesObj);\n    let createEdges = [];\n    for (let i = 0; i < childKeys.length; i++) {\n      childNodeId = childKeys[i];\n      childNode = childNodesObj[childNodeId];\n\n      // construct new edges from the cluster to others\n      for (let j = 0; j < childNode.edges.length; j++) {\n        edge = childNode.edges[j];\n        // we only handle edges that are visible to the system, not the disabled ones from the clustering process.\n        if (this.clusteredEdges[edge.id] === undefined) {\n          // self-referencing edges will be added to the \"hidden\" list\n          if (edge.toId == edge.fromId) {\n            childEdgesObj[edge.id] = edge;\n          }\n          else {\n            // set up the from and to.\n            if (edge.toId == childNodeId) { // this is a double equals because ints and strings can be interchanged here.\n              toId = clusterNodeProperties.id;\n              fromId = edge.fromId;\n              otherNodeId = fromId;\n            }\n            else {\n              toId = edge.toId;\n              fromId = clusterNodeProperties.id;\n              otherNodeId = toId;\n            }\n          }\n\n          // Only edges from the cluster outwards are being replaced.\n          if (childNodesObj[otherNodeId] === undefined) {\n            createEdges.push({edge: edge, fromId: fromId, toId: toId});\n          }\n        }\n      }\n    }\n\n    // here we actually create the replacement edges. We could not do this in the loop above as the creation process\n    // would add an edge to the edges array we are iterating over.\n    for (let j = 0; j < createEdges.length; j++) {\n      let edge = createEdges[j].edge;\n      // copy the options of the edge we will replace\n      let clonedOptions = NetworkUtil.cloneOptions(edge, 'edge');\n      // make sure the properties of clusterEdges are superimposed on it\n      util.deepExtend(clonedOptions, clusterEdgeProperties);\n\n      // set up the edge\n      clonedOptions.from = createEdges[j].fromId;\n      clonedOptions.to = createEdges[j].toId;\n      clonedOptions.id = 'clusterEdge:' + util.randomUUID();\n      //clonedOptions.id = '(cf: ' + createEdges[j].fromId + \" to: \" + createEdges[j].toId + \")\" + Math.random();\n\n      // create the edge and give a reference to the one it replaced.\n      let newEdge = this.body.functions.createEdge(clonedOptions);\n      newEdge.clusteringEdgeReplacingId = edge.id;\n\n      // also reference the new edge in the old edge\n      this.body.edges[edge.id].edgeReplacedById = newEdge.id;\n\n      // connect the edge.\n      this.body.edges[newEdge.id] = newEdge;\n      newEdge.connect();\n\n      // hide the replaced edge\n      this._backupEdgeOptions(edge);\n      edge.setOptions({physics:false, hidden:true});\n    }\n\n  }\n\n  /**\n  * This function checks the options that can be supplied to the different cluster functions\n  * for certain fields and inserts defaults if needed\n  * @param options\n  * @returns {*}\n  * @private\n  */\n  _checkOptions(options = {}) {\n    if (options.clusterEdgeProperties === undefined)    {options.clusterEdgeProperties = {};}\n    if (options.clusterNodeProperties === undefined)    {options.clusterNodeProperties = {};}\n\n    return options;\n  }\n\n  /**\n  *\n  * @param {Object}    childNodesObj         | object with node objects, id as keys, same as childNodes except it also contains a source node\n  * @param {Object}    childEdgesObj         | object with edge objects, id as keys\n  * @param {Array}     options               | object with {clusterNodeProperties, clusterEdgeProperties, processProperties}\n  * @param {Boolean}   refreshData | when true, do not wrap up\n  * @private\n  */\n  _cluster(childNodesObj, childEdgesObj, options, refreshData = true) {\n    // kill condition: no nodes don't bother\n    if (Object.keys(childNodesObj).length == 0) {return;}\n\n    // allow clusters of 1 if options allow\n    if (Object.keys(childNodesObj).length == 1 && options.clusterNodeProperties.allowSingleNodeCluster != true) {return;}\n\n    // check if this cluster call is not trying to cluster anything that is in another cluster.\n    for (let nodeId in childNodesObj) {\n      if (childNodesObj.hasOwnProperty(nodeId)) {\n        if (this.clusteredNodes[nodeId] !== undefined) {\n          return;\n        }\n      }\n    }\n\n    let clusterNodeProperties = util.deepExtend({},options.clusterNodeProperties);\n\n    // construct the clusterNodeProperties\n    if (options.processProperties !== undefined) {\n      // get the childNode options\n      let childNodesOptions = [];\n      for (let nodeId in childNodesObj) {\n        if (childNodesObj.hasOwnProperty(nodeId)) {\n          let clonedOptions = NetworkUtil.cloneOptions(childNodesObj[nodeId]);\n          childNodesOptions.push(clonedOptions);\n        }\n      }\n\n      // get cluster properties based on childNodes\n      let childEdgesOptions = [];\n      for (let edgeId in childEdgesObj) {\n        if (childEdgesObj.hasOwnProperty(edgeId)) {\n          // these cluster edges will be removed on creation of the cluster.\n          if (edgeId.substr(0, 12) !== \"clusterEdge:\") {\n            let clonedOptions = NetworkUtil.cloneOptions(childEdgesObj[edgeId], 'edge');\n            childEdgesOptions.push(clonedOptions);\n          }\n        }\n      }\n\n      clusterNodeProperties = options.processProperties(clusterNodeProperties, childNodesOptions, childEdgesOptions);\n      if (!clusterNodeProperties) {\n        throw new Error(\"The processProperties function does not return properties!\");\n      }\n    }\n\n    // check if we have an unique id;\n    if (clusterNodeProperties.id === undefined) {clusterNodeProperties.id = 'cluster:' + util.randomUUID();}\n    let clusterId = clusterNodeProperties.id;\n\n    if (clusterNodeProperties.label === undefined) {\n      clusterNodeProperties.label = 'cluster';\n    }\n\n\n    // give the clusterNode a position if it does not have one.\n    let pos = undefined;\n    if (clusterNodeProperties.x === undefined) {\n      pos = this._getClusterPosition(childNodesObj);\n      clusterNodeProperties.x = pos.x;\n    }\n    if (clusterNodeProperties.y === undefined) {\n      if (pos === undefined) {pos = this._getClusterPosition(childNodesObj);}\n      clusterNodeProperties.y = pos.y;\n    }\n\n    // force the ID to remain the same\n    clusterNodeProperties.id = clusterId;\n\n    // create the clusterNode\n    let clusterNode = this.body.functions.createNode(clusterNodeProperties, Cluster);\n    clusterNode.isCluster = true;\n    clusterNode.containedNodes = childNodesObj;\n    clusterNode.containedEdges = childEdgesObj;\n    // cache a copy from the cluster edge properties if we have to reconnect others later on\n    clusterNode.clusterEdgeProperties = options.clusterEdgeProperties;\n\n    // finally put the cluster node into global\n    this.body.nodes[clusterNodeProperties.id] = clusterNode;\n\n    // create the new edges that will connect to the cluster, all self-referencing edges will be added to childEdgesObject here.\n    this._createClusterEdges(childNodesObj, childEdgesObj, clusterNodeProperties, options.clusterEdgeProperties);\n\n    // disable the childEdges\n    for (let edgeId in childEdgesObj) {\n      if (childEdgesObj.hasOwnProperty(edgeId)) {\n        if (this.body.edges[edgeId] !== undefined) {\n          let edge = this.body.edges[edgeId];\n          // cache the options before changing\n          this._backupEdgeOptions(edge);\n          // disable physics and hide the edge\n          edge.setOptions({physics:false, hidden:true});\n        }\n      }\n    }\n\n    // disable the childNodes\n    for (let nodeId in childNodesObj) {\n      if (childNodesObj.hasOwnProperty(nodeId)) {\n        this.clusteredNodes[nodeId] = {clusterId:clusterNodeProperties.id, node: this.body.nodes[nodeId]};\n        this.body.nodes[nodeId].setOptions({hidden:true, physics:false});\n      }\n    }\n\n    // set ID to undefined so no duplicates arise\n    clusterNodeProperties.id = undefined;\n\n    // wrap up\n    if (refreshData === true) {\n      this.body.emitter.emit('_dataChanged');\n    }\n  }\n\n  _backupEdgeOptions(edge) {\n    if (this.clusteredEdges[edge.id] === undefined) {\n      this.clusteredEdges[edge.id] = {physics: edge.options.physics, hidden: edge.options.hidden};\n    }\n  }\n\n  _restoreEdge(edge) {\n    let originalOptions = this.clusteredEdges[edge.id];\n    if (originalOptions !== undefined) {\n      edge.setOptions({physics: originalOptions.physics, hidden: originalOptions.hidden});\n      delete this.clusteredEdges[edge.id];\n    }\n  }\n\n\n  /**\n  * Check if a node is a cluster.\n  * @param nodeId\n  * @returns {*}\n  */\n  isCluster(nodeId) {\n    if (this.body.nodes[nodeId] !== undefined) {\n      return this.body.nodes[nodeId].isCluster === true;\n    }\n    else {\n      console.log(\"Node does not exist.\");\n      return false;\n    }\n  }\n\n  /**\n  * get the position of the cluster node based on what's inside\n  * @param {object} childNodesObj    | object with node objects, id as keys\n  * @returns {{x: number, y: number}}\n  * @private\n  */\n  _getClusterPosition(childNodesObj) {\n    let childKeys = Object.keys(childNodesObj);\n    let minX = childNodesObj[childKeys[0]].x;\n    let maxX = childNodesObj[childKeys[0]].x;\n    let minY = childNodesObj[childKeys[0]].y;\n    let maxY = childNodesObj[childKeys[0]].y;\n    let node;\n    for (let i = 1; i < childKeys.length; i++) {\n      node = childNodesObj[childKeys[i]];\n      minX = node.x < minX ? node.x : minX;\n      maxX = node.x > maxX ? node.x : maxX;\n      minY = node.y < minY ? node.y : minY;\n      maxY = node.y > maxY ? node.y : maxY;\n    }\n\n\n    return {x: 0.5*(minX + maxX), y: 0.5*(minY + maxY)};\n  }\n\n\n\n  /**\n  * Open a cluster by calling this function.\n  * @param {String}  clusterNodeId | the ID of the cluster node\n  * @param {Boolean} refreshData | wrap up afterwards if not true\n  */\n  openCluster(clusterNodeId, options, refreshData = true) {\n    // kill conditions\n    if (clusterNodeId === undefined)                    {throw new Error(\"No clusterNodeId supplied to openCluster.\");}\n    if (this.body.nodes[clusterNodeId] === undefined)   {throw new Error(\"The clusterNodeId supplied to openCluster does not exist.\");}\n    if (this.body.nodes[clusterNodeId].containedNodes === undefined) {\n      console.log(\"The node:\" + clusterNodeId + \" is not a cluster.\");\n      return\n    }\n    let clusterNode = this.body.nodes[clusterNodeId];\n    let containedNodes = clusterNode.containedNodes;\n    let containedEdges = clusterNode.containedEdges;\n\n    // allow the user to position the nodes after release.\n    if (options !== undefined && options.releaseFunction !== undefined && typeof options.releaseFunction === 'function') {\n      let positions = {};\n      let clusterPosition = {x:clusterNode.x, y:clusterNode.y};\n      for (let nodeId in containedNodes) {\n        if (containedNodes.hasOwnProperty(nodeId)) {\n          let containedNode = this.body.nodes[nodeId];\n          positions[nodeId] = {x: containedNode.x, y: containedNode.y};\n        }\n      }\n      let newPositions = options.releaseFunction(clusterPosition, positions);\n\n      for (let nodeId in containedNodes) {\n        if (containedNodes.hasOwnProperty(nodeId)) {\n          let containedNode = this.body.nodes[nodeId];\n          if (newPositions[nodeId] !== undefined) {\n            containedNode.x = (newPositions[nodeId].x === undefined ? clusterNode.x : newPositions[nodeId].x);\n            containedNode.y = (newPositions[nodeId].y === undefined ? clusterNode.y : newPositions[nodeId].y);\n          }\n        }\n      }\n    }\n    else {\n      // copy the position from the cluster\n      for (let nodeId in containedNodes) {\n        if (containedNodes.hasOwnProperty(nodeId)) {\n          let containedNode = this.body.nodes[nodeId];\n          containedNode = containedNodes[nodeId];\n          // inherit position\n          if (containedNode.options.fixed.x === false) {containedNode.x = clusterNode.x;}\n          if (containedNode.options.fixed.y === false) {containedNode.y = clusterNode.y;}\n        }\n      }\n    }\n\n    // release nodes\n    for (let nodeId in containedNodes) {\n      if (containedNodes.hasOwnProperty(nodeId)) {\n        let containedNode = this.body.nodes[nodeId];\n\n        // inherit speed\n        containedNode.vx = clusterNode.vx;\n        containedNode.vy = clusterNode.vy;\n\n        // we use these methods to avoid re-instantiating the shape, which happens with setOptions.\n        containedNode.setOptions({hidden:false, physics:true});\n\n        delete this.clusteredNodes[nodeId];\n      }\n    }\n\n    // copy the clusterNode edges because we cannot iterate over an object that we add or remove from.\n    let edgesToBeDeleted = [];\n    for (let i = 0; i < clusterNode.edges.length; i++) {\n      edgesToBeDeleted.push(clusterNode.edges[i]);\n    }\n\n    // actually handling the deleting.\n    for (let i = 0; i < edgesToBeDeleted.length; i++) {\n      let edge = edgesToBeDeleted[i];\n\n      let otherNodeId = this._getConnectedId(edge, clusterNodeId);\n      // if the other node is in another cluster, we transfer ownership of this edge to the other cluster\n      if (this.clusteredNodes[otherNodeId] !== undefined) {\n        // transfer ownership:\n        let otherCluster = this.body.nodes[this.clusteredNodes[otherNodeId].clusterId];\n        let transferEdge = this.body.edges[edge.clusteringEdgeReplacingId];\n        if (transferEdge !== undefined) {\n          otherCluster.containedEdges[transferEdge.id] = transferEdge;\n\n          // delete local reference\n          delete containedEdges[transferEdge.id];\n\n          // create new cluster edge from the otherCluster:\n          // get to and from\n          let fromId = transferEdge.fromId;\n          let toId = transferEdge.toId;\n          if (transferEdge.toId == otherNodeId) {\n            toId = this.clusteredNodes[otherNodeId].clusterId;\n          }\n          else {\n            fromId = this.clusteredNodes[otherNodeId].clusterId;\n          }\n\n          // clone the options and apply the cluster options to them\n          let clonedOptions = NetworkUtil.cloneOptions(transferEdge, 'edge');\n          util.deepExtend(clonedOptions, otherCluster.clusterEdgeProperties);\n\n          // apply the edge specific options to it.\n          let id = 'clusterEdge:' + util.randomUUID();\n          util.deepExtend(clonedOptions, {from: fromId, to: toId, hidden: false, physics: true, id: id});\n\n          // create it\n          let newEdge = this.body.functions.createEdge(clonedOptions);\n          newEdge.clusteringEdgeReplacingId = transferEdge.id;\n          this.body.edges[id] = newEdge;\n          this.body.edges[id].connect();\n        }\n      }\n      else {\n        let replacedEdge = this.body.edges[edge.clusteringEdgeReplacingId];\n        if (replacedEdge !== undefined) {\n          this._restoreEdge(replacedEdge);\n        }\n      }\n      edge.cleanup();\n      // this removes the edge from node.edges, which is why edgeIds is formed\n      edge.disconnect();\n      delete this.body.edges[edge.id];\n    }\n\n    // handle the releasing of the edges\n    for (let edgeId in containedEdges) {\n      if (containedEdges.hasOwnProperty(edgeId)) {\n        this._restoreEdge(containedEdges[edgeId]);\n      }\n    }\n\n    // remove clusterNode\n    delete this.body.nodes[clusterNodeId];\n\n    if (refreshData === true) {\n      this.body.emitter.emit('_dataChanged');\n    }\n  }\n\n  getNodesInCluster(clusterId) {\n    let nodesArray = [];\n    if (this.isCluster(clusterId) === true) {\n      let containedNodes = this.body.nodes[clusterId].containedNodes;\n      for (let nodeId in containedNodes) {\n        if (containedNodes.hasOwnProperty(nodeId)) {\n          nodesArray.push(this.body.nodes[nodeId].id)\n        }\n      }\n    }\n\n    return nodesArray;\n  }\n\n  /**\n  * Get the stack clusterId's that a certain node resides in. cluster A -> cluster B -> cluster C -> node\n  * @param nodeId\n  * @returns {Array}\n  */\n  findNode(nodeId) {\n    let stack = [];\n    let max = 100;\n    let counter = 0;\n\n    while (this.clusteredNodes[nodeId] !== undefined && counter < max) {\n      stack.push(this.body.nodes[nodeId].id);\n      nodeId = this.clusteredNodes[nodeId].clusterId;\n      counter++;\n    }\n    stack.push(this.body.nodes[nodeId].id);\n    stack.reverse();\n\n    return stack;\n  }\n\n  /**\n  * Using a clustered nodeId, update with the new options\n  * @param clusteredNodeId\n  * @param {object} newOptions\n  */\n  updateClusteredNode(clusteredNodeId, newOptions) {\n    if (clusteredNodeId === undefined) {throw new Error(\"No clusteredNodeId supplied to updateClusteredNode.\");}\n    if (newOptions === undefined) {throw new Error(\"No newOptions supplied to updateClusteredNode.\");}\n    if (this.body.nodes[clusteredNodeId] === undefined)   {throw new Error(\"The clusteredNodeId supplied to updateClusteredNode does not exist.\");}\n\n    this.body.nodes[clusteredNodeId].setOptions(newOptions);\n    this.body.emitter.emit('_dataChanged');\n  }\n\n  /**\n  * Using a base edgeId, update all related clustered edges with the new options\n  * @param startEdgeId\n  * @param {object} newOptions\n  */\n  updateEdge(startEdgeId, newOptions) {\n    if (startEdgeId === undefined) {throw new Error(\"No startEdgeId supplied to updateEdge.\");}\n    if (newOptions === undefined) {throw new Error(\"No newOptions supplied to updateEdge.\");}\n    if (this.body.edges[startEdgeId] === undefined)   {throw new Error(\"The startEdgeId supplied to updateEdge does not exist.\");}\n\n    let allEdgeIds = this.getClusteredEdges(startEdgeId);\n    for (let i = 0; i < allEdgeIds.length; i++) {\n      var edge = this.body.edges[allEdgeIds[i]];\n      edge.setOptions(newOptions);\n    }\n    this.body.emitter.emit('_dataChanged');\n  }\n\n  /**\n  * Get a stack of clusterEdgeId's (+base edgeid) that a base edge is the same as. cluster edge C -> cluster edge B -> cluster edge A -> base edge(edgeId)\n  * @param edgeId\n  * @returns {Array}\n  */\n  getClusteredEdges(edgeId) {\n    let stack = [];\n    let max = 100;\n    let counter = 0;\n\n    while (edgeId !== undefined && this.body.edges[edgeId] !== undefined && counter < max) {\n      stack.push(this.body.edges[edgeId].id);\n      edgeId = this.body.edges[edgeId].edgeReplacedById;\n      counter++;\n    }\n    stack.reverse();\n    return stack;\n  }\n\n  /**\n  * Get the base edge id of clusterEdgeId. cluster edge (clusteredEdgeId) -> cluster edge B -> cluster edge C -> base edge\n  * @param clusteredEdgeId\n  * @returns baseEdgeId\n  */\n  getBaseEdge(clusteredEdgeId) {\n    let baseEdgeId = clusteredEdgeId;\n    let max = 100;\n    let counter = 0;\n\n    while (clusteredEdgeId !== undefined && this.body.edges[clusteredEdgeId] !== undefined && counter < max) {\n      clusteredEdgeId = this.body.edges[clusteredEdgeId].clusteringEdgeReplacingId;\n      counter++;\n      if (clusteredEdgeId !== undefined) {\n        baseEdgeId = clusteredEdgeId;\n      }\n    }\n    return baseEdgeId;\n  }\n\n  /**\n  * Get the Id the node is connected to\n  * @param edge\n  * @param nodeId\n  * @returns {*}\n  * @private\n  */\n  _getConnectedId(edge, nodeId) {\n    if (edge.toId != nodeId) {\n      return edge.toId;\n    }\n    else if (edge.fromId != nodeId) {\n      return edge.fromId;\n    }\n    else {\n      return edge.fromId;\n    }\n  }\n\n  /**\n  * We determine how many connections denote an important hub.\n  * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%)\n  *\n  * @private\n  */\n  _getHubSize() {\n    let average = 0;\n    let averageSquared = 0;\n    let hubCounter = 0;\n    let largestHub = 0;\n\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      let node = this.body.nodes[this.body.nodeIndices[i]];\n      if (node.edges.length > largestHub) {\n        largestHub = node.edges.length;\n      }\n      average += node.edges.length;\n      averageSquared += Math.pow(node.edges.length,2);\n      hubCounter += 1;\n    }\n    average = average / hubCounter;\n    averageSquared = averageSquared / hubCounter;\n\n    let variance = averageSquared - Math.pow(average,2);\n    let standardDeviation = Math.sqrt(variance);\n\n    let hubThreshold = Math.floor(average + 2*standardDeviation);\n\n    // always have at least one to cluster\n    if (hubThreshold > largestHub) {\n      hubThreshold = largestHub;\n    }\n\n    return hubThreshold;\n  };\n\n}\n\n\nexport default ClusterEngine;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/Clustering.js","let util = require(\"../util\");\nclass NetworkUtil {\n  constructor() {}\n\n  /**\n   * Find the center position of the network considering the bounding boxes\n   */\n  static getRange(allNodes, specificNodes = []) {\n    var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node;\n    if (specificNodes.length > 0) {\n      for (var i = 0; i < specificNodes.length; i++) {\n        node = allNodes[specificNodes[i]];\n        if (minX > node.shape.boundingBox.left) {\n          minX = node.shape.boundingBox.left;\n        }\n        if (maxX < node.shape.boundingBox.right) {\n          maxX = node.shape.boundingBox.right;\n        }\n        if (minY > node.shape.boundingBox.top) {\n          minY = node.shape.boundingBox.top;\n        } // top is negative, bottom is positive\n        if (maxY < node.shape.boundingBox.bottom) {\n          maxY = node.shape.boundingBox.bottom;\n        } // top is negative, bottom is positive\n      }\n    }\n\n    if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) {\n      minY = 0, maxY = 0, minX = 0, maxX = 0;\n    }\n    return {minX: minX, maxX: maxX, minY: minY, maxY: maxY};\n  }\n\n  /**\n   * Find the center position of the network\n   */\n  static getRangeCore(allNodes, specificNodes = []) {\n    var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node;\n    if (specificNodes.length > 0) {\n      for (var i = 0; i < specificNodes.length; i++) {\n        node = allNodes[specificNodes[i]];\n        if (minX > node.x) {\n          minX = node.x;\n        }\n        if (maxX < node.x) {\n          maxX = node.x;\n        }\n        if (minY > node.y) {\n          minY = node.y;\n        } // top is negative, bottom is positive\n        if (maxY < node.y) {\n          maxY = node.y;\n        } // top is negative, bottom is positive\n      }\n    }\n\n    if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) {\n      minY = 0, maxY = 0, minX = 0, maxX = 0;\n    }\n    return {minX: minX, maxX: maxX, minY: minY, maxY: maxY};\n  }\n\n\n  /**\n   * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY};\n   * @returns {{x: number, y: number}}\n   */\n  static findCenter(range) {\n    return {x: (0.5 * (range.maxX + range.minX)),\n      y: (0.5 * (range.maxY + range.minY))};\n  }\n\n\n  /**\n   * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes.\n   * @param item\n   * @param type\n   * @returns {{}}\n   */\n  static cloneOptions(item, type) {\n    let clonedOptions = {};\n    if (type === undefined || type === 'node') {\n      util.deepExtend(clonedOptions, item.options, true);\n      clonedOptions.x = item.x;\n      clonedOptions.y = item.y;\n      clonedOptions.amountOfConnections = item.edges.length;\n    }\n    else {\n      util.deepExtend(clonedOptions, item.options, true);\n    }\n    return clonedOptions;\n  }\n\n}\n\nexport default NetworkUtil;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/NetworkUtil.js","import Node from '../Node'\n\n/**\n *\n */\nclass Cluster extends Node {\n  constructor(options, body, imagelist, grouplist, globalOptions) {\n    super(options, body, imagelist, grouplist, globalOptions);\n\n    this.isCluster = true;\n    this.containedNodes = {};\n    this.containedEdges = {};\n  }\n}\n\nexport default Cluster;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/nodes/Cluster.js","if (typeof window !== 'undefined') {\n  window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||\n  window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n}\n\nlet util = require('../../util');\n\n\nclass CanvasRenderer {\n  constructor(body, canvas) {\n    this.body = body;\n    this.canvas = canvas;\n\n    this.redrawRequested = false;\n    this.renderTimer = undefined;\n    this.requiresTimeout = true;\n    this.renderingActive = false;\n    this.renderRequests = 0;\n    this.pixelRatio = undefined;\n    this.allowRedraw = true;\n\n    this.dragging = false;\n    this.options = {};\n    this.defaultOptions = {\n      hideEdgesOnDrag: false,\n      hideNodesOnDrag: false\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this._determineBrowserMethod();\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    this.body.emitter.on(\"dragStart\", () => { this.dragging = true; });\n    this.body.emitter.on(\"dragEnd\", () => { this.dragging = false; });\n    this.body.emitter.on(\"_resizeNodes\", () => { this._resizeNodes(); });\n    this.body.emitter.on(\"_redraw\", () => {\n      if (this.renderingActive === false) {\n        this._redraw();\n      }\n    });\n    this.body.emitter.on(\"_blockRedraw\", () => {this.allowRedraw = false;});\n    this.body.emitter.on(\"_allowRedraw\", () => {this.allowRedraw = true; this.redrawRequested = false;});\n    this.body.emitter.on(\"_requestRedraw\", this._requestRedraw.bind(this));\n    this.body.emitter.on(\"_startRendering\", () => {\n      this.renderRequests += 1;\n      this.renderingActive = true;\n      this._startRendering();\n    });\n    this.body.emitter.on(\"_stopRendering\", () => {\n      this.renderRequests -= 1;\n      this.renderingActive = this.renderRequests > 0;\n      this.renderTimer = undefined;\n    });\n    this.body.emitter.on('destroy',  () => {\n      this.renderRequests = 0;\n      this.allowRedraw = false;\n      this.renderingActive = false;\n      if (this.requiresTimeout === true) {\n        clearTimeout(this.renderTimer);\n      }\n      else {\n        cancelAnimationFrame(this.renderTimer);\n      }\n      this.body.emitter.off();\n    });\n\n  }\n\n  setOptions(options) {\n    if (options !== undefined) {\n      let fields = ['hideEdgesOnDrag','hideNodesOnDrag'];\n      util.selectiveDeepExtend(fields,this.options, options);\n    }\n  }\n\n  _startRendering() {\n    if (this.renderingActive === true) {\n      if (this.renderTimer === undefined) {\n        if (this.requiresTimeout === true) {\n          this.renderTimer = window.setTimeout(this._renderStep.bind(this), this.simulationInterval); // wait this.renderTimeStep milliseconds and perform the animation step function\n        }\n        else {\n          this.renderTimer = window.requestAnimationFrame(this._renderStep.bind(this)); // wait this.renderTimeStep milliseconds and perform the animation step function\n        }\n      }\n    }\n  }\n\n  _renderStep() {\n    if (this.renderingActive === true) {\n      // reset the renderTimer so a new scheduled animation step can be set\n      this.renderTimer = undefined;\n\n      if (this.requiresTimeout === true) {\n        // this schedules a new simulation step\n        this._startRendering();\n      }\n\n      this._redraw();\n\n      if (this.requiresTimeout === false) {\n        // this schedules a new simulation step\n        this._startRendering();\n      }\n    }\n  }\n\n  /**\n   * Redraw the network with the current data\n   * chart will be resized too.\n   */\n  redraw() {\n    this.body.emitter.emit('setSize');\n    this._redraw();\n  }\n\n  /**\n   * Redraw the network with the current data\n   * @param hidden | used to get the first estimate of the node sizes. only the nodes are drawn after which they are quickly drawn over.\n   * @private\n   */\n  _requestRedraw() {\n    if (this.redrawRequested !== true && this.renderingActive === false && this.allowRedraw === true) {\n      this.redrawRequested = true;\n      if (this.requiresTimeout === true) {\n        window.setTimeout(() => {this._redraw(false);}, 0);\n      }\n      else {\n        window.requestAnimationFrame(() => {this._redraw(false);});\n      }\n    }\n  }\n\n  _redraw(hidden = false) {\n    if (this.allowRedraw === true) {\n      this.body.emitter.emit(\"initRedraw\");\n\n      this.redrawRequested = false;\n      let ctx = this.canvas.frame.canvas.getContext('2d');\n\n      // when the container div was hidden, this fixes it back up!\n      if (this.canvas.frame.canvas.width === 0 || this.canvas.frame.canvas.height === 0) {\n        this.canvas.setSize();\n      }\n\n      this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n        ctx.mozBackingStorePixelRatio ||\n        ctx.msBackingStorePixelRatio ||\n        ctx.oBackingStorePixelRatio ||\n        ctx.backingStorePixelRatio || 1);\n\n      ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n\n      // clear the canvas\n      let w = this.canvas.frame.canvas.clientWidth;\n      let h = this.canvas.frame.canvas.clientHeight;\n      ctx.clearRect(0, 0, w, h);\n\n      // if the div is hidden, we stop the redraw here for performance.\n      if (this.canvas.frame.clientWidth === 0) {\n        return;\n      }\n\n      // set scaling and translation\n      ctx.save();\n      ctx.translate(this.body.view.translation.x, this.body.view.translation.y);\n      ctx.scale(this.body.view.scale, this.body.view.scale);\n\n      ctx.beginPath();\n      this.body.emitter.emit(\"beforeDrawing\", ctx);\n      ctx.closePath();\n\n      if (hidden === false) {\n        if (this.dragging === false || (this.dragging === true && this.options.hideEdgesOnDrag === false)) {\n          this._drawEdges(ctx);\n        }\n      }\n\n      if (this.dragging === false || (this.dragging === true && this.options.hideNodesOnDrag === false)) {\n        this._drawNodes(ctx, hidden);\n      }\n\n      ctx.beginPath();\n      this.body.emitter.emit(\"afterDrawing\", ctx);\n      ctx.closePath();\n\n\n      // restore original scaling and translation\n      ctx.restore();\n      if (hidden === true) {\n        ctx.clearRect(0, 0, w, h);\n      }\n    }\n  }\n\n\n  /**\n   * Redraw all nodes\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d');\n   * @param {CanvasRenderingContext2D}   ctx\n   * @param {Boolean} [alwaysShow]\n   * @private\n   */\n  _resizeNodes() {\n    let ctx = this.canvas.frame.canvas.getContext('2d');\n    if (this.pixelRatio === undefined) {\n      this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n        ctx.mozBackingStorePixelRatio ||\n        ctx.msBackingStorePixelRatio ||\n        ctx.oBackingStorePixelRatio ||\n        ctx.backingStorePixelRatio || 1);\n    }\n    ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n    ctx.save();\n    ctx.translate(this.body.view.translation.x, this.body.view.translation.y);\n    ctx.scale(this.body.view.scale, this.body.view.scale);\n\n    let nodes = this.body.nodes;\n    let node;\n\n    // resize all nodes\n    for (let nodeId in nodes) {\n      if (nodes.hasOwnProperty(nodeId)) {\n        node = nodes[nodeId];\n        node.resize(ctx);\n        node.updateBoundingBox(ctx, node.selected);\n      }\n    }\n\n    // restore original scaling and translation\n    ctx.restore();\n  }\n\n  /**\n   * Redraw all nodes\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d');\n   * @param {CanvasRenderingContext2D}   ctx\n   * @param {Boolean} [alwaysShow]\n   * @private\n   */\n  _drawNodes(ctx, alwaysShow = false) {\n    let nodes = this.body.nodes;\n    let nodeIndices = this.body.nodeIndices;\n    let node;\n    let selected = [];\n    let margin = 20;\n    let topLeft = this.canvas.DOMtoCanvas({x:-margin,y:-margin});\n    let bottomRight = this.canvas.DOMtoCanvas({\n      x: this.canvas.frame.canvas.clientWidth+margin,\n      y: this.canvas.frame.canvas.clientHeight+margin\n    });\n    let viewableArea = {top:topLeft.y,left:topLeft.x,bottom:bottomRight.y,right:bottomRight.x};\n\n    // draw unselected nodes;\n    for (let i = 0; i < nodeIndices.length; i++) {\n      node = nodes[nodeIndices[i]];\n      // set selected nodes aside\n      if (node.isSelected()) {\n        selected.push(nodeIndices[i]);\n      }\n      else {\n        if (alwaysShow === true) {\n          node.draw(ctx);\n        }\n        else if (node.isBoundingBoxOverlappingWith(viewableArea) === true) {\n          node.draw(ctx);\n        }\n        else {\n          node.updateBoundingBox(ctx, node.selected);\n        }\n      }\n    }\n\n    // draw the selected nodes on top\n    for (let i = 0; i < selected.length; i++) {\n      node = nodes[selected[i]];\n      node.draw(ctx);\n    }\n  }\n\n\n  /**\n   * Redraw all edges\n   * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d');\n   * @param {CanvasRenderingContext2D}   ctx\n   * @private\n   */\n  _drawEdges(ctx) {\n    let edges = this.body.edges;\n    let edgeIndices = this.body.edgeIndices;\n    let edge;\n\n    for (let i = 0; i < edgeIndices.length; i++) {\n      edge = edges[edgeIndices[i]];\n      if (edge.connected === true) {\n        edge.draw(ctx);\n      }\n    }\n  }\n\n  /**\n   * Determine if the browser requires a setTimeout or a requestAnimationFrame. This was required because\n   * some implementations (safari and IE9) did not support requestAnimationFrame\n   * @private\n   */\n  _determineBrowserMethod() {\n    if (typeof window !== 'undefined') {\n      let browserType = navigator.userAgent.toLowerCase();\n      this.requiresTimeout = false;\n      if (browserType.indexOf('msie 9.0') != -1) { // IE 9\n        this.requiresTimeout = true;\n      }\n      else if (browserType.indexOf('safari') != -1) {  // safari\n        if (browserType.indexOf('chrome') <= -1) {\n          this.requiresTimeout = true;\n        }\n      }\n    }\n    else {\n      this.requiresTimeout = true;\n    }\n  }\n\n}\n\nexport default CanvasRenderer;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/CanvasRenderer.js","let Hammer = require('../../module/hammer');\nlet hammerUtil = require('../../hammerUtil');\n\nlet util = require('../../util');\n\n/**\n * Create the main frame for the Network.\n * This function is executed once when a Network object is created. The frame\n * contains a canvas, and this canvas contains all objects like the axis and\n * nodes.\n * @private\n */\nclass Canvas {\n  constructor(body) {\n    this.body = body;\n    this.pixelRatio = 1;\n    this.resizeTimer = undefined;\n    this.resizeFunction = this._onResize.bind(this);\n    this.cameraState = {};\n    this.initialized = false;\n    this.canvasViewCenter = {};\n\n    this.options = {};\n    this.defaultOptions = {\n      autoResize: true,\n      height: '100%',\n      width: '100%'\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    // bind the events\n    this.body.emitter.once(\"resize\", (obj) => {\n      if (obj.width !== 0) {\n        this.body.view.translation.x = obj.width * 0.5;\n      }\n      if (obj.height !== 0) {\n        this.body.view.translation.y = obj.height * 0.5;\n      }\n    });\n    this.body.emitter.on(\"setSize\", this.setSize.bind(this));\n    this.body.emitter.on(\"destroy\", () => {\n      this.hammerFrame.destroy();\n      this.hammer.destroy();\n      this._cleanUp();\n    });\n\n\n  }\n\n  setOptions(options) {\n    if (options !== undefined) {\n      let fields = ['width','height','autoResize'];\n      util.selectiveDeepExtend(fields,this.options, options);\n    }\n\n    if (this.options.autoResize === true) {\n      // automatically adapt to a changing size of the browser.\n      this._cleanUp();\n      this.resizeTimer = setInterval(() => {\n        let changed = this.setSize();\n        if (changed === true) {\n          this.body.emitter.emit(\"_requestRedraw\");\n        }\n      }, 1000);\n      this.resizeFunction = this._onResize.bind(this);\n      util.addEventListener(window,'resize',this.resizeFunction);\n    }\n  }\n\n  _cleanUp() {\n    // automatically adapt to a changing size of the browser.\n    if (this.resizeTimer !== undefined) {\n      clearInterval(this.resizeTimer);\n    }\n    util.removeEventListener(window,'resize',this.resizeFunction);\n    this.resizeFunction = undefined;\n  }\n\n  _onResize() {\n    this.setSize();\n    this.body.emitter.emit(\"_redraw\");\n  }\n\n  /**\n   * Get and store the cameraState\n   * @private\n   */\n  _getCameraState(pixelRatio = this.pixelRatio) {\n    if (this.initialized === true) {\n      this.cameraState.previousWidth = this.frame.canvas.width / pixelRatio;\n      this.cameraState.previousHeight = this.frame.canvas.height / pixelRatio;\n      this.cameraState.scale = this.body.view.scale;\n      this.cameraState.position = this.DOMtoCanvas({\n        x: 0.5 * this.frame.canvas.width / pixelRatio,\n        y: 0.5 * this.frame.canvas.height / pixelRatio\n      });\n    }\n  }\n\n  /**\n   * Set the cameraState\n   * @private\n   */\n  _setCameraState() {\n    if (this.cameraState.scale !== undefined &&\n      this.frame.canvas.clientWidth !== 0 &&\n      this.frame.canvas.clientHeight !== 0 &&\n      this.pixelRatio !== 0 &&\n      this.cameraState.previousWidth > 0) {\n\n      let widthRatio = (this.frame.canvas.width / this.pixelRatio) / this.cameraState.previousWidth;\n      let heightRatio = (this.frame.canvas.height / this.pixelRatio) / this.cameraState.previousHeight;\n      let newScale = this.cameraState.scale;\n\n      if (widthRatio != 1 && heightRatio != 1) {\n        newScale = this.cameraState.scale * 0.5 * (widthRatio + heightRatio);\n      }\n      else if (widthRatio != 1) {\n        newScale = this.cameraState.scale * widthRatio;\n      }\n      else if (heightRatio != 1) {\n        newScale = this.cameraState.scale * heightRatio;\n      }\n\n      this.body.view.scale = newScale;\n      // this comes from the view module.\n      var currentViewCenter = this.DOMtoCanvas({\n        x: 0.5 * this.frame.canvas.clientWidth,\n        y: 0.5 * this.frame.canvas.clientHeight\n      });\n\n      var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node\n        x: currentViewCenter.x - this.cameraState.position.x,\n        y: currentViewCenter.y - this.cameraState.position.y\n      };\n      this.body.view.translation.x += distanceFromCenter.x * this.body.view.scale;\n      this.body.view.translation.y += distanceFromCenter.y * this.body.view.scale;\n    }\n  }\n\n  _prepareValue(value) {\n    if (typeof value === 'number') {\n      return value + 'px';\n    }\n    else if (typeof value === 'string') {\n      if (value.indexOf('%') !== -1 || value.indexOf('px') !== -1) {\n        return value;\n      }\n      else if (value.indexOf('%') === -1) {\n        return value + 'px';\n      }\n    }\n    throw new Error('Could not use the value supplied for width or height:' + value);\n  }\n\n\n  /**\n   * Create the HTML\n   */\n  _create() {\n    // remove all elements from the container element.\n    while (this.body.container.hasChildNodes()) {\n      this.body.container.removeChild(this.body.container.firstChild);\n    }\n\n    this.frame = document.createElement('div');\n    this.frame.className = 'vis-network';\n    this.frame.style.position = 'relative';\n    this.frame.style.overflow = 'hidden';\n    this.frame.tabIndex = 900; // tab index is required for keycharm to bind keystrokes to the div instead of the window\n\n    //////////////////////////////////////////////////////////////////\n\n    this.frame.canvas = document.createElement(\"canvas\");\n    this.frame.canvas.style.position = 'relative';\n    this.frame.appendChild(this.frame.canvas);\n\n    if (!this.frame.canvas.getContext) {\n      let noCanvas = document.createElement( 'DIV' );\n      noCanvas.style.color = 'red';\n      noCanvas.style.fontWeight =  'bold' ;\n      noCanvas.style.padding =  '10px';\n      noCanvas.innerHTML =  'Error: your browser does not support HTML canvas';\n      this.frame.canvas.appendChild(noCanvas);\n    }\n    else {\n      let ctx = this.frame.canvas.getContext(\"2d\");\n      this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n      ctx.mozBackingStorePixelRatio ||\n      ctx.msBackingStorePixelRatio ||\n      ctx.oBackingStorePixelRatio ||\n      ctx.backingStorePixelRatio || 1);\n\n      this.frame.canvas.getContext(\"2d\").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);\n    }\n\n    // add the frame to the container element\n    this.body.container.appendChild(this.frame);\n\n    this.body.view.scale = 1;\n    this.body.view.translation = {x: 0.5 * this.frame.canvas.clientWidth,y: 0.5 * this.frame.canvas.clientHeight};\n\n    this._bindHammer();\n  }\n\n\n  /**\n   * This function binds hammer, it can be repeated over and over due to the uniqueness check.\n   * @private\n   */\n  _bindHammer() {\n    if (this.hammer !== undefined) {\n      this.hammer.destroy();\n    }\n    this.drag = {};\n    this.pinch = {};\n\n    // init hammer\n    this.hammer = new Hammer(this.frame.canvas);\n    this.hammer.get('pinch').set({enable: true});\n    // enable to get better response, todo: test on mobile.\n    this.hammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_ALL});\n\n    hammerUtil.onTouch(this.hammer, (event) => {this.body.eventListeners.onTouch(event)});\n    this.hammer.on('tap',       (event) => {this.body.eventListeners.onTap(event)});\n    this.hammer.on('doubletap', (event) => {this.body.eventListeners.onDoubleTap(event)});\n    this.hammer.on('press',     (event) => {this.body.eventListeners.onHold(event)});\n    this.hammer.on('panstart',  (event) => {this.body.eventListeners.onDragStart(event)});\n    this.hammer.on('panmove',   (event) => {this.body.eventListeners.onDrag(event)});\n    this.hammer.on('panend',    (event) => {this.body.eventListeners.onDragEnd(event)});\n    this.hammer.on('pinch',     (event) => {this.body.eventListeners.onPinch(event)});\n\n    // TODO: neatly cleanup these handlers when re-creating the Canvas, IF these are done with hammer, event.stopPropagation will not work?\n    this.frame.canvas.addEventListener('mousewheel',     (event) => {this.body.eventListeners.onMouseWheel(event)});\n    this.frame.canvas.addEventListener('DOMMouseScroll', (event) => {this.body.eventListeners.onMouseWheel(event)});\n\n    this.frame.canvas.addEventListener('mousemove', (event) => {this.body.eventListeners.onMouseMove(event)});\n    this.frame.canvas.addEventListener('contextmenu', (event) => {this.body.eventListeners.onContext(event)});\n\n    this.hammerFrame = new Hammer(this.frame);\n    hammerUtil.onRelease(this.hammerFrame, (event) => {this.body.eventListeners.onRelease(event)});\n  }\n\n\n  /**\n   * Set a new size for the network\n   * @param {string} width   Width in pixels or percentage (for example '800px'\n   *                         or '50%')\n   * @param {string} height  Height in pixels or percentage  (for example '400px'\n   *                         or '30%')\n   */\n  setSize(width = this.options.width, height = this.options.height) {\n    width = this._prepareValue(width);\n    height= this._prepareValue(height);\n\n    let emitEvent = false;\n    let oldWidth = this.frame.canvas.width;\n    let oldHeight = this.frame.canvas.height;\n\n    // update the pixel ratio\n    let ctx = this.frame.canvas.getContext(\"2d\");\n    let previousRatio = this.pixelRatio; // we cache this because the camera state storage needs the old value\n    this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||\n      ctx.mozBackingStorePixelRatio ||\n      ctx.msBackingStorePixelRatio ||\n      ctx.oBackingStorePixelRatio ||\n      ctx.backingStorePixelRatio || 1);\n\n    if (width != this.options.width || height != this.options.height || this.frame.style.width != width || this.frame.style.height != height) {\n      this._getCameraState(previousRatio);\n\n      this.frame.style.width = width;\n      this.frame.style.height = height;\n\n      this.frame.canvas.style.width = '100%';\n      this.frame.canvas.style.height = '100%';\n\n      this.frame.canvas.width = Math.round(this.frame.canvas.clientWidth * this.pixelRatio);\n      this.frame.canvas.height = Math.round(this.frame.canvas.clientHeight * this.pixelRatio);\n\n      this.options.width = width;\n      this.options.height = height;\n\n      this.canvasViewCenter = {\n        x: 0.5 * this.frame.clientWidth,\n        y: 0.5 * this.frame.clientHeight\n      };\n\n      emitEvent = true;\n    }\n    else {\n      // this would adapt the width of the canvas to the width from 100% if and only if\n      // there is a change.\n\n      // store the camera if there is a change in size.\n      if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio) || this.frame.canvas.height != Math.round(this.frame.canvas.clientHeight * this.pixelRatio)) {\n        this._getCameraState(previousRatio);\n      }\n\n      if (this.frame.canvas.width != Math.round(this.frame.canvas.clientWidth * this.pixelRatio)) {\n        this.frame.canvas.width = Math.round(this.frame.canvas.clientWidth * this.pixelRatio);\n        emitEvent = true;\n      }\n      if (this.frame.canvas.height != Math.round(this.frame.canvas.clientHeight * this.pixelRatio)) {\n        this.frame.canvas.height = Math.round(this.frame.canvas.clientHeight * this.pixelRatio);\n        emitEvent = true;\n      }\n    }\n\n    if (emitEvent === true) {\n      this.body.emitter.emit('resize', {\n        width:Math.round(this.frame.canvas.width / this.pixelRatio),\n        height:Math.round(this.frame.canvas.height / this.pixelRatio),\n        oldWidth: Math.round(oldWidth / this.pixelRatio),\n        oldHeight: Math.round(oldHeight / this.pixelRatio)\n      });\n\n      // restore the camera on change.\n      this._setCameraState();\n    }\n\n\n    // set initialized so the get and set camera will work from now on.\n    this.initialized = true;\n    return emitEvent;\n  };\n\n\n  /**\n   * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to\n   * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon)\n   * @param {number} x\n   * @returns {number}\n   * @private\n   */\n  _XconvertDOMtoCanvas(x) {\n    return (x - this.body.view.translation.x) / this.body.view.scale;\n  }\n\n  /**\n   * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to\n   * the X coordinate in DOM-space (coordinate point in browser relative to the container div)\n   * @param {number} x\n   * @returns {number}\n   * @private\n   */\n  _XconvertCanvasToDOM(x) {\n    return x * this.body.view.scale + this.body.view.translation.x;\n  }\n\n  /**\n   * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to\n   * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon)\n   * @param {number} y\n   * @returns {number}\n   * @private\n   */\n  _YconvertDOMtoCanvas(y) {\n    return (y - this.body.view.translation.y) / this.body.view.scale;\n  }\n\n  /**\n   * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to\n   * the Y coordinate in DOM-space (coordinate point in browser relative to the container div)\n   * @param {number} y\n   * @returns {number}\n   * @private\n   */\n  _YconvertCanvasToDOM(y) {\n    return y * this.body.view.scale + this.body.view.translation.y;\n  }\n\n\n  /**\n   *\n   * @param {object} pos   = {x: number, y: number}\n   * @returns {{x: number, y: number}}\n   * @constructor\n   */\n  canvasToDOM (pos) {\n    return {x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y)};\n  }\n\n  /**\n   *\n   * @param {object} pos   = {x: number, y: number}\n   * @returns {{x: number, y: number}}\n   * @constructor\n   */\n  DOMtoCanvas (pos) {\n    return {x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y)};\n  }\n\n}\n\nexport default Canvas;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/Canvas.js","let util = require('../../util');\n\nimport NetworkUtil from '../NetworkUtil';\n\nclass View {\n  constructor(body, canvas) {\n    this.body = body;\n    this.canvas = canvas;\n\n    this.animationSpeed = 1/this.renderRefreshRate;\n    this.animationEasingFunction = \"easeInOutQuint\";\n    this.easingTime = 0;\n    this.sourceScale = 0;\n    this.targetScale = 0;\n    this.sourceTranslation = 0;\n    this.targetTranslation = 0;\n    this.lockedOnNodeId = undefined;\n    this.lockedOnNodeOffset = undefined;\n    this.touchTime = 0;\n\n    this.viewFunction = undefined;\n\n    this.body.emitter.on(\"fit\",                 this.fit.bind(this));\n    this.body.emitter.on(\"animationFinished\",   () => {this.body.emitter.emit(\"_stopRendering\");});\n    this.body.emitter.on(\"unlockNode\",          this.releaseNode.bind(this));\n  }\n\n\n  setOptions(options = {}) {\n    this.options = options;\n  }\n\n\n  /**\n   * This function zooms out to fit all data on screen based on amount of nodes\n   * @param {Object} Options\n   * @param {Boolean} [initialZoom]  | zoom based on fitted formula or range, true = fitted, default = false;\n   */\n  fit(options = {nodes:[]}, initialZoom = false) {\n    let range;\n    let zoomLevel;\n    if (options.nodes === undefined || options.nodes.length === 0) {\n      options.nodes = this.body.nodeIndices;\n    }\n\n\n    if (initialZoom === true) {\n      // check if more than half of the nodes have a predefined position. If so, we use the range, not the approximation.\n      let positionDefined = 0;\n      for (let nodeId in this.body.nodes) {\n        if (this.body.nodes.hasOwnProperty(nodeId)) {\n          let node = this.body.nodes[nodeId];\n          if (node.predefinedPosition === true) {\n            positionDefined += 1;\n          }\n        }\n      }\n      if (positionDefined > 0.5 * this.body.nodeIndices.length) {\n        this.fit(options,false);\n        return;\n      }\n\n      range = NetworkUtil.getRange(this.body.nodes, options.nodes);\n\n      let numberOfNodes = this.body.nodeIndices.length;\n      zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good.\n\n      // correct for larger canvasses.\n      let factor = Math.min(this.canvas.frame.canvas.clientWidth / 600, this.canvas.frame.canvas.clientHeight / 600);\n      zoomLevel *= factor;\n    }\n    else {\n      this.body.emitter.emit(\"_resizeNodes\");\n      range = NetworkUtil.getRange(this.body.nodes, options.nodes);\n\n      let xDistance = Math.abs(range.maxX - range.minX) * 1.1;\n      let yDistance = Math.abs(range.maxY - range.minY) * 1.1;\n\n      let xZoomLevel = this.canvas.frame.canvas.clientWidth  / xDistance;\n      let yZoomLevel = this.canvas.frame.canvas.clientHeight / yDistance;\n\n      zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel;\n    }\n\n    if (zoomLevel > 1.0) {\n      zoomLevel = 1.0;\n    }\n    else if (zoomLevel === 0) {\n      zoomLevel = 1.0;\n    }\n\n    let center = NetworkUtil.findCenter(range);\n    let animationOptions = {position: center, scale: zoomLevel, animation: options.animation};\n    this.moveTo(animationOptions);\n  }\n  \n  // animation\n\n  /**\n   * Center a node in view.\n   *\n   * @param {Number} nodeId\n   * @param {Number} [options]\n   */\n  focus(nodeId, options = {}) {\n    if (this.body.nodes[nodeId] !== undefined) {\n      let nodePosition = {x: this.body.nodes[nodeId].x, y: this.body.nodes[nodeId].y};\n      options.position = nodePosition;\n      options.lockedOnNode = nodeId;\n\n      this.moveTo(options)\n    }\n    else {\n      console.log(\"Node: \" + nodeId + \" cannot be found.\");\n    }\n  }\n\n  /**\n   *\n   * @param {Object} options  |  options.offset   = {x:Number, y:Number}   // offset from the center in DOM pixels\n   *                          |  options.scale    = Number                 // scale to move to\n   *                          |  options.position = {x:Number, y:Number}   // position to move to\n   *                          |  options.animation = {duration:Number, easingFunction:String} || Boolean   // position to move to\n   */\n  moveTo(options) {\n    if (options === undefined) {\n      options = {};\n      return;\n    }\n    if (options.offset    === undefined)           {options.offset    = {x: 0, y: 0};    }\n    if (options.offset.x  === undefined)           {options.offset.x  = 0;               }\n    if (options.offset.y  === undefined)           {options.offset.y  = 0;               }\n    if (options.scale     === undefined)           {options.scale     = this.body.view.scale;  }\n    if (options.position  === undefined)           {options.position  = this.getViewPosition();}\n    if (options.animation === undefined)           {options.animation = {duration:0};    }\n    if (options.animation === false    )           {options.animation = {duration:0};    }\n    if (options.animation === true     )           {options.animation = {};              }\n    if (options.animation.duration === undefined)  {options.animation.duration = 1000;   }  // default duration\n    if (options.animation.easingFunction === undefined)  {options.animation.easingFunction = \"easeInOutQuad\";  } // default easing function\n\n    this.animateView(options);\n  }\n\n  /**\n   *\n   * @param {Object} options  |  options.offset   = {x:Number, y:Number}   // offset from the center in DOM pixels\n   *                          |  options.time     = Number                 // animation time in milliseconds\n   *                          |  options.scale    = Number                 // scale to animate to\n   *                          |  options.position = {x:Number, y:Number}   // position to animate to\n   *                          |  options.easingFunction = String           // linear, easeInQuad, easeOutQuad, easeInOutQuad,\n   *                                                                       // easeInCubic, easeOutCubic, easeInOutCubic,\n   *                                                                       // easeInQuart, easeOutQuart, easeInOutQuart,\n   *                                                                       // easeInQuint, easeOutQuint, easeInOutQuint\n   */\n  animateView(options) {\n    if (options === undefined) {\n      return;\n    }\n    this.animationEasingFunction = options.animation.easingFunction;\n    // release if something focussed on the node\n    this.releaseNode();\n    if (options.locked === true) {\n      this.lockedOnNodeId = options.lockedOnNode;\n      this.lockedOnNodeOffset = options.offset;\n    }\n\n    // forcefully complete the old animation if it was still running\n    if (this.easingTime != 0) {\n      this._transitionRedraw(true); // by setting easingtime to 1, we finish the animation.\n    }\n\n    this.sourceScale = this.body.view.scale;\n    this.sourceTranslation = this.body.view.translation;\n    this.targetScale = options.scale;\n\n    // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw\n    // but at least then we'll have the target transition\n    this.body.view.scale = this.targetScale;\n    let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});\n\n    let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node\n      x: viewCenter.x - options.position.x,\n      y: viewCenter.y - options.position.y\n    };\n    this.targetTranslation = {\n      x: this.sourceTranslation.x + distanceFromCenter.x * this.targetScale + options.offset.x,\n      y: this.sourceTranslation.y + distanceFromCenter.y * this.targetScale + options.offset.y\n    };\n\n    // if the time is set to 0, don't do an animation\n    if (options.animation.duration === 0) {\n      if (this.lockedOnNodeId != undefined) {\n        this.viewFunction = this._lockedRedraw.bind(this);\n        this.body.emitter.on(\"initRedraw\", this.viewFunction);\n      }\n      else {\n        this.body.view.scale = this.targetScale;\n        this.body.view.translation = this.targetTranslation;\n        this.body.emitter.emit(\"_requestRedraw\");\n      }\n    }\n    else {\n      this.animationSpeed = 1 / (60 * options.animation.duration * 0.001) || 1 / 60; // 60 for 60 seconds, 0.001 for milli's\n      this.animationEasingFunction = options.animation.easingFunction;\n\n\n      this.viewFunction = this._transitionRedraw.bind(this);\n      this.body.emitter.on(\"initRedraw\", this.viewFunction);\n      this.body.emitter.emit(\"_startRendering\");\n    }\n  }\n\n  /**\n   * used to animate smoothly by hijacking the redraw function.\n   * @private\n   */\n  _lockedRedraw() {\n    let nodePosition = {x: this.body.nodes[this.lockedOnNodeId].x, y: this.body.nodes[this.lockedOnNodeId].y};\n    let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});\n    let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node\n      x: viewCenter.x - nodePosition.x,\n      y: viewCenter.y - nodePosition.y\n    };\n    let sourceTranslation = this.body.view.translation;\n    let targetTranslation = {\n      x: sourceTranslation.x + distanceFromCenter.x * this.body.view.scale + this.lockedOnNodeOffset.x,\n      y: sourceTranslation.y + distanceFromCenter.y * this.body.view.scale + this.lockedOnNodeOffset.y\n    };\n\n    this.body.view.translation = targetTranslation;\n  }\n\n  releaseNode() {\n    if (this.lockedOnNodeId !== undefined && this.viewFunction !== undefined) {\n      this.body.emitter.off(\"initRedraw\", this.viewFunction);\n      this.lockedOnNodeId = undefined;\n      this.lockedOnNodeOffset = undefined;\n    }\n  }\n\n  /**\n   *\n   * @param easingTime\n   * @private\n   */\n  _transitionRedraw(finished = false) {\n    this.easingTime += this.animationSpeed;\n    this.easingTime = finished === true ? 1.0 : this.easingTime;\n\n    let progress = util.easingFunctions[this.animationEasingFunction](this.easingTime);\n\n    this.body.view.scale = this.sourceScale + (this.targetScale - this.sourceScale) * progress;\n    this.body.view.translation = {\n      x: this.sourceTranslation.x + (this.targetTranslation.x - this.sourceTranslation.x) * progress,\n      y: this.sourceTranslation.y + (this.targetTranslation.y - this.sourceTranslation.y) * progress\n    };\n\n    // cleanup\n    if (this.easingTime >= 1.0) {\n      this.body.emitter.off(\"initRedraw\", this.viewFunction);\n      this.easingTime = 0;\n      if (this.lockedOnNodeId != undefined) {\n        this.viewFunction = this._lockedRedraw.bind(this);\n        this.body.emitter.on(\"initRedraw\", this.viewFunction);\n      }\n      this.body.emitter.emit(\"animationFinished\");\n    }\n  };\n\n\n  getScale() {\n    return this.body.view.scale;\n  }\n\n  getViewPosition() {\n    return this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});\n  }\n\n\n}\n\nexport default View;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/View.js","let util = require('../../util');\n\nimport NavigationHandler from './components/NavigationHandler'\nimport Popup             from './../../shared/Popup'\n\nclass InteractionHandler {\n  constructor(body, canvas, selectionHandler) {\n    this.body = body;\n    this.canvas = canvas;\n    this.selectionHandler = selectionHandler;\n    this.navigationHandler = new NavigationHandler(body,canvas);\n\n    // bind the events from hammer to functions in this object\n    this.body.eventListeners.onTap        = this.onTap.bind(this);\n    this.body.eventListeners.onTouch      = this.onTouch.bind(this);\n    this.body.eventListeners.onDoubleTap  = this.onDoubleTap.bind(this);\n    this.body.eventListeners.onHold       = this.onHold.bind(this);\n    this.body.eventListeners.onDragStart  = this.onDragStart.bind(this);\n    this.body.eventListeners.onDrag       = this.onDrag.bind(this);\n    this.body.eventListeners.onDragEnd    = this.onDragEnd.bind(this);\n    this.body.eventListeners.onMouseWheel = this.onMouseWheel.bind(this);\n    this.body.eventListeners.onPinch      = this.onPinch.bind(this);\n    this.body.eventListeners.onMouseMove  = this.onMouseMove.bind(this);\n    this.body.eventListeners.onRelease    = this.onRelease.bind(this);\n    this.body.eventListeners.onContext    = this.onContext.bind(this);\n\n    this.touchTime = 0;\n    this.drag = {};\n    this.pinch = {};\n    this.popup = undefined;\n    this.popupObj = undefined;\n    this.popupTimer = undefined;\n\n    this.body.functions.getPointer = this.getPointer.bind(this);\n\n    this.options = {};\n    this.defaultOptions = {\n      dragNodes:true,\n      dragView: true,\n      hover: false,\n      keyboard: {\n        enabled: false,\n        speed: {x: 10, y: 10, zoom: 0.02},\n        bindToWindow: true\n      },\n      navigationButtons: false,\n      tooltipDelay: 300,\n      zoomView: true\n    };\n    util.extend(this.options,this.defaultOptions);\n\n    this.bindEventListeners()\n  }\n\n  bindEventListeners() {\n    this.body.emitter.on('destroy', () => {\n      clearTimeout(this.popupTimer);\n      delete this.body.functions.getPointer;\n    })\n  }\n\n  setOptions(options) {\n    if (options !== undefined) {\n      // extend all but the values in fields\n      let fields = ['hideEdgesOnDrag','hideNodesOnDrag','keyboard','multiselect','selectable','selectConnectedEdges'];\n      util.selectiveNotDeepExtend(fields, this.options, options);\n\n      // merge the keyboard options in.\n      util.mergeOptions(this.options, options, 'keyboard');\n\n      if (options.tooltip) {\n        util.extend(this.options.tooltip, options.tooltip);\n        if (options.tooltip.color) {\n          this.options.tooltip.color = util.parseColor(options.tooltip.color);\n        }\n      }\n    }\n\n    this.navigationHandler.setOptions(this.options);\n  }\n\n\n  /**\n   * Get the pointer location from a touch location\n   * @param {{x: Number, y: Number}} touch\n   * @return {{x: Number, y: Number}} pointer\n   * @private\n   */\n  getPointer(touch) {\n    return {\n      x: touch.x - util.getAbsoluteLeft(this.canvas.frame.canvas),\n      y: touch.y - util.getAbsoluteTop(this.canvas.frame.canvas)\n    };\n  }\n\n\n  /**\n   * On start of a touch gesture, store the pointer\n   * @param event\n   * @private\n   */\n  onTouch(event) {\n    if (new Date().valueOf() - this.touchTime > 50) {\n      this.drag.pointer = this.getPointer(event.center);\n      this.drag.pinched = false;\n      this.pinch.scale = this.body.view.scale;\n      // to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame)\n      this.touchTime = new Date().valueOf();\n    }\n  }\n\n  /**\n   * handle tap/click event: select/unselect a node\n   * @private\n   */\n  onTap(event) {\n    let pointer = this.getPointer(event.center);\n    let multiselect = this.selectionHandler.options.multiselect &&\n        (event.changedPointers[0].ctrlKey || event.changedPointers[0].metaKey);\n\n    this.checkSelectionChanges(pointer, event, multiselect);\n    this.selectionHandler._generateClickEvent('click', event, pointer);\n  }\n\n\n  /**\n   * handle doubletap event\n   * @private\n   */\n  onDoubleTap(event) {\n    let pointer = this.getPointer(event.center);\n    this.selectionHandler._generateClickEvent('doubleClick', event, pointer);\n  }\n\n\n\n  /**\n   * handle long tap event: multi select nodes\n   * @private\n   */\n  onHold(event) {\n    let pointer = this.getPointer(event.center);\n    let multiselect = this.selectionHandler.options.multiselect;\n\n    this.checkSelectionChanges(pointer, event, multiselect);\n\n    this.selectionHandler._generateClickEvent('click', event, pointer);\n    this.selectionHandler._generateClickEvent('hold', event, pointer);\n  }\n\n\n  /**\n   * handle the release of the screen\n   *\n   * @private\n   */\n  onRelease(event) {\n    if (new Date().valueOf() - this.touchTime > 10) {\n      let pointer = this.getPointer(event.center);\n      this.selectionHandler._generateClickEvent('release', event, pointer);\n      // to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame)\n      this.touchTime = new Date().valueOf();\n    }\n  }\n\n  onContext(event) {\n    let pointer = this.getPointer({x:event.clientX, y:event.clientY});\n    this.selectionHandler._generateClickEvent('oncontext', event, pointer);\n  }\n\n\n  /**\n   *\n   * @param pointer\n   * @param add\n   */\n  checkSelectionChanges(pointer, event, add = false) {\n    let previouslySelectedEdgeCount = this.selectionHandler._getSelectedEdgeCount();\n    let previouslySelectedNodeCount = this.selectionHandler._getSelectedNodeCount();\n    let previousSelection = this.selectionHandler.getSelection();\n    let selected;\n    if (add === true) {\n      selected = this.selectionHandler.selectAdditionalOnPoint(pointer);\n    }\n    else {\n      selected = this.selectionHandler.selectOnPoint(pointer);\n    }\n    let selectedEdgesCount = this.selectionHandler._getSelectedEdgeCount();\n    let selectedNodesCount = this.selectionHandler._getSelectedNodeCount();\n    let currentSelection = this.selectionHandler.getSelection();\n\n    let {nodesChanged, edgesChanged} = this._determineIfDifferent(previousSelection, currentSelection);\n    let nodeSelected = false;\n\n    if (selectedNodesCount - previouslySelectedNodeCount > 0) { // node was selected\n      this.selectionHandler._generateClickEvent('selectNode', event, pointer);\n      selected = true;\n      nodeSelected = true;\n    }\n    else if (nodesChanged === true && selectedNodesCount > 0) {\n      this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection);\n      this.selectionHandler._generateClickEvent('selectNode', event, pointer);\n      nodeSelected = true;\n      selected = true;\n    }\n    else if (selectedNodesCount - previouslySelectedNodeCount < 0) { // node was deselected\n      this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection);\n      selected = true;\n    }\n\n\n    // handle the selected edges\n    if (selectedEdgesCount - previouslySelectedEdgeCount > 0 && nodeSelected === false) { // edge was selected\n      this.selectionHandler._generateClickEvent('selectEdge', event, pointer);\n      selected = true;\n    }\n    else if (selectedEdgesCount > 0 && edgesChanged === true) {\n      this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection);\n      this.selectionHandler._generateClickEvent('selectEdge', event, pointer);\n      selected = true;\n    }\n    else if (selectedEdgesCount - previouslySelectedEdgeCount < 0) { // edge was deselected\n      this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection);\n      selected = true;\n    }\n\n\n    // fire the select event if anything has been selected or deselected\n    if (selected === true) { // select or unselect\n      this.selectionHandler._generateClickEvent('select', event, pointer);\n    }\n  }\n\n\n  /**\n   * This function checks if the nodes and edges previously selected have changed.\n   * @param previousSelection\n   * @param currentSelection\n   * @returns {{nodesChanged: boolean, edgesChanged: boolean}}\n   * @private\n   */\n  _determineIfDifferent(previousSelection,currentSelection) {\n    let nodesChanged = false;\n    let edgesChanged = false;\n\n    for (let i = 0; i < previousSelection.nodes.length; i++) {\n      if (currentSelection.nodes.indexOf(previousSelection.nodes[i]) === -1) {\n        nodesChanged = true;\n      }\n    }\n    for (let i = 0; i < currentSelection.nodes.length; i++) {\n      if (previousSelection.nodes.indexOf(previousSelection.nodes[i]) === -1) {\n        nodesChanged = true;\n      }\n    }\n    for (let i = 0; i < previousSelection.edges.length; i++) {\n      if (currentSelection.edges.indexOf(previousSelection.edges[i]) === -1) {\n        edgesChanged = true;\n      }\n    }\n    for (let i = 0; i < currentSelection.edges.length; i++) {\n      if (previousSelection.edges.indexOf(previousSelection.edges[i]) === -1) {\n        edgesChanged = true;\n      }\n    }\n\n    return {nodesChanged, edgesChanged};\n  }\n\n\n  /**\n   * This function is called by onDragStart.\n   * It is separated out because we can then overload it for the datamanipulation system.\n   *\n   * @private\n   */\n  onDragStart(event) {\n    //in case the touch event was triggered on an external div, do the initial touch now.\n    if (this.drag.pointer === undefined) {\n      this.onTouch(event);\n    }\n\n    // note: drag.pointer is set in onTouch to get the initial touch location\n    let node = this.selectionHandler.getNodeAt(this.drag.pointer);\n\n    this.drag.dragging = true;\n    this.drag.selection = [];\n    this.drag.translation = util.extend({},this.body.view.translation); // copy the object\n    this.drag.nodeId = undefined;\n\n    if (node !== undefined && this.options.dragNodes === true) {\n      this.drag.nodeId = node.id;\n      // select the clicked node if not yet selected\n      if (node.isSelected() === false) {\n        this.selectionHandler.unselectAll();\n        this.selectionHandler.selectObject(node);\n      }\n\n      // after select to contain the node\n      this.selectionHandler._generateClickEvent('dragStart', event, this.drag.pointer);\n\n      let selection = this.selectionHandler.selectionObj.nodes;\n      // create an array with the selected nodes and their original location and status\n      for (let nodeId in selection) {\n        if (selection.hasOwnProperty(nodeId)) {\n          let object = selection[nodeId];\n          let s = {\n            id: object.id,\n            node: object,\n\n            // store original x, y, xFixed and yFixed, make the node temporarily Fixed\n            x: object.x,\n            y: object.y,\n            xFixed: object.options.fixed.x,\n            yFixed: object.options.fixed.y\n          };\n\n          object.options.fixed.x = true;\n          object.options.fixed.y = true;\n\n          this.drag.selection.push(s);\n        }\n      }\n    }\n    else {\n      // fallback if no node is selected and thus the view is dragged.\n      this.selectionHandler._generateClickEvent('dragStart', event, this.drag.pointer, undefined, true);\n    }\n  }\n\n\n  /**\n   * handle drag event\n   * @private\n   */\n  onDrag(event) {\n    if (this.drag.pinched === true) {\n      return;\n    }\n\n    // remove the focus on node if it is focussed on by the focusOnNode\n    this.body.emitter.emit('unlockNode');\n\n    let pointer = this.getPointer(event.center);\n\n    let selection = this.drag.selection;\n    if (selection && selection.length && this.options.dragNodes === true) {\n      this.selectionHandler._generateClickEvent('dragging', event, pointer);\n\n      // calculate delta's and new location\n      let deltaX = pointer.x - this.drag.pointer.x;\n      let deltaY = pointer.y - this.drag.pointer.y;\n\n      // update position of all selected nodes\n      selection.forEach((selection) => {\n        let node = selection.node;\n        // only move the node if it was not fixed initially\n        if (selection.xFixed === false) {\n          node.x = this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(selection.x) + deltaX);\n        }\n        // only move the node if it was not fixed initially\n        if (selection.yFixed === false) {\n          node.y = this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(selection.y) + deltaY);\n        }\n      });\n\n      // start the simulation of the physics\n      this.body.emitter.emit('startSimulation');\n    }\n    else {\n      // move the network\n      if (this.options.dragView === true) {\n        this.selectionHandler._generateClickEvent('dragging', event, pointer, undefined, true);\n\n        // if the drag was not started properly because the click started outside the network div, start it now.\n        if (this.drag.pointer === undefined) {\n          this.onDragStart(event);\n          return;\n        }\n        let diffX = pointer.x - this.drag.pointer.x;\n        let diffY = pointer.y - this.drag.pointer.y;\n\n        this.body.view.translation = {x:this.drag.translation.x + diffX, y:this.drag.translation.y + diffY};\n        this.body.emitter.emit('_redraw');\n      }\n    }\n  }\n\n\n  /**\n   * handle drag start event\n   * @private\n   */\n  onDragEnd(event) {\n    this.drag.dragging = false;\n    let selection = this.drag.selection;\n    if (selection && selection.length) {\n      selection.forEach(function (s) {\n        // restore original xFixed and yFixed\n        s.node.options.fixed.x = s.xFixed;\n        s.node.options.fixed.y = s.yFixed;\n      });\n      this.selectionHandler._generateClickEvent('dragEnd', event, this.getPointer(event.center));\n      this.body.emitter.emit('startSimulation');\n    }\n    else {\n      this.selectionHandler._generateClickEvent('dragEnd', event, this.getPointer(event.center), undefined, true);\n      this.body.emitter.emit('_requestRedraw');\n    }\n  }\n\n\n\n  /**\n   * Handle pinch event\n   * @param event\n   * @private\n   */\n  onPinch(event) {\n    let pointer = this.getPointer(event.center);\n\n    this.drag.pinched = true;\n    if (this.pinch['scale'] === undefined) {\n      this.pinch.scale = 1;\n    }\n\n    // TODO: enabled moving while pinching?\n    let scale = this.pinch.scale * event.scale;\n    this.zoom(scale, pointer)\n  }\n\n\n  /**\n   * Zoom the network in or out\n   * @param {Number} scale a number around 1, and between 0.01 and 10\n   * @param {{x: Number, y: Number}} pointer    Position on screen\n   * @return {Number} appliedScale    scale is limited within the boundaries\n   * @private\n   */\n  zoom(scale, pointer) {\n    if (this.options.zoomView === true) {\n      let scaleOld = this.body.view.scale;\n      if (scale < 0.00001) {\n        scale = 0.00001;\n      }\n      if (scale > 10) {\n        scale = 10;\n      }\n\n      let preScaleDragPointer = undefined;\n      if (this.drag !== undefined) {\n        if (this.drag.dragging === true) {\n          preScaleDragPointer = this.canvas.DOMtoCanvas(this.drag.pointer);\n        }\n      }\n      // + this.canvas.frame.canvas.clientHeight / 2\n      let translation = this.body.view.translation;\n\n      let scaleFrac = scale / scaleOld;\n      let tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac;\n      let ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac;\n\n      this.body.view.scale = scale;\n      this.body.view.translation = {x:tx, y:ty};\n\n      if (preScaleDragPointer != undefined) {\n        let postScaleDragPointer = this.canvas.canvasToDOM(preScaleDragPointer);\n        this.drag.pointer.x = postScaleDragPointer.x;\n        this.drag.pointer.y = postScaleDragPointer.y;\n      }\n\n      this.body.emitter.emit('_requestRedraw');\n\n      if (scaleOld < scale) {\n        this.body.emitter.emit('zoom', {direction: '+', scale: this.body.view.scale, pointer: pointer});\n      }\n      else {\n        this.body.emitter.emit('zoom', {direction: '-', scale: this.body.view.scale, pointer: pointer});\n      }\n    }\n  }\n\n\n  /**\n   * Event handler for mouse wheel event, used to zoom the timeline\n   * See http://adomas.org/javascript-mouse-wheel/\n   *     https://github.com/EightMedia/hammer.js/issues/256\n   * @param {MouseEvent}  event\n   * @private\n   */\n  onMouseWheel(event) {\n    if (this.options.zoomView === true) {\n      // retrieve delta\n      let delta = 0;\n      if (event.wheelDelta) { /* IE/Opera. */\n        delta = event.wheelDelta / 120;\n      }\n      else if (event.detail) { /* Mozilla case. */\n        // In Mozilla, sign of delta is different than in IE.\n        // Also, delta is multiple of 3.\n        delta = -event.detail / 3;\n      }\n\n      // If delta is nonzero, handle it.\n      // Basically, delta is now positive if wheel was scrolled up,\n      // and negative, if wheel was scrolled down.\n      if (delta !== 0) {\n\n        // calculate the new scale\n        let scale = this.body.view.scale;\n        let zoom = delta / 10;\n        if (delta < 0) {\n          zoom = zoom / (1 - zoom);\n        }\n        scale *= (1 + zoom);\n\n        // calculate the pointer location\n        let pointer = this.getPointer({x: event.clientX, y: event.clientY});\n\n        // apply the new scale\n        this.zoom(scale, pointer);\n      }\n\n      // Prevent default actions caused by mouse wheel.\n      event.preventDefault();\n    }\n  }\n\n\n  /**\n   * Mouse move handler for checking whether the title moves over a node with a title.\n   * @param  {Event} event\n   * @private\n   */\n  onMouseMove(event) {\n    let pointer = this.getPointer({x:event.clientX, y:event.clientY});\n    let popupVisible = false;\n\n    // check if the previously selected node is still selected\n    if (this.popup !== undefined) {\n      if (this.popup.hidden === false) {\n        this._checkHidePopup(pointer);\n      }\n\n      // if the popup was not hidden above\n      if (this.popup.hidden === false) {\n        popupVisible = true;\n        this.popup.setPosition(pointer.x + 3, pointer.y - 5);\n        this.popup.show();\n      }\n    }\n\n    // if we bind the keyboard to the div, we have to highlight it to use it. This highlights it on mouse over.\n    if (this.options.keyboard.bindToWindow === false && this.options.keyboard.enabled === true) {\n      this.canvas.frame.focus();\n    }\n\n    // start a timeout that will check if the mouse is positioned above an element\n    if (popupVisible === false) {\n      if (this.popupTimer !== undefined) {\n        clearInterval(this.popupTimer); // stop any running calculationTimer\n        this.popupTimer = undefined;\n      }\n      if (!this.drag.dragging) {\n        this.popupTimer = setTimeout(() => this._checkShowPopup(pointer), this.options.tooltipDelay);\n      }\n    }\n\n    /**\n    * Adding hover highlights\n    */\n    if (this.options.hover === true) {\n      // adding hover highlights\n      let obj = this.selectionHandler.getNodeAt(pointer);\n      if (obj === undefined) {\n        obj = this.selectionHandler.getEdgeAt(pointer);\n      }\n      this.selectionHandler.hoverObject(obj);\n    }\n  }\n\n\n\n  /**\n   * Check if there is an element on the given position in the network\n   * (a node or edge). If so, and if this element has a title,\n   * show a popup window with its title.\n   *\n   * @param {{x:Number, y:Number}} pointer\n   * @private\n   */\n _checkShowPopup(pointer) {\n    let x = this.canvas._XconvertDOMtoCanvas(pointer.x);\n    let y = this.canvas._YconvertDOMtoCanvas(pointer.y);\n    let pointerObj = {\n      left:   x,\n      top:    y,\n      right:  x,\n      bottom: y\n    };\n\n    let previousPopupObjId = this.popupObj === undefined ? undefined : this.popupObj.id;\n    let nodeUnderCursor = false;\n    let popupType = 'node';\n\n    // check if a node is under the cursor.\n    if (this.popupObj === undefined) {\n      // search the nodes for overlap, select the top one in case of multiple nodes\n      let nodeIndices = this.body.nodeIndices;\n      let nodes = this.body.nodes;\n      let node;\n      let overlappingNodes = [];\n      for (let i = 0; i < nodeIndices.length; i++) {\n        node = nodes[nodeIndices[i]];\n        if (node.isOverlappingWith(pointerObj) === true) {\n          if (node.getTitle() !== undefined) {\n            overlappingNodes.push(nodeIndices[i]);\n          }\n        }\n      }\n\n      if (overlappingNodes.length > 0) {\n        // if there are overlapping nodes, select the last one, this is the one which is drawn on top of the others\n        this.popupObj = nodes[overlappingNodes[overlappingNodes.length - 1]];\n        // if you hover over a node, the title of the edge is not supposed to be shown.\n        nodeUnderCursor = true;\n      }\n    }\n\n    if (this.popupObj === undefined && nodeUnderCursor === false) {\n      // search the edges for overlap\n      let edgeIndices = this.body.edgeIndices;\n      let edges = this.body.edges;\n      let edge;\n      let overlappingEdges = [];\n      for (let i = 0; i < edgeIndices.length; i++) {\n        edge = edges[edgeIndices[i]];\n        if (edge.isOverlappingWith(pointerObj) === true) {\n          if (edge.connected === true && edge.getTitle() !== undefined) {\n            overlappingEdges.push(edgeIndices[i]);\n          }\n        }\n      }\n\n      if (overlappingEdges.length > 0) {\n        this.popupObj = edges[overlappingEdges[overlappingEdges.length - 1]];\n        popupType = 'edge';\n      }\n    }\n\n    if (this.popupObj !== undefined) {\n      // show popup message window\n      if (this.popupObj.id !== previousPopupObjId) {\n        if (this.popup === undefined) {\n          this.popup = new Popup(this.canvas.frame);\n        }\n\n        this.popup.popupTargetType = popupType;\n        this.popup.popupTargetId = this.popupObj.id;\n\n        // adjust a small offset such that the mouse cursor is located in the\n        // bottom left location of the popup, and you can easily move over the\n        // popup area\n        this.popup.setPosition(pointer.x + 3, pointer.y - 5);\n        this.popup.setText(this.popupObj.getTitle());\n        this.popup.show();\n        this.body.emitter.emit('showPopup',this.popupObj.id);\n      }\n    }\n    else {\n      if (this.popup !== undefined) {\n        this.popup.hide();\n        this.body.emitter.emit('hidePopup');\n      }\n    }\n  }\n\n\n  /**\n   * Check if the popup must be hidden, which is the case when the mouse is no\n   * longer hovering on the object\n   * @param {{x:Number, y:Number}} pointer\n   * @private\n   */\n _checkHidePopup(pointer) {\n    let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);\n\n    let stillOnObj = false;\n    if (this.popup.popupTargetType === 'node') {\n      if (this.body.nodes[this.popup.popupTargetId] !== undefined) {\n        stillOnObj = this.body.nodes[this.popup.popupTargetId].isOverlappingWith(pointerObj);\n\n        // if the mouse is still one the node, we have to check if it is not also on one that is drawn on top of it.\n        // we initially only check stillOnObj because this is much faster.\n        if (stillOnObj === true) {\n          let overNode = this.selectionHandler.getNodeAt(pointer);\n          stillOnObj = overNode === undefined ? false : overNode.id === this.popup.popupTargetId;\n        }\n      }\n    }\n    else {\n      if (this.selectionHandler.getNodeAt(pointer) === undefined) {\n        if (this.body.edges[this.popup.popupTargetId] !== undefined) {\n          stillOnObj = this.body.edges[this.popup.popupTargetId].isOverlappingWith(pointerObj);\n        }\n      }\n    }\n\n\n    if (stillOnObj === false) {\n      this.popupObj = undefined;\n      this.popup.hide();\n      this.body.emitter.emit('hidePopup');\n    }\n  }\n\n}\n\nexport default InteractionHandler;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/InteractionHandler.js","var util = require('../../../util');\nvar Hammer = require('../../../module/hammer');\nvar hammerUtil = require('../../../hammerUtil');\nvar keycharm = require('keycharm');\n\nclass NavigationHandler {\n  constructor(body, canvas) {\n    this.body = body;\n    this.canvas = canvas;\n\n    this.iconsCreated = false;\n    this.navigationHammers = [];\n    this.boundFunctions = {};\n    this.touchTime = 0;\n    this.activated = false;\n\n\n    this.body.emitter.on(\"activate\",   () => {this.activated = true;  this.configureKeyboardBindings();});\n    this.body.emitter.on(\"deactivate\", () => {this.activated = false; this.configureKeyboardBindings();});\n    this.body.emitter.on(\"destroy\",    () => {if (this.keycharm !== undefined) {this.keycharm.destroy();}});\n\n    this.options = {}\n  }\n\n  setOptions(options) {\n    if (options !== undefined) {\n      this.options = options;\n      this.create();\n    }\n  }\n\n  create() {\n    if (this.options.navigationButtons === true) {\n      if (this.iconsCreated === false) {\n        this.loadNavigationElements();\n      }\n    }\n    else if (this.iconsCreated === true) {\n      this.cleanNavigation();\n    }\n\n    this.configureKeyboardBindings();\n  }\n\n  cleanNavigation() {\n    // clean hammer bindings\n    if (this.navigationHammers.length != 0) {\n      for (var i = 0; i < this.navigationHammers.length; i++) {\n        this.navigationHammers[i].destroy();\n      }\n      this.navigationHammers = [];\n    }\n\n    // clean up previous navigation items\n    if (this.navigationDOM && this.navigationDOM['wrapper'] && this.navigationDOM['wrapper'].parentNode) {\n      this.navigationDOM['wrapper'].parentNode.removeChild(this.navigationDOM['wrapper']);\n    }\n\n    this.iconsCreated = false;\n  }\n\n  /**\n   * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation\n   * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent\n   * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false.\n   * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas.\n   *\n   * @private\n   */\n  loadNavigationElements() {\n    this.cleanNavigation();\n\n    this.navigationDOM = {};\n    var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends'];\n    var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','_fit'];\n\n    this.navigationDOM['wrapper'] = document.createElement('div');\n    this.navigationDOM['wrapper'].className = 'vis-navigation';\n    this.canvas.frame.appendChild(this.navigationDOM['wrapper']);\n\n    for (var i = 0; i < navigationDivs.length; i++) {\n      this.navigationDOM[navigationDivs[i]] = document.createElement('div');\n      this.navigationDOM[navigationDivs[i]].className = 'vis-button vis-' + navigationDivs[i];\n      this.navigationDOM['wrapper'].appendChild(this.navigationDOM[navigationDivs[i]]);\n\n      var hammer = new Hammer(this.navigationDOM[navigationDivs[i]]);\n      if (navigationDivActions[i] === \"_fit\") {\n        hammerUtil.onTouch(hammer, this._fit.bind(this));\n      }\n      else {\n        hammerUtil.onTouch(hammer, this.bindToRedraw.bind(this,navigationDivActions[i]));\n      }\n\n      this.navigationHammers.push(hammer);\n    }\n\n    // use a hammer for the release so we do not require the one used in the rest of the network\n    // the one the rest uses can be overloaded by the manipulation system.\n    var hammerFrame = new Hammer(this.canvas.frame);\n    hammerUtil.onRelease(hammerFrame, () => {this._stopMovement();});\n    this.navigationHammers.push(hammerFrame);\n\n    this.iconsCreated = true;\n  }\n\n  bindToRedraw(action) {\n    if (this.boundFunctions[action] === undefined) {\n      this.boundFunctions[action] = this[action].bind(this);\n      this.body.emitter.on(\"initRedraw\", this.boundFunctions[action]);\n      this.body.emitter.emit(\"_startRendering\");\n    }\n  }\n\n  unbindFromRedraw(action) {\n    if (this.boundFunctions[action] !== undefined) {\n      this.body.emitter.off(\"initRedraw\", this.boundFunctions[action]);\n      this.body.emitter.emit(\"_stopRendering\");\n      delete this.boundFunctions[action];\n    }\n  }\n\n  /**\n   * this stops all movement induced by the navigation buttons\n   *\n   * @private\n   */\n  _fit() {\n    if (new Date().valueOf() - this.touchTime > 700) { // TODO: fix ugly hack to avoid hammer's double fireing of event (because we use release?)\n      this.body.emitter.emit(\"fit\", {duration: 700});\n      this.touchTime = new Date().valueOf();\n    }\n  }\n\n  /**\n   * this stops all movement induced by the navigation buttons\n   *\n   * @private\n   */\n  _stopMovement() {\n    for (let boundAction in this.boundFunctions) {\n      if (this.boundFunctions.hasOwnProperty(boundAction)) {\n        this.body.emitter.off(\"initRedraw\", this.boundFunctions[boundAction]);\n        this.body.emitter.emit(\"_stopRendering\");\n      }\n    }\n    this.boundFunctions = {};\n  }\n\n  _moveUp()   {this.body.view.translation.y += this.options.keyboard.speed.y;}\n  _moveDown() {this.body.view.translation.y -= this.options.keyboard.speed.y;}\n  _moveLeft() {this.body.view.translation.x += this.options.keyboard.speed.x;}\n  _moveRight(){this.body.view.translation.x -= this.options.keyboard.speed.x;}\n  _zoomIn() {\n    var scaleOld = this.body.view.scale;\n    var scale = this.body.view.scale * (1 + this.options.keyboard.speed.zoom);\n    var translation = this.body.view.translation;\n    var scaleFrac = scale / scaleOld;\n    var tx = (1 - scaleFrac) * this.canvas.canvasViewCenter.x + translation.x * scaleFrac;\n    var ty = (1 - scaleFrac) * this.canvas.canvasViewCenter.y + translation.y * scaleFrac;\n\n    this.body.view.scale = scale;\n    this.body.view.translation = { x: tx, y: ty };\n    this.body.emitter.emit('zoom', { direction: '+', scale: this.body.view.scale, pointer: pointer });\n  }\n  _zoomOut()  {\n    var scaleOld = this.body.view.scale;\n    var scale = this.body.view.scale / (1 + this.options.keyboard.speed.zoom);\n    var translation = this.body.view.translation;\n    var scaleFrac = scale / scaleOld;\n    var tx = (1 - scaleFrac) * this.canvas.canvasViewCenter.x + translation.x * scaleFrac;\n    var ty = (1 - scaleFrac) * this.canvas.canvasViewCenter.y + translation.y * scaleFrac;\n\n    this.body.view.scale = scale;\n    this.body.view.translation = { x: tx, y: ty };\n    this.body.emitter.emit('zoom', { direction: '-', scale: this.body.view.scale, pointer: pointer });\n  }\n\n\n  /**\n   * bind all keys using keycharm.\n   */\n  configureKeyboardBindings() {\n    if (this.keycharm !== undefined) {\n      this.keycharm.destroy();\n    }\n\n    if (this.options.keyboard.enabled === true) {\n      if (this.options.keyboard.bindToWindow === true) {\n        this.keycharm = keycharm({container: window, preventDefault: true});\n      }\n      else {\n        this.keycharm = keycharm({container: this.canvas.frame, preventDefault: true});\n      }\n\n      this.keycharm.reset();\n\n      if (this.activated === true) {\n        this.keycharm.bind(\"up\",       () => {this.bindToRedraw(\"_moveUp\")   ;}, \"keydown\");\n        this.keycharm.bind(\"down\",     () => {this.bindToRedraw(\"_moveDown\") ;}, \"keydown\");\n        this.keycharm.bind(\"left\",     () => {this.bindToRedraw(\"_moveLeft\") ;}, \"keydown\");\n        this.keycharm.bind(\"right\",    () => {this.bindToRedraw(\"_moveRight\");}, \"keydown\");\n        this.keycharm.bind(\"=\",        () => {this.bindToRedraw(\"_zoomIn\")   ;}, \"keydown\");\n        this.keycharm.bind(\"num+\",     () => {this.bindToRedraw(\"_zoomIn\")   ;}, \"keydown\");\n        this.keycharm.bind(\"num-\",     () => {this.bindToRedraw(\"_zoomOut\")  ;}, \"keydown\");\n        this.keycharm.bind(\"-\",        () => {this.bindToRedraw(\"_zoomOut\")  ;}, \"keydown\");\n        this.keycharm.bind(\"[\",        () => {this.bindToRedraw(\"_zoomOut\")  ;}, \"keydown\");\n        this.keycharm.bind(\"]\",        () => {this.bindToRedraw(\"_zoomIn\")   ;}, \"keydown\");\n        this.keycharm.bind(\"pageup\",   () => {this.bindToRedraw(\"_zoomIn\")   ;}, \"keydown\");\n        this.keycharm.bind(\"pagedown\", () => {this.bindToRedraw(\"_zoomOut\")  ;}, \"keydown\");\n\n        this.keycharm.bind(\"up\",       () => {this.unbindFromRedraw(\"_moveUp\")   ;}, \"keyup\");\n        this.keycharm.bind(\"down\",     () => {this.unbindFromRedraw(\"_moveDown\") ;}, \"keyup\");\n        this.keycharm.bind(\"left\",     () => {this.unbindFromRedraw(\"_moveLeft\") ;}, \"keyup\");\n        this.keycharm.bind(\"right\",    () => {this.unbindFromRedraw(\"_moveRight\");}, \"keyup\");\n        this.keycharm.bind(\"=\",        () => {this.unbindFromRedraw(\"_zoomIn\")   ;}, \"keyup\");\n        this.keycharm.bind(\"num+\",     () => {this.unbindFromRedraw(\"_zoomIn\")   ;}, \"keyup\");\n        this.keycharm.bind(\"num-\",     () => {this.unbindFromRedraw(\"_zoomOut\")  ;}, \"keyup\");\n        this.keycharm.bind(\"-\",        () => {this.unbindFromRedraw(\"_zoomOut\")  ;}, \"keyup\");\n        this.keycharm.bind(\"[\",        () => {this.unbindFromRedraw(\"_zoomOut\")  ;}, \"keyup\");\n        this.keycharm.bind(\"]\",        () => {this.unbindFromRedraw(\"_zoomIn\")   ;}, \"keyup\");\n        this.keycharm.bind(\"pageup\",   () => {this.unbindFromRedraw(\"_zoomIn\")   ;}, \"keyup\");\n        this.keycharm.bind(\"pagedown\", () => {this.unbindFromRedraw(\"_zoomOut\")  ;}, \"keyup\");\n      }\n    }\n  }\n}\n\n\nexport default NavigationHandler;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/NavigationHandler.js","import Node from './components/Node';\nimport Edge from './components/Edge';\n\nlet util = require('../../util');\n\nclass SelectionHandler {\n  constructor(body, canvas) {\n    this.body = body;\n    this.canvas = canvas;\n    this.selectionObj = {nodes: [], edges: []};\n    this.hoverObj = {nodes:{},edges:{}};\n\n    this.options = {};\n    this.defaultOptions = {\n      multiselect: false,\n      selectable: true,\n      selectConnectedEdges: true,\n      hoverConnectedEdges: true\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this.body.emitter.on(\"_dataChanged\", () => {\n      this.updateSelection()\n    });\n  }\n\n\n  setOptions(options) {\n    if (options !== undefined) {\n      let fields = ['multiselect','hoverConnectedEdges','selectable','selectConnectedEdges'];\n      util.selectiveDeepExtend(fields,this.options, options);\n    }\n  }\n\n\n  /**\n   * handles the selection part of the tap;\n   *\n   * @param {Object} pointer\n   * @private\n   */\n  selectOnPoint(pointer) {\n    let selected = false;\n    if (this.options.selectable === true) {\n      let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);\n\n      // unselect after getting the objects in order to restore width and height.\n      this.unselectAll();\n\n      if (obj !== undefined) {\n        selected = this.selectObject(obj);\n      }\n      this.body.emitter.emit(\"_requestRedraw\");\n    }\n    return selected;\n  }\n\n  selectAdditionalOnPoint(pointer) {\n    let selectionChanged = false;\n    if (this.options.selectable === true) {\n      let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);\n\n      if (obj !== undefined) {\n        selectionChanged = true;\n        if (obj.isSelected() === true) {\n          this.deselectObject(obj);\n        }\n        else {\n          this.selectObject(obj);\n        }\n\n        this.body.emitter.emit(\"_requestRedraw\");\n      }\n    }\n    return selectionChanged;\n  }\n\n  _generateClickEvent(eventType, event, pointer, oldSelection, emptySelection = false) {\n    let properties;\n    if (emptySelection === true) {\n      properties = {nodes:[], edges:[]};\n    }\n    else {\n      properties = this.getSelection();\n    }\n    properties['pointer'] = {\n      DOM: {x: pointer.x, y: pointer.y},\n      canvas: this.canvas.DOMtoCanvas(pointer)\n    };\n    properties['event'] = event;\n\n    if (oldSelection !== undefined) {\n      properties['previousSelection'] = oldSelection;\n    }\n    this.body.emitter.emit(eventType, properties);\n  }\n\n  selectObject(obj, highlightEdges = this.options.selectConnectedEdges) {\n    if (obj !== undefined) {\n      if (obj instanceof Node) {\n        if (highlightEdges === true) {\n          this._selectConnectedEdges(obj);\n        }\n      }\n      obj.select();\n      this._addToSelection(obj);\n      return true;\n    }\n    return false;\n  }\n\n  deselectObject(obj) {\n    if (obj.isSelected() === true) {\n      obj.selected = false;\n      this._removeFromSelection(obj);\n    }\n  }\n\n\n\n  /**\n   * retrieve all nodes overlapping with given object\n   * @param {Object} object  An object with parameters left, top, right, bottom\n   * @return {Number[]}   An array with id's of the overlapping nodes\n   * @private\n   */\n  _getAllNodesOverlappingWith(object) {\n    let overlappingNodes = [];\n    let nodes = this.body.nodes;\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      let nodeId = this.body.nodeIndices[i];\n      if (nodes[nodeId].isOverlappingWith(object)) {\n        overlappingNodes.push(nodeId);\n      }\n    }\n    return overlappingNodes;\n  }\n\n\n  /**\n   * Return a position object in canvasspace from a single point in screenspace\n   *\n   * @param pointer\n   * @returns {{left: number, top: number, right: number, bottom: number}}\n   * @private\n   */\n  _pointerToPositionObject(pointer) {\n    let canvasPos = this.canvas.DOMtoCanvas(pointer);\n    return {\n      left:   canvasPos.x - 1,\n      top:    canvasPos.y + 1,\n      right:  canvasPos.x + 1,\n      bottom: canvasPos.y - 1\n    };\n  }\n\n\n  /**\n   * Get the top node at the a specific point (like a click)\n   *\n   * @param {{x: Number, y: Number}} pointer\n   * @return {Node | undefined} node\n   */\n  getNodeAt(pointer, returnNode = true) {\n    // we first check if this is an navigation controls element\n    let positionObject = this._pointerToPositionObject(pointer);\n    let overlappingNodes = this._getAllNodesOverlappingWith(positionObject);\n    // if there are overlapping nodes, select the last one, this is the\n    // one which is drawn on top of the others\n    if (overlappingNodes.length > 0) {\n      if (returnNode === true) {\n        return this.body.nodes[overlappingNodes[overlappingNodes.length - 1]];\n      }\n      else {\n        return overlappingNodes[overlappingNodes.length - 1];\n      }\n    }\n    else {\n      return undefined;\n    }\n  }\n\n\n  /**\n   * retrieve all edges overlapping with given object, selector is around center\n   * @param {Object} object  An object with parameters left, top, right, bottom\n   * @return {Number[]}   An array with id's of the overlapping nodes\n   * @private\n   */\n  _getEdgesOverlappingWith(object, overlappingEdges) {\n    let edges = this.body.edges;\n    for (let i = 0; i < this.body.edgeIndices.length; i++) {\n      let edgeId = this.body.edgeIndices[i];\n      if (edges[edgeId].isOverlappingWith(object)) {\n        overlappingEdges.push(edgeId);\n      }\n    }\n  }\n\n\n  /**\n   * retrieve all nodes overlapping with given object\n   * @param {Object} object  An object with parameters left, top, right, bottom\n   * @return {Number[]}   An array with id's of the overlapping nodes\n   * @private\n   */\n  _getAllEdgesOverlappingWith(object) {\n    let overlappingEdges = [];\n    this._getEdgesOverlappingWith(object,overlappingEdges);\n    return overlappingEdges;\n  }\n\n\n  /**\n   * Place holder. To implement change the getNodeAt to a _getObjectAt. Have the _getObjectAt call\n   * getNodeAt and _getEdgesAt, then priortize the selection to user preferences.\n   *\n   * @param pointer\n   * @returns {undefined}\n   */\n  getEdgeAt(pointer, returnEdge = true) {\n    // Iterate over edges, pick closest within 10\n    var canvasPos = this.canvas.DOMtoCanvas(pointer);\n    var mindist = 10;\n    var overlappingEdge = null;\n    var edges = this.body.edges;\n    for (var i = 0; i < this.body.edgeIndices.length; i++) {\n      var edgeId = this.body.edgeIndices[i];\n      var edge = edges[edgeId];\n      if (edge.connected) {\n        var xFrom = edge.from.x;\n        var yFrom = edge.from.y;\n        var xTo = edge.to.x;\n        var yTo = edge.to.y;\n        var dist = edge.edgeType.getDistanceToEdge(xFrom, yFrom, xTo, yTo, canvasPos.x, canvasPos.y);\n        if(dist < mindist){\n          overlappingEdge = edgeId;\n          mindist = dist;\n        }\n      }\n    }\n    if (overlappingEdge) {\n      if (returnEdge === true) {\n        return this.body.edges[overlappingEdge];\n      }\n      else {\n        return overlappingEdge;\n      }\n    }\n    else {\n      return undefined;\n    }\n  }\n\n\n  /**\n   * Add object to the selection array.\n   *\n   * @param obj\n   * @private\n   */\n  _addToSelection(obj) {\n    if (obj instanceof Node) {\n      this.selectionObj.nodes[obj.id] = obj;\n    }\n    else {\n      this.selectionObj.edges[obj.id] = obj;\n    }\n  }\n\n  /**\n   * Add object to the selection array.\n   *\n   * @param obj\n   * @private\n   */\n  _addToHover(obj) {\n    if (obj instanceof Node) {\n      this.hoverObj.nodes[obj.id] = obj;\n    }\n    else {\n      this.hoverObj.edges[obj.id] = obj;\n    }\n  }\n\n\n  /**\n   * Remove a single option from selection.\n   *\n   * @param {Object} obj\n   * @private\n   */\n  _removeFromSelection(obj) {\n    if (obj instanceof Node) {\n      delete this.selectionObj.nodes[obj.id];\n      this._unselectConnectedEdges(obj);\n    }\n    else {\n      delete this.selectionObj.edges[obj.id];\n    }\n  }\n\n  /**\n   * Unselect all. The selectionObj is useful for this.\n   */\n  unselectAll() {\n    for(let nodeId in this.selectionObj.nodes) {\n      if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        this.selectionObj.nodes[nodeId].unselect();\n      }\n    }\n    for(let edgeId in this.selectionObj.edges) {\n      if(this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        this.selectionObj.edges[edgeId].unselect();\n      }\n    }\n\n    this.selectionObj = {nodes:{},edges:{}};\n  }\n\n\n  /**\n   * return the number of selected nodes\n   *\n   * @returns {number}\n   * @private\n   */\n  _getSelectedNodeCount() {\n    let count = 0;\n    for (let nodeId in this.selectionObj.nodes) {\n      if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        count += 1;\n      }\n    }\n    return count;\n  }\n\n  /**\n   * return the selected node\n   *\n   * @returns {number}\n   * @private\n   */\n  _getSelectedNode() {\n    for (let nodeId in this.selectionObj.nodes) {\n      if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        return this.selectionObj.nodes[nodeId];\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * return the selected edge\n   *\n   * @returns {number}\n   * @private\n   */\n  _getSelectedEdge() {\n    for (let edgeId in this.selectionObj.edges) {\n      if (this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        return this.selectionObj.edges[edgeId];\n      }\n    }\n    return undefined;\n  }\n\n\n  /**\n   * return the number of selected edges\n   *\n   * @returns {number}\n   * @private\n   */\n  _getSelectedEdgeCount() {\n    let count = 0;\n    for (let edgeId in this.selectionObj.edges) {\n      if (this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        count += 1;\n      }\n    }\n    return count;\n  }\n\n\n  /**\n   * return the number of selected objects.\n   *\n   * @returns {number}\n   * @private\n   */\n  _getSelectedObjectCount() {\n    let count = 0;\n    for(let nodeId in this.selectionObj.nodes) {\n      if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        count += 1;\n      }\n    }\n    for(let edgeId in this.selectionObj.edges) {\n      if(this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        count += 1;\n      }\n    }\n    return count;\n  }\n\n  /**\n   * Check if anything is selected\n   *\n   * @returns {boolean}\n   * @private\n   */\n  _selectionIsEmpty() {\n    for(let nodeId in this.selectionObj.nodes) {\n      if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        return false;\n      }\n    }\n    for(let edgeId in this.selectionObj.edges) {\n      if(this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n\n  /**\n   * check if one of the selected nodes is a cluster.\n   *\n   * @returns {boolean}\n   * @private\n   */\n  _clusterInSelection() {\n    for(let nodeId in this.selectionObj.nodes) {\n      if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        if (this.selectionObj.nodes[nodeId].clusterSize > 1) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  /**\n   * select the edges connected to the node that is being selected\n   *\n   * @param {Node} node\n   * @private\n   */\n  _selectConnectedEdges(node) {\n    for (let i = 0; i < node.edges.length; i++) {\n      let edge = node.edges[i];\n      edge.select();\n      this._addToSelection(edge);\n    }\n  }\n\n  /**\n   * select the edges connected to the node that is being selected\n   *\n   * @param {Node} node\n   * @private\n   */\n  _hoverConnectedEdges(node) {\n    for (let i = 0; i < node.edges.length; i++) {\n      let edge = node.edges[i];\n      edge.hover = true;\n      this._addToHover(edge);\n    }\n  }\n\n\n  /**\n   * unselect the edges connected to the node that is being selected\n   *\n   * @param {Node} node\n   * @private\n   */\n  _unselectConnectedEdges(node) {\n    for (let i = 0; i < node.edges.length; i++) {\n      let edge = node.edges[i];\n      edge.unselect();\n      this._removeFromSelection(edge);\n    }\n  }\n\n\n  /**\n   * This is called when someone clicks on a node. either select or deselect it.\n   * If there is an existing selection and we don't want to append to it, clear the existing selection\n   *\n   * @param {Node || Edge} object\n   * @private\n   */\n  blurObject(object) {\n    if (object.hover === true) {\n      object.hover = false;\n      if (object instanceof Node) {\n        this.body.emitter.emit(\"blurNode\", {node: object.id});\n      }\n      else {\n        this.body.emitter.emit(\"blurEdge\", {edge: object.id});\n      }\n    }\n  }\n\n  /**\n   * This is called when someone clicks on a node. either select or deselect it.\n   * If there is an existing selection and we don't want to append to it, clear the existing selection\n   *\n   * @param {Node || Edge} object\n   * @private\n   */\n  hoverObject(object) {\n    let hoverChanged = false;\n    // remove all node hover highlights\n    for (let nodeId in this.hoverObj.nodes) {\n      if (this.hoverObj.nodes.hasOwnProperty(nodeId)) {\n        if (object === undefined || (object instanceof Node && object.id != nodeId) || object instanceof Edge) {\n          this.blurObject(this.hoverObj.nodes[nodeId]);\n          delete this.hoverObj.nodes[nodeId];\n          hoverChanged = true;\n        }\n      }\n    }\n\n    // removing all edge hover highlights\n    for (let edgeId in this.hoverObj.edges) {\n      if (this.hoverObj.edges.hasOwnProperty(edgeId)) {\n        // if the hover has been changed here it means that the node has been hovered over or off\n        // we then do not use the blurObject method here.\n        if (hoverChanged === true) {\n          this.hoverObj.edges[edgeId].hover = false;\n          delete this.hoverObj.edges[edgeId];\n        }\n        // if the blur remains the same and the object is undefined (mouse off) or another\n        // edge has been hovered, or another node has been hovered we blur the edge.\n        else if (object === undefined || (object instanceof Edge && object.id != edgeId) || (object instanceof Node && !object.hover)) {\n          this.blurObject(this.hoverObj.edges[edgeId]);\n          delete this.hoverObj.edges[edgeId];\n          hoverChanged = true;\n        }\n      }\n    }\n\n    if (object !== undefined) {\n      if (object.hover === false) {\n        object.hover = true;\n        this._addToHover(object);\n        hoverChanged = true;\n        if (object instanceof Node) {\n          this.body.emitter.emit(\"hoverNode\", {node: object.id});\n        }\n        else {\n          this.body.emitter.emit(\"hoverEdge\", {edge: object.id});\n        }\n      }\n      if (object instanceof Node && this.options.hoverConnectedEdges === true) {\n        this._hoverConnectedEdges(object);\n      }\n    }\n\n    if (hoverChanged === true) {\n      this.body.emitter.emit('_requestRedraw');\n    }\n  }\n\n\n\n\n  /**\n   *\n   * retrieve the currently selected objects\n   * @return {{nodes: Array.<String>, edges: Array.<String>}} selection\n   */\n  getSelection() {\n    let nodeIds = this.getSelectedNodes();\n    let edgeIds = this.getSelectedEdges();\n    return {nodes:nodeIds, edges:edgeIds};\n  }\n\n  /**\n   *\n   * retrieve the currently selected nodes\n   * @return {String[]} selection    An array with the ids of the\n   *                                            selected nodes.\n   */\n  getSelectedNodes() {\n    let idArray = [];\n    if (this.options.selectable === true) {\n      for (let nodeId in this.selectionObj.nodes) {\n        if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n          idArray.push(this.selectionObj.nodes[nodeId].id);\n        }\n      }\n    }\n    return idArray;\n  }\n\n  /**\n   *\n   * retrieve the currently selected edges\n   * @return {Array} selection    An array with the ids of the\n   *                                            selected nodes.\n   */\n  getSelectedEdges() {\n    let idArray = [];\n    if (this.options.selectable === true) {\n      for (let edgeId in this.selectionObj.edges) {\n        if (this.selectionObj.edges.hasOwnProperty(edgeId)) {\n          idArray.push(this.selectionObj.edges[edgeId].id);\n        }\n      }\n    }\n    return idArray;\n  }\n\n  /**\n   * Updates the current selection\n   * @param {{nodes: Array.<String>, edges: Array.<String>}} Selection\n   * @param {Object} options                                 Options\n   */\n  setSelection(selection, options = {}) {\n    let i, id;\n\n    if (!selection || (!selection.nodes && !selection.edges))\n      throw 'Selection must be an object with nodes and/or edges properties';\n    // first unselect any selected node, if option is true or undefined\n    if (options.unselectAll || options.unselectAll === undefined) {\n      this.unselectAll();\n    }\n    if (selection.nodes) {\n      for (i = 0; i < selection.nodes.length; i++) {\n        id = selection.nodes[i];\n\n        let node = this.body.nodes[id];\n        if (!node) {\n          throw new RangeError('Node with id \"' + id + '\" not found');\n        }\n        // don't select edges with it\n        this.selectObject(node, options.highlightEdges);\n      }\n    }\n\n    if (selection.edges) {\n      for (i = 0; i < selection.edges.length; i++) {\n        id = selection.edges[i];\n\n        let edge = this.body.edges[id];\n        if (!edge) {\n          throw new RangeError('Edge with id \"' + id + '\" not found');\n        }\n        this.selectObject(edge);\n      }\n    }\n    this.body.emitter.emit('_requestRedraw');\n  }\n\n\n  /**\n   * select zero or more nodes with the option to highlight edges\n   * @param {Number[] | String[]} selection     An array with the ids of the\n   *                                            selected nodes.\n   * @param {boolean} [highlightEdges]\n   */\n  selectNodes(selection, highlightEdges = true) {\n    if (!selection || (selection.length === undefined))\n      throw 'Selection must be an array with ids';\n\n    this.setSelection({nodes: selection}, {highlightEdges: highlightEdges});\n  }\n\n\n  /**\n   * select zero or more edges\n   * @param {Number[] | String[]} selection     An array with the ids of the\n   *                                            selected nodes.\n   */\n  selectEdges(selection) {\n    if (!selection || (selection.length === undefined))\n      throw 'Selection must be an array with ids';\n\n    this.setSelection({edges: selection});\n  }\n\n  /**\n   * Validate the selection: remove ids of nodes which no longer exist\n   * @private\n   */\n  updateSelection() {\n    for (let nodeId in this.selectionObj.nodes) {\n      if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {\n        if (!this.body.nodes.hasOwnProperty(nodeId)) {\n          delete this.selectionObj.nodes[nodeId];\n        }\n      }\n    }\n    for (let edgeId in this.selectionObj.edges) {\n      if (this.selectionObj.edges.hasOwnProperty(edgeId)) {\n        if (!this.body.edges.hasOwnProperty(edgeId)) {\n          delete this.selectionObj.edges[edgeId];\n        }\n      }\n    }\n  }\n}\n\nexport default SelectionHandler;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/SelectionHandler.js","'use strict';\n\nlet util = require('../../util');\nimport NetworkUtil from '../NetworkUtil';\n\nclass LayoutEngine {\n  constructor(body) {\n    this.body = body;\n\n    this.initialRandomSeed = Math.round(Math.random() * 1000000);\n    this.randomSeed = this.initialRandomSeed;\n    this.setPhysics = false;\n    this.options = {};\n    this.optionsBackup = {physics:{}};\n\n    this.defaultOptions = {\n      randomSeed: undefined,\n      improvedLayout: true,\n      hierarchical: {\n        enabled:false,\n        levelSeparation: 150,\n        nodeSpacing: 100,\n        treeSpacing: 200,\n        blockShifting: true,\n        edgeMinimization: true,\n        parentCentralization: true,\n        direction: 'UD',   // UD, DU, LR, RL\n        sortMethod: 'hubsize' // hubsize, directed\n      }\n    };\n    util.extend(this.options, this.defaultOptions);\n    this.bindEventListeners();\n  }\n\n  bindEventListeners() {\n    this.body.emitter.on('_dataChanged', () => {\n      this.setupHierarchicalLayout();\n    });\n    this.body.emitter.on('_dataLoaded', () => {\n      this.layoutNetwork();\n    });\n    this.body.emitter.on('_resetHierarchicalLayout', () => {\n      this.setupHierarchicalLayout();\n    });\n  }\n\n  setOptions(options, allOptions) {\n    if (options !== undefined) {\n      let prevHierarchicalState = this.options.hierarchical.enabled;\n      util.selectiveDeepExtend([\"randomSeed\", \"improvedLayout\"],this.options, options);\n      util.mergeOptions(this.options, options, 'hierarchical');\n      if (options.randomSeed !== undefined)     {this.initialRandomSeed = options.randomSeed;}\n\n      if (this.options.hierarchical.enabled === true) {\n        if (prevHierarchicalState === true) {\n          // refresh the overridden options for nodes and edges.\n          this.body.emitter.emit('refresh', true);\n        }\n\n        // make sure the level separation is the right way up\n        if (this.options.hierarchical.direction === 'RL' || this.options.hierarchical.direction === 'DU') {\n          if (this.options.hierarchical.levelSeparation > 0) {\n            this.options.hierarchical.levelSeparation *= -1;\n          }\n        }\n        else {\n          if (this.options.hierarchical.levelSeparation < 0) {\n            this.options.hierarchical.levelSeparation *= -1;\n          }\n        }\n\n        this.body.emitter.emit('_resetHierarchicalLayout');\n        // because the hierarchical system needs it's own physics and smooth curve settings, we adapt the other options if needed.\n        return this.adaptAllOptionsForHierarchicalLayout(allOptions);\n      }\n      else {\n        if (prevHierarchicalState === true) {\n          // refresh the overridden options for nodes and edges.\n          this.body.emitter.emit('refresh');\n          return util.deepExtend(allOptions,this.optionsBackup);\n        }\n      }\n    }\n    return allOptions;\n  }\n\n  adaptAllOptionsForHierarchicalLayout(allOptions) {\n    if (this.options.hierarchical.enabled === true) {\n      // set the physics\n      if (allOptions.physics === undefined || allOptions.physics === true) {\n        allOptions.physics = {\n          enabled:this.optionsBackup.physics.enabled === undefined ? true :  this.optionsBackup.physics.enabled,\n          solver:'hierarchicalRepulsion'\n        };\n        this.optionsBackup.physics.enabled = this.optionsBackup.physics.enabled === undefined ? true : this.optionsBackup.physics.enabled;\n        this.optionsBackup.physics.solver = this.optionsBackup.physics.solver || 'barnesHut';\n      }\n      else if (typeof allOptions.physics === 'object') {\n        this.optionsBackup.physics.enabled = allOptions.physics.enabled === undefined ? true : allOptions.physics.enabled;\n        this.optionsBackup.physics.solver  = allOptions.physics.solver  || 'barnesHut';\n        allOptions.physics.solver = 'hierarchicalRepulsion';\n      }\n      else if (allOptions.physics !== false) {\n        this.optionsBackup.physics.solver ='barnesHut';\n        allOptions.physics = {solver:'hierarchicalRepulsion'};\n      }\n\n      // get the type of static smooth curve in case it is required\n      let type = 'horizontal';\n      if (this.options.hierarchical.direction === 'RL' || this.options.hierarchical.direction === 'LR') {\n        type = 'vertical';\n      }\n\n      // disable smooth curves if nothing is defined. If smooth curves have been turned on, turn them into static smooth curves.\n      if (allOptions.edges === undefined) {\n        this.optionsBackup.edges = {smooth:{enabled:true, type:'dynamic'}};\n        allOptions.edges = {smooth: false};\n      }\n      else if (allOptions.edges.smooth === undefined) {\n        this.optionsBackup.edges = {smooth:{enabled:true, type:'dynamic'}};\n        allOptions.edges.smooth = false;\n      }\n      else {\n        if (typeof allOptions.edges.smooth === 'boolean') {\n          this.optionsBackup.edges = {smooth:allOptions.edges.smooth};\n          allOptions.edges.smooth = {enabled: allOptions.edges.smooth, type:type}\n        }\n        else {\n          // allow custom types except for dynamic\n          if (allOptions.edges.smooth.type !== undefined && allOptions.edges.smooth.type !== 'dynamic') {\n            type = allOptions.edges.smooth.type;\n          }\n\n          this.optionsBackup.edges = {\n            smooth: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled,\n            type: allOptions.edges.smooth.type === undefined ? 'dynamic' : allOptions.edges.smooth.type,\n            roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness,\n            forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection\n          };\n          allOptions.edges.smooth = {\n            enabled: allOptions.edges.smooth.enabled === undefined ? true : allOptions.edges.smooth.enabled,\n            type:type,\n            roundness: allOptions.edges.smooth.roundness === undefined ? 0.5 : allOptions.edges.smooth.roundness,\n            forceDirection: allOptions.edges.smooth.forceDirection === undefined ? false : allOptions.edges.smooth.forceDirection\n          }\n        }\n      }\n\n      // force all edges into static smooth curves. Only applies to edges that do not use the global options for smooth.\n      this.body.emitter.emit('_forceDisableDynamicCurves', type);\n    }\n\n    return allOptions;\n  }\n\n  seededRandom() {\n    let x = Math.sin(this.randomSeed++) * 10000;\n    return x - Math.floor(x);\n  }\n\n  positionInitially(nodesArray) {\n    if (this.options.hierarchical.enabled !== true) {\n      this.randomSeed = this.initialRandomSeed;\n      for (let i = 0; i < nodesArray.length; i++) {\n        let node = nodesArray[i];\n        let radius = 10 * 0.1 * nodesArray.length + 10;\n        let angle = 2 * Math.PI * this.seededRandom();\n        if (node.x === undefined) {\n          node.x = radius * Math.cos(angle);\n        }\n        if (node.y === undefined) {\n          node.y = radius * Math.sin(angle);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Use Kamada Kawai to position nodes. This is quite a heavy algorithm so if there are a lot of nodes we\n   * cluster them first to reduce the amount.\n   */\n  layoutNetwork() {\n    if (this.options.hierarchical.enabled !== true && this.options.improvedLayout === true) {\n      // first check if we should Kamada Kawai to layout. The threshold is if less than half of the visible\n      // nodes have predefined positions we use this.\n      let positionDefined = 0;\n      for (let i = 0; i < this.body.nodeIndices.length; i++) {\n        let node = this.body.nodes[this.body.nodeIndices[i]];\n        if (node.predefinedPosition === true) {\n          positionDefined += 1;\n        }\n      }\n\n      // if less than half of the nodes have a predefined position we continue\n      if (positionDefined < 0.5 * this.body.nodeIndices.length) {\n        let MAX_LEVELS = 10;\n        let level = 0;\n        let clusterThreshold = 100;\n        // if there are a lot of nodes, we cluster before we run the algorithm.\n        if (this.body.nodeIndices.length > clusterThreshold) {\n          let startLength = this.body.nodeIndices.length;\n          while (this.body.nodeIndices.length > clusterThreshold) {\n            //console.time(\"clustering\")\n            level += 1;\n            let before = this.body.nodeIndices.length;\n            // if there are many nodes we do a hubsize cluster\n            if (level % 3 === 0) {\n              this.body.modules.clustering.clusterBridges();\n            }\n            else {\n              this.body.modules.clustering.clusterOutliers();\n            }\n            let after = this.body.nodeIndices.length;\n            if ((before == after && level % 3 !== 0) || level > MAX_LEVELS) {\n              this._declusterAll();\n              this.body.emitter.emit(\"_layoutFailed\");\n              console.info(\"This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.\");\n              return;\n            }\n            //console.timeEnd(\"clustering\")\n            //console.log(level,after)\n          }\n          // increase the size of the edges\n          this.body.modules.kamadaKawai.setOptions({springLength: Math.max(150, 2 * startLength)})\n        }\n\n        // position the system for these nodes and edges\n        this.body.modules.kamadaKawai.solve(this.body.nodeIndices, this.body.edgeIndices, true);\n\n        // shift to center point\n        this._shiftToCenter();\n\n        // perturb the nodes a little bit to force the physics to kick in\n        let offset = 70;\n        for (let i = 0; i < this.body.nodeIndices.length; i++) {\n          // Only perturb the nodes that aren't fixed\n          if (this.body.nodes[this.body.nodeIndices[i]].predefinedPosition === false) {\n            this.body.nodes[this.body.nodeIndices[i]].x += (0.5 - this.seededRandom())*offset;\n            this.body.nodes[this.body.nodeIndices[i]].y += (0.5 - this.seededRandom())*offset;\n          }\n        }\n\n        // uncluster all clusters\n        this._declusterAll();\n\n        // reposition all bezier nodes.\n        this.body.emitter.emit(\"_repositionBezierNodes\");\n      }\n    }\n  }\n\n  /**\n   * Move all the nodes towards to the center so gravitational pull wil not move the nodes away from view\n   * @private\n   */\n  _shiftToCenter() {\n    let range = NetworkUtil.getRangeCore(this.body.nodes, this.body.nodeIndices);\n    let center = NetworkUtil.findCenter(range);\n    for (let i = 0; i < this.body.nodeIndices.length; i++) {\n      this.body.nodes[this.body.nodeIndices[i]].x -= center.x;\n      this.body.nodes[this.body.nodeIndices[i]].y -= center.y;\n    }\n  }\n\n  _declusterAll() {\n    let clustersPresent = true;\n    while (clustersPresent === true) {\n      clustersPresent = false;\n      for (let i = 0; i < this.body.nodeIndices.length; i++) {\n        if (this.body.nodes[this.body.nodeIndices[i]].isCluster === true) {\n          clustersPresent = true;\n          this.body.modules.clustering.openCluster(this.body.nodeIndices[i], {}, false);\n        }\n      }\n      if (clustersPresent === true) {\n        this.body.emitter.emit('_dataChanged');\n      }\n    }\n  }\n\n  getSeed() {\n    return this.initialRandomSeed;\n  }\n\n  /**\n   * This is the main function to layout the nodes in a hierarchical way.\n   * It checks if the node details are supplied correctly\n   *\n   * @private\n   */\n  setupHierarchicalLayout() {\n    if (this.options.hierarchical.enabled === true && this.body.nodeIndices.length > 0) {\n      // get the size of the largest hubs and check if the user has defined a level for a node.\n      let node, nodeId;\n      let definedLevel = false;\n      let definedPositions = true;\n      let undefinedLevel = false;\n      this.hierarchicalLevels = {};\n      this.lastNodeOnLevel = {};\n      this.hierarchicalChildrenReference = {};\n      this.hierarchicalParentReference = {};\n      this.hierarchicalTrees = {};\n      this.treeIndex = -1;\n\n      this.distributionOrdering = {};\n      this.distributionIndex = {};\n      this.distributionOrderingPresence = {};\n\n\n      for (nodeId in this.body.nodes) {\n        if (this.body.nodes.hasOwnProperty(nodeId)) {\n          node = this.body.nodes[nodeId];\n          if (node.options.x === undefined && node.options.y === undefined) {\n            definedPositions = false;\n          }\n          if (node.options.level !== undefined) {\n            definedLevel = true;\n            this.hierarchicalLevels[nodeId] = node.options.level;\n          }\n          else {\n            undefinedLevel = true;\n          }\n        }\n      }\n\n      // if the user defined some levels but not all, alert and run without hierarchical layout\n      if (undefinedLevel === true && definedLevel === true) {\n        throw new Error('To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.');\n        return;\n      }\n      else {\n        // define levels if undefined by the users. Based on hubsize.\n        if (undefinedLevel === true) {\n          if (this.options.hierarchical.sortMethod === 'hubsize') {\n            this._determineLevelsByHubsize();\n          }\n          else if (this.options.hierarchical.sortMethod === 'directed') {\n            this._determineLevelsDirected();\n          }\n          else if (this.options.hierarchical.sortMethod === 'custom') {\n            this._determineLevelsCustomCallback();\n          }\n        }\n\n\n        // fallback for cases where there are nodes but no edges\n        for (let nodeId in this.body.nodes) {\n          if (this.body.nodes.hasOwnProperty(nodeId)) {\n            if (this.hierarchicalLevels[nodeId] === undefined) {\n              this.hierarchicalLevels[nodeId] = 0;\n            }\n          }\n        }\n        // check the distribution of the nodes per level.\n        let distribution = this._getDistribution();\n\n        // get the parent children relations.\n        this._generateMap();\n\n        // place the nodes on the canvas.\n        this._placeNodesByHierarchy(distribution);\n\n        // condense the whitespace.\n        this._condenseHierarchy();\n\n        // shift to center so gravity does not have to do much\n        this._shiftToCenter();\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _condenseHierarchy() {\n    // Global var in this scope to define when the movement has stopped.\n    let stillShifting = false;\n    let branches = {};\n    // first we have some methods to help shifting trees around.\n    // the main method to shift the trees\n    let shiftTrees = () => {\n      let treeSizes = getTreeSizes();\n      for (let i = 0; i < treeSizes.length - 1; i++) {\n        let diff = treeSizes[i].max - treeSizes[i+1].min;\n        shiftTree(i + 1, diff + this.options.hierarchical.treeSpacing);\n      }\n    };\n\n    // shift a single tree by an offset\n    let shiftTree = (index, offset) => {\n      for (let nodeId in this.hierarchicalTrees) {\n        if (this.hierarchicalTrees.hasOwnProperty(nodeId)) {\n          if (this.hierarchicalTrees[nodeId] === index) {\n            let node = this.body.nodes[nodeId];\n            let pos = this._getPositionForHierarchy(node);\n            this._setPositionForHierarchy(node, pos + offset, undefined, true);\n          }\n        }\n      }\n    };\n\n    // get the width of a tree\n    let getTreeSize = (index) => {\n      let min = 1e9;\n      let max = -1e9;\n      for (let nodeId in this.hierarchicalTrees) {\n        if (this.hierarchicalTrees.hasOwnProperty(nodeId)) {\n          if (this.hierarchicalTrees[nodeId] === index) {\n            let pos = this._getPositionForHierarchy(this.body.nodes[nodeId]);\n            min = Math.min(pos, min);\n            max = Math.max(pos, max);\n          }\n        }\n      }\n      return {min:min, max:max};\n    };\n\n    // get the width of all trees\n    let getTreeSizes = () => {\n      let treeWidths = [];\n      for (let i = 0; i <= this.treeIndex; i++) {\n        treeWidths.push(getTreeSize(i));\n      }\n      return treeWidths;\n    };\n\n\n    // get a map of all nodes in this branch\n    let getBranchNodes = (source, map) => {\n      map[source.id] = true;\n      if (this.hierarchicalChildrenReference[source.id]) {\n        let children = this.hierarchicalChildrenReference[source.id];\n        if (children.length > 0) {\n          for (let i = 0; i < children.length; i++) {\n            getBranchNodes(this.body.nodes[children[i]], map);\n          }\n        }\n      }\n    };\n\n    // get a min max width as well as the maximum movement space it has on either sides\n    // we use min max terminology because width and height can interchange depending on the direction of the layout\n    let getBranchBoundary = (branchMap, maxLevel = 1e9) => {\n      let minSpace = 1e9;\n      let maxSpace = 1e9;\n      let min = 1e9;\n      let max = -1e9;\n      for (let branchNode in branchMap) {\n        if (branchMap.hasOwnProperty(branchNode)) {\n          let node = this.body.nodes[branchNode];\n          let level = this.hierarchicalLevels[node.id];\n          let position = this._getPositionForHierarchy(node);\n\n          // get the space around the node.\n          let [minSpaceNode, maxSpaceNode] = this._getSpaceAroundNode(node,branchMap);\n          minSpace = Math.min(minSpaceNode, minSpace);\n          maxSpace = Math.min(maxSpaceNode, maxSpace);\n\n          // the width is only relevant for the levels two nodes have in common. This is why we filter on this.\n          if (level <= maxLevel) {\n            min = Math.min(position, min);\n            max = Math.max(position, max);\n          }\n        }\n      }\n\n      return [min, max, minSpace, maxSpace];\n    };\n\n    // get the maximum level of a branch.\n    let getMaxLevel = (nodeId) => {\n      let level = this.hierarchicalLevels[nodeId];\n      if (this.hierarchicalChildrenReference[nodeId]) {\n        let children = this.hierarchicalChildrenReference[nodeId];\n        if (children.length > 0) {\n          for (let i = 0; i < children.length; i++) {\n            level = Math.max(level,getMaxLevel(children[i]));\n          }\n        }\n      }\n      return level;\n    };\n\n    // check what the maximum level is these nodes have in common.\n    let getCollisionLevel = (node1, node2) => {\n      let maxLevel1 = getMaxLevel(node1.id);\n      let maxLevel2 = getMaxLevel(node2.id);\n      return Math.min(maxLevel1, maxLevel2);\n    };\n\n    // check if two nodes have the same parent(s)\n    let hasSameParent = (node1, node2) => {\n      let parents1 = this.hierarchicalParentReference[node1.id];\n      let parents2 = this.hierarchicalParentReference[node2.id];\n      if (parents1 === undefined || parents2 === undefined) {\n        return false;\n      }\n\n      for (let i = 0; i < parents1.length; i++) {\n        for (let j = 0; j < parents2.length; j++) {\n          if (parents1[i] == parents2[j]) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n\n    // condense elements. These can be nodes or branches depending on the callback.\n    let shiftElementsCloser = (callback, levels, centerParents) => {\n      for (let i = 0; i < levels.length; i++) {\n        let level = levels[i];\n        let levelNodes = this.distributionOrdering[level];\n        if (levelNodes.length > 1) {\n          for (let j = 0; j < levelNodes.length - 1; j++) {\n            if (hasSameParent(levelNodes[j],levelNodes[j+1]) === true)  {\n              if (this.hierarchicalTrees[levelNodes[j].id] === this.hierarchicalTrees[levelNodes[j+1].id])  {\n                callback(levelNodes[j],levelNodes[j+1], centerParents);\n              }\n            }}\n        }\n      }\n    };\n\n    // callback for shifting branches\n    let branchShiftCallback = (node1, node2, centerParent = false) => {\n      //window.CALLBACKS.push(() => {\n        let pos1 = this._getPositionForHierarchy(node1);\n        let pos2 = this._getPositionForHierarchy(node2);\n        let diffAbs = Math.abs(pos2 - pos1);\n        //console.log(\"NOW CHEcKING:\", node1.id, node2.id, diffAbs);\n        if (diffAbs > this.options.hierarchical.nodeSpacing) {\n          let branchNodes1 = {}; branchNodes1[node1.id] = true;\n          let branchNodes2 = {}; branchNodes2[node2.id] = true;\n\n          getBranchNodes(node1, branchNodes1);\n          getBranchNodes(node2, branchNodes2);\n\n          // check the largest distance between the branches\n          let maxLevel = getCollisionLevel(node1, node2);\n          let [min1,max1, minSpace1, maxSpace1] = getBranchBoundary(branchNodes1, maxLevel);\n          let [min2,max2, minSpace2, maxSpace2] = getBranchBoundary(branchNodes2, maxLevel);\n\n          //console.log(node1.id, getBranchBoundary(branchNodes1, maxLevel), node2.id, getBranchBoundary(branchNodes2, maxLevel), maxLevel);\n          let diffBranch = Math.abs(max1 - min2);\n          if (diffBranch > this.options.hierarchical.nodeSpacing) {\n            let offset = max1 - min2 + this.options.hierarchical.nodeSpacing;\n            if (offset < -minSpace2 + this.options.hierarchical.nodeSpacing) {\n              offset = -minSpace2 + this.options.hierarchical.nodeSpacing;\n              //console.log(\"RESETTING OFFSET\", max1 - min2 + this.options.hierarchical.nodeSpacing, -minSpace2, offset);\n            }\n            if (offset < 0) {\n              //console.log(\"SHIFTING\", node2.id, offset);\n              this._shiftBlock(node2.id, offset);\n              stillShifting = true;\n\n              if (centerParent === true)\n                this._centerParent(node2);\n            }\n          }\n\n        }\n        //this.body.emitter.emit(\"_redraw\");})\n    };\n\n    let minimizeEdgeLength = (iterations, node) => {\n      //window.CALLBACKS.push(() => {\n      //  console.log(\"ts\",node.id);\n        let nodeId = node.id;\n        let allEdges = node.edges;\n        let nodeLevel = this.hierarchicalLevels[node.id];\n\n        // gather constants\n        let C2 = this.options.hierarchical.levelSeparation * this.options.hierarchical.levelSeparation;\n        let referenceNodes = {};\n        let aboveEdges = [];\n        for (let i = 0; i < allEdges.length; i++) {\n          let edge = allEdges[i];\n          if (edge.toId != edge.fromId) {\n            let otherNode = edge.toId == nodeId ? edge.from : edge.to;\n            referenceNodes[allEdges[i].id] = otherNode;\n            if (this.hierarchicalLevels[otherNode.id] < nodeLevel) {\n              aboveEdges.push(edge);\n            }\n          }\n        }\n\n        // differentiated sum of lengths based on only moving one node over one axis\n        let getFx = (point, edges) => {\n          let sum = 0;\n          for (let i = 0; i < edges.length; i++) {\n            if (referenceNodes[edges[i].id] !== undefined) {\n              let a = this._getPositionForHierarchy(referenceNodes[edges[i].id]) - point;\n              sum += a / Math.sqrt(a * a + C2);\n            }\n          }\n          return sum;\n        };\n\n        // doubly differentiated sum of lengths based on only moving one node over one axis\n        let getDFx = (point, edges) => {\n          let sum = 0;\n          for (let i = 0; i < edges.length; i++) {\n            if (referenceNodes[edges[i].id] !== undefined) {\n              let a = this._getPositionForHierarchy(referenceNodes[edges[i].id]) - point;\n              sum -= (C2 * Math.pow(a * a + C2, -1.5));\n            }\n          }\n          return sum;\n        };\n\n        let getGuess = (iterations, edges) => {\n          let guess = this._getPositionForHierarchy(node);\n          // Newton's method for optimization\n          let guessMap = {};\n          for (let i = 0; i < iterations; i++) {\n            let fx = getFx(guess, edges);\n            let dfx = getDFx(guess, edges);\n\n            // we limit the movement to avoid instability.\n            let limit = 40;\n            let ratio = Math.max(-limit, Math.min(limit, Math.round(fx/dfx)));\n            guess = guess - ratio;\n            // reduce duplicates\n            if (guessMap[guess] !== undefined) {\n              break;\n            }\n            guessMap[guess] = i;\n          }\n          return guess;\n        };\n\n        let moveBranch = (guess) => {\n          // position node if there is space\n          let nodePosition = this._getPositionForHierarchy(node);\n\n          // check movable area of the branch\n          if (branches[node.id] === undefined) {\n            let branchNodes = {};\n            branchNodes[node.id] = true;\n            getBranchNodes(node, branchNodes);\n            branches[node.id] = branchNodes;\n          }\n          let [minBranch, maxBranch, minSpaceBranch, maxSpaceBranch] = getBranchBoundary(branches[node.id]);\n\n          let diff = guess - nodePosition;\n\n          // check if we are allowed to move the node:\n          let branchOffset = 0;\n          if (diff > 0) {\n            branchOffset = Math.min(diff, maxSpaceBranch - this.options.hierarchical.nodeSpacing);\n          }\n          else if (diff < 0) {\n            branchOffset = -Math.min(-diff, minSpaceBranch - this.options.hierarchical.nodeSpacing);\n          }\n\n          if (branchOffset != 0) {\n            //console.log(\"moving branch:\",branchOffset, maxSpaceBranch, minSpaceBranch)\n            this._shiftBlock(node.id, branchOffset);\n            //this.body.emitter.emit(\"_redraw\");\n            stillShifting = true;\n          }\n        };\n\n        let moveNode = (guess) => {\n          let nodePosition = this._getPositionForHierarchy(node);\n\n          // position node if there is space\n          let [minSpace, maxSpace] = this._getSpaceAroundNode(node);\n          let diff = guess - nodePosition;\n          // check if we are allowed to move the node:\n          let newPosition = nodePosition;\n          if (diff > 0) {\n            newPosition = Math.min(nodePosition + (maxSpace - this.options.hierarchical.nodeSpacing), guess);\n          }\n          else if (diff < 0) {\n            newPosition = Math.max(nodePosition - (minSpace - this.options.hierarchical.nodeSpacing), guess);\n          }\n\n          if (newPosition !== nodePosition) {\n            //console.log(\"moving Node:\",diff, minSpace, maxSpace);\n            this._setPositionForHierarchy(node, newPosition, undefined, true);\n            //this.body.emitter.emit(\"_redraw\");\n            stillShifting = true;\n          }\n        };\n\n        let guess = getGuess(iterations, aboveEdges);\n        moveBranch(guess);\n        guess = getGuess(iterations, allEdges);\n        moveNode(guess);\n      //})\n    };\n\n    // method to remove whitespace between branches. Because we do bottom up, we can center the parents.\n    let minimizeEdgeLengthBottomUp = (iterations) => {\n      let levels = Object.keys(this.distributionOrdering);\n      levels = levels.reverse();\n      for (let i = 0; i < iterations; i++) {\n        stillShifting = false;\n        for (let j = 0; j < levels.length; j++) {\n          let level = levels[j];\n          let levelNodes = this.distributionOrdering[level];\n          for (let k = 0; k < levelNodes.length; k++) {\n            minimizeEdgeLength(1000, levelNodes[k]);\n          }\n        }\n        if (stillShifting !== true) {\n          //console.log(\"FINISHED minimizeEdgeLengthBottomUp IN \" + i);\n          break;\n        }\n      }\n    };\n\n    // method to remove whitespace between branches. Because we do bottom up, we can center the parents.\n    let shiftBranchesCloserBottomUp = (iterations) => {\n      let levels = Object.keys(this.distributionOrdering);\n      levels = levels.reverse();\n      for (let i = 0; i < iterations; i++) {\n        stillShifting = false;\n        shiftElementsCloser(branchShiftCallback, levels, true);\n        if (stillShifting !== true) {\n          //console.log(\"FINISHED shiftBranchesCloserBottomUp IN \" + (i+1));\n          break;\n        }\n      }\n    };\n\n    // center all parents\n    let centerAllParents = () => {\n      for (let nodeId in this.body.nodes) {\n        if (this.body.nodes.hasOwnProperty(nodeId))\n          this._centerParent(this.body.nodes[nodeId]);\n      }\n    };\n\n    // center all parents\n    let centerAllParentsBottomUp = () => {\n      let levels = Object.keys(this.distributionOrdering);\n      levels = levels.reverse();\n      for (let i = 0; i < levels.length; i++) {\n        let level = levels[i];\n        let levelNodes = this.distributionOrdering[level];\n        for (let j = 0; j < levelNodes.length; j++) {\n          this._centerParent(levelNodes[j]);\n        }\n      }\n    };\n\n    // the actual work is done here.\n    if (this.options.hierarchical.blockShifting === true) {\n      shiftBranchesCloserBottomUp(5);\n      centerAllParents();\n    }\n\n    // minimize edge length\n    if (this.options.hierarchical.edgeMinimization === true) {\n      minimizeEdgeLengthBottomUp(20);\n    }\n\n    if (this.options.hierarchical.parentCentralization === true) {\n      centerAllParentsBottomUp()\n    }\n\n    shiftTrees();\n  }\n\n  /**\n   * This gives the space around the node. IF a map is supplied, it will only check against nodes NOT in the map.\n   * This is used to only get the distances to nodes outside of a branch.\n   * @param node\n   * @param map\n   * @returns {*[]}\n   * @private\n   */\n  _getSpaceAroundNode(node, map) {\n    let useMap = true;\n    if (map === undefined) {\n      useMap = false;\n    }\n    let level = this.hierarchicalLevels[node.id];\n    if (level !== undefined) {\n      let index = this.distributionIndex[node.id];\n      let position = this._getPositionForHierarchy(node);\n      let minSpace = 1e9;\n      let maxSpace = 1e9;\n      if (index !== 0) {\n        let prevNode = this.distributionOrdering[level][index - 1];\n        if ((useMap === true && map[prevNode.id] === undefined) || useMap === false) {\n          let prevPos = this._getPositionForHierarchy(prevNode);\n          minSpace = position - prevPos;\n        }\n      }\n\n      if (index != this.distributionOrdering[level].length - 1) {\n        let nextNode = this.distributionOrdering[level][index + 1];\n        if ((useMap === true && map[nextNode.id] === undefined) || useMap === false) {\n          let nextPos = this._getPositionForHierarchy(nextNode);\n          maxSpace = Math.min(maxSpace, nextPos - position);\n        }\n      }\n\n      return [minSpace, maxSpace];\n    }\n    else {\n      return [0, 0];\n    }\n  }\n\n  /**\n   * We use this method to center a parent node and check if it does not cross other nodes when it does.\n   * @param node\n   * @private\n   */\n  _centerParent(node) {\n    if (this.hierarchicalParentReference[node.id]) {\n      let parents = this.hierarchicalParentReference[node.id];\n      for (var i = 0; i < parents.length; i++) {\n        let parentId = parents[i];\n        let parentNode = this.body.nodes[parentId];\n        if (this.hierarchicalChildrenReference[parentId]) {\n          // get the range of the children\n          let minPos = 1e9;\n          let maxPos = -1e9;\n          let children = this.hierarchicalChildrenReference[parentId];\n          if (children.length > 0) {\n            for (let i = 0; i < children.length; i++) {\n              let childNode = this.body.nodes[children[i]];\n              minPos = Math.min(minPos, this._getPositionForHierarchy(childNode));\n              maxPos = Math.max(maxPos, this._getPositionForHierarchy(childNode));\n            }\n          }\n\n          let position = this._getPositionForHierarchy(parentNode);\n          let [minSpace, maxSpace] = this._getSpaceAroundNode(parentNode);\n          let newPosition = 0.5 * (minPos + maxPos);\n          let diff = position - newPosition;\n          if ((diff < 0 && Math.abs(diff) < maxSpace - this.options.hierarchical.nodeSpacing) || (diff > 0 && Math.abs(diff) < minSpace - this.options.hierarchical.nodeSpacing))  {\n            this._setPositionForHierarchy(parentNode, newPosition, undefined, true);\n          }\n        }\n      }\n    }\n  }\n\n\n\n  /**\n   * This function places the nodes on the canvas based on the hierarchial distribution.\n   *\n   * @param {Object} distribution | obtained by the function this._getDistribution()\n   * @private\n   */\n  _placeNodesByHierarchy(distribution) {\n    this.positionedNodes = {};\n    // start placing all the level 0 nodes first. Then recursively position their branches.\n    for (let level in distribution) {\n      if (distribution.hasOwnProperty(level)) {\n        // sort nodes in level by position:\n        let nodeArray = Object.keys(distribution[level]);\n        nodeArray = this._indexArrayToNodes(nodeArray);\n        this._sortNodeArray(nodeArray);\n        let handledNodeCount = 0;\n\n        for (let i = 0; i < nodeArray.length; i++) {\n          let node = nodeArray[i];\n          if (this.positionedNodes[node.id] === undefined) {\n            let pos = this.options.hierarchical.nodeSpacing * handledNodeCount;\n            // we get the X or Y values we need and store them in pos and previousPos. The get and set make sure we get X or Y\n            if (handledNodeCount > 0) {pos = this._getPositionForHierarchy(nodeArray[i-1]) + this.options.hierarchical.nodeSpacing;}\n            this._setPositionForHierarchy(node, pos, level);\n            this._validataPositionAndContinue(node, level, pos);\n\n            handledNodeCount++;\n          }\n        }\n      }\n    }\n  }\n\n\n  /**\n   * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes\n   * on a X position that ensures there will be no overlap.\n   *\n   * @param parentId\n   * @param parentLevel\n   * @private\n   */\n  _placeBranchNodes(parentId, parentLevel) {\n    // if this is not a parent, cancel the placing. This can happen with multiple parents to one child.\n    if (this.hierarchicalChildrenReference[parentId] === undefined) {\n      return;\n    }\n\n    // get a list of childNodes\n    let childNodes = [];\n    for (let i = 0; i < this.hierarchicalChildrenReference[parentId].length; i++) {\n      childNodes.push(this.body.nodes[this.hierarchicalChildrenReference[parentId][i]]);\n    }\n\n    // use the positions to order the nodes.\n    this._sortNodeArray(childNodes);\n\n    // position the childNodes\n    for (let i = 0; i < childNodes.length; i++) {\n      let childNode = childNodes[i];\n      let childNodeLevel = this.hierarchicalLevels[childNode.id];\n      // check if the child node is below the parent node and if it has already been positioned.\n      if (childNodeLevel > parentLevel && this.positionedNodes[childNode.id] === undefined) {\n        // get the amount of space required for this node. If parent the width is based on the amount of children.\n        let pos;\n\n        // we get the X or Y values we need and store them in pos and previousPos. The get and set make sure we get X or Y\n        if (i === 0) {pos = this._getPositionForHierarchy(this.body.nodes[parentId]);}\n        else         {pos = this._getPositionForHierarchy(childNodes[i-1]) + this.options.hierarchical.nodeSpacing;}\n        this._setPositionForHierarchy(childNode, pos, childNodeLevel);\n        this._validataPositionAndContinue(childNode, childNodeLevel, pos);\n      }\n      else {\n        return;\n      }\n    }\n\n    // center the parent nodes.\n    let minPos = 1e9;\n    let maxPos = -1e9;\n    for (let i = 0; i < childNodes.length; i++) {\n      let childNodeId = childNodes[i].id;\n      minPos = Math.min(minPos, this._getPositionForHierarchy(this.body.nodes[childNodeId]));\n      maxPos = Math.max(maxPos, this._getPositionForHierarchy(this.body.nodes[childNodeId]));\n    }\n    this._setPositionForHierarchy(this.body.nodes[parentId], 0.5 * (minPos + maxPos), parentLevel);\n  }\n\n\n  /**\n   * This method checks for overlap and if required shifts the branch. It also keeps records of positioned nodes.\n   * Finally it will call _placeBranchNodes to place the branch nodes.\n   * @param node\n   * @param level\n   * @param pos\n   * @private\n   */\n  _validataPositionAndContinue(node, level, pos) {\n    // if overlap has been detected, we shift the branch\n    if (this.lastNodeOnLevel[level] !== undefined) {\n      let previousPos = this._getPositionForHierarchy(this.body.nodes[this.lastNodeOnLevel[level]]);\n      if (pos - previousPos < this.options.hierarchical.nodeSpacing) {\n        let diff = (previousPos + this.options.hierarchical.nodeSpacing) - pos;\n        let sharedParent = this._findCommonParent(this.lastNodeOnLevel[level], node.id);\n        this._shiftBlock(sharedParent.withChild, diff);\n      }\n    }\n\n    // store change in position.\n    this.lastNodeOnLevel[level] = node.id;\n\n    this.positionedNodes[node.id] = true;\n\n    this._placeBranchNodes(node.id, level);\n  }\n\n  /**\n   * Receives an array with node indices and returns an array with the actual node references. Used for sorting based on\n   * node properties.\n   * @param idArray\n   */\n  _indexArrayToNodes(idArray) {\n    let array = [];\n    for (let i = 0; i < idArray.length; i++) {\n      array.push(this.body.nodes[idArray[i]])\n    }\n    return array;\n  }\n\n  /**\n   * This function get the distribution of levels based on hubsize\n   *\n   * @returns {Object}\n   * @private\n   */\n  _getDistribution() {\n    let distribution = {};\n    let nodeId, node;\n\n    // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time.\n    // the fix of X is removed after the x value has been set.\n    for (nodeId in this.body.nodes) {\n      if (this.body.nodes.hasOwnProperty(nodeId)) {\n        node = this.body.nodes[nodeId];\n        let level = this.hierarchicalLevels[nodeId] === undefined ? 0 : this.hierarchicalLevels[nodeId];\n        if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') {\n          node.y = this.options.hierarchical.levelSeparation * level;\n          node.options.fixed.y = true;\n        }\n        else {\n          node.x = this.options.hierarchical.levelSeparation * level;\n          node.options.fixed.x = true;\n        }\n        if (distribution[level] === undefined) {\n          distribution[level] = {};\n        }\n        distribution[level][nodeId] = node;\n      }\n    }\n    return distribution;\n  }\n\n\n  /**\n   * Get the hubsize from all remaining unlevelled nodes.\n   *\n   * @returns {number}\n   * @private\n   */\n  _getHubSize() {\n    let hubSize = 0;\n    for (let nodeId in this.body.nodes) {\n      if (this.body.nodes.hasOwnProperty(nodeId)) {\n        let node = this.body.nodes[nodeId];\n        if (this.hierarchicalLevels[nodeId] === undefined) {\n          hubSize = node.edges.length < hubSize ? hubSize : node.edges.length;\n        }\n      }\n    }\n    return hubSize;\n  }\n\n\n  /**\n   * this function allocates nodes in levels based on the recursive branching from the largest hubs.\n   *\n   * @param hubsize\n   * @private\n   */\n  _determineLevelsByHubsize() {\n    let hubSize = 1;\n\n    let levelDownstream = (nodeA, nodeB) => {\n      if (this.hierarchicalLevels[nodeB.id] === undefined) {\n        // set initial level\n        if (this.hierarchicalLevels[nodeA.id] === undefined) {\n          this.hierarchicalLevels[nodeA.id] = 0;\n        }\n        // set level\n        this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + 1;\n      }\n    };\n\n    while (hubSize > 0) {\n      // determine hubs\n      hubSize = this._getHubSize();\n      if (hubSize === 0)\n        break;\n\n      for (let nodeId in this.body.nodes) {\n        if (this.body.nodes.hasOwnProperty(nodeId)) {\n          let node = this.body.nodes[nodeId];\n          if (node.edges.length === hubSize) {\n            this._crawlNetwork(levelDownstream,nodeId);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * TODO: release feature\n   * @private\n   */\n  _determineLevelsCustomCallback() {\n    let minLevel = 100000;\n\n    // TODO: this should come from options.\n    let customCallback = function(nodeA, nodeB, edge) {\n\n    };\n\n    let levelByDirection = (nodeA, nodeB, edge) => {\n      let levelA = this.hierarchicalLevels[nodeA.id];\n      // set initial level\n      if (levelA === undefined) {this.hierarchicalLevels[nodeA.id] = minLevel;}\n\n      let diff = customCallback(\n        NetworkUtil.cloneOptions(nodeA,'node'),\n        NetworkUtil.cloneOptions(nodeB,'node'),\n        NetworkUtil.cloneOptions(edge,'edge')\n      );\n\n      this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + diff;\n    };\n\n    this._crawlNetwork(levelByDirection);\n    this._setMinLevelToZero();\n  }\n\n  /**\n   * this function allocates nodes in levels based on the direction of the edges\n   *\n   * @param hubsize\n   * @private\n   */\n  _determineLevelsDirected() {\n    let minLevel = 10000;\n    let levelByDirection = (nodeA, nodeB, edge) => {\n      let levelA = this.hierarchicalLevels[nodeA.id];\n      // set initial level\n      if (levelA === undefined) {this.hierarchicalLevels[nodeA.id] = minLevel;}\n      if (edge.toId == nodeB.id) {\n        this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] + 1;\n      }\n      else {\n        this.hierarchicalLevels[nodeB.id] = this.hierarchicalLevels[nodeA.id] - 1;\n      }\n    };\n    this._crawlNetwork(levelByDirection);\n    this._setMinLevelToZero();\n  }\n\n\n  /**\n   * Small util method to set the minimum levels of the nodes to zero.\n   * @private\n   */\n  _setMinLevelToZero() {\n    let minLevel = 1e9;\n    // get the minimum level\n    for (let nodeId in this.body.nodes) {\n      if (this.body.nodes.hasOwnProperty(nodeId)) {\n        if (this.hierarchicalLevels[nodeId] !== undefined) {\n          minLevel = Math.min(this.hierarchicalLevels[nodeId], minLevel);\n        }\n      }\n    }\n\n    // subtract the minimum from the set so we have a range starting from 0\n    for (let nodeId in this.body.nodes) {\n      if (this.body.nodes.hasOwnProperty(nodeId)) {\n        if (this.hierarchicalLevels[nodeId] !== undefined) {\n          this.hierarchicalLevels[nodeId] -= minLevel;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Update the bookkeeping of parent and child.\n   * @private\n   */\n  _generateMap() {\n    let fillInRelations = (parentNode, childNode) => {\n      if (this.hierarchicalLevels[childNode.id] > this.hierarchicalLevels[parentNode.id]) {\n        let parentNodeId = parentNode.id;\n        let childNodeId = childNode.id;\n        if (this.hierarchicalChildrenReference[parentNodeId] === undefined) {\n          this.hierarchicalChildrenReference[parentNodeId] = [];\n        }\n        this.hierarchicalChildrenReference[parentNodeId].push(childNodeId);\n        if (this.hierarchicalParentReference[childNodeId] === undefined) {\n          this.hierarchicalParentReference[childNodeId] = [];\n        }\n        this.hierarchicalParentReference[childNodeId].push(parentNodeId);\n      }\n    };\n\n    this._crawlNetwork(fillInRelations);\n  }\n\n\n  /**\n   * Crawl over the entire network and use a callback on each node couple that is connected to each other.\n   * @param callback          | will receive nodeA nodeB and the connecting edge. A and B are unique.\n   * @param startingNodeId\n   * @private\n   */\n  _crawlNetwork(callback = function() {}, startingNodeId) {\n    let progress = {};\n    let treeIndex = 0;\n\n    let crawler = (node, tree) => {\n      if (progress[node.id] === undefined) {\n\n        if (this.hierarchicalTrees[node.id] === undefined) {\n          this.hierarchicalTrees[node.id] = tree;\n          this.treeIndex = Math.max(tree, this.treeIndex);\n        }\n\n        progress[node.id] = true;\n        let childNode;\n        for (let i = 0; i < node.edges.length; i++) {\n          if (node.edges[i].connected === true) {\n            if (node.edges[i].toId === node.id) {\n              childNode = node.edges[i].from;\n            }\n            else {\n              childNode = node.edges[i].to;\n            }\n\n            if (node.id !== childNode.id) {\n              callback(node, childNode, node.edges[i]);\n              crawler(childNode, tree);\n            }\n          }\n        }\n      }\n    };\n\n\n    // we can crawl from a specific node or over all nodes.\n    if (startingNodeId === undefined) {\n      for (let i = 0; i < this.body.nodeIndices.length; i++) {\n        let node = this.body.nodes[this.body.nodeIndices[i]];\n        if (progress[node.id] === undefined) {\n          crawler(node, treeIndex);\n          treeIndex += 1;\n        }\n      }\n    }\n    else {\n      let node = this.body.nodes[startingNodeId];\n      if (node === undefined) {\n        console.error(\"Node not found:\", startingNodeId);\n        return;\n      }\n      crawler(node);\n    }\n  }\n\n\n  /**\n   * Shift a branch a certain distance\n   * @param parentId\n   * @param diff\n   * @private\n   */\n  _shiftBlock(parentId, diff) {\n    if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') {\n      this.body.nodes[parentId].x += diff;\n    }\n    else {\n      this.body.nodes[parentId].y += diff;\n    }\n    if (this.hierarchicalChildrenReference[parentId] !== undefined) {\n      for (let i = 0; i < this.hierarchicalChildrenReference[parentId].length; i++) {\n        this._shiftBlock(this.hierarchicalChildrenReference[parentId][i], diff);\n      }\n    }\n  }\n\n\n  /**\n   * Find a common parent between branches.\n   * @param childA\n   * @param childB\n   * @returns {{foundParent, withChild}}\n   * @private\n   */\n  _findCommonParent(childA,childB) {\n    let parents = {};\n    let iterateParents = (parents,child) => {\n      if (this.hierarchicalParentReference[child] !== undefined) {\n        for (let i = 0; i < this.hierarchicalParentReference[child].length; i++) {\n          let parent = this.hierarchicalParentReference[child][i];\n          parents[parent] = true;\n          iterateParents(parents, parent)\n        }\n      }\n    };\n    let findParent = (parents, child) => {\n      if (this.hierarchicalParentReference[child] !== undefined) {\n        for (let i = 0; i < this.hierarchicalParentReference[child].length; i++) {\n          let parent = this.hierarchicalParentReference[child][i];\n          if (parents[parent] !== undefined) {\n            return {foundParent:parent, withChild:child};\n          }\n          let branch = findParent(parents, parent);\n          if (branch.foundParent !== null) {\n            return branch;\n          }\n        }\n      }\n      return {foundParent:null, withChild:child};\n    };\n\n    iterateParents(parents, childA);\n    return findParent(parents, childB);\n  }\n\n  /**\n   * Abstract the getting of the position so we won't have to repeat the check for direction all the time\n   * @param node\n   * @param position\n   * @param level\n   * @private\n   */\n  _setPositionForHierarchy(node, position, level, doNotUpdate = false) {\n    //console.log('_setPositionForHierarchy',node.id, position)\n    if (doNotUpdate !== true) {\n      if (this.distributionOrdering[level] === undefined) {\n        this.distributionOrdering[level] = [];\n        this.distributionOrderingPresence[level] = {};\n      }\n\n      if (this.distributionOrderingPresence[level][node.id] === undefined) {\n        this.distributionOrdering[level].push(node);\n        this.distributionIndex[node.id] = this.distributionOrdering[level].length - 1;\n      }\n      this.distributionOrderingPresence[level][node.id] = true;\n    }\n\n    if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') {\n      node.x = position;\n    }\n    else {\n      node.y = position;\n    }\n  }\n\n  /**\n   * Abstract the getting of the position of a node so we do not have to repeat the direction check all the time.\n   * @param node\n   * @returns {number|*}\n   * @private\n   */\n  _getPositionForHierarchy(node) {\n    if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') {\n      return node.x;\n    }\n    else {\n      return node.y;\n    }\n  }\n\n  /**\n   * Use the x or y value to sort the array, allowing users to specify order.\n   * @param nodeArray\n   * @private\n   */\n  _sortNodeArray(nodeArray) {\n    if (nodeArray.length > 1) {\n      if (this.options.hierarchical.direction === 'UD' || this.options.hierarchical.direction === 'DU') {\n        nodeArray.sort(function (a, b) {\n          return a.x - b.x;\n        })\n      }\n      else {\n        nodeArray.sort(function (a, b) {\n          return a.y - b.y;\n        })\n      }\n    }\n  }\n\n\n\n}\n\nexport default LayoutEngine;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/LayoutEngine.js","\nlet util = require('../../util');\nlet Hammer = require('../../module/hammer');\nlet hammerUtil = require('../../hammerUtil');\n\n/**\n * clears the toolbar div element of children\n *\n * @private\n */\nclass ManipulationSystem {\n  constructor(body, canvas, selectionHandler) {\n    this.body = body;\n    this.canvas = canvas;\n    this.selectionHandler = selectionHandler;\n\n    this.editMode = false;\n    this.manipulationDiv = undefined;\n    this.editModeDiv     = undefined;\n    this.closeDiv        = undefined;\n\n    this.manipulationHammers = [];\n    this.temporaryUIFunctions = {};\n    this.temporaryEventFunctions = [];\n\n    this.touchTime = 0;\n    this.temporaryIds = {nodes: [], edges:[]};\n    this.guiEnabled = false;\n    this.inMode = false;\n    this.selectedControlNode = undefined;\n\n    this.options = {};\n    this.defaultOptions = {\n      enabled: false,\n      initiallyActive: false,\n      addNode: true,\n      addEdge: true,\n      editNode: undefined,\n      editEdge: true,\n      deleteNode: true,\n      deleteEdge: true,\n      controlNodeStyle:{\n        shape:'dot',\n        size:6,\n        color: {background: '#ff0000', border: '#3c3c3c', highlight: {background: '#07f968', border: '#3c3c3c'}},\n        borderWidth: 2,\n        borderWidthSelected: 2\n      }\n    };\n    util.extend(this.options, this.defaultOptions);\n\n    this.body.emitter.on('destroy',     () => {this._clean();});\n    this.body.emitter.on('_dataChanged',this._restore.bind(this));\n    this.body.emitter.on('_resetData',  this._restore.bind(this));\n  }\n\n\n  /**\n   * If something changes in the data during editing, switch back to the initial datamanipulation state and close all edit modes.\n   * @private\n   */\n  _restore() {\n    if (this.inMode !== false) {\n      if (this.options.initiallyActive === true) {\n        this.enableEditMode();\n      }\n      else {\n        this.disableEditMode();\n      }\n    }\n  }\n\n  /**\n   * Set the Options\n   * @param options\n   */\n  setOptions(options, allOptions, globalOptions) {\n    if (allOptions !== undefined) {\n      if (allOptions.locale !== undefined)  {this.options.locale = allOptions.locale}   else {this.options.locale = globalOptions.locale;}\n      if (allOptions.locales !== undefined) {this.options.locales = allOptions.locales} else {this.options.locales = globalOptions.locales;}\n    }\n\n    if (options !== undefined) {\n      if (typeof options === 'boolean') {\n        this.options.enabled = options;\n      }\n      else {\n        this.options.enabled = true;\n        util.deepExtend(this.options, options);\n      }\n      if (this.options.initiallyActive === true) {\n        this.editMode = true;\n      }\n      this._setup();\n    }\n  }\n\n\n  /**\n   * Enable or disable edit-mode. Draws the DOM required and cleans up after itself.\n   *\n   * @private\n   */\n  toggleEditMode() {\n    if (this.editMode === true) {\n      this.disableEditMode();\n    }\n    else {\n      this.enableEditMode();\n    }\n  }\n\n\n  enableEditMode() {\n    this.editMode = true;\n\n    this._clean();\n    if (this.guiEnabled === true) {\n      this.manipulationDiv.style.display = 'block';\n      this.closeDiv.style.display = 'block';\n      this.editModeDiv.style.display = 'none';\n      this.showManipulatorToolbar();\n    }\n  }\n\n  disableEditMode() {\n    this.editMode = false;\n\n    this._clean();\n    if (this.guiEnabled === true) {\n      this.manipulationDiv.style.display = 'none';\n      this.closeDiv.style.display = 'none';\n      this.editModeDiv.style.display = 'block';\n      this._createEditButton();\n    }\n  }\n\n  /**\n   * Creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar.\n   *\n   * @private\n   */\n  showManipulatorToolbar() {\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n\n    // reset global variables\n    this.manipulationDOM = {};\n\n    // if the gui is enabled, draw all elements.\n    if (this.guiEnabled === true) {\n      // a _restore will hide these menus\n      this.editMode = true;\n      this.manipulationDiv.style.display = 'block';\n      this.closeDiv.style.display = 'block';\n\n      let selectedNodeCount  = this.selectionHandler._getSelectedNodeCount();\n      let selectedEdgeCount  = this.selectionHandler._getSelectedEdgeCount();\n      let selectedTotalCount = selectedNodeCount + selectedEdgeCount;\n      let locale = this.options.locales[this.options.locale];\n      let needSeperator = false;\n\n\n      if (this.options.addNode !== false) {\n        this._createAddNodeButton(locale);\n        needSeperator = true;\n      }\n      if (this.options.addEdge !== false) {\n        if (needSeperator === true) {\n          this._createSeperator(1);\n        } else {\n          needSeperator = true;\n        }\n        this._createAddEdgeButton(locale);\n      }\n\n      if (selectedNodeCount === 1 && typeof this.options.editNode === 'function') {\n        if (needSeperator === true) {\n          this._createSeperator(2);\n        } else {\n          needSeperator = true;\n        }\n        this._createEditNodeButton(locale);\n      }\n      else if (selectedEdgeCount === 1 && selectedNodeCount === 0 && this.options.editEdge !== false) {\n        if (needSeperator === true) {\n          this._createSeperator(3);\n        } else {\n          needSeperator = true;\n        }\n        this._createEditEdgeButton(locale);\n      }\n\n      // remove buttons\n      if (selectedTotalCount !== 0) {\n        if (selectedNodeCount > 0 && this.options.deleteNode !== false) {\n          if (needSeperator === true) {\n            this._createSeperator(4);\n          }\n          this._createDeleteButton(locale);\n        }\n        else if (selectedNodeCount === 0 && this.options.deleteEdge !== false) {\n          if (needSeperator === true) {\n            this._createSeperator(4);\n          }\n          this._createDeleteButton(locale);\n        }\n      }\n\n      // bind the close button\n      this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));\n\n      // refresh this bar based on what has been selected\n      this._temporaryBindEvent('select', this.showManipulatorToolbar.bind(this));\n    }\n\n    // redraw to show any possible changes\n    this.body.emitter.emit('_redraw');\n\n  }\n\n\n  /**\n   * Create the toolbar for adding Nodes\n   */\n  addNodeMode() {\n    // when using the gui, enable edit mode if it wasnt already.\n    if (this.editMode !== true) {\n      this.enableEditMode();\n    }\n\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n\n    this.inMode = 'addNode';\n    if (this.guiEnabled === true) {\n      let locale = this.options.locales[this.options.locale];\n      this.manipulationDOM = {};\n      this._createBackButton(locale);\n      this._createSeperator();\n      this._createDescription(locale['addDescription'] || this.options.locales['en']['addDescription']);\n\n      // bind the close button\n      this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));\n    }\n\n    this._temporaryBindEvent('click', this._performAddNode.bind(this));\n  }\n\n  /**\n   * call the bound function to handle the editing of the node. The node has to be selected.\n   */\n  editNode() {\n    // when using the gui, enable edit mode if it wasnt already.\n    if (this.editMode !== true) {\n      this.enableEditMode();\n    }\n\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n    let node = this.selectionHandler._getSelectedNode();\n    if (node !== undefined) {\n      this.inMode = 'editNode';\n      if (typeof this.options.editNode === 'function') {\n        if (node.isCluster !== true) {\n          let data = util.deepExtend({}, node.options, false);\n          data.x = node.x;\n          data.y = node.y;\n\n          if (this.options.editNode.length === 2) {\n            this.options.editNode(data, (finalizedData) => {\n              if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'editNode') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {\n                this.body.data.nodes.getDataSet().update(finalizedData);\n              }\n              this.showManipulatorToolbar();\n            });\n          }\n          else {\n            throw new Error('The function for edit does not support two arguments (data, callback)');\n          }\n        }\n        else {\n          alert(this.options.locales[this.options.locale]['editClusterError'] || this.options.locales['en']['editClusterError']);\n        }\n      }\n      else {\n        throw new Error('No function has been configured to handle the editing of nodes.');\n      }\n    }\n    else {\n      this.showManipulatorToolbar();\n    }\n  }\n\n\n  /**\n   * create the toolbar to connect nodes\n   */\n  addEdgeMode() {\n    // when using the gui, enable edit mode if it wasnt already.\n    if (this.editMode !== true) {\n      this.enableEditMode();\n    }\n\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n\n    this.inMode = 'addEdge';\n    if (this.guiEnabled === true) {\n      let locale = this.options.locales[this.options.locale];\n      this.manipulationDOM = {};\n      this._createBackButton(locale);\n      this._createSeperator();\n      this._createDescription(locale['edgeDescription'] || this.options.locales['en']['edgeDescription']);\n\n      // bind the close button\n      this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));\n    }\n\n    // temporarily overload functions\n    this._temporaryBindUI('onTouch',    this._handleConnect.bind(this));\n    this._temporaryBindUI('onDragEnd',  this._finishConnect.bind(this));\n    this._temporaryBindUI('onDrag',     this._dragControlNode.bind(this));\n    this._temporaryBindUI('onRelease',  this._finishConnect.bind(this));\n\n    this._temporaryBindUI('onDragStart', () => {});\n    this._temporaryBindUI('onHold', () => {});\n  }\n\n  /**\n   * create the toolbar to edit edges\n   */\n  editEdgeMode() {\n    // when using the gui, enable edit mode if it wasn't already.\n    if (this.editMode !== true) {\n      this.enableEditMode();\n    }\n\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n\n    this.inMode = 'editEdge';\n    if (typeof this.options.editEdge === 'object' && typeof this.options.editEdge.editWithoutDrag === \"function\") {\n      this.edgeBeingEditedId = this.selectionHandler.getSelectedEdges()[0];\n      if (this.edgeBeingEditedId !== undefined) {\n        var edge = this.body.edges[this.edgeBeingEditedId];\n        this._performEditEdge(edge.from, edge.to);\n        return;\n      }\n    }\n    if (this.guiEnabled === true) {\n      let locale = this.options.locales[this.options.locale];\n      this.manipulationDOM = {};\n      this._createBackButton(locale);\n      this._createSeperator();\n      this._createDescription(locale['editEdgeDescription'] || this.options.locales['en']['editEdgeDescription']);\n\n      // bind the close button\n      this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));\n    }\n\n    this.edgeBeingEditedId = this.selectionHandler.getSelectedEdges()[0];\n    if (this.edgeBeingEditedId !== undefined) {\n      let edge = this.body.edges[this.edgeBeingEditedId];\n\n      // create control nodes\n      let controlNodeFrom = this._getNewTargetNode(edge.from.x, edge.from.y);\n      let controlNodeTo = this._getNewTargetNode(edge.to.x, edge.to.y);\n\n      this.temporaryIds.nodes.push(controlNodeFrom.id);\n      this.temporaryIds.nodes.push(controlNodeTo.id);\n\n      this.body.nodes[controlNodeFrom.id] = controlNodeFrom;\n      this.body.nodeIndices.push(controlNodeFrom.id);\n      this.body.nodes[controlNodeTo.id] = controlNodeTo;\n      this.body.nodeIndices.push(controlNodeTo.id);\n\n      // temporarily overload UI functions, cleaned up automatically because of _temporaryBindUI\n      this._temporaryBindUI('onTouch', this._controlNodeTouch.bind(this));    // used to get the position\n      this._temporaryBindUI('onTap', () => {});                             // disabled\n      this._temporaryBindUI('onHold', () => {});                             // disabled\n      this._temporaryBindUI('onDragStart', this._controlNodeDragStart.bind(this));// used to select control node\n      this._temporaryBindUI('onDrag', this._controlNodeDrag.bind(this));     // used to drag control node\n      this._temporaryBindUI('onDragEnd', this._controlNodeDragEnd.bind(this));  // used to connect or revert control nodes\n      this._temporaryBindUI('onMouseMove', () => {});                             // disabled\n\n      // create function to position control nodes correctly on movement\n      // automatically cleaned up because we use the temporary bind\n      this._temporaryBindEvent('beforeDrawing', (ctx) => {\n        let positions = edge.edgeType.findBorderPositions(ctx);\n        if (controlNodeFrom.selected === false) {\n          controlNodeFrom.x = positions.from.x;\n          controlNodeFrom.y = positions.from.y;\n        }\n        if (controlNodeTo.selected === false) {\n          controlNodeTo.x = positions.to.x;\n          controlNodeTo.y = positions.to.y;\n        }\n      });\n\n      this.body.emitter.emit('_redraw');\n    }\n    else {\n      this.showManipulatorToolbar();\n    }\n  }\n\n  /**\n   * delete everything in the selection\n   */\n  deleteSelected() {\n    // when using the gui, enable edit mode if it wasnt already.\n    if (this.editMode !== true) {\n      this.enableEditMode();\n    }\n\n    // restore the state of any bound functions or events, remove control nodes, restore physics\n    this._clean();\n\n    this.inMode = 'delete';\n    let selectedNodes = this.selectionHandler.getSelectedNodes();\n    let selectedEdges = this.selectionHandler.getSelectedEdges();\n    let deleteFunction = undefined;\n    if (selectedNodes.length > 0) {\n      for (let i = 0; i < selectedNodes.length; i++) {\n        if (this.body.nodes[selectedNodes[i]].isCluster === true) {\n          alert(this.options.locales[this.options.locale]['deleteClusterError'] || this.options.locales['en']['deleteClusterError']);\n          return;\n        }\n      }\n\n      if (typeof this.options.deleteNode === 'function') {\n        deleteFunction = this.options.deleteNode;\n      }\n    }\n    else if (selectedEdges.length > 0) {\n      if (typeof this.options.deleteEdge === 'function') {\n        deleteFunction = this.options.deleteEdge;\n      }\n    }\n\n    if (typeof deleteFunction === 'function') {\n      let data = {nodes: selectedNodes, edges: selectedEdges};\n      if (deleteFunction.length === 2) {\n        deleteFunction(data, (finalizedData) => {\n          if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'delete') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {\n            this.body.data.edges.getDataSet().remove(finalizedData.edges);\n            this.body.data.nodes.getDataSet().remove(finalizedData.nodes);\n            this.body.emitter.emit('startSimulation');\n            this.showManipulatorToolbar();\n          }\n          else {\n            this.body.emitter.emit('startSimulation');\n            this.showManipulatorToolbar();\n          }\n        });\n      }\n      else {\n        throw new Error('The function for delete does not support two arguments (data, callback)')\n      }\n    }\n    else {\n      this.body.data.edges.getDataSet().remove(selectedEdges);\n      this.body.data.nodes.getDataSet().remove(selectedNodes);\n      this.body.emitter.emit('startSimulation');\n      this.showManipulatorToolbar();\n    }\n  }\n\n\n\n\n  //********************************************** PRIVATE ***************************************//\n\n  /**\n   * draw or remove the DOM\n   * @private\n   */\n  _setup() {\n    if (this.options.enabled === true) {\n      // Enable the GUI\n      this.guiEnabled = true;\n\n      this._createWrappers();\n      if (this.editMode === false) {\n        this._createEditButton();\n      }\n      else {\n        this.showManipulatorToolbar();\n      }\n    }\n    else {\n      this._removeManipulationDOM();\n\n      // disable the gui\n      this.guiEnabled = false;\n    }\n  }\n\n\n  /**\n   * create the div overlays that contain the DOM\n   * @private\n   */\n  _createWrappers() {\n    // load the manipulator HTML elements. All styling done in css.\n    if (this.manipulationDiv === undefined) {\n      this.manipulationDiv = document.createElement('div');\n      this.manipulationDiv.className = 'vis-manipulation';\n      if (this.editMode === true) {\n        this.manipulationDiv.style.display = 'block';\n      }\n      else {\n        this.manipulationDiv.style.display = 'none';\n      }\n      this.canvas.frame.appendChild(this.manipulationDiv);\n    }\n\n    // container for the edit button.\n    if (this.editModeDiv === undefined) {\n      this.editModeDiv = document.createElement('div');\n      this.editModeDiv.className = 'vis-edit-mode';\n      if (this.editMode === true) {\n        this.editModeDiv.style.display = 'none';\n      }\n      else {\n        this.editModeDiv.style.display = 'block';\n      }\n      this.canvas.frame.appendChild(this.editModeDiv);\n    }\n\n\n    // container for the close div button\n    if (this.closeDiv === undefined) {\n      this.closeDiv = document.createElement('div');\n      this.closeDiv.className = 'vis-close';\n      this.closeDiv.style.display = this.manipulationDiv.style.display;\n      this.canvas.frame.appendChild(this.closeDiv);\n    }\n  }\n\n\n  /**\n   * generate a new target node. Used for creating new edges and editing edges\n   * @param x\n   * @param y\n   * @returns {*}\n   * @private\n   */\n  _getNewTargetNode(x,y) {\n    let controlNodeStyle = util.deepExtend({}, this.options.controlNodeStyle);\n\n    controlNodeStyle.id = 'targetNode' + util.randomUUID();\n    controlNodeStyle.hidden = false;\n    controlNodeStyle.physics = false;\n    controlNodeStyle.x = x;\n    controlNodeStyle.y = y;\n\n    // we have to define the bounding box in order for the nodes to be drawn immediately\n    let node = this.body.functions.createNode(controlNodeStyle);\n    node.shape.boundingBox = {left: x, right:x, top:y, bottom:y};\n\n    return node;\n  }\n\n\n  /**\n   * Create the edit button\n   */\n  _createEditButton() {\n    // restore everything to it's original state (if applicable)\n    this._clean();\n\n    // reset the manipulationDOM\n    this.manipulationDOM = {};\n\n    // empty the editModeDiv\n    util.recursiveDOMDelete(this.editModeDiv);\n\n\n    // create the contents for the editMode button\n    let locale = this.options.locales[this.options.locale];\n    let button = this._createButton('editMode', 'vis-button vis-edit vis-edit-mode', locale['edit'] || this.options.locales['en']['edit']);\n    this.editModeDiv.appendChild(button);\n\n    // bind a hammer listener to the button, calling the function toggleEditMode.\n    this._bindHammerToDiv(button, this.toggleEditMode.bind(this));\n  }\n\n\n  /**\n   * this function cleans up after everything this module does. Temporary elements, functions and events are removed, physics restored, hammers removed.\n   * @private\n   */\n  _clean() {\n    // not in mode\n    this.inMode = false;\n\n    // _clean the divs\n    if (this.guiEnabled === true) {\n      util.recursiveDOMDelete(this.editModeDiv);\n      util.recursiveDOMDelete(this.manipulationDiv);\n\n      // removes all the bindings and overloads\n      this._cleanManipulatorHammers();\n    }\n\n    // remove temporary nodes and edges\n    this._cleanupTemporaryNodesAndEdges();\n\n    // restore overloaded UI functions\n    this._unbindTemporaryUIs();\n\n    // remove the temporaryEventFunctions\n    this._unbindTemporaryEvents();\n\n    // restore the physics if required\n    this.body.emitter.emit('restorePhysics');\n  }\n\n\n  /**\n   * Each dom element has it's own hammer. They are stored in this.manipulationHammers. This cleans them up.\n   * @private\n   */\n  _cleanManipulatorHammers() {\n    // _clean hammer bindings\n    if (this.manipulationHammers.length != 0) {\n      for (let i = 0; i < this.manipulationHammers.length; i++) {\n        this.manipulationHammers[i].destroy();\n      }\n      this.manipulationHammers = [];\n    }\n  }\n\n\n  /**\n   * Remove all DOM elements created by this module.\n   * @private\n   */\n  _removeManipulationDOM() {\n    // removes all the bindings and overloads\n    this._clean();\n\n    // empty the manipulation divs\n    util.recursiveDOMDelete(this.manipulationDiv);\n    util.recursiveDOMDelete(this.editModeDiv);\n    util.recursiveDOMDelete(this.closeDiv);\n\n    // remove the manipulation divs\n    if (this.manipulationDiv) {this.canvas.frame.removeChild(this.manipulationDiv);}\n    if (this.editModeDiv)     {this.canvas.frame.removeChild(this.editModeDiv);}\n    if (this.closeDiv)        {this.canvas.frame.removeChild(this.closeDiv);}\n\n    // set the references to undefined\n    this.manipulationDiv = undefined;\n    this.editModeDiv = undefined;\n    this.closeDiv = undefined;\n  }\n\n\n  /**\n   * create a seperator line. the index is to differentiate in the manipulation dom\n   * @param index\n   * @private\n   */\n  _createSeperator(index = 1) {\n    this.manipulationDOM['seperatorLineDiv' + index] = document.createElement('div');\n    this.manipulationDOM['seperatorLineDiv' + index].className = 'vis-separator-line';\n    this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv' + index]);\n  }\n\n  // ----------------------    DOM functions for buttons    --------------------------//\n\n  _createAddNodeButton(locale) {\n    let button = this._createButton('addNode', 'vis-button vis-add', locale['addNode'] || this.options.locales['en']['addNode']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.addNodeMode.bind(this));\n  }\n\n  _createAddEdgeButton(locale) {\n    let button = this._createButton('addEdge', 'vis-button vis-connect',  locale['addEdge'] || this.options.locales['en']['addEdge']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.addEdgeMode.bind(this));\n  }\n\n  _createEditNodeButton(locale) {\n    let button = this._createButton('editNode', 'vis-button vis-edit', locale['editNode'] || this.options.locales['en']['editNode']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.editNode.bind(this));\n  }\n\n  _createEditEdgeButton(locale) {\n    let button = this._createButton('editEdge', 'vis-button vis-edit',  locale['editEdge'] || this.options.locales['en']['editEdge']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.editEdgeMode.bind(this));\n  }\n\n  _createDeleteButton(locale) {\n    if (this.options.rtl) {\n      var deleteBtnClass = 'vis-button vis-delete-rtl';\n    } else {\n      var deleteBtnClass = 'vis-button vis-delete';\n    }\n    let button = this._createButton('delete', deleteBtnClass, locale['del'] || this.options.locales['en']['del']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.deleteSelected.bind(this));\n  }\n\n  _createBackButton(locale) {\n    let button = this._createButton('back', 'vis-button vis-back', locale['back'] || this.options.locales['en']['back']);\n    this.manipulationDiv.appendChild(button);\n    this._bindHammerToDiv(button, this.showManipulatorToolbar.bind(this));\n  }\n\n  _createButton(id, className, label, labelClassName = 'vis-label') {\n\n    this.manipulationDOM[id+'Div'] = document.createElement('div');\n    this.manipulationDOM[id+'Div'].className = className;\n    this.manipulationDOM[id+'Label'] = document.createElement('div');\n    this.manipulationDOM[id+'Label'].className = labelClassName;\n    this.manipulationDOM[id+'Label'].innerHTML = label;\n    this.manipulationDOM[id+'Div'].appendChild(this.manipulationDOM[id+'Label']);\n    return this.manipulationDOM[id+'Div'];\n  }\n\n  _createDescription(label) {\n    this.manipulationDiv.appendChild(\n      this._createButton('description', 'vis-button vis-none', label)\n    );\n  }\n\n  // -------------------------- End of DOM functions for buttons ------------------------------//\n\n  /**\n   * this binds an event until cleanup by the clean functions.\n   * @param event\n   * @param newFunction\n   * @private\n   */\n  _temporaryBindEvent(event, newFunction) {\n    this.temporaryEventFunctions.push({event:event, boundFunction:newFunction});\n    this.body.emitter.on(event, newFunction);\n  }\n\n  /**\n   * this overrides an UI function until cleanup by the clean function\n   * @param UIfunctionName\n   * @param newFunction\n   * @private\n   */\n  _temporaryBindUI(UIfunctionName, newFunction) {\n    if (this.body.eventListeners[UIfunctionName] !== undefined) {\n      this.temporaryUIFunctions[UIfunctionName] = this.body.eventListeners[UIfunctionName];\n      this.body.eventListeners[UIfunctionName] = newFunction;\n    }\n    else {\n      throw new Error('This UI function does not exist. Typo? You tried: ' + UIfunctionName + ' possible are: ' + JSON.stringify(Object.keys(this.body.eventListeners)));\n    }\n  }\n\n  /**\n   * Restore the overridden UI functions to their original state.\n   *\n   * @private\n   */\n  _unbindTemporaryUIs() {\n    for (let functionName in this.temporaryUIFunctions) {\n      if (this.temporaryUIFunctions.hasOwnProperty(functionName)) {\n        this.body.eventListeners[functionName] = this.temporaryUIFunctions[functionName];\n        delete this.temporaryUIFunctions[functionName];\n      }\n    }\n    this.temporaryUIFunctions = {};\n  }\n\n  /**\n   * Unbind the events created by _temporaryBindEvent\n   * @private\n   */\n  _unbindTemporaryEvents() {\n    for (let i = 0; i < this.temporaryEventFunctions.length; i++) {\n      let eventName = this.temporaryEventFunctions[i].event;\n      let boundFunction = this.temporaryEventFunctions[i].boundFunction;\n      this.body.emitter.off(eventName, boundFunction);\n    }\n    this.temporaryEventFunctions = [];\n  }\n\n  /**\n   * Bind an hammer instance to a DOM element.\n   * @param domElement\n   * @param funct\n   */\n  _bindHammerToDiv(domElement, boundFunction) {\n    let hammer = new Hammer(domElement, {});\n    hammerUtil.onTouch(hammer, boundFunction);\n    this.manipulationHammers.push(hammer);\n  }\n\n\n  /**\n   * Neatly clean up temporary edges and nodes\n   * @private\n   */\n  _cleanupTemporaryNodesAndEdges() {\n    // _clean temporary edges\n    for (let i = 0; i < this.temporaryIds.edges.length; i++) {\n      this.body.edges[this.temporaryIds.edges[i]].disconnect();\n      delete this.body.edges[this.temporaryIds.edges[i]];\n      let indexTempEdge = this.body.edgeIndices.indexOf(this.temporaryIds.edges[i]);\n      if (indexTempEdge !== -1) {this.body.edgeIndices.splice(indexTempEdge,1);}\n    }\n\n    // _clean temporary nodes\n    for (let i = 0; i < this.temporaryIds.nodes.length; i++) {\n      delete this.body.nodes[this.temporaryIds.nodes[i]];\n      let indexTempNode = this.body.nodeIndices.indexOf(this.temporaryIds.nodes[i]);\n      if (indexTempNode !== -1) {this.body.nodeIndices.splice(indexTempNode,1);}\n    }\n\n    this.temporaryIds = {nodes: [], edges: []};\n  }\n\n  // ------------------------------------------ EDIT EDGE FUNCTIONS -----------------------------------------//\n\n  /**\n   * the touch is used to get the position of the initial click\n   * @param event\n   * @private\n   */\n  _controlNodeTouch(event) {\n    this.selectionHandler.unselectAll();\n    this.lastTouch = this.body.functions.getPointer(event.center);\n    this.lastTouch.translation = util.extend({},this.body.view.translation); // copy the object\n  }\n\n\n  /**\n   * the drag start is used to mark one of the control nodes as selected.\n   * @param event\n   * @private\n   */\n  _controlNodeDragStart(event) {\n    let pointer = this.lastTouch;\n    let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);\n    let from = this.body.nodes[this.temporaryIds.nodes[0]];\n    let to   = this.body.nodes[this.temporaryIds.nodes[1]];\n    let edge = this.body.edges[this.edgeBeingEditedId];\n    this.selectedControlNode = undefined;\n\n    let fromSelect = from.isOverlappingWith(pointerObj);\n    let toSelect = to.isOverlappingWith(pointerObj);\n\n    if (fromSelect === true) {\n      this.selectedControlNode = from;\n      edge.edgeType.from = from;\n    }\n    else if (toSelect === true) {\n      this.selectedControlNode = to;\n      edge.edgeType.to = to;\n    }\n\n    // we use the selection to find the node that is being dragged. We explicitly select it here.\n    if (this.selectedControlNode !== undefined) {\n      this.selectionHandler.selectObject(this.selectedControlNode)\n    }\n\n    this.body.emitter.emit('_redraw');\n  }\n\n  /**\n   * dragging the control nodes or the canvas\n   * @param event\n   * @private\n   */\n  _controlNodeDrag(event) {\n    this.body.emitter.emit('disablePhysics');\n    let pointer = this.body.functions.getPointer(event.center);\n    let pos = this.canvas.DOMtoCanvas(pointer);\n    if (this.selectedControlNode !== undefined) {\n      this.selectedControlNode.x = pos.x;\n      this.selectedControlNode.y = pos.y;\n    }\n    else {\n      // if the drag was not started properly because the click started outside the network div, start it now.\n      let diffX = pointer.x - this.lastTouch.x;\n      let diffY = pointer.y - this.lastTouch.y;\n      this.body.view.translation = {x:this.lastTouch.translation.x + diffX, y:this.lastTouch.translation.y + diffY};\n    }\n    this.body.emitter.emit('_redraw');\n  }\n\n\n  /**\n   * connecting or restoring the control nodes.\n   * @param event\n   * @private\n   */\n  _controlNodeDragEnd(event) {\n    let pointer = this.body.functions.getPointer(event.center);\n    let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);\n    let edge = this.body.edges[this.edgeBeingEditedId];\n    // if the node that was dragged is not a control node, return\n    if (this.selectedControlNode === undefined) {\n      return;\n    }\n\n    // we use the selection to find the node that is being dragged. We explicitly DEselect the control node here.\n    this.selectionHandler.unselectAll();\n    let overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj);\n    let node = undefined;\n    for (let i = overlappingNodeIds.length-1; i >= 0; i--) {\n      if (overlappingNodeIds[i] !== this.selectedControlNode.id) {\n        node = this.body.nodes[overlappingNodeIds[i]];\n        break;\n      }\n    }\n    // perform the connection\n    if (node !== undefined && this.selectedControlNode !== undefined) {\n      if (node.isCluster === true) {\n        alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError'])\n      }\n      else {\n        let from = this.body.nodes[this.temporaryIds.nodes[0]];\n        if (this.selectedControlNode.id === from.id) {\n          this._performEditEdge(node.id, edge.to.id);\n        }\n        else {\n          this._performEditEdge(edge.from.id, node.id);\n        }\n      }\n    }\n    else {\n      edge.updateEdgeType();\n      this.body.emitter.emit('restorePhysics');\n    }\n    this.body.emitter.emit('_redraw');\n  }\n\n  // ------------------------------------ END OF EDIT EDGE FUNCTIONS -----------------------------------------//\n\n\n\n  // ------------------------------------------- ADD EDGE FUNCTIONS -----------------------------------------//\n  /**\n   * the function bound to the selection event. It checks if you want to connect a cluster and changes the description\n   * to walk the user through the process.\n   *\n   * @private\n   */\n  _handleConnect(event) {\n    // check to avoid double fireing of this function.\n    if (new Date().valueOf() - this.touchTime > 100) {\n      this.lastTouch = this.body.functions.getPointer(event.center);\n      this.lastTouch.translation = util.extend({},this.body.view.translation); // copy the object\n\n      let pointer = this.lastTouch;\n      let node = this.selectionHandler.getNodeAt(pointer);\n\n      if (node !== undefined) {\n        if (node.isCluster === true) {\n          alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError'])\n        }\n        else {\n          // create a node the temporary line can look at\n          let targetNode = this._getNewTargetNode(node.x,node.y);\n          this.body.nodes[targetNode.id] = targetNode;\n          this.body.nodeIndices.push(targetNode.id);\n\n          // create a temporary edge\n          let connectionEdge = this.body.functions.createEdge({\n            id: 'connectionEdge' + util.randomUUID(),\n            from: node.id,\n            to: targetNode.id,\n            physics: false,\n            smooth: {\n              enabled: true,\n              type: 'continuous',\n              roundness: 0.5\n            }\n          });\n          this.body.edges[connectionEdge.id] = connectionEdge;\n          this.body.edgeIndices.push(connectionEdge.id);\n\n          this.temporaryIds.nodes.push(targetNode.id);\n          this.temporaryIds.edges.push(connectionEdge.id);\n        }\n      }\n      this.touchTime = new Date().valueOf();\n    }\n  }\n\n  _dragControlNode(event) {\n    let pointer = this.body.functions.getPointer(event.center);\n    if (this.temporaryIds.nodes[0] !== undefined) {\n      let targetNode = this.body.nodes[this.temporaryIds.nodes[0]]; // there is only one temp node in the add edge mode.\n      targetNode.x = this.canvas._XconvertDOMtoCanvas(pointer.x);\n      targetNode.y = this.canvas._YconvertDOMtoCanvas(pointer.y);\n      this.body.emitter.emit('_redraw');\n    }\n    else {\n      let diffX = pointer.x - this.lastTouch.x;\n      let diffY = pointer.y - this.lastTouch.y;\n      this.body.view.translation = {x:this.lastTouch.translation.x + diffX, y:this.lastTouch.translation.y + diffY};\n    }\n\n  }\n\n\n  /**\n   * Connect the new edge to the target if one exists, otherwise remove temp line\n   * @param event\n   * @private\n   */\n  _finishConnect(event) {\n    let pointer = this.body.functions.getPointer(event.center);\n    let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);\n\n    // remember the edge id\n    let connectFromId = undefined;\n    if (this.temporaryIds.edges[0] !== undefined) {\n      connectFromId = this.body.edges[this.temporaryIds.edges[0]].fromId;\n    }\n\n    // get the overlapping node but NOT the temporary node;\n    let overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj);\n    let node = undefined;\n    for (let i = overlappingNodeIds.length-1; i >= 0; i--) {\n      // if the node id is NOT a temporary node, accept the node.\n      if (this.temporaryIds.nodes.indexOf(overlappingNodeIds[i]) === -1) {\n        node = this.body.nodes[overlappingNodeIds[i]];\n        break;\n      }\n    }\n\n    // clean temporary nodes and edges.\n    this._cleanupTemporaryNodesAndEdges();\n\n    // perform the connection\n    if (node !== undefined) {\n      if (node.isCluster === true) {\n        alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError']);\n      }\n      else {\n        if (this.body.nodes[connectFromId] !== undefined && this.body.nodes[node.id] !== undefined) {\n          this._performAddEdge(connectFromId, node.id);\n        }\n      }\n    }\n    this.body.emitter.emit('_redraw');\n  }\n\n  // --------------------------------------- END OF ADD EDGE FUNCTIONS -------------------------------------//\n\n\n  // ------------------------------ Performing all the actual data manipulation ------------------------//\n\n  /**\n   * Adds a node on the specified location\n   */\n  _performAddNode(clickData) {\n    let defaultData = {\n      id: util.randomUUID(),\n      x: clickData.pointer.canvas.x,\n      y: clickData.pointer.canvas.y,\n      label: 'new'\n    };\n\n    if (typeof this.options.addNode === 'function') {\n      if (this.options.addNode.length === 2) {\n        this.options.addNode(defaultData, (finalizedData) => {\n          if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'addNode') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback\n            this.body.data.nodes.getDataSet().add(finalizedData);\n            this.showManipulatorToolbar();\n          }\n        });\n      }\n      else {\n        throw new Error('The function for add does not support two arguments (data,callback)');\n        this.showManipulatorToolbar();\n      }\n    }\n    else {\n      this.body.data.nodes.getDataSet().add(defaultData);\n      this.showManipulatorToolbar();\n    }\n  }\n\n\n  /**\n   * connect two nodes with a new edge.\n   *\n   * @private\n   */\n  _performAddEdge(sourceNodeId, targetNodeId) {\n    let defaultData = {from: sourceNodeId, to: targetNodeId};\n    if (typeof this.options.addEdge === 'function') {\n      if (this.options.addEdge.length === 2) {\n        this.options.addEdge(defaultData, (finalizedData) => {\n          if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'addEdge') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback\n            this.body.data.edges.getDataSet().add(finalizedData);\n            this.selectionHandler.unselectAll();\n            this.showManipulatorToolbar();\n          }\n        });\n      }\n      else {\n        throw new Error('The function for connect does not support two arguments (data,callback)');\n      }\n    }\n    else {\n      this.body.data.edges.getDataSet().add(defaultData);\n      this.selectionHandler.unselectAll();\n      this.showManipulatorToolbar();\n    }\n  }\n\n  /**\n   * connect two nodes with a new edge.\n   *\n   * @private\n   */\n  _performEditEdge(sourceNodeId, targetNodeId) {\n    let defaultData = {id: this.edgeBeingEditedId, from: sourceNodeId, to: targetNodeId, label: this.body.data.edges._data[this.edgeBeingEditedId].label };\n    let eeFunct = this.options.editEdge;\n    if (typeof eeFunct === 'object') {\n      eeFunct = eeFunct.editWithoutDrag;\n    }\n    if (typeof eeFunct === 'function') {\n      if (eeFunct.length === 2) {\n        eeFunct(defaultData, (finalizedData) => {\n          if (finalizedData === null || finalizedData === undefined || this.inMode !== 'editEdge') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {\n            this.body.edges[defaultData.id].updateEdgeType();\n            this.body.emitter.emit('_redraw');\n            this.showManipulatorToolbar();\n          }\n          else {\n            this.body.data.edges.getDataSet().update(finalizedData);\n            this.selectionHandler.unselectAll();\n            this.showManipulatorToolbar();\n          }\n        });\n      }\n      else {\n        throw new Error('The function for edit does not support two arguments (data, callback)');\n      }\n    }\n    else {\n      this.body.data.edges.getDataSet().update(defaultData);\n      this.selectionHandler.unselectAll();\n      this.showManipulatorToolbar();\n    }\n  }\n\n\n}\n\nexport default ManipulationSystem;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/ManipulationSystem.js","/**\n * This object contains all possible options. It will check if the types are correct, if required if the option is one\n * of the allowed values.\n *\n * __any__ means that the name of the property does not matter.\n * __type__ is a required field for all objects and contains the allowed types of all objects\n */\nlet string = 'string';\nlet bool = 'boolean';\nlet number = 'number';\nlet array = 'array';\nlet object = 'object'; // should only be in a __type__ property\nlet dom = 'dom';\nlet any = 'any';\n\n\nlet allOptions = {\n  configure: {\n    enabled: { boolean: bool },\n    filter: { boolean: bool, string, array, 'function': 'function' },\n    container: { dom },\n    showButton: { boolean: bool },\n    __type__: { object, boolean: bool, string, array, 'function': 'function' }\n  },\n  edges: {\n    arrows: {\n      to: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: ['arrow', 'circle'] }, __type__: { object, boolean: bool } },\n      middle: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: ['arrow', 'circle'] }, __type__: { object, boolean: bool } },\n      from: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: ['arrow', 'circle'] }, __type__: { object, boolean: bool } },\n      __type__: { string: ['from', 'to', 'middle'], object }\n    },\n    arrowStrikethrough: { boolean: bool },\n    chosen: {\n      label: { boolean: bool, 'function': 'function' },\n      edge: { boolean: bool, 'function': 'function' },\n      __type__: { object, boolean: bool }\n    },\n    color: {\n      color: { string },\n      highlight: { string },\n      hover: { string },\n      inherit: { string: ['from', 'to', 'both'], boolean: bool },\n      opacity: { number },\n      __type__: { object, string }\n    },\n    dashes: { boolean: bool, array },\n    font: {\n      color: { string },\n      size: { number }, // px\n      face: { string },\n      background: { string },\n      strokeWidth: { number }, // px\n      strokeColor: { string },\n      align: { string: ['horizontal', 'top', 'middle', 'bottom'] },\n      vadjust: { number },\n      multi: { boolean: bool, string },\n      bold: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      boldital: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      ital: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      mono: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      __type__: { object, string }\n    },\n    hidden: { boolean: bool },\n    hoverWidth: { 'function': 'function', number },\n    label: { string, 'undefined': 'undefined' },\n    labelHighlightBold: { boolean: bool },\n    length: { number, 'undefined': 'undefined' },\n    physics: { boolean: bool },\n    scaling: {\n      min: { number },\n      max: { number },\n      label: {\n        enabled: { boolean: bool },\n        min: { number },\n        max: { number },\n        maxVisible: { number },\n        drawThreshold: { number },\n        __type__: { object, boolean: bool }\n      },\n      customScalingFunction: { 'function': 'function' },\n      __type__: { object }\n    },\n    selectionWidth: { 'function': 'function', number },\n    selfReferenceSize: { number },\n    shadow: {\n      enabled: { boolean: bool },\n      color: { string },\n      size: { number },\n      x: { number },\n      y: { number },\n      __type__: { object, boolean: bool }\n    },\n    smooth: {\n      enabled: { boolean: bool },\n      type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'] },\n      roundness: { number },\n      forceDirection: { string: ['horizontal', 'vertical', 'none'], boolean: bool },\n      __type__: { object, boolean: bool }\n    },\n    title: { string, 'undefined': 'undefined' },\n    width: { number },\n    widthConstraint: {\n      maximum: { number },\n      __type__: { object, boolean: bool, number }\n    },\n    value: { number, 'undefined': 'undefined' },\n    __type__: { object }\n  },\n  groups: {\n    useDefaultGroups: { boolean: bool },\n    __any__: 'get from nodes, will be overwritten below',\n    __type__: { object }\n  },\n  interaction: {\n    dragNodes: { boolean: bool },\n    dragView: { boolean: bool },\n    hideEdgesOnDrag: { boolean: bool },\n    hideNodesOnDrag: { boolean: bool },\n    hover: { boolean: bool },\n    keyboard: {\n      enabled: { boolean: bool },\n      speed: { x: { number }, y: { number }, zoom: { number }, __type__: { object } },\n      bindToWindow: { boolean: bool },\n      __type__: { object, boolean: bool }\n    },\n    multiselect: { boolean: bool },\n    navigationButtons: { boolean: bool },\n    selectable: { boolean: bool },\n    selectConnectedEdges: { boolean: bool },\n    hoverConnectedEdges: { boolean: bool },\n    tooltipDelay: { number },\n    zoomView: { boolean: bool },\n    __type__: { object }\n  },\n  layout: {\n    randomSeed: { 'undefined': 'undefined', number },\n    improvedLayout: { boolean: bool },\n    hierarchical: {\n      enabled: { boolean: bool },\n      levelSeparation: { number },\n      nodeSpacing: { number },\n      treeSpacing: { number },\n      blockShifting: { boolean: bool },\n      edgeMinimization: { boolean: bool },\n      parentCentralization: { boolean: bool },\n      direction: { string: ['UD', 'DU', 'LR', 'RL'] },   // UD, DU, LR, RL\n      sortMethod: { string: ['hubsize', 'directed'] }, // hubsize, directed\n      __type__: { object, boolean: bool }\n    },\n    __type__: { object }\n  },\n  manipulation: {\n    enabled: { boolean: bool },\n    initiallyActive: { boolean: bool },\n    addNode: { boolean: bool, 'function': 'function' },\n    addEdge: { boolean: bool, 'function': 'function' },\n    editNode: { 'function': 'function' },\n    editEdge: {\n      editWithoutDrag: { 'function' : 'function' },\n      __type__: {object, boolean: bool, 'function': 'function' }\n    },\n    deleteNode: { boolean: bool, 'function': 'function' },\n    deleteEdge: { boolean: bool, 'function': 'function' },\n    controlNodeStyle: 'get from nodes, will be overwritten below',\n    __type__: { object, boolean: bool }\n  },\n  nodes: {\n    borderWidth: { number },\n    borderWidthSelected: { number, 'undefined': 'undefined' },\n    brokenImage: { string, 'undefined': 'undefined' },\n    chosen: {\n      label: { boolean: bool, 'function': 'function' },\n      node: { boolean: bool, 'function': 'function' },\n      __type__: { object, boolean: bool }\n    },\n    color: {\n      border: { string },\n      background: { string },\n      highlight: {\n        border: { string },\n        background: { string },\n        __type__: { object, string }\n      },\n      hover: {\n        border: { string },\n        background: { string },\n        __type__: { object, string }\n      },\n      __type__: { object, string }\n    },\n    fixed: {\n      x: { boolean: bool },\n      y: { boolean: bool },\n      __type__: { object, boolean: bool }\n    },\n    font: {\n      align: { string },\n      color: { string },\n      size: { number }, // px\n      face: { string },\n      background: { string },\n      strokeWidth: { number }, // px\n      strokeColor: { string },\n      vadjust: { number },\n      multi: { boolean: bool, string },\n      bold: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      boldital: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      ital: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      mono: {\n        color: { string },\n        size: { number }, // px\n        face: { string },\n        mod: { string },\n        vadjust: { number },\n        __type__: { object, string }\n      },\n      __type__: { object, string }\n    },\n    group: { string, number, 'undefined': 'undefined' },\n    heightConstraint: {\n      minimum: { number },\n      valign: { string },\n      __type__: { object, boolean: bool, number }\n    },\n    hidden: { boolean: bool },\n    icon: {\n      face: { string },\n      code: { string },  //'\\uf007',\n      size: { number },  //50,\n      color: { string },\n      __type__: { object }\n    },\n    id: { string, number },\n    image: { string, 'undefined': 'undefined' }, // --> URL\n    label: { string, 'undefined': 'undefined' },\n    labelHighlightBold: { boolean: bool },\n    level: { number, 'undefined': 'undefined' },\n    margin: {\n      top: { number },\n      right: { number },\n      bottom: { number },\n      left: { number },\n      __type__: { object, number }\n    },\n    mass: { number },\n    physics: { boolean: bool },\n    scaling: {\n      min: { number },\n      max: { number },\n      label: {\n        enabled: { boolean: bool },\n        min: { number },\n        max: { number },\n        maxVisible: { number },\n        drawThreshold: { number },\n        __type__: { object, boolean: bool }\n      },\n      customScalingFunction: { 'function': 'function' },\n      __type__: { object }\n    },\n    shadow: {\n      enabled: { boolean: bool },\n      color: { string },\n      size: { number },\n      x: { number },\n      y: { number },\n      __type__: { object, boolean: bool }\n    },\n    shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon'] },\n    shapeProperties: {\n      borderDashes: { boolean: bool, array },\n      borderRadius: { number },\n      interpolation: { boolean: bool },\n      useImageSize: { boolean: bool },\n      useBorderWithImage: { boolean: bool },\n      __type__: { object }\n    },\n    size: { number },\n    title: { string, 'undefined': 'undefined' },\n    value: { number, 'undefined': 'undefined' },\n    widthConstraint: {\n      minimum: { number },\n      maximum: { number },\n      __type__: { object, boolean: bool, number }\n    },\n    x: { number },\n    y: { number },\n    __type__: { object }\n  },\n  physics: {\n    enabled: { boolean: bool },\n    barnesHut: {\n      gravitationalConstant: { number },\n      centralGravity: { number },\n      springLength: { number },\n      springConstant: { number },\n      damping: { number },\n      avoidOverlap: { number },\n      __type__: { object }\n    },\n    forceAtlas2Based: {\n      gravitationalConstant: { number },\n      centralGravity: { number },\n      springLength: { number },\n      springConstant: { number },\n      damping: { number },\n      avoidOverlap: { number },\n      __type__: { object }\n    },\n    repulsion: {\n      centralGravity: { number },\n      springLength: { number },\n      springConstant: { number },\n      nodeDistance: { number },\n      damping: { number },\n      __type__: { object }\n    },\n    hierarchicalRepulsion: {\n      centralGravity: { number },\n      springLength: { number },\n      springConstant: { number },\n      nodeDistance: { number },\n      damping: { number },\n      __type__: { object }\n    },\n    maxVelocity: { number },\n    minVelocity: { number },    // px/s\n    solver: { string: ['barnesHut', 'repulsion', 'hierarchicalRepulsion', 'forceAtlas2Based'] },\n    stabilization: {\n      enabled: { boolean: bool },\n      iterations: { number },   // maximum number of iteration to stabilize\n      updateInterval: { number },\n      onlyDynamicEdges: { boolean: bool },\n      fit: { boolean: bool },\n      __type__: { object, boolean: bool }\n    },\n    timestep: { number },\n    adaptiveTimestep: { boolean: bool },\n    __type__: { object, boolean: bool }\n  },\n\n  //globals :\n  autoResize: { boolean: bool },\n  clickToUse: { boolean: bool },\n  locale: { string },\n  locales: {\n    __any__: { any },\n    __type__: { object }\n  },\n  height: { string },\n  width: { string },\n  __type__: { object }\n};\n\nallOptions.groups.__any__ = allOptions.nodes;\nallOptions.manipulation.controlNodeStyle = allOptions.nodes;\n\n\nlet configureOptions = {\n  nodes: {\n    borderWidth: [1, 0, 10, 1],\n    borderWidthSelected: [2, 0, 10, 1],\n    color: {\n      border: ['color', '#2B7CE9'],\n      background: ['color', '#97C2FC'],\n      highlight: {\n        border: ['color', '#2B7CE9'],\n        background: ['color', '#D2E5FF']\n      },\n      hover: {\n        border: ['color', '#2B7CE9'],\n        background: ['color', '#D2E5FF']\n      }\n    },\n    fixed: {\n      x: false,\n      y: false\n    },\n    font: {\n      color: ['color', '#343434'],\n      size: [14, 0, 100, 1], // px\n      face: ['arial', 'verdana', 'tahoma'],\n      background: ['color', 'none'],\n      strokeWidth: [0, 0, 50, 1], // px\n      strokeColor: ['color', '#ffffff']\n    },\n    //group: 'string',\n    hidden: false,\n    labelHighlightBold: true,\n    //icon: {\n    //  face: 'string',  //'FontAwesome',\n    //  code: 'string',  //'\\uf007',\n    //  size: [50, 0, 200, 1],  //50,\n    //  color: ['color','#2B7CE9']   //'#aa00ff'\n    //},\n    //image: 'string', // --> URL\n    physics: true,\n    scaling: {\n      min: [10, 0, 200, 1],\n      max: [30, 0, 200, 1],\n      label: {\n        enabled: false,\n        min: [14, 0, 200, 1],\n        max: [30, 0, 200, 1],\n        maxVisible: [30, 0, 200, 1],\n        drawThreshold: [5, 0, 20, 1]\n      }\n    },\n    shadow: {\n      enabled: false,\n      color: 'rgba(0,0,0,0.5)',\n      size: [10, 0, 20, 1],\n      x: [5, -30, 30, 1],\n      y: [5, -30, 30, 1]\n    },\n    shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown'],\n    shapeProperties: {\n      borderDashes: false,\n      borderRadius: [6, 0, 20, 1],\n      interpolation: true,\n      useImageSize: false\n    },\n    size: [25, 0, 200, 1]\n  },\n  edges: {\n    arrows: {\n      to: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' },\n      middle: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' },\n      from: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' }\n    },\n    arrowStrikethrough: true,\n    color: {\n      color: ['color', '#848484'],\n      highlight: ['color', '#848484'],\n      hover: ['color', '#848484'],\n      inherit: ['from', 'to', 'both', true, false],\n      opacity: [1, 0, 1, 0.05]\n    },\n    dashes: false,\n    font: {\n      color: ['color', '#343434'],\n      size: [14, 0, 100, 1], // px\n      face: ['arial', 'verdana', 'tahoma'],\n      background: ['color', 'none'],\n      strokeWidth: [2, 0, 50, 1], // px\n      strokeColor: ['color', '#ffffff'],\n      align: ['horizontal', 'top', 'middle', 'bottom']\n    },\n    hidden: false,\n    hoverWidth: [1.5, 0, 5, 0.1],\n    labelHighlightBold: true,\n    physics: true,\n    scaling: {\n      min: [1, 0, 100, 1],\n      max: [15, 0, 100, 1],\n      label: {\n        enabled: true,\n        min: [14, 0, 200, 1],\n        max: [30, 0, 200, 1],\n        maxVisible: [30, 0, 200, 1],\n        drawThreshold: [5, 0, 20, 1]\n      }\n    },\n    selectionWidth: [1.5, 0, 5, 0.1],\n    selfReferenceSize: [20, 0, 200, 1],\n    shadow: {\n      enabled: false,\n      color: 'rgba(0,0,0,0.5)',\n      size: [10, 0, 20, 1],\n      x: [5, -30, 30, 1],\n      y: [5, -30, 30, 1]\n    },\n    smooth: {\n      enabled: true,\n      type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'],\n      forceDirection: ['horizontal', 'vertical', 'none'],\n      roundness: [0.5, 0, 1, 0.05]\n    },\n    width: [1, 0, 30, 1]\n  },\n  layout: {\n    //randomSeed: [0, 0, 500, 1],\n    //improvedLayout: true,\n    hierarchical: {\n      enabled: false,\n      levelSeparation: [150, 20, 500, 5],\n      nodeSpacing: [100, 20, 500, 5],\n      treeSpacing: [200, 20, 500, 5],\n      blockShifting: true,\n      edgeMinimization: true,\n      parentCentralization: true,\n      direction: ['UD', 'DU', 'LR', 'RL'],   // UD, DU, LR, RL\n      sortMethod: ['hubsize', 'directed'] // hubsize, directed\n    }\n  },\n  interaction: {\n    dragNodes: true,\n    dragView: true,\n    hideEdgesOnDrag: false,\n    hideNodesOnDrag: false,\n    hover: false,\n    keyboard: {\n      enabled: false,\n      speed: { x: [10, 0, 40, 1], y: [10, 0, 40, 1], zoom: [0.02, 0, 0.1, 0.005] },\n      bindToWindow: true\n    },\n    multiselect: false,\n    navigationButtons: false,\n    selectable: true,\n    selectConnectedEdges: true,\n    hoverConnectedEdges: true,\n    tooltipDelay: [300, 0, 1000, 25],\n    zoomView: true\n  },\n  manipulation: {\n    enabled: false,\n    initiallyActive: false\n  },\n  physics: {\n    enabled: true,\n    barnesHut: {\n      //theta: [0.5, 0.1, 1, 0.05],\n      gravitationalConstant: [-2000, -30000, 0, 50],\n      centralGravity: [0.3, 0, 10, 0.05],\n      springLength: [95, 0, 500, 5],\n      springConstant: [0.04, 0, 1.2, 0.005],\n      damping: [0.09, 0, 1, 0.01],\n      avoidOverlap: [0, 0, 1, 0.01]\n    },\n    forceAtlas2Based: {\n      //theta: [0.5, 0.1, 1, 0.05],\n      gravitationalConstant: [-50, -500, 0, 1],\n      centralGravity: [0.01, 0, 1, 0.005],\n      springLength: [95, 0, 500, 5],\n      springConstant: [0.08, 0, 1.2, 0.005],\n      damping: [0.4, 0, 1, 0.01],\n      avoidOverlap: [0, 0, 1, 0.01]\n    },\n    repulsion: {\n      centralGravity: [0.2, 0, 10, 0.05],\n      springLength: [200, 0, 500, 5],\n      springConstant: [0.05, 0, 1.2, 0.005],\n      nodeDistance: [100, 0, 500, 5],\n      damping: [0.09, 0, 1, 0.01]\n    },\n    hierarchicalRepulsion: {\n      centralGravity: [0.2, 0, 10, 0.05],\n      springLength: [100, 0, 500, 5],\n      springConstant: [0.01, 0, 1.2, 0.005],\n      nodeDistance: [120, 0, 500, 5],\n      damping: [0.09, 0, 1, 0.01]\n    },\n    maxVelocity: [50, 0, 150, 1],\n    minVelocity: [0.1, 0.01, 0.5, 0.01],\n    solver: ['barnesHut', 'forceAtlas2Based', 'repulsion', 'hierarchicalRepulsion'],\n    timestep: [0.5, 0.01, 1, 0.01],\n    //adaptiveTimestep: true\n  }\n};\n\nexport {allOptions, configureOptions};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/options.js","// distance finding algorithm\nimport FloydWarshall from \"./components/algorithms/FloydWarshall.js\"\n\n\n/**\n * KamadaKawai positions the nodes initially based on\n *\n * \"AN ALGORITHM FOR DRAWING GENERAL UNDIRECTED GRAPHS\"\n * -- Tomihisa KAMADA and Satoru KAWAI in 1989\n *\n * Possible optimizations in the distance calculation can be implemented.\n */\nclass KamadaKawai {\n  constructor(body, edgeLength, edgeStrength) {\n    this.body = body;\n    this.springLength = edgeLength;\n    this.springConstant = edgeStrength;\n    this.distanceSolver = new FloydWarshall();\n  }\n\n  /**\n   * Not sure if needed but can be used to update the spring length and spring constant\n   * @param options\n   */\n  setOptions(options) {\n    if (options) {\n      if (options.springLength) {\n        this.springLength = options.springLength;\n      }\n      if (options.springConstant) {\n        this.springConstant = options.springConstant;\n      }\n    }\n  }\n\n\n  /**\n   * Position the system\n   * @param nodesArray\n   * @param edgesArray\n   */\n  solve(nodesArray, edgesArray, ignoreClusters = false) {\n    // get distance matrix\n    let D_matrix = this.distanceSolver.getDistances(this.body, nodesArray, edgesArray); // distance matrix\n\n    // get the L Matrix\n    this._createL_matrix(D_matrix);\n\n    // get the K Matrix\n    this._createK_matrix(D_matrix);\n\n    // calculate positions\n    let threshold = 0.01;\n    let innerThreshold = 1;\n    let iterations = 0;\n    let maxIterations = Math.max(1000,Math.min(10*this.body.nodeIndices.length,6000));\n    let maxInnerIterations = 5;\n\n    let maxEnergy = 1e9;\n    let highE_nodeId = 0, dE_dx = 0, dE_dy = 0, delta_m = 0, subIterations = 0;\n\n    while (maxEnergy > threshold && iterations < maxIterations) {\n      iterations += 1;\n      [highE_nodeId, maxEnergy, dE_dx, dE_dy] = this._getHighestEnergyNode(ignoreClusters);\n      delta_m = maxEnergy;\n      subIterations = 0;\n      while(delta_m > innerThreshold && subIterations < maxInnerIterations) {\n        subIterations += 1;\n        this._moveNode(highE_nodeId, dE_dx, dE_dy);\n        [delta_m,dE_dx,dE_dy] = this._getEnergy(highE_nodeId);\n      }\n    }\n  }\n\n  /**\n   * get the node with the highest energy\n   * @returns {*[]}\n   * @private\n   */\n  _getHighestEnergyNode(ignoreClusters) {\n    let nodesArray = this.body.nodeIndices;\n    let nodes = this.body.nodes;\n    let maxEnergy = 0;\n    let maxEnergyNodeId = nodesArray[0];\n    let dE_dx_max = 0, dE_dy_max = 0;\n\n    for (let nodeIdx = 0; nodeIdx < nodesArray.length; nodeIdx++) {\n      let m = nodesArray[nodeIdx];\n      // by not evaluating nodes with predefined positions we should only move nodes that have no positions.\n      if ((nodes[m].predefinedPosition === false || nodes[m].isCluster === true && ignoreClusters === true) || nodes[m].options.fixed.x === true ||  nodes[m].options.fixed.y === true) {\n        let [delta_m,dE_dx,dE_dy] = this._getEnergy(m);\n        if (maxEnergy < delta_m) {\n          maxEnergy = delta_m;\n          maxEnergyNodeId = m;\n          dE_dx_max = dE_dx;\n          dE_dy_max = dE_dy;\n        }\n      }\n    }\n\n    return [maxEnergyNodeId, maxEnergy, dE_dx_max, dE_dy_max];\n  }\n\n  /**\n   * calculate the energy of a single node\n   * @param m\n   * @returns {*[]}\n   * @private\n   */\n  _getEnergy(m) {\n    let nodesArray = this.body.nodeIndices;\n    let nodes = this.body.nodes;\n\n    let x_m = nodes[m].x;\n    let y_m = nodes[m].y;\n    let dE_dx = 0;\n    let dE_dy = 0;\n    for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) {\n      let i = nodesArray[iIdx];\n      if (i !== m) {\n        let x_i = nodes[i].x;\n        let y_i = nodes[i].y;\n        let denominator = 1.0 / Math.sqrt(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2));\n        dE_dx += this.K_matrix[m][i] * ((x_m - x_i) - this.L_matrix[m][i] * (x_m - x_i) * denominator);\n        dE_dy += this.K_matrix[m][i] * ((y_m - y_i) - this.L_matrix[m][i] * (y_m - y_i) * denominator);\n      }\n    }\n\n    let delta_m = Math.sqrt(Math.pow(dE_dx, 2) + Math.pow(dE_dy, 2));\n    return [delta_m, dE_dx, dE_dy];\n  }\n\n  /**\n   * move the node based on it's energy\n   * the dx and dy are calculated from the linear system proposed by Kamada and Kawai\n   * @param m\n   * @param dE_dx\n   * @param dE_dy\n   * @private\n   */\n  _moveNode(m, dE_dx, dE_dy) {\n    let nodesArray = this.body.nodeIndices;\n    let nodes = this.body.nodes;\n    let d2E_dx2 = 0;\n    let d2E_dxdy = 0;\n    let d2E_dy2 = 0;\n\n    let x_m = nodes[m].x;\n    let y_m = nodes[m].y;\n    for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) {\n      let i = nodesArray[iIdx];\n      if (i !== m) {\n        let x_i = nodes[i].x;\n        let y_i = nodes[i].y;\n        let denominator = 1.0 / Math.pow(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2), 1.5);\n        d2E_dx2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(y_m - y_i, 2) * denominator);\n        d2E_dxdy += this.K_matrix[m][i] * (this.L_matrix[m][i] * (x_m - x_i) * (y_m - y_i) * denominator);\n        d2E_dy2 += this.K_matrix[m][i] * (1 - this.L_matrix[m][i] * Math.pow(x_m - x_i, 2) * denominator);\n      }\n    }\n    // make the variable names easier to make the solving of the linear system easier to read\n    let A = d2E_dx2, B = d2E_dxdy, C = dE_dx, D = d2E_dy2, E = dE_dy;\n\n    // solve the linear system for dx and dy\n    let dy = (C / A + E / B) / (B / A - D / B);\n    let dx = -(B * dy + C) / A;\n\n    // move the node\n    nodes[m].x += dx;\n    nodes[m].y += dy;\n  }\n\n\n  /**\n   * Create the L matrix: edge length times shortest path\n   * @param D_matrix\n   * @private\n   */\n  _createL_matrix(D_matrix) {\n    let nodesArray = this.body.nodeIndices;\n    let edgeLength = this.springLength;\n\n    this.L_matrix = [];\n    for (let i = 0; i < nodesArray.length; i++) {\n      this.L_matrix[nodesArray[i]] = {};\n      for (let j = 0; j < nodesArray.length; j++) {\n        this.L_matrix[nodesArray[i]][nodesArray[j]] = edgeLength * D_matrix[nodesArray[i]][nodesArray[j]];\n      }\n    }\n  }\n\n\n  /**\n   * Create the K matrix: spring constants times shortest path\n   * @param D_matrix\n   * @private\n   */\n  _createK_matrix(D_matrix) {\n    let nodesArray = this.body.nodeIndices;\n    let edgeStrength = this.springConstant;\n\n    this.K_matrix = [];\n    for (let i = 0; i < nodesArray.length; i++) {\n      this.K_matrix[nodesArray[i]] = {};\n      for (let j = 0; j < nodesArray.length; j++) {\n        this.K_matrix[nodesArray[i]][nodesArray[j]] = edgeStrength * Math.pow(D_matrix[nodesArray[i]][nodesArray[j]], -2);\n      }\n    }\n  }\n\n\n\n}\n\nexport default KamadaKawai;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/KamadaKawai.js","/**\n * Created by Alex on 10-Aug-15.\n */\n\n\nclass FloydWarshall {\n  constructor(){}\n\n  getDistances(body, nodesArray, edgesArray) {\n    let D_matrix = {};\n    let edges = body.edges;\n\n    // prepare matrix with large numbers\n    for (let i = 0; i < nodesArray.length; i++) {\n      D_matrix[nodesArray[i]] = {};\n      D_matrix[nodesArray[i]] = {};\n      for (let j = 0; j < nodesArray.length; j++) {\n        D_matrix[nodesArray[i]][nodesArray[j]] = (i == j ? 0 : 1e9);\n        D_matrix[nodesArray[i]][nodesArray[j]] = (i == j ? 0 : 1e9);\n      }\n    }\n\n    // put the weights for the edges in. This assumes unidirectionality.\n    for (let i = 0; i < edgesArray.length; i++) {\n      let edge = edges[edgesArray[i]];\n      // edge has to be connected if it counts to the distances. If it is connected to inner clusters it will crash so we also check if it is in the D_matrix\n      if (edge.connected === true && D_matrix[edge.fromId] !== undefined && D_matrix[edge.toId] !== undefined) {\n        D_matrix[edge.fromId][edge.toId] = 1;\n        D_matrix[edge.toId][edge.fromId] = 1;\n      }\n    }\n\n    let nodeCount = nodesArray.length;\n\n    // Adapted FloydWarshall based on unidirectionality to greatly reduce complexity.\n    for (let k = 0; k < nodeCount; k++) {\n      for (let i = 0; i < nodeCount-1; i++) {\n        for (let j = i+1; j < nodeCount; j++) {\n          D_matrix[nodesArray[i]][nodesArray[j]] = Math.min(D_matrix[nodesArray[i]][nodesArray[j]],D_matrix[nodesArray[i]][nodesArray[k]] + D_matrix[nodesArray[k]][nodesArray[j]])\n          D_matrix[nodesArray[j]][nodesArray[i]] = D_matrix[nodesArray[i]][nodesArray[j]];\n        }\n      }\n    }\n\n    return D_matrix;\n  }\n}\n\nexport default FloydWarshall;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/modules/components/algorithms/FloydWarshall.js","/**\n * Canvas shapes used by Network\n */\nif (typeof CanvasRenderingContext2D !== 'undefined') {\n\n  /**\n   * Draw a circle shape\n   */\n  CanvasRenderingContext2D.prototype.circle = function (x, y, r) {\n    this.beginPath();\n    this.arc(x, y, r, 0, 2 * Math.PI, false);\n    this.closePath();\n  };\n\n  /**\n   * Draw a square shape\n   * @param {Number} x horizontal center\n   * @param {Number} y vertical center\n   * @param {Number} r   size, width and height of the square\n   */\n  CanvasRenderingContext2D.prototype.square = function (x, y, r) {\n    this.beginPath();\n    this.rect(x - r, y - r, r * 2, r * 2);\n    this.closePath();\n  };\n\n  /**\n   * Draw a triangle shape\n   * @param {Number} x horizontal center\n   * @param {Number} y vertical center\n   * @param {Number} r   radius, half the length of the sides of the triangle\n   */\n  CanvasRenderingContext2D.prototype.triangle = function (x, y, r) {\n    // http://en.wikipedia.org/wiki/Equilateral_triangle\n    this.beginPath();\n\n    // the change in radius and the offset is here to center the shape\n    r *= 1.15;\n    y += 0.275 * r;\n\n    var s = r * 2;\n    var s2 = s / 2;\n    var ir = Math.sqrt(3) / 6 * s;      // radius of inner circle\n    var h = Math.sqrt(s * s - s2 * s2); // height\n\n\n    this.moveTo(x, y - (h - ir));\n    this.lineTo(x + s2, y + ir);\n    this.lineTo(x - s2, y + ir);\n    this.lineTo(x, y - (h - ir));\n    this.closePath();\n\n\n  };\n\n  /**\n   * Draw a triangle shape in downward orientation\n   * @param {Number} x horizontal center\n   * @param {Number} y vertical center\n   * @param {Number} r radius\n   */\n  CanvasRenderingContext2D.prototype.triangleDown = function (x, y, r) {\n    // http://en.wikipedia.org/wiki/Equilateral_triangle\n    this.beginPath();\n\n    // the change in radius and the offset is here to center the shape\n    r *= 1.15;\n    y -= 0.275 * r;\n\n    var s = r * 2;\n    var s2 = s / 2;\n    var ir = Math.sqrt(3) / 6 * s;      // radius of inner circle\n    var h = Math.sqrt(s * s - s2 * s2); // height\n\n    this.moveTo(x, y + (h - ir));\n    this.lineTo(x + s2, y - ir);\n    this.lineTo(x - s2, y - ir);\n    this.lineTo(x, y + (h - ir));\n    this.closePath();\n  };\n\n  /**\n   * Draw a star shape, a star with 5 points\n   * @param {Number} x horizontal center\n   * @param {Number} y vertical center\n   * @param {Number} r   radius, half the length of the sides of the triangle\n   */\n  CanvasRenderingContext2D.prototype.star = function (x, y, r) {\n    // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/\n    this.beginPath();\n\n    // the change in radius and the offset is here to center the shape\n    r *= 0.82;\n    y += 0.1 * r;\n\n    for (var n = 0; n < 10; n++) {\n      var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5;\n      this.lineTo(\n        x + radius * Math.sin(n * 2 * Math.PI / 10),\n        y - radius * Math.cos(n * 2 * Math.PI / 10)\n      );\n    }\n\n    this.closePath();\n  };\n\n  /**\n   * Draw a Diamond shape\n   * @param {Number} x horizontal center\n   * @param {Number} y vertical center\n   * @param {Number} r   radius, half the length of the sides of the triangle\n   */\n  CanvasRenderingContext2D.prototype.diamond = function (x, y, r) {\n    // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/\n    this.beginPath();\n\n    this.lineTo(x, y + r);\n    this.lineTo(x + r, y);\n    this.lineTo(x, y - r);\n    this.lineTo(x - r, y);\n\n\n    this.closePath();\n  };\n\n  /**\n   * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas\n   */\n  CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {\n    var r2d = Math.PI / 180;\n    if (w - ( 2 * r ) < 0) {\n      r = ( w / 2 );\n    } //ensure that the radius isn't too large for x\n    if (h - ( 2 * r ) < 0) {\n      r = ( h / 2 );\n    } //ensure that the radius isn't too large for y\n    this.beginPath();\n    this.moveTo(x + r, y);\n    this.lineTo(x + w - r, y);\n    this.arc(x + w - r, y + r, r, r2d * 270, r2d * 360, false);\n    this.lineTo(x + w, y + h - r);\n    this.arc(x + w - r, y + h - r, r, 0, r2d * 90, false);\n    this.lineTo(x + r, y + h);\n    this.arc(x + r, y + h - r, r, r2d * 90, r2d * 180, false);\n    this.lineTo(x, y + r);\n    this.arc(x + r, y + r, r, r2d * 180, r2d * 270, false);\n    this.closePath();\n  };\n\n  /**\n   * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\n   */\n  CanvasRenderingContext2D.prototype.ellipse = function (x, y, w, h) {\n    var kappa = .5522848,\n      ox = (w / 2) * kappa, // control point offset horizontal\n      oy = (h / 2) * kappa, // control point offset vertical\n      xe = x + w,           // x-end\n      ye = y + h,           // y-end\n      xm = x + w / 2,       // x-middle\n      ym = y + h / 2;       // y-middle\n\n    this.beginPath();\n    this.moveTo(x, ym);\n    this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n    this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n    this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n    this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n    this.closePath();\n  };\n\n\n  /**\n   * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\n   */\n  CanvasRenderingContext2D.prototype.database = function (x, y, w, h) {\n    var f = 1 / 3;\n    var wEllipse = w;\n    var hEllipse = h * f;\n\n    var kappa = .5522848,\n      ox = (wEllipse / 2) * kappa, // control point offset horizontal\n      oy = (hEllipse / 2) * kappa, // control point offset vertical\n      xe = x + wEllipse,           // x-end\n      ye = y + hEllipse,           // y-end\n      xm = x + wEllipse / 2,       // x-middle\n      ym = y + hEllipse / 2,       // y-middle\n      ymb = y + (h - hEllipse / 2),  // y-midlle, bottom ellipse\n      yeb = y + h;                 // y-end, bottom ellipse\n\n    this.beginPath();\n    this.moveTo(xe, ym);\n\n    this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n    this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n\n    this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n    this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n\n    this.lineTo(xe, ymb);\n\n    this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb);\n    this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb);\n\n    this.lineTo(x, ym);\n  };\n\n\n  /**\n   * Draw an arrow at the end of a line with the given angle.\n   */\n  CanvasRenderingContext2D.prototype.arrowEndpoint = function (x, y, angle, length) {\n    // tail\n    var xt = x - length * Math.cos(angle);\n    var yt = y - length * Math.sin(angle);\n\n    // inner tail\n    var xi = x - length * 0.9 * Math.cos(angle);\n    var yi = y - length * 0.9 * Math.sin(angle);\n\n    // left\n    var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI);\n    var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI);\n\n    // right\n    var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI);\n    var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI);\n\n    this.beginPath();\n    this.moveTo(x, y);\n    this.lineTo(xl, yl);\n    this.lineTo(xi, yi);\n    this.lineTo(xr, yr);\n    this.closePath();\n  };\n\n  /**\n   * Draw an circle an the end of an line with the given angle.\n   */\n  CanvasRenderingContext2D.prototype.circleEndpoint = function (x, y, angle, length) {\n    var radius = length * 0.4;\n    var xc = x - radius * Math.cos(angle);\n    var yc = y - radius * Math.sin(angle);\n    this.circle(xc, yc, radius);\n  };\n\n  /**\n   * Sets up the dashedLine functionality for drawing\n   * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas\n   * @author David Jordan\n   * @date 2012-08-08\n   */\n  CanvasRenderingContext2D.prototype.dashedLine = function (x, y, x2, y2, pattern) {\n    this.beginPath();\n    this.moveTo(x, y);\n\n    var patternLength = pattern.length;\n    var dx = (x2 - x);\n    var dy = (y2 - y);\n    var slope = dy / dx;\n    var distRemaining = Math.sqrt(dx * dx + dy * dy);\n    var patternIndex = 0;\n    var draw = true;\n    var xStep = 0;\n    var dashLength = pattern[0];\n\n    while (distRemaining >= 0.1) {\n      dashLength = pattern[patternIndex++ % patternLength];\n      if (dashLength > distRemaining) {\n        dashLength = distRemaining;\n      }\n\n      xStep = Math.sqrt(dashLength * dashLength / (1 + slope * slope));\n      xStep = dx < 0 ? -xStep : xStep;\n      x += xStep;\n      y += slope * xStep;\n\n      if (draw === true) {this.lineTo(x,y);}\n      else               {this.moveTo(x,y);}\n\n      distRemaining -= dashLength;\n      draw = !draw;\n    }\n  };\n\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/shapes.js","/**\n * Parse a text source containing data in DOT language into a JSON object.\n * The object contains two lists: one with nodes and one with edges.\n *\n * DOT language reference: http://www.graphviz.org/doc/info/lang.html\n *\n * DOT language attributes: http://graphviz.org/content/attrs\n *\n * @param {String} data     Text containing a graph in DOT-notation\n * @return {Object} graph   An object containing two parameters:\n *                          {Object[]} nodes\n *                          {Object[]} edges\n */\nfunction parseDOT (data) {\n  dot = data;\n  return parseGraph();\n}\n\n// mapping of attributes from DOT (the keys) to vis.js (the values)\nvar NODE_ATTR_MAPPING = {\n  'fontsize': 'font.size',\n  'fontcolor': 'font.color',\n  'labelfontcolor': 'font.color',\n  'fontname': 'font.face',\n  'color': ['color.border', 'color.background'],\n  'fillcolor': 'color.background',\n  'tooltip': 'title',\n  'labeltooltip': 'title'\n};\nvar EDGE_ATTR_MAPPING = Object.create(NODE_ATTR_MAPPING);\nEDGE_ATTR_MAPPING.color = 'color.color';\n\n// token types enumeration\nvar TOKENTYPE = {\n  NULL : 0,\n  DELIMITER : 1,\n  IDENTIFIER: 2,\n  UNKNOWN : 3\n};\n\n// map with all delimiters\nvar DELIMITERS = {\n  '{': true,\n  '}': true,\n  '[': true,\n  ']': true,\n  ';': true,\n  '=': true,\n  ',': true,\n\n  '->': true,\n  '--': true\n};\n\nvar dot = '';                   // current dot file\nvar index = 0;                  // current index in dot file\nvar c = '';                     // current token character in expr\nvar token = '';                 // current token\nvar tokenType = TOKENTYPE.NULL; // type of the token\n\n/**\n * Get the first character from the dot file.\n * The character is stored into the char c. If the end of the dot file is\n * reached, the function puts an empty string in c.\n */\nfunction first() {\n  index = 0;\n  c = dot.charAt(0);\n}\n\n/**\n * Get the next character from the dot file.\n * The character is stored into the char c. If the end of the dot file is\n * reached, the function puts an empty string in c.\n */\nfunction next() {\n  index++;\n  c = dot.charAt(index);\n}\n\n/**\n * Preview the next character from the dot file.\n * @return {String} cNext\n */\nfunction nextPreview() {\n  return dot.charAt(index + 1);\n}\n\n/**\n * Test whether given character is alphabetic or numeric\n * @param {String} c\n * @return {Boolean} isAlphaNumeric\n */\nvar regexAlphaNumeric = /[a-zA-Z_0-9.:#]/;\nfunction isAlphaNumeric(c) {\n  return regexAlphaNumeric.test(c);\n}\n\n/**\n * Merge all options of object b into object b\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n */\nfunction merge (a, b) {\n  if (!a) {\n    a = {};\n  }\n\n  if (b) {\n    for (var name in b) {\n      if (b.hasOwnProperty(name)) {\n        a[name] = b[name];\n      }\n    }\n  }\n  return a;\n}\n\n/**\n * Set a value in an object, where the provided parameter name can be a\n * path with nested parameters. For example:\n *\n *     var obj = {a: 2};\n *     setValue(obj, 'b.c', 3);     // obj = {a: 2, b: {c: 3}}\n *\n * @param {Object} obj\n * @param {String} path  A parameter name or dot-separated parameter path,\n *                      like \"color.highlight.border\".\n * @param {*} value\n */\nfunction setValue(obj, path, value) {\n  var keys = path.split('.');\n  var o = obj;\n  while (keys.length) {\n    var key = keys.shift();\n    if (keys.length) {\n      // this isn't the end point\n      if (!o[key]) {\n        o[key] = {};\n      }\n      o = o[key];\n    }\n    else {\n      // this is the end point\n      o[key] = value;\n    }\n  }\n}\n\n/**\n * Add a node to a graph object. If there is already a node with\n * the same id, their attributes will be merged.\n * @param {Object} graph\n * @param {Object} node\n */\nfunction addNode(graph, node) {\n  var i, len;\n  var current = null;\n\n  // find root graph (in case of subgraph)\n  var graphs = [graph]; // list with all graphs from current graph to root graph\n  var root = graph;\n  while (root.parent) {\n    graphs.push(root.parent);\n    root = root.parent;\n  }\n\n  // find existing node (at root level) by its id\n  if (root.nodes) {\n    for (i = 0, len = root.nodes.length; i < len; i++) {\n      if (node.id === root.nodes[i].id) {\n        current = root.nodes[i];\n        break;\n      }\n    }\n  }\n\n  if (!current) {\n    // this is a new node\n    current = {\n      id: node.id\n    };\n    if (graph.node) {\n      // clone default attributes\n      current.attr = merge(current.attr, graph.node);\n    }\n  }\n\n  // add node to this (sub)graph and all its parent graphs\n  for (i = graphs.length - 1; i >= 0; i--) {\n    var g = graphs[i];\n\n    if (!g.nodes) {\n      g.nodes = [];\n    }\n    if (g.nodes.indexOf(current) === -1) {\n      g.nodes.push(current);\n    }\n  }\n\n  // merge attributes\n  if (node.attr) {\n    current.attr = merge(current.attr, node.attr);\n  }\n}\n\n/**\n * Add an edge to a graph object\n * @param {Object} graph\n * @param {Object} edge\n */\nfunction addEdge(graph, edge) {\n  if (!graph.edges) {\n    graph.edges = [];\n  }\n  graph.edges.push(edge);\n  if (graph.edge) {\n    var attr = merge({}, graph.edge);     // clone default attributes\n    edge.attr = merge(attr, edge.attr); // merge attributes\n  }\n}\n\n/**\n * Create an edge to a graph object\n * @param {Object} graph\n * @param {String | Number | Object} from\n * @param {String | Number | Object} to\n * @param {String} type\n * @param {Object | null} attr\n * @return {Object} edge\n */\nfunction createEdge(graph, from, to, type, attr) {\n  var edge = {\n    from: from,\n    to: to,\n    type: type\n  };\n\n  if (graph.edge) {\n    edge.attr = merge({}, graph.edge);  // clone default attributes\n  }\n  edge.attr = merge(edge.attr || {}, attr); // merge attributes\n\n  return edge;\n}\n\n/**\n * Get next token in the current dot file.\n * The token and token type are available as token and tokenType\n */\nfunction getToken() {\n  tokenType = TOKENTYPE.NULL;\n  token = '';\n\n  // skip over whitespaces\n  while (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') {  // space, tab, enter\n    next();\n  }\n\n  do {\n    var isComment = false;\n\n    // skip comment\n    if (c === '#') {\n      // find the previous non-space character\n      var i = index - 1;\n      while (dot.charAt(i) === ' ' || dot.charAt(i) === '\\t') {\n        i--;\n      }\n      if (dot.charAt(i) === '\\n' || dot.charAt(i) === '') {\n        // the # is at the start of a line, this is indeed a line comment\n        while (c != '' && c != '\\n') {\n          next();\n        }\n        isComment = true;\n      }\n    }\n    if (c === '/' && nextPreview() === '/') {\n      // skip line comment\n      while (c != '' && c != '\\n') {\n        next();\n      }\n      isComment = true;\n    }\n    if (c === '/' && nextPreview() === '*') {\n      // skip block comment\n      while (c != '') {\n        if (c === '*' && nextPreview() === '/') {\n          // end of block comment found. skip these last two characters\n          next();\n          next();\n          break;\n        }\n        else {\n          next();\n        }\n      }\n      isComment = true;\n    }\n\n    // skip over whitespaces\n    while (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') {  // space, tab, enter\n      next();\n    }\n  }\n  while (isComment);\n\n  // check for end of dot file\n  if (c === '') {\n    // token is still empty\n    tokenType = TOKENTYPE.DELIMITER;\n    return;\n  }\n\n  // check for delimiters consisting of 2 characters\n  var c2 = c + nextPreview();\n  if (DELIMITERS[c2]) {\n    tokenType = TOKENTYPE.DELIMITER;\n    token = c2;\n    next();\n    next();\n    return;\n  }\n\n  // check for delimiters consisting of 1 character\n  if (DELIMITERS[c]) {\n    tokenType = TOKENTYPE.DELIMITER;\n    token = c;\n    next();\n    return;\n  }\n\n  // check for an identifier (number or string)\n  // TODO: more precise parsing of numbers/strings (and the port separator ':')\n  if (isAlphaNumeric(c) || c === '-') {\n    token += c;\n    next();\n\n    while (isAlphaNumeric(c)) {\n      token += c;\n      next();\n    }\n    if (token === 'false') {\n      token = false;   // convert to boolean\n    }\n    else if (token === 'true') {\n      token = true;   // convert to boolean\n    }\n    else if (!isNaN(Number(token))) {\n      token = Number(token); // convert to number\n    }\n    tokenType = TOKENTYPE.IDENTIFIER;\n    return;\n  }\n\n  // check for a string enclosed by double quotes\n  if (c === '\"') {\n    next();\n    while (c != '' && (c != '\"' || (c === '\"' && nextPreview() === '\"'))) {\n      token += c;\n      if (c === '\"') { // skip the escape character\n        next();\n      }\n      next();\n    }\n    if (c != '\"') {\n      throw newSyntaxError('End of string \" expected');\n    }\n    next();\n    tokenType = TOKENTYPE.IDENTIFIER;\n    return;\n  }\n\n  // something unknown is found, wrong characters, a syntax error\n  tokenType = TOKENTYPE.UNKNOWN;\n  while (c != '') {\n    token += c;\n    next();\n  }\n  throw new SyntaxError('Syntax error in part \"' + chop(token, 30) + '\"');\n}\n\n/**\n * Parse a graph.\n * @returns {Object} graph\n */\nfunction parseGraph() {\n  var graph = {};\n\n  first();\n  getToken();\n\n  // optional strict keyword\n  if (token === 'strict') {\n    graph.strict = true;\n    getToken();\n  }\n\n  // graph or digraph keyword\n  if (token === 'graph' || token === 'digraph') {\n    graph.type = token;\n    getToken();\n  }\n\n  // optional graph id\n  if (tokenType === TOKENTYPE.IDENTIFIER) {\n    graph.id = token;\n    getToken();\n  }\n\n  // open angle bracket\n  if (token != '{') {\n    throw newSyntaxError('Angle bracket { expected');\n  }\n  getToken();\n\n  // statements\n  parseStatements(graph);\n\n  // close angle bracket\n  if (token != '}') {\n    throw newSyntaxError('Angle bracket } expected');\n  }\n  getToken();\n\n  // end of file\n  if (token !== '') {\n    throw newSyntaxError('End of file expected');\n  }\n  getToken();\n\n  // remove temporary default options\n  delete graph.node;\n  delete graph.edge;\n  delete graph.graph;\n\n  return graph;\n}\n\n/**\n * Parse a list with statements.\n * @param {Object} graph\n */\nfunction parseStatements (graph) {\n  while (token !== '' && token != '}') {\n    parseStatement(graph);\n    if (token === ';') {\n      getToken();\n    }\n  }\n}\n\n/**\n * Parse a single statement. Can be a an attribute statement, node\n * statement, a series of node statements and edge statements, or a\n * parameter.\n * @param {Object} graph\n */\nfunction parseStatement(graph) {\n  // parse subgraph\n  var subgraph = parseSubgraph(graph);\n  if (subgraph) {\n    // edge statements\n    parseEdge(graph, subgraph);\n\n    return;\n  }\n\n  // parse an attribute statement\n  var attr = parseAttributeStatement(graph);\n  if (attr) {\n    return;\n  }\n\n  // parse node\n  if (tokenType != TOKENTYPE.IDENTIFIER) {\n    throw newSyntaxError('Identifier expected');\n  }\n  var id = token; // id can be a string or a number\n  getToken();\n\n  if (token === '=') {\n    // id statement\n    getToken();\n    if (tokenType != TOKENTYPE.IDENTIFIER) {\n      throw newSyntaxError('Identifier expected');\n    }\n    graph[id] = token;\n    getToken();\n    // TODO: implement comma separated list with \"a_list: ID=ID [','] [a_list] \"\n  }\n  else {\n    parseNodeStatement(graph, id);\n  }\n}\n\n/**\n * Parse a subgraph\n * @param {Object} graph    parent graph object\n * @return {Object | null} subgraph\n */\nfunction parseSubgraph (graph) {\n  var subgraph = null;\n\n  // optional subgraph keyword\n  if (token === 'subgraph') {\n    subgraph = {};\n    subgraph.type = 'subgraph';\n    getToken();\n\n    // optional graph id\n    if (tokenType === TOKENTYPE.IDENTIFIER) {\n      subgraph.id = token;\n      getToken();\n    }\n  }\n\n  // open angle bracket\n  if (token === '{') {\n    getToken();\n\n    if (!subgraph) {\n      subgraph = {};\n    }\n    subgraph.parent = graph;\n    subgraph.node = graph.node;\n    subgraph.edge = graph.edge;\n    subgraph.graph = graph.graph;\n\n    // statements\n    parseStatements(subgraph);\n\n    // close angle bracket\n    if (token != '}') {\n      throw newSyntaxError('Angle bracket } expected');\n    }\n    getToken();\n\n    // remove temporary default options\n    delete subgraph.node;\n    delete subgraph.edge;\n    delete subgraph.graph;\n    delete subgraph.parent;\n\n    // register at the parent graph\n    if (!graph.subgraphs) {\n      graph.subgraphs = [];\n    }\n    graph.subgraphs.push(subgraph);\n  }\n\n  return subgraph;\n}\n\n/**\n * parse an attribute statement like \"node [shape=circle fontSize=16]\".\n * Available keywords are 'node', 'edge', 'graph'.\n * The previous list with default attributes will be replaced\n * @param {Object} graph\n * @returns {String | null} keyword Returns the name of the parsed attribute\n *                                  (node, edge, graph), or null if nothing\n *                                  is parsed.\n */\nfunction parseAttributeStatement (graph) {\n  // attribute statements\n  if (token === 'node') {\n    getToken();\n\n    // node attributes\n    graph.node = parseAttributeList();\n    return 'node';\n  }\n  else if (token === 'edge') {\n    getToken();\n\n    // edge attributes\n    graph.edge = parseAttributeList();\n    return 'edge';\n  }\n  else if (token === 'graph') {\n    getToken();\n\n    // graph attributes\n    graph.graph = parseAttributeList();\n    return 'graph';\n  }\n\n  return null;\n}\n\n/**\n * parse a node statement\n * @param {Object} graph\n * @param {String | Number} id\n */\nfunction parseNodeStatement(graph, id) {\n  // node statement\n  var node = {\n    id: id\n  };\n  var attr = parseAttributeList();\n  if (attr) {\n    node.attr = attr;\n  }\n  addNode(graph, node);\n\n  // edge statements\n  parseEdge(graph, id);\n}\n\n/**\n * Parse an edge or a series of edges\n * @param {Object} graph\n * @param {String | Number} from        Id of the from node\n */\nfunction parseEdge(graph, from) {\n  while (token === '->' || token === '--') {\n    var to;\n    var type = token;\n    getToken();\n\n    var subgraph = parseSubgraph(graph);\n    if (subgraph) {\n      to = subgraph;\n    }\n    else {\n      if (tokenType != TOKENTYPE.IDENTIFIER) {\n        throw newSyntaxError('Identifier or subgraph expected');\n      }\n      to = token;\n      addNode(graph, {\n        id: to\n      });\n      getToken();\n    }\n\n    // parse edge attributes\n    var attr = parseAttributeList();\n\n    // create edge\n    var edge = createEdge(graph, from, to, type, attr);\n    addEdge(graph, edge);\n\n    from = to;\n  }\n}\n\n/**\n * Parse a set with attributes,\n * for example [label=\"1.000\", shape=solid]\n * @return {Object | null} attr\n */\nfunction parseAttributeList() {\n  var attr = null;\n\n  while (token === '[') {\n    getToken();\n    attr = {};\n    while (token !== '' && token != ']') {\n      if (tokenType != TOKENTYPE.IDENTIFIER) {\n        throw newSyntaxError('Attribute name expected');\n      }\n      var name = token;\n\n      getToken();\n      if (token != '=') {\n        throw newSyntaxError('Equal sign = expected');\n      }\n      getToken();\n\n      if (tokenType != TOKENTYPE.IDENTIFIER) {\n        throw newSyntaxError('Attribute value expected');\n      }\n      var value = token;\n      setValue(attr, name, value); // name can be a path\n\n      getToken();\n      if (token ==',') {\n        getToken();\n      }\n    }\n\n    if (token != ']') {\n      throw newSyntaxError('Bracket ] expected');\n    }\n    getToken();\n  }\n\n  return attr;\n}\n\n/**\n * Create a syntax error with extra information on current token and index.\n * @param {String} message\n * @returns {SyntaxError} err\n */\nfunction newSyntaxError(message) {\n  return new SyntaxError(message + ', got \"' + chop(token, 30) + '\" (char ' + index + ')');\n}\n\n/**\n * Chop off text after a maximum length\n * @param {String} text\n * @param {Number} maxLength\n * @returns {String}\n */\nfunction chop (text, maxLength) {\n  return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...');\n}\n\n/**\n * Execute a function fn for each pair of elements in two arrays\n * @param {Array | *} array1\n * @param {Array | *} array2\n * @param {function} fn\n */\nfunction forEach2(array1, array2, fn) {\n  if (Array.isArray(array1)) {\n    array1.forEach(function (elem1) {\n      if (Array.isArray(array2)) {\n        array2.forEach(function (elem2)  {\n          fn(elem1, elem2);\n        });\n      }\n      else {\n        fn(elem1, array2);\n      }\n    });\n  }\n  else {\n    if (Array.isArray(array2)) {\n      array2.forEach(function (elem2)  {\n        fn(array1, elem2);\n      });\n    }\n    else {\n      fn(array1, array2);\n    }\n  }\n}\n\n/**\n * Set a nested property on an object\n * When nested objects are missing, they will be created.\n * For example setProp({}, 'font.color', 'red') will return {font: {color: 'red'}}\n * @param {Object} object\n * @param {string} path   A dot separated string like 'font.color'\n * @param {*} value       Value for the property\n * @return {Object} Returns the original object, allows for chaining.\n */\nfunction setProp(object, path, value) {\n  var names = path.split('.');\n  var prop = names.pop();\n\n  // traverse over the nested objects\n  var obj = object;\n  for (var i = 0; i < names.length; i++) {\n    var name = names[i];\n    if (!(name in obj)) {\n      obj[name] = {};\n    }\n    obj = obj[name];\n  }\n\n  // set the property value\n  obj[prop] = value;\n\n  return object;\n}\n\n/**\n * Convert an object with DOT attributes to their vis.js equivalents.\n * @param {Object} attr     Object with DOT attributes\n * @param {Object} mapping\n * @return {Object}         Returns an object with vis.js attributes\n */\nfunction convertAttr (attr, mapping) {\n  var converted = {};\n\n  for (var prop in attr) {\n    if (attr.hasOwnProperty(prop)) {\n      var visProp = mapping[prop];\n      if (Array.isArray(visProp)) {\n        visProp.forEach(function (visPropI) {\n          setProp(converted, visPropI, attr[prop]);\n        })\n      }\n      else if (typeof visProp === 'string') {\n        setProp(converted, visProp, attr[prop]);\n      }\n      else {\n        setProp(converted, prop, attr[prop]);\n      }\n    }\n  }\n\n  return converted;\n}\n\n/**\n * Convert a string containing a graph in DOT language into a map containing\n * with nodes and edges in the format of graph.\n * @param {String} data         Text containing a graph in DOT-notation\n * @return {Object} graphData\n */\nfunction DOTToGraph (data) {\n  // parse the DOT file\n  var dotData = parseDOT(data);\n  var graphData = {\n    nodes: [],\n    edges: [],\n    options: {}\n  };\n\n  // copy the nodes\n  if (dotData.nodes) {\n    dotData.nodes.forEach(function (dotNode) {\n      var graphNode = {\n        id: dotNode.id,\n        label: String(dotNode.label || dotNode.id)\n      };\n      merge(graphNode, convertAttr(dotNode.attr, NODE_ATTR_MAPPING));\n      if (graphNode.image) {\n        graphNode.shape = 'image';\n      }\n      graphData.nodes.push(graphNode);\n    });\n  }\n\n  // copy the edges\n  if (dotData.edges) {\n    /**\n     * Convert an edge in DOT format to an edge with VisGraph format\n     * @param {Object} dotEdge\n     * @returns {Object} graphEdge\n     */\n    var convertEdge = function (dotEdge) {\n      var graphEdge = {\n        from: dotEdge.from,\n        to: dotEdge.to\n      };\n      merge(graphEdge, convertAttr(dotEdge.attr, EDGE_ATTR_MAPPING));\n      graphEdge.arrows = (dotEdge.type === '->') ? 'to' : undefined;\n\n      return graphEdge;\n    };\n\n    dotData.edges.forEach(function (dotEdge) {\n      var from, to;\n      if (dotEdge.from instanceof Object) {\n        from = dotEdge.from.nodes;\n      }\n      else {\n        from = {\n          id: dotEdge.from\n        }\n      }\n\n      // TODO: support of solid/dotted/dashed edges (attr = 'style')\n      // TODO: support for attributes 'dir' and 'arrowhead' (edge arrows)\n\n      if (dotEdge.to instanceof Object) {\n        to = dotEdge.to.nodes;\n      }\n      else {\n        to = {\n          id: dotEdge.to\n        }\n      }\n\n      if (dotEdge.from instanceof Object && dotEdge.from.edges) {\n        dotEdge.from.edges.forEach(function (subEdge) {\n          var graphEdge = convertEdge(subEdge);\n          graphData.edges.push(graphEdge);\n        });\n      }\n\n      forEach2(from, to, function (from, to) {\n        var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr);\n        var graphEdge = convertEdge(subEdge);\n        graphData.edges.push(graphEdge);\n      });\n\n      if (dotEdge.to instanceof Object && dotEdge.to.edges) {\n        dotEdge.to.edges.forEach(function (subEdge) {\n          var graphEdge = convertEdge(subEdge);\n          graphData.edges.push(graphEdge);\n        });\n      }\n    });\n  }\n\n  // copy the options\n  if (dotData.attr) {\n    graphData.options = dotData.attr;\n  }\n\n  return graphData;\n}\n\n// exports\nexports.parseDOT   = parseDOT;\nexports.DOTToGraph = DOTToGraph;\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/dotparser.js","\nfunction parseGephi(gephiJSON, optionsObj) {\n  var edges = [];\n  var nodes = [];\n  var options = {\n    edges: {\n      inheritColor: false\n    },\n    nodes: {\n      fixed: false,\n      parseColor: false\n    }\n  };\n\n  if (optionsObj !== undefined) {\n    if (optionsObj.fixed !== undefined)        {options.nodes.fixed = optionsObj.fixed}\n    if (optionsObj.parseColor !== undefined)   {options.nodes.parseColor = optionsObj.parseColor}\n    if (optionsObj.inheritColor !== undefined) {options.edges.inheritColor = optionsObj.inheritColor}\n  }\n\n  var gEdges = gephiJSON.edges;\n  var gNodes = gephiJSON.nodes;\n  for (var i = 0; i < gEdges.length; i++) {\n    var edge = {};\n    var gEdge = gEdges[i];\n    edge['id'] = gEdge.id;\n    edge['from'] = gEdge.source;\n    edge['to'] = gEdge.target;\n    edge['attributes'] = gEdge.attributes;\n    edge['label'] = gEdge.label;\n    edge['title'] = gEdge.attributes !== undefined ? gEdge.attributes.title : undefined;\n    if (gEdge['type'] === 'Directed') {\n      edge['arrows'] = 'to';\n    }\n//    edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined;\n//    edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size;\n    if (gEdge.color && options.inheritColor === false) {\n      edge['color'] = gEdge.color;\n    }\n    edges.push(edge);\n  }\n\n  for (var i = 0; i < gNodes.length; i++) {\n    var node = {};\n    var gNode = gNodes[i];\n    node['id'] = gNode.id;\n    node['attributes'] = gNode.attributes;\n    node['title'] = gNode.title;\n    node['x'] = gNode.x;\n    node['y'] = gNode.y;\n    node['label'] = gNode.label;\n    node['title'] = gNode.attributes !== undefined ? gNode.attributes.title : undefined;\n    if (options.nodes.parseColor === true) {\n      node['color'] = gNode.color;\n    }\n    else {\n      node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color, highlight: {background:gNode.color, border:gNode.color}, hover:{background:gNode.color, border:gNode.color}} : undefined;\n    }\n    node['size'] = gNode.size;\n    node['fixed'] = options.nodes.fixed && gNode.x !== undefined && gNode.y !== undefined;\n    nodes.push(node);\n  }\n\n  return {nodes:nodes, edges:edges};\n}\n\nexports.parseGephi = parseGephi;\n\n\n// WEBPACK FOOTER //\n// ./lib/network/gephiParser.js","// English\nexports['en'] = {\n  edit: 'Edit',\n  del: 'Delete selected',\n  back: 'Back',\n  addNode: 'Add Node',\n  addEdge: 'Add Edge',\n  editNode: 'Edit Node',\n  editEdge: 'Edit Edge',\n  addDescription: 'Click in an empty space to place a new node.',\n  edgeDescription: 'Click on a node and drag the edge to another node to connect them.',\n  editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.',\n  createEdgeError: 'Cannot link edges to a cluster.',\n  deleteClusterError: 'Clusters cannot be deleted.',\n  editClusterError: 'Clusters cannot be edited.'\n};\nexports['en_EN'] = exports['en'];\nexports['en_US'] = exports['en'];\n\n// German\nexports['de'] = {\n  edit: 'Editieren',\n  del: 'L\\u00f6sche Auswahl',\n  back: 'Zur\\u00fcck',\n  addNode: 'Knoten hinzuf\\u00fcgen',\n  addEdge: 'Kante hinzuf\\u00fcgen',\n  editNode: 'Knoten editieren',\n  editEdge: 'Kante editieren',\n  addDescription: 'Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.',\n  edgeDescription: 'Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.',\n  editEdgeDescription: 'Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.',\n  createEdgeError: 'Es ist nicht m\\u00f6glich, Kanten mit Clustern zu verbinden.',\n  deleteClusterError: 'Cluster k\\u00f6nnen nicht gel\\u00f6scht werden.',\n  editClusterError: 'Cluster k\\u00f6nnen nicht editiert werden.'\n};\nexports['de_DE'] = exports['de'];\n\n// Spanish\nexports['es'] = {\n  edit: 'Editar',\n  del: 'Eliminar selecci\\u00f3n',\n  back: '\\u00c1tras',\n  addNode: 'A\\u00f1adir nodo',\n  addEdge: 'A\\u00f1adir arista',\n  editNode: 'Editar nodo',\n  editEdge: 'Editar arista',\n  addDescription: 'Haga clic en un lugar vac\\u00edo para colocar un nuevo nodo.',\n  edgeDescription: 'Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.',\n  editEdgeDescription: 'Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.',\n  createEdgeError: 'No se puede conectar una arista a un grupo.',\n  deleteClusterError: 'No es posible eliminar grupos.',\n  editClusterError: 'No es posible editar grupos.'\n};\nexports['es_ES'] = exports['es'];\n\n//Italiano\nexports['it'] = {\n  edit: 'Modifica',\n  del: 'Cancella la selezione',\n  back: 'Indietro',\n  addNode: 'Aggiungi un nodo',\n  addEdge: 'Aggiungi un vertice',\n  editNode: 'Modifica il nodo',\n  editEdge: 'Modifica il vertice',\n  addDescription: 'Clicca per aggiungere un nuovo nodo',\n  edgeDescription: 'Clicca su un nodo e trascinalo ad un altro nodo per connetterli.',\n  editEdgeDescription: 'Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.',\n  createEdgeError: 'Non si possono collegare vertici ad un cluster',\n  deleteClusterError: 'I cluster non possono essere cancellati',\n  editClusterError: 'I clusters non possono essere modificati.'\n};\nexports['it_IT'] = exports['it'];\n\n// Dutch\nexports['nl'] = {\n  edit: 'Wijzigen',\n  del: 'Selectie verwijderen',\n  back: 'Terug',\n  addNode: 'Node toevoegen',\n  addEdge: 'Link toevoegen',\n  editNode: 'Node wijzigen',\n  editEdge: 'Link wijzigen',\n  addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.',\n  edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.',\n  editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.',\n  createEdgeError: 'Kan geen link maken naar een cluster.',\n  deleteClusterError: 'Clusters kunnen niet worden verwijderd.',\n  editClusterError: 'Clusters kunnen niet worden aangepast.'\n};\nexports['nl_NL'] = exports['nl'];\nexports['nl_BE'] = exports['nl'];\n\n// Portuguese Brazil\nexports['pt-br'] = {\n  edit: 'Editar',\n  del: 'Remover selecionado',\n  back: 'Voltar',\n  addNode: 'Adicionar nó',\n  addEdge: 'Adicionar aresta',\n  editNode: 'Editar nó',\n  editEdge: 'Editar aresta',\n  addDescription: 'Clique em um espaço em branco para adicionar um novo nó',\n  edgeDescription: 'Clique em um nó e arraste a aresta até outro nó para conectá-los',\n  editEdgeDescription: 'Clique nos pontos de controle e os arraste para um nó para conectá-los',\n  createEdgeError: 'Não foi possível linkar arestas a um cluster.',\n  deleteClusterError: 'Clusters não puderam ser removidos.',\n  editClusterError: 'Clusters não puderam ser editados.'\n};\nexports['pt-BR'] = exports['pt-br'];\nexports['pt_BR'] = exports['pt-br'];\nexports['pt_br'] = exports['pt-br'];\n\n// Russian\nexports['ru'] = {\n  edit: 'Редактировать',\n  del: 'Удалить выбранное',\n  back: 'Назад',\n  addNode: 'Добавить узел',\n  addEdge: 'Добавить ребро',\n  editNode: 'Редактировать узел',\n  editEdge: 'Редактировать ребро',\n  addDescription: 'Кликните в свободное место, чтобы добавить новый узел.',\n  edgeDescription: 'Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.',\n  editEdgeDescription: 'Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.',\n  createEdgeError: 'Невозможно соединить ребра в кластер.',\n  deleteClusterError: 'Кластеры не могут быть удалены',\n  editClusterError: 'Кластеры недоступны для редактирования.'\n};\nexports['ru_RU'] = exports['ru'];\n\n\n\n// WEBPACK FOOTER //\n// ./lib/network/locales.js"],"sourceRoot":""}
\ No newline at end of file