summaryrefslogtreecommitdiff
path: root/htroot
diff options
context:
space:
mode:
Diffstat (limited to 'htroot')
-rw-r--r--htroot/js/highlight.min.js1102
-rw-r--r--htroot/js/index.umd.min.js2
-rw-r--r--htroot/js/languages/actionscript.js163
-rw-r--r--htroot/js/languages/actionscript.min.js17
-rw-r--r--htroot/js/languages/asciidoc.js271
-rw-r--r--htroot/js/languages/asciidoc.min.js35
-rw-r--r--htroot/js/languages/bash.js419
-rw-r--r--htroot/js/languages/bash.min.js21
-rw-r--r--htroot/js/languages/c.js343
-rw-r--r--htroot/js/languages/c.min.js41
-rw-r--r--htroot/js/languages/clojure.js194
-rw-r--r--htroot/js/languages/clojure.min.js25
-rw-r--r--htroot/js/languages/cpp.js615
-rw-r--r--htroot/js/languages/cpp.min.js47
-rw-r--r--htroot/js/languages/css.js959
-rw-r--r--htroot/js/languages/css.min.js31
-rw-r--r--htroot/js/languages/diff.js72
-rw-r--r--htroot/js/languages/diff.min.js9
-rw-r--r--htroot/js/languages/dockerfile.js54
-rw-r--r--htroot/js/languages/dockerfile.min.js8
-rw-r--r--htroot/js/languages/ebnf.js64
-rw-r--r--htroot/js/languages/ebnf.min.js7
-rw-r--r--htroot/js/languages/fortran.js584
-rw-r--r--htroot/js/languages/fortran.min.js17
-rw-r--r--htroot/js/languages/go.js166
-rw-r--r--htroot/js/languages/go.min.js20
-rw-r--r--htroot/js/languages/gradle.js200
-rw-r--r--htroot/js/languages/gradle.min.js5
-rw-r--r--htroot/js/languages/http.js107
-rw-r--r--htroot/js/languages/http.min.js14
-rw-r--r--htroot/js/languages/java.js301
-rw-r--r--htroot/js/languages/java.min.js38
-rw-r--r--htroot/js/languages/javascript.js779
-rw-r--r--htroot/js/languages/javascript.min.js81
-rw-r--r--htroot/js/languages/json.js64
-rw-r--r--htroot/js/languages/json.min.js8
-rw-r--r--htroot/js/languages/latex.js288
-rw-r--r--htroot/js/languages/latex.min.js33
-rw-r--r--htroot/js/languages/lisp.js149
-rw-r--r--htroot/js/languages/lisp.min.js17
-rw-r--r--htroot/js/languages/makefile.js99
-rw-r--r--htroot/js/languages/makefile.min.js14
-rw-r--r--htroot/js/languages/markdown.js258
-rw-r--r--htroot/js/languages/markdown.min.js32
-rw-r--r--htroot/js/languages/nestedtext.js93
-rw-r--r--htroot/js/languages/nestedtext.min.js9
-rw-r--r--htroot/js/languages/nginx.js163
-rw-r--r--htroot/js/languages/nginx.min.js21
-rw-r--r--htroot/js/languages/plaintext.js29
-rw-r--r--htroot/js/languages/plaintext.min.js4
-rw-r--r--htroot/js/languages/powershell.js327
-rw-r--r--htroot/js/languages/powershell.min.js39
-rw-r--r--htroot/js/languages/prolog.js107
-rw-r--r--htroot/js/languages/prolog.min.js11
-rw-r--r--htroot/js/languages/python.js446
-rw-r--r--htroot/js/languages/python.min.js42
-rw-r--r--htroot/js/languages/rust.js336
-rw-r--r--htroot/js/languages/rust.min.js27
-rw-r--r--htroot/js/languages/shell.js43
-rw-r--r--htroot/js/languages/shell.min.js5
-rw-r--r--htroot/js/languages/sql.js703
-rw-r--r--htroot/js/languages/sql.min.js21
-rw-r--r--htroot/js/languages/typescript.js923
-rw-r--r--htroot/js/languages/typescript.min.js99
-rw-r--r--htroot/js/languages/yaml.js223
-rw-r--r--htroot/js/languages/yaml.min.js28
-rw-r--r--htroot/js/marked.umd.js74
-rw-r--r--htroot/js/styles/a11y-dark.min.css7
-rw-r--r--htroot/js/styles/a11y-light.min.css7
-rw-r--r--htroot/js/styles/atom-one-dark.css90
-rw-r--r--htroot/js/styles/atom-one-dark.min.css1
-rw-r--r--htroot/js/styles/atom-one-light.css90
-rw-r--r--htroot/js/styles/atom-one-light.min.css1
-rw-r--r--htroot/js/styles/cybertopia-cherry.css103
-rw-r--r--htroot/js/styles/cybertopia-cherry.min.css1
-rw-r--r--htroot/js/styles/cybertopia-dimmer.css103
-rw-r--r--htroot/js/styles/cybertopia-dimmer.min.css1
-rw-r--r--htroot/js/styles/cybertopia-icecap.css103
-rw-r--r--htroot/js/styles/cybertopia-icecap.min.css1
-rw-r--r--htroot/js/styles/cybertopia-saturated.css103
-rw-r--r--htroot/js/styles/cybertopia-saturated.min.css1
-rw-r--r--htroot/js/styles/default.min.css9
-rw-r--r--htroot/js/styles/github-dark.min.css10
-rw-r--r--htroot/js/styles/github.min.css10
-rw-r--r--htroot/js/styles/grayscale.min.css1
-rw-r--r--htroot/js/styles/mono-blue.css56
-rw-r--r--htroot/js/styles/mono-blue.min.css1
-rw-r--r--htroot/js/styles/night-owl.css174
-rw-r--r--htroot/js/styles/night-owl.min.css1
-rw-r--r--htroot/js/styles/nnfx-dark.css104
-rw-r--r--htroot/js/styles/nnfx-dark.min.css10
-rw-r--r--htroot/js/styles/nnfx-light.css104
-rw-r--r--htroot/js/styles/nnfx-light.min.css10
-rw-r--r--htroot/js/styles/panda-syntax-dark.css92
-rw-r--r--htroot/js/styles/panda-syntax-dark.min.css1
-rw-r--r--htroot/js/styles/panda-syntax-light.css89
-rw-r--r--htroot/js/styles/panda-syntax-light.min.css1
-rw-r--r--htroot/js/styles/paraiso-dark.css67
-rw-r--r--htroot/js/styles/paraiso-dark.min.css1
-rw-r--r--htroot/js/styles/paraiso-light.css67
-rw-r--r--htroot/js/styles/paraiso-light.min.css1
-rw-r--r--htroot/js/styles/tomorrow-night-blue.css69
-rw-r--r--htroot/js/styles/tomorrow-night-blue.min.css1
-rw-r--r--htroot/js/styles/tomorrow-night-bright.css68
-rw-r--r--htroot/js/styles/tomorrow-night-bright.min.css1
-rw-r--r--htroot/yacychat.html237
106 files changed, 13338 insertions, 5 deletions
diff --git a/htroot/js/highlight.min.js b/htroot/js/highlight.min.js
new file mode 100644
index 000000000..a99393ddb
--- /dev/null
+++ b/htroot/js/highlight.min.js
@@ -0,0 +1,1102 @@
+/*!
+ Highlight.js v11.11.1 (git: 08cb242e7d)
+ (c) 2006-2025 Josh Goebel <hello@joshgoebel.com> and other contributors
+ License: BSD-3-Clause
+ */
+var hljs=function(){"use strict";function e(t){
+return t instanceof Map?t.clear=t.delete=t.set=()=>{
+throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{
+throw Error("set is read-only")
+}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{
+const i=t[n],s=typeof i;"object"!==s&&"function"!==s||Object.isFrozen(i)||e(i)
+})),t}class t{constructor(e){
+void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}
+ignoreMatch(){this.isMatchIgnored=!0}}function n(e){
+return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")
+}function i(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t]
+;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const s=e=>!!e.scope
+;class r{constructor(e,t){
+this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){
+this.buffer+=n(e)}openNode(e){if(!s(e))return;const t=((e,{prefix:t})=>{
+if(e.startsWith("language:"))return e.replace("language:","language-")
+;if(e.includes(".")){const n=e.split(".")
+;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ")
+}return`${t}${e}`})(e.scope,{prefix:this.classPrefix});this.span(t)}
+closeNode(e){s(e)&&(this.buffer+="</span>")}value(){return this.buffer}span(e){
+this.buffer+=`<span class="${e}">`}}const o=(e={})=>{const t={children:[]}
+;return Object.assign(t,e),t};class a{constructor(){
+this.rootNode=o(),this.stack=[this.rootNode]}get top(){
+return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){
+this.top.children.push(e)}openNode(e){const t=o({scope:e})
+;this.add(t),this.stack.push(t)}closeNode(){
+if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){
+for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}
+walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){
+return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t),
+t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){
+"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{
+a._collapse(e)})))}}class c extends a{constructor(e){super(),this.options=e}
+addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){
+this.closeNode()}__addSublanguage(e,t){const n=e.root
+;t&&(n.scope="language:"+t),this.add(n)}toHTML(){
+return new r(this,this.options).value()}finalize(){
+return this.closeAllNodes(),!0}}function l(e){
+return e?"string"==typeof e?e:e.source:null}function g(e){return h("(?=",e,")")}
+function u(e){return h("(?:",e,")*")}function d(e){return h("(?:",e,")?")}
+function h(...e){return e.map((e=>l(e))).join("")}function f(...e){const t=(e=>{
+const t=e[e.length-1]
+;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}
+})(e);return"("+(t.capture?"":"?:")+e.map((e=>l(e))).join("|")+")"}
+function p(e){return RegExp(e.toString()+"|").exec("").length-1}
+const b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./
+;function m(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n
+;let i=l(e),s="";for(;i.length>0;){const e=b.exec(i);if(!e){s+=i;break}
+s+=i.substring(0,e.index),
+i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],
+"("===e[0]&&n++)}return s})).map((e=>`(${e})`)).join(t)}
+const E="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",O={
+begin:"\\\\[\\s\\S]",relevance:0},v={scope:"string",begin:"'",end:"'",
+illegal:"\\n",contains:[O]},k={scope:"string",begin:'"',end:'"',illegal:"\\n",
+contains:[O]},N=(e,t,n={})=>{const s=i({scope:"comment",begin:e,end:t,
+contains:[]},n);s.contains.push({scope:"doctag",
+begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
+end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0})
+;const r=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/)
+;return s.contains.push({begin:h(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s
+},S=N("//","$"),M=N("/\\*","\\*/"),R=N("#","$");var j=Object.freeze({
+__proto__:null,APOS_STRING_MODE:v,BACKSLASH_ESCAPE:O,BINARY_NUMBER_MODE:{
+scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:N,
+C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:S,C_NUMBER_MODE:{scope:"number",
+begin:_,relevance:0},C_NUMBER_RE:_,END_SAME_AS_BEGIN:e=>Object.assign(e,{
+"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{
+t.data._beginMatch!==e[1]&&t.ignoreMatch()}}),HASH_COMMENT_MODE:R,IDENT_RE:E,
+MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+x,relevance:0},
+NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y,
+PHRASAL_WORDS_MODE:{
+begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
+},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/,
+end:/\/[gimuy]*/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,contains:[O]}]},
+RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",
+SHEBANG:(e={})=>{const t=/^#![ ]*\//
+;return e.binary&&(e.begin=h(t,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:t,
+end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},
+TITLE_MODE:{scope:"title",begin:E,relevance:0},UNDERSCORE_IDENT_RE:x,
+UNDERSCORE_TITLE_MODE:{scope:"title",begin:x,relevance:0}});function A(e,t){
+"."===e.input[e.index-1]&&t.ignoreMatch()}function I(e,t){
+void 0!==e.className&&(e.scope=e.className,delete e.className)}function T(e,t){
+t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",
+e.__beforeBegin=A,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,
+void 0===e.relevance&&(e.relevance=0))}function L(e,t){
+Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function B(e,t){
+if(e.match){
+if(e.begin||e.end)throw Error("begin & end are not supported with match")
+;e.begin=e.match,delete e.match}}function P(e,t){
+void 0===e.relevance&&(e.relevance=1)}const D=(e,t)=>{if(!e.beforeMatch)return
+;if(e.starts)throw Error("beforeMatch cannot be used with starts")
+;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t]
+})),e.keywords=n.keywords,e.begin=h(n.beforeMatch,g(n.begin)),e.starts={
+relevance:0,contains:[Object.assign(n,{endsParent:!0})]
+},e.relevance=0,delete n.beforeMatch
+},H=["of","and","for","in","not","or","if","then","parent","list","value"]
+;function C(e,t,n="keyword"){const i=Object.create(null)
+;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{
+Object.assign(i,C(e[n],t,n))})),i;function s(e,n){
+t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|")
+;i[n[0]]=[e,$(n[0],n[1])]}))}}function $(e,t){
+return t?Number(t):(e=>H.includes(e.toLowerCase()))(e)?0:1}const U={},z=e=>{
+console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{
+U[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),U[`${e}/${t}`]=!0)
+},G=Error();function K(e,t,{key:n}){let i=0;const s=e[n],r={},o={}
+;for(let e=1;e<=t.length;e++)o[e+i]=s[e],r[e+i]=!0,i+=p(t[e-1])
+;e[n]=o,e[n]._emit=r,e[n]._multi=!0}function F(e){(e=>{
+e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,
+delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={
+_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope
+}),(e=>{if(Array.isArray(e.begin)){
+if(e.skip||e.excludeBegin||e.returnBegin)throw z("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),
+G
+;if("object"!=typeof e.beginScope||null===e.beginScope)throw z("beginScope must be object"),
+G;K(e,e.begin,{key:"beginScope"}),e.begin=m(e.begin,{joinWith:""})}})(e),(e=>{
+if(Array.isArray(e.end)){
+if(e.skip||e.excludeEnd||e.returnEnd)throw z("skip, excludeEnd, returnEnd not compatible with endScope: {}"),
+G
+;if("object"!=typeof e.endScope||null===e.endScope)throw z("endScope must be object"),
+G;K(e,e.end,{key:"endScope"}),e.end=m(e.end,{joinWith:""})}})(e)}function Z(e){
+function t(t,n){
+return RegExp(l(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":""))
+}class n{constructor(){
+this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}
+addRule(e,t){
+t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),
+this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null)
+;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(m(e,{joinWith:"|"
+}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex
+;const t=this.matcherRe.exec(e);if(!t)return null
+;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n]
+;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){
+this.rules=[],this.multiRegexes=[],
+this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){
+if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n
+;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),
+t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){
+return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){
+this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){
+const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex
+;let n=t.exec(e)
+;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{
+const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}
+return n&&(this.regexIndex+=n.position+1,
+this.regexIndex===this.count&&this.considerAll()),n}}
+if(e.compilerExtensions||(e.compilerExtensions=[]),
+e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.")
+;return e.classNameAliases=i(e.classNameAliases||{}),function n(r,o){const a=r
+;if(r.isCompiled)return a
+;[I,B,F,D].forEach((e=>e(r,o))),e.compilerExtensions.forEach((e=>e(r,o))),
+r.__beforeBegin=null,[T,L,P].forEach((e=>e(r,o))),r.isCompiled=!0;let c=null
+;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords),
+c=r.keywords.$pattern,
+delete r.keywords.$pattern),c=c||/\w+/,r.keywords&&(r.keywords=C(r.keywords,e.case_insensitive)),
+a.keywordPatternRe=t(c,!0),
+o&&(r.begin||(r.begin=/\B|\b/),a.beginRe=t(a.begin),r.end||r.endsWithParent||(r.end=/\B|\b/),
+r.end&&(a.endRe=t(a.end)),
+a.terminatorEnd=l(a.end)||"",r.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(r.end?"|":"")+o.terminatorEnd)),
+r.illegal&&(a.illegalRe=t(r.illegal)),
+r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>i(e,{
+variants:null},t)))),e.cachedVariants?e.cachedVariants:V(e)?i(e,{
+starts:e.starts?i(e.starts):null
+}):Object.isFrozen(e)?i(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{n(e,a)
+})),r.starts&&n(r.starts,o),a.matcher=(e=>{const t=new s
+;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin"
+}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end"
+}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function V(e){
+return!!e&&(e.endsWithParent||V(e.starts))}class q extends Error{
+constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}}
+const J=n,Y=i,Q=Symbol("nomatch"),ee=n=>{
+const i=Object.create(null),s=Object.create(null),r=[];let o=!0
+;const a="Could not find the language '{}', did you forget to load/include a language module?",l={
+disableAutodetect:!0,name:"Plain text",contains:[]};let p={
+ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,
+languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",
+cssSelector:"pre code",languages:null,__emitter:c};function b(e){
+return p.noHighlightRe.test(e)}function m(e,t,n){let i="",s=""
+;"object"==typeof t?(i=e,
+n=t.ignoreIllegals,s=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."),
+X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),
+s=e,i=t),void 0===n&&(n=!0);const r={code:i,language:s};N("before:highlight",r)
+;const o=r.result?r.result:E(r.language,r.code,n)
+;return o.code=r.code,N("after:highlight",o),o}function E(e,n,s,r){
+const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(R)
+;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(R),n=""
+;for(;t;){n+=R.substring(e,t.index)
+;const s=w.case_insensitive?t[0].toLowerCase():t[0],r=(i=s,N.keywords[i]);if(r){
+const[e,i]=r
+;if(M.addText(n),n="",c[s]=(c[s]||0)+1,c[s]<=7&&(j+=i),e.startsWith("_"))n+=t[0];else{
+const n=w.classNameAliases[e]||e;u(t[0],n)}}else n+=t[0]
+;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(R)}var i
+;n+=R.substring(e),M.addText(n)}function g(){null!=N.subLanguage?(()=>{
+if(""===R)return;let e=null;if("string"==typeof N.subLanguage){
+if(!i[N.subLanguage])return void M.addText(R)
+;e=E(N.subLanguage,R,!0,S[N.subLanguage]),S[N.subLanguage]=e._top
+}else e=x(R,N.subLanguage.length?N.subLanguage:null)
+;N.relevance>0&&(j+=e.relevance),M.__addSublanguage(e._emitter,e.language)
+})():l(),R=""}function u(e,t){
+""!==e&&(M.startScope(t),M.addText(e),M.endScope())}function d(e,t){let n=1
+;const i=t.length-1;for(;n<=i;){if(!e._emit[n]){n++;continue}
+const i=w.classNameAliases[e[n]]||e[n],s=t[n];i?u(s,i):(R=s,l(),R=""),n++}}
+function h(e,t){
+return e.scope&&"string"==typeof e.scope&&M.openNode(w.classNameAliases[e.scope]||e.scope),
+e.beginScope&&(e.beginScope._wrap?(u(R,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),
+R=""):e.beginScope._multi&&(d(e.beginScope,t),R="")),N=Object.create(e,{parent:{
+value:N}}),N}function f(e,n,i){let s=((e,t)=>{const n=e&&e.exec(t)
+;return n&&0===n.index})(e.endRe,i);if(s){if(e["on:end"]){const i=new t(e)
+;e["on:end"](n,i),i.isMatchIgnored&&(s=!1)}if(s){
+for(;e.endsParent&&e.parent;)e=e.parent;return e}}
+if(e.endsWithParent)return f(e.parent,n,i)}function b(e){
+return 0===N.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function m(e){
+const t=e[0],i=n.substring(e.index),s=f(N,e,i);if(!s)return Q;const r=N
+;N.endScope&&N.endScope._wrap?(g(),
+u(t,N.endScope._wrap)):N.endScope&&N.endScope._multi?(g(),
+d(N.endScope,e)):r.skip?R+=t:(r.returnEnd||r.excludeEnd||(R+=t),
+g(),r.excludeEnd&&(R=t));do{
+N.scope&&M.closeNode(),N.skip||N.subLanguage||(j+=N.relevance),N=N.parent
+}while(N!==s.parent);return s.starts&&h(s.starts,e),r.returnEnd?0:t.length}
+let y={};function _(i,r){const a=r&&r[0];if(R+=i,null==a)return g(),0
+;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===a){
+if(R+=n.slice(r.index,r.index+1),!o){const t=Error(`0 width match regex (${e})`)
+;throw t.languageName=e,t.badRule=y.rule,t}return 1}
+if(y=r,"begin"===r.type)return(e=>{
+const n=e[0],i=e.rule,s=new t(i),r=[i.__beforeBegin,i["on:begin"]]
+;for(const t of r)if(t&&(t(e,s),s.isMatchIgnored))return b(n)
+;return i.skip?R+=n:(i.excludeBegin&&(R+=n),
+g(),i.returnBegin||i.excludeBegin||(R=n)),h(i,e),i.returnBegin?0:n.length})(r)
+;if("illegal"===r.type&&!s){
+const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"<unnamed>")+'"')
+;throw e.mode=N,e}if("end"===r.type){const e=m(r);if(e!==Q)return e}
+if("illegal"===r.type&&""===a)return R+="\n",1
+;if(I>1e5&&I>3*r.index)throw Error("potential infinite loop, way more iterations than matches")
+;return R+=a,a.length}const w=O(e)
+;if(!w)throw z(a.replace("{}",e)),Error('Unknown language: "'+e+'"')
+;const v=Z(w);let k="",N=r||v;const S={},M=new p.__emitter(p);(()=>{const e=[]
+;for(let t=N;t!==w;t=t.parent)t.scope&&e.unshift(t.scope)
+;e.forEach((e=>M.openNode(e)))})();let R="",j=0,A=0,I=0,T=!1;try{
+if(w.__emitTokens)w.__emitTokens(n,M);else{for(N.matcher.considerAll();;){
+I++,T?T=!1:N.matcher.considerAll(),N.matcher.lastIndex=A
+;const e=N.matcher.exec(n);if(!e)break;const t=_(n.substring(A,e.index),e)
+;A=e.index+t}_(n.substring(A))}return M.finalize(),k=M.toHTML(),{language:e,
+value:k,relevance:j,illegal:!1,_emitter:M,_top:N}}catch(t){
+if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n),
+illegal:!0,relevance:0,_illegalBy:{message:t.message,index:A,
+context:n.slice(A-100,A+100),mode:t.mode,resultSoFar:k},_emitter:M};if(o)return{
+language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:N}
+;throw t}}function x(e,t){t=t||p.languages||Object.keys(i);const n=(e=>{
+const t={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new p.__emitter(p)}
+;return t._emitter.addText(e),t})(e),s=t.filter(O).filter(k).map((t=>E(t,e,!1)))
+;s.unshift(n);const r=s.sort(((e,t)=>{
+if(e.relevance!==t.relevance)return t.relevance-e.relevance
+;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1
+;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=r,c=o
+;return c.secondBest=a,c}function y(e){let t=null;const n=(e=>{
+let t=e.className+" ";t+=e.parentNode?e.parentNode.className:""
+;const n=p.languageDetectRe.exec(t);if(n){const t=O(n[1])
+;return t||(W(a.replace("{}",n[1])),
+W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"}
+return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return
+;if(N("before:highlightElement",{el:e,language:n
+}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e)
+;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),
+console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),
+console.warn("The element with unescaped HTML:"),
+console.warn(e)),p.throwUnescapedHTML))throw new q("One of your code blocks includes unescaped HTML.",e.innerHTML)
+;t=e;const i=t.textContent,r=n?m(i,{language:n,ignoreIllegals:!0}):x(i)
+;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,t,n)=>{const i=t&&s[t]||n
+;e.classList.add("hljs"),e.classList.add("language-"+i)
+})(e,n,r.language),e.result={language:r.language,re:r.relevance,
+relevance:r.relevance},r.secondBest&&(e.secondBest={
+language:r.secondBest.language,relevance:r.secondBest.relevance
+}),N("after:highlightElement",{el:e,result:r,text:i})}let _=!1;function w(){
+if("loading"===document.readyState)return _||window.addEventListener("DOMContentLoaded",(()=>{
+w()}),!1),void(_=!0);document.querySelectorAll(p.cssSelector).forEach(y)}
+function O(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}
+function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{
+s[e.toLowerCase()]=t}))}function k(e){const t=O(e)
+;return t&&!t.disableAutodetect}function N(e,t){const n=e;r.forEach((e=>{
+e[n]&&e[n](t)}))}Object.assign(n,{highlight:m,highlightAuto:x,highlightAll:w,
+highlightElement:y,
+highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"),
+X("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)},
+initHighlighting:()=>{
+w(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},
+initHighlightingOnLoad:()=>{
+w(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")
+},registerLanguage:(e,t)=>{let s=null;try{s=t(n)}catch(t){
+if(z("Language definition for '{}' could not be registered.".replace("{}",e)),
+!o)throw t;z(t),s=l}
+s.name||(s.name=e),i[e]=s,s.rawDefinition=t.bind(null,n),s.aliases&&v(s.aliases,{
+languageName:e})},unregisterLanguage:e=>{delete i[e]
+;for(const t of Object.keys(s))s[t]===e&&delete s[t]},
+listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v,
+autoDetection:k,inherit:Y,addPlugin:e=>{(e=>{
+e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{
+e["before:highlightBlock"](Object.assign({block:t.el},t))
+}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{
+e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),r.push(e)},
+removePlugin:e=>{const t=r.indexOf(e);-1!==t&&r.splice(t,1)}}),n.debugMode=()=>{
+o=!1},n.safeMode=()=>{o=!0},n.versionString="11.11.1",n.regex={concat:h,
+lookahead:g,either:f,optional:d,anyNumberOfTimes:u}
+;for(const t in j)"object"==typeof j[t]&&e(j[t]);return Object.assign(n,j),n
+},te=ee({});return te.newInstance=()=>ee({}),te}()
+;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `actionscript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const a=e.regex,t=/[a-zA-Z_$][a-zA-Z0-9_$]*/,n=a.concat(t,a.concat("(\\.",t,")*")),s={
+className:"rest_arg",begin:/[.]{3}/,end:t,relevance:10};return{
+name:"ActionScript",aliases:["as"],keywords:{
+keyword:["as","break","case","catch","class","const","continue","default","delete","do","dynamic","each","else","extends","final","finally","for","function","get","if","implements","import","in","include","instanceof","interface","internal","is","namespace","native","new","override","package","private","protected","public","return","set","static","super","switch","this","throw","try","typeof","use","var","void","while","with"],
+literal:["true","false","null","undefined"]},
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,{
+match:[/\bpackage/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{
+match:[/\b(?:class|interface|extends|implements)/,/\s+/,t],className:{
+1:"keyword",3:"title.class"}},{className:"meta",beginKeywords:"import include",
+end:/;/,keywords:{keyword:"import include"}},{beginKeywords:"function",
+end:/[{;]/,excludeEnd:!0,illegal:/\S/,contains:[e.inherit(e.TITLE_MODE,{
+className:"title.function"}),{className:"params",begin:/\(/,end:/\)/,
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]
+},{begin:a.concat(/:\s*/,/([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/)}]},e.METHOD_GUARD],
+illegal:/#/}}})();hljs.registerLanguage("actionscript",e)})();/*! `asciidoc` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a=[{
+className:"strong",begin:/\*{2}([^\n]+?)\*{2}/},{className:"strong",
+begin:n.concat(/\*\*/,/((\*(?!\*)|\\[^\n]|[^*\n\\])+\n)+/,/(\*(?!\*)|\\[^\n]|[^*\n\\])*/,/\*\*/),
+relevance:0},{className:"strong",begin:/\B\*(\S|\S[^\n]*?\S)\*(?!\w)/},{
+className:"strong",begin:/\*[^\s]([^\n]+\n)+([^\n]+)\*/}],s=[{
+className:"emphasis",begin:/_{2}([^\n]+?)_{2}/},{className:"emphasis",
+begin:n.concat(/__/,/((_(?!_)|\\[^\n]|[^_\n\\])+\n)+/,/(_(?!_)|\\[^\n]|[^_\n\\])*/,/__/),
+relevance:0},{className:"emphasis",begin:/\b_(\S|\S[^\n]*?\S)_(?!\w)/},{
+className:"emphasis",begin:/_[^\s]([^\n]+\n)+([^\n]+)_/},{className:"emphasis",
+begin:"\\B'(?!['\\s])",end:"(\\n{2}|')",contains:[{begin:"\\\\'\\w",relevance:0
+}],relevance:0}];return{name:"AsciiDoc",aliases:["adoc"],
+contains:[e.COMMENT("^/{4,}\\n","\\n/{4,}$",{relevance:10
+}),e.COMMENT("^//","$",{relevance:0}),{className:"title",begin:"^\\.\\w.*$"},{
+begin:"^[=\\*]{4,}\\n",end:"\\n^[=\\*]{4,}$",relevance:10},{className:"section",
+relevance:10,variants:[{begin:"^(={1,6})[ \t].+?([ \t]\\1)?$"},{
+begin:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{className:"meta",
+begin:"^:.+?:",end:"\\s",excludeEnd:!0,relevance:10},{className:"meta",
+begin:"^\\[.+?\\]$",relevance:0},{className:"quote",begin:"^_{4,}\\n",
+end:"\\n_{4,}$",relevance:10},{className:"code",begin:"^[\\-\\.]{4,}\\n",
+end:"\\n[\\-\\.]{4,}$",relevance:10},{begin:"^\\+{4,}\\n",end:"\\n\\+{4,}$",
+contains:[{begin:"<",end:">",subLanguage:"xml",relevance:0}],relevance:10},{
+className:"bullet",begin:"^(\\*+|-+|\\.+|[^\\n]+?::)\\s+"},{className:"symbol",
+begin:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{
+begin:/\\[*_`]/},{begin:/\\\\\*{2}[^\n]*?\*{2}/},{begin:/\\\\_{2}[^\n]*_{2}/},{
+begin:/\\\\`{2}[^\n]*`{2}/},{begin:/[:;}][*_`](?![*_`])/},...a,...s,{
+className:"string",variants:[{begin:"``.+?''"},{begin:"`.+?'"}]},{
+className:"code",begin:/`{2}/,end:/(\n{2}|`{2})/},{className:"code",
+begin:"(`.+?`|\\+.+?\\+)",relevance:0},{className:"code",begin:"^[ \\t]",
+end:"$",relevance:0},{begin:"^'{3,}[ \\t]*$",relevance:10},{
+begin:"(link:)?(http|https|ftp|file|irc|image:?):\\S+?\\[[^[]*?\\]",
+returnBegin:!0,contains:[{begin:"(link|image:?):",relevance:0},{
+className:"link",begin:"\\w",end:"[^\\[]+",relevance:0},{className:"string",
+begin:"\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0,relevance:0}],relevance:10}]
+}}})();hljs.registerLanguage("asciidoc",e)})();/*! `bash` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const s=e.regex,t={},n={begin:/\$\{/,
+end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{
+className:"variable",variants:[{
+begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={
+className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]
+},i=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),c={
+begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,
+end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const r={begin:/\$?\(\(/,
+end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]
+},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10
+}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,
+contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{
+name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,
+keyword:["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],
+literal:["true","false"],
+built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"]
+},contains:[l,e.SHEBANG(),m,r,i,c,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{
+className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}})()
+;hljs.registerLanguage("bash",e)})();/*! `c` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,n=e.COMMENT("//","$",{
+contains:[{begin:/\\\n/}]
+}),a="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",r="("+a+"|"+t.optional(s)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",i={
+className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{
+match:/\batomic_[a-z]{3,6}\b/}]},l={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{match:/\b(0b[01']+)/},{
+match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/
+},{
+match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/
+},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0
+},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(l,{className:"string"}),{
+className:"string",begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},d={
+className:"title",begin:t.optional(s)+e.IDENT_RE,relevance:0
+},_=t.optional(s)+e.IDENT_RE+"\\s*\\(",u={
+keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],
+type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"],
+literal:"true false NULL",
+built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"
+},m=[c,i,n,e.C_BLOCK_COMMENT_MODE,o,l],g={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u,
+contains:m.concat(["self"]),relevance:0}]),relevance:0},p={
+begin:"("+r+"[\\*&\\s]+)+"+_,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{
+begin:_,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})],
+relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,
+keywords:u,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,l,o,i,{begin:/\(/,
+end:/\)/,keywords:u,relevance:0,contains:["self",n,e.C_BLOCK_COMMENT_MODE,l,o,i]
+}]},i,n,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u,
+disableAutodetect:!0,illegal:"</",contains:[].concat(g,p,m,[c,{
+begin:e.IDENT_RE+"::",keywords:u},{className:"class",
+beginKeywords:"enum class struct union",end:/[{;:<>=]/,contains:[{
+beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c,
+strings:l,keywords:u}}}})();hljs.registerLanguage("c",e)})();/*! `clojure` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const t="a-zA-Z_\\-!.?+*=<>&'",n="[#]?["+t+"]["+t+"0-9/;:$#]*",a="def defonce defprotocol defstruct defmulti defmethod defn- defn defmacro deftype defrecord",r={
+$pattern:n,
+built_in:a+" cond apply if-not if-let if not not= =|0 <|0 >|0 <=|0 >=|0 ==|0 +|0 /|0 *|0 -|0 rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy first rest cons cast coll last butlast sigs reify second ffirst fnext nfirst nnext meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"
+},s={begin:n,relevance:0},o={scope:"number",relevance:0,variants:[{
+match:/[-+]?0[xX][0-9a-fA-F]+N?/},{match:/[-+]?0[0-7]+N?/},{
+match:/[-+]?[1-9][0-9]?[rR][0-9a-zA-Z]+N?/},{match:/[-+]?[0-9]+\/[0-9]+N?/},{
+match:/[-+]?[0-9]+((\.[0-9]*([eE][+-]?[0-9]+)?M?)|([eE][+-]?[0-9]+M?|M))/},{
+match:/[-+]?([1-9][0-9]*|0)N?/}]},c={scope:"character",variants:[{
+match:/\\o[0-3]?[0-7]{1,2}/},{match:/\\u[0-9a-fA-F]{4}/},{
+match:/\\(newline|space|tab|formfeed|backspace|return)/},{match:/\\\S/,
+relevance:0}]},i={scope:"regex",begin:/#"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]
+},d=e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),l={scope:"punctuation",
+match:/,/,relevance:0},m=e.COMMENT(";","$",{relevance:0}),p={
+className:"literal",begin:/\b(true|false|nil)\b/},u={
+begin:"\\[|(#::?"+n+")?\\{",end:"[\\]\\}]",relevance:0},f={className:"symbol",
+begin:"[:]{1,2}"+n},h={begin:"\\(",end:"\\)"},y={endsWithParent:!0,relevance:0
+},g={keywords:r,className:"name",begin:n,relevance:0,starts:y
+},b=[l,h,c,i,d,m,f,u,o,p,s],v={beginKeywords:a,keywords:{$pattern:n,keyword:a},
+end:'(\\[|#|\\d|"|:|\\{|\\)|\\(|$)',contains:[{className:"title",begin:n,
+relevance:0,excludeEnd:!0,endsParent:!0}].concat(b)}
+;return h.contains=[v,g,y],y.contains=b,u.contains=b,{name:"Clojure",
+aliases:["clj","edn"],illegal:/\S/,contains:[l,h,c,i,d,m,f,u,o,p]}}})()
+;hljs.registerLanguage("clojure",e)})();/*! `cpp` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,a=e.COMMENT("//","$",{
+contains:[{begin:/\\\n/}]
+}),n="decltype\\(auto\\)",r="[a-zA-Z_]\\w*::",i="(?!struct)("+n+"|"+t.optional(r)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={
+className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{
+begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"
+},{
+begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"
+}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{
+className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},u={
+className:"title",begin:t.optional(r)+e.IDENT_RE,relevance:0
+},d=t.optional(r)+e.IDENT_RE+"\\s*\\(",p={
+type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],
+keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],
+literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],
+_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"]
+},_={className:"function.dispatch",relevance:0,keywords:{
+_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"]
+},
+begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))
+},m=[_,l,s,a,e.C_BLOCK_COMMENT_MODE,o,c],f={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p,
+contains:m.concat(["self"]),relevance:0}]),relevance:0},g={className:"function",
+begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:p,relevance:0},{
+begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{
+begin:/:/,endsWithParent:!0,contains:[c,o]},{relevance:0,match:/,/},{
+className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,
+contains:[a,e.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/,end:/\)/,keywords:p,
+relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,c,o,s]}]
+},s,a,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++",
+aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"</",
+classNameAliases:{"function.dispatch":"built_in"},
+contains:[].concat(f,g,_,m,[l,{
+begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)",
+end:">",keywords:p,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:p},{
+match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],
+className:{1:"keyword",3:"title.class"}}])}}})();hljs.registerLanguage("cpp",e)
+})();/*! `css` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],i=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),t=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),r=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse()
+;return n=>{const a=n.regex,l=(e=>({IMPORTANT:{scope:"meta",begin:"!important"},
+BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",
+begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{
+className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{
+scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{
+scope:"number",
+begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",
+relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}
+}))(n),s=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS",
+case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},
+classNameAliases:{keyframePosition:"selector-tag"},contains:[l.BLOCK_COMMENT,{
+begin:/-(webkit|moz|ms|o)-(?=[a-z])/},l.CSS_NUMBER_MODE,{
+className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{
+className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0
+},l.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{
+begin:":("+t.join("|")+")"},{begin:":(:)?("+o.join("|")+")"}]},l.CSS_VARIABLE,{
+className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,
+contains:[l.BLOCK_COMMENT,l.HEXCOLOR,l.IMPORTANT,l.CSS_NUMBER_MODE,...s,{
+begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"
+},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0,
+excludeEnd:!0}]},l.FUNCTION_DISPATCH]},{begin:a.lookahead(/@/),end:"[{;]",
+relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/
+},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{
+$pattern:/[a-z-]+/,keyword:"and or not only",attribute:i.join(" ")},contains:[{
+begin:/[a-z-]+(?=:)/,className:"attribute"},...s,l.CSS_NUMBER_MODE]}]},{
+className:"selector-tag",begin:"\\b("+e.join("|")+")\\b"}]}}})()
+;hljs.registerLanguage("css",e)})();/*! `diff` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=e.regex;return{name:"Diff",
+aliases:["patch"],contains:[{className:"meta",relevance:10,
+match:a.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)
+},{className:"comment",variants:[{
+begin:a.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),
+end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{
+className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,
+end:/$/}]}}})();hljs.registerLanguage("diff",e)})();/*! `dockerfile` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>({name:"Dockerfile",aliases:["docker"],
+case_insensitive:!0,
+keywords:["from","maintainer","expose","env","arg","user","onbuild","stopsignal"],
+contains:[e.HASH_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{
+beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell",
+starts:{end:/[^\\]$/,subLanguage:"bash"}}],illegal:"</"})})()
+;hljs.registerLanguage("dockerfile",e)})();/*! `ebnf` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=e.COMMENT(/\(\*/,/\*\)/)
+;return{name:"Extended Backus-Naur Form",illegal:/\S/,contains:[a,{
+className:"attribute",begin:/^[ ]*[a-zA-Z]+([\s_-]+[a-zA-Z]+)*/},{begin:/=/,
+end:/[.;]/,contains:[a,{className:"meta",begin:/\?.*\?/},{className:"string",
+variants:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{begin:"`",end:"`"}]}]}]}}})()
+;hljs.registerLanguage("ebnf",e)})();/*! `fortran` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a={
+variants:[e.COMMENT("!","$",{relevance:0}),e.COMMENT("^C[ ]","$",{relevance:0
+}),e.COMMENT("^C$","$",{relevance:0})]
+},t=/(_[a-z_\d]+)?/,i=/([de][+-]?\d+)?/,c={className:"number",variants:[{
+begin:n.concat(/\b\d+/,/\.(\d*)/,i,t)},{begin:n.concat(/\b\d+/,i,t)},{
+begin:n.concat(/\.\d+/,i,t)}],relevance:0},o={className:"function",
+beginKeywords:"subroutine function program",illegal:"[${=\\n]",
+contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]}
+;return{name:"Fortran",case_insensitive:!0,aliases:["f90","f95"],keywords:{
+$pattern:/\b[a-z][a-z0-9_]+\b|\.[a-z][a-z0-9_]+\./,
+keyword:["kind","do","concurrent","local","shared","while","private","call","intrinsic","where","elsewhere","type","endtype","endmodule","endselect","endinterface","end","enddo","endif","if","forall","endforall","only","contains","default","return","stop","then","block","endblock","endassociate","public","subroutine|10","function","program",".and.",".or.",".not.",".le.",".eq.",".ge.",".gt.",".lt.","goto","save","else","use","module","select","case","access","blank","direct","exist","file","fmt","form","formatted","iostat","name","named","nextrec","number","opened","rec","recl","sequential","status","unformatted","unit","continue","format","pause","cycle","exit","c_null_char","c_alert","c_backspace","c_form_feed","flush","wait","decimal","round","iomsg","synchronous","nopass","non_overridable","pass","protected","volatile","abstract","extends","import","non_intrinsic","value","deferred","generic","final","enumerator","class","associate","bind","enum","c_int","c_short","c_long","c_long_long","c_signed_char","c_size_t","c_int8_t","c_int16_t","c_int32_t","c_int64_t","c_int_least8_t","c_int_least16_t","c_int_least32_t","c_int_least64_t","c_int_fast8_t","c_int_fast16_t","c_int_fast32_t","c_int_fast64_t","c_intmax_t","C_intptr_t","c_float","c_double","c_long_double","c_float_complex","c_double_complex","c_long_double_complex","c_bool","c_char","c_null_ptr","c_null_funptr","c_new_line","c_carriage_return","c_horizontal_tab","c_vertical_tab","iso_c_binding","c_loc","c_funloc","c_associated","c_f_pointer","c_ptr","c_funptr","iso_fortran_env","character_storage_size","error_unit","file_storage_size","input_unit","iostat_end","iostat_eor","numeric_storage_size","output_unit","c_f_procpointer","ieee_arithmetic","ieee_support_underflow_control","ieee_get_underflow_mode","ieee_set_underflow_mode","newunit","contiguous","recursive","pad","position","action","delim","readwrite","eor","advance","nml","interface","procedure","namelist","include","sequence","elemental","pure","impure","integer","real","character","complex","logical","codimension","dimension","allocatable|10","parameter","external","implicit|10","none","double","precision","assign","intent","optional","pointer","target","in","out","common","equivalence","data"],
+literal:[".False.",".True."],
+built_in:["alog","alog10","amax0","amax1","amin0","amin1","amod","cabs","ccos","cexp","clog","csin","csqrt","dabs","dacos","dasin","datan","datan2","dcos","dcosh","ddim","dexp","dint","dlog","dlog10","dmax1","dmin1","dmod","dnint","dsign","dsin","dsinh","dsqrt","dtan","dtanh","float","iabs","idim","idint","idnint","ifix","isign","max0","max1","min0","min1","sngl","algama","cdabs","cdcos","cdexp","cdlog","cdsin","cdsqrt","cqabs","cqcos","cqexp","cqlog","cqsin","cqsqrt","dcmplx","dconjg","derf","derfc","dfloat","dgamma","dimag","dlgama","iqint","qabs","qacos","qasin","qatan","qatan2","qcmplx","qconjg","qcos","qcosh","qdim","qerf","qerfc","qexp","qgamma","qimag","qlgama","qlog","qlog10","qmax1","qmin1","qmod","qnint","qsign","qsin","qsinh","qsqrt","qtan","qtanh","abs","acos","aimag","aint","anint","asin","atan","atan2","char","cmplx","conjg","cos","cosh","exp","ichar","index","int","log","log10","max","min","nint","sign","sin","sinh","sqrt","tan","tanh","print","write","dim","lge","lgt","lle","llt","mod","nullify","allocate","deallocate","adjustl","adjustr","all","allocated","any","associated","bit_size","btest","ceiling","count","cshift","date_and_time","digits","dot_product","eoshift","epsilon","exponent","floor","fraction","huge","iand","ibclr","ibits","ibset","ieor","ior","ishft","ishftc","lbound","len_trim","matmul","maxexponent","maxloc","maxval","merge","minexponent","minloc","minval","modulo","mvbits","nearest","pack","present","product","radix","random_number","random_seed","range","repeat","reshape","rrspacing","scale","scan","selected_int_kind","selected_real_kind","set_exponent","shape","size","spacing","spread","sum","system_clock","tiny","transpose","trim","ubound","unpack","verify","achar","iachar","transfer","dble","entry","dprod","cpu_time","command_argument_count","get_command","get_command_argument","get_environment_variable","is_iostat_end","ieee_arithmetic","ieee_support_underflow_control","ieee_get_underflow_mode","ieee_set_underflow_mode","is_iostat_eor","move_alloc","new_line","selected_char_kind","same_type_as","extends_type_of","acosh","asinh","atanh","bessel_j0","bessel_j1","bessel_jn","bessel_y0","bessel_y1","bessel_yn","erf","erfc","erfc_scaled","gamma","log_gamma","hypot","norm2","atomic_define","atomic_ref","execute_command_line","leadz","trailz","storage_size","merge_bits","bge","bgt","ble","blt","dshiftl","dshiftr","findloc","iall","iany","iparity","image_index","lcobound","ucobound","maskl","maskr","num_images","parity","popcnt","poppar","shifta","shiftl","shiftr","this_image","sync","change","team","co_broadcast","co_max","co_min","co_sum","co_reduce"]
+},illegal:/\/\*/,contains:[{className:"string",relevance:0,
+variants:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},o,{begin:/^C\s*=(?!=)/,
+relevance:0},a,c]}}})();hljs.registerLanguage("fortran",e)})();/*! `go` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a={
+keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],
+type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],
+literal:["true","false","iota","nil"],
+built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]
+};return{name:"Go",aliases:["golang"],keywords:a,illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",
+variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{
+className:"number",variants:[{
+match:/-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/,relevance:0
+},{
+match:/-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/,
+relevance:0},{match:/-?\b0[oO](_?[0-7])*i?/,relevance:0},{
+match:/-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/,relevance:0},{
+match:/-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/,relevance:0}]},{
+begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",
+excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,
+endsParent:!0,keywords:a,illegal:/["']/}]}]}}})();hljs.registerLanguage("go",e)
+})();/*! `gradle` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>({name:"Gradle",case_insensitive:!0,
+keywords:["task","project","allprojects","subprojects","artifacts","buildscript","configurations","dependencies","repositories","sourceSets","description","delete","from","into","include","exclude","source","classpath","destinationDir","includes","options","sourceCompatibility","targetCompatibility","group","flatDir","doLast","doFirst","flatten","todir","fromdir","ant","def","abstract","break","case","catch","continue","default","do","else","extends","final","finally","for","if","implements","instanceof","native","new","private","protected","public","return","static","switch","synchronized","throw","throws","transient","try","volatile","while","strictfp","package","import","false","null","super","this","true","antlrtask","checkstyle","codenarc","copy","boolean","byte","char","class","double","float","int","interface","long","short","void","compile","runTime","file","fileTree","abs","any","append","asList","asWritable","call","collect","compareTo","count","div","dump","each","eachByte","eachFile","eachLine","every","find","findAll","flatten","getAt","getErr","getIn","getOut","getText","grep","immutable","inject","inspect","intersect","invokeMethods","isCase","join","leftShift","minus","multiply","newInputStream","newOutputStream","newPrintWriter","newReader","newWriter","next","plus","pop","power","previous","print","println","push","putAt","read","readBytes","readLines","reverse","reverseEach","round","size","sort","splitEachLine","step","subMap","times","toInteger","toList","tokenize","upto","waitForOrKill","withPrintWriter","withReader","withStream","withWriter","withWriterAppend","write","writeLine"],
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,e.REGEXP_MODE]
+})})();hljs.registerLanguage("gradle",e)})();/*! `http` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n="HTTP/([32]|1\\.[01])",a={
+className:"attribute",
+begin:e.regex.concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{
+contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",
+relevance:0}}]}},s=[a,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}
+}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{
+begin:"^(?="+n+" \\d{3})",end:/$/,contains:[{className:"meta",begin:n},{
+className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,
+contains:s}},{begin:"(?=^[A-Z]+ (.*?) "+n+"$)",end:/$/,contains:[{
+className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{
+className:"meta",begin:n},{className:"keyword",begin:"[A-Z]+"}],starts:{
+end:/\b\B/,illegal:/\S/,contains:s}},e.inherit(a,{relevance:0})]}}})()
+;hljs.registerLanguage("http",e)})();/*! `java` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;var e="[0-9](_*[0-9])*",a=`\\.(${e})`,n="[0-9a-fA-F](_*[0-9a-fA-F])*",s={
+className:"number",variants:[{
+begin:`(\\b(${e})((${a})|\\.)?|(${a}))[eE][+-]?(${e})[fFdD]?\\b`},{
+begin:`\\b(${e})((${a})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${a})[fFdD]?\\b`
+},{begin:`\\b(${e})[fFdD]\\b`},{
+begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?(${e})[fFdD]?\\b`},{
+begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{
+begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],
+relevance:0};function t(e,a,n){return-1===n?"":e.replace(a,(s=>t(e,a,n-1)))}
+return e=>{
+const a=e.regex,n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",i=n+t("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),r={
+keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"],
+literal:["false","true","null"],
+type:["char","boolean","long","float","int","byte","short","double"],
+built_in:["super","this"]},l={className:"meta",begin:"@"+n,contains:[{
+begin:/\(/,end:/\)/,contains:["self"]}]},c={className:"params",begin:/\(/,
+end:/\)/,keywords:r,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0}
+;return{name:"Java",aliases:["jsp"],keywords:r,illegal:/<\/|#/,
+contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,
+relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{
+begin:/import java\.[a-z]+\./,keywords:"import",relevance:2
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,
+className:"string",contains:[e.BACKSLASH_ESCAPE]
+},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{
+match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{
+1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{
+begin:[a.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",
+3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",
+3:"title.class"},contains:[c,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{
+beginKeywords:"new throw return else",relevance:0},{
+begin:["(?:"+i+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{
+2:"title.function"},keywords:r,contains:[{className:"params",begin:/\(/,
+end:/\)/,keywords:r,relevance:0,
+contains:[l,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},s,l]}}})()
+;hljs.registerLanguage("java",e)})();/*! `javascript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s)
+;return o=>{const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const a=e[0].length+e.index,t=e.input[a]
+;if("<"===t||","===t)return void n.ignoreMatch();let s
+;">"===t&&(((e,{after:n})=>{const a="</"+e[0].slice(1)
+;return-1!==e.input.indexOf(a,n)})(e,{after:a})||n.ignoreMatch())
+;const r=e.input.substring(a)
+;((s=r.match(/^\s*=/))||(s=r.match(/^\s+extends\s+/))&&0===s.index)&&n.ignoreMatch()
+}},g={$pattern:e,keyword:n,literal:a,built_in:i,"variable.language":c
+},u="[0-9](_?[0-9])*",m=`\\.(${u})`,E="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",A={
+className:"number",variants:[{
+begin:`(\\b(${E})((${m})|\\.)?|(${m}))[eE][+-]?(${u})\\b`},{
+begin:`\\b(${E})\\b((${m})\\b|\\.)?|(${m})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},y={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:g,contains:[]},h={begin:".?html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"xml"}},_={
+begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"css"}},N={begin:".?gql`",end:"",
+starts:{end:"`",returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],
+subLanguage:"graphql"}},f={className:"string",begin:"`",end:"`",
+contains:[o.BACKSLASH_ESCAPE,y]},p={className:"comment",
+variants:[o.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
+excludeBegin:!0,relevance:0},{className:"variable",begin:d+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),o.C_BLOCK_COMMENT_MODE,o.C_LINE_COMMENT_MODE]
+},v=[o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,{match:/\$\d+/},A]
+;y.contains=v.concat({begin:/\{/,end:/\}/,keywords:g,contains:["self"].concat(v)
+});const S=[].concat(p,y.contains),w=S.concat([{begin:/(\s*)\(/,end:/\)/,
+keywords:g,contains:["self"].concat(S)}]),R={className:"params",begin:/(\s*)\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w},O={variants:[{
+match:[/class/,/\s+/,d,/\s+/,/extends/,/\s+/,l.concat(d,"(",l.concat(/\./,d),")*")],
+scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
+match:[/class/,/\s+/,d],scope:{1:"keyword",3:"title.class"}}]},k={relevance:0,
+match:l.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
+className:"title.class",keywords:{_:[...t,...s]}},I={variants:[{
+match:[/function/,/\s+/,d,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
+className:{1:"keyword",3:"title.function"},label:"func.def",contains:[R],
+illegal:/%/},x={
+match:l.concat(/\b/,(T=[...r,"super","import"].map((e=>e+"\\s*\\(")),
+l.concat("(?!",T.join("|"),")")),d,l.lookahead(/\s*\(/)),
+className:"title.function",relevance:0};var T;const C={
+begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d,
+excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={
+match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"},
+contains:[{begin:/\(\)/},R]
+},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={
+match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)],
+keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]}
+;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{
+PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/,
+contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{
+label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,p,{match:/\$\d+/},A,k,{
+scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{
+begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",relevance:0,contains:[p,o.REGEXP_MODE,{
+className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{
+className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{
+className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0
+},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:"</>"},{
+match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin,
+"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{
+begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},I,{
+beginKeywords:"while if switch catch for"},{
+begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d,
+className:"title.function"})]},{match:/\.\.\./,relevance:0},C,{match:"\\$"+d,
+relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
+contains:[R]},x,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
+className:"variable.constant"},O,M,{match:/\$[(.]/}]}}})()
+;hljs.registerLanguage("javascript",e)})();/*! `json` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=["true","false","null"],s={
+scope:"literal",beginKeywords:a.join(" ")};return{name:"JSON",aliases:["jsonc"],
+keywords:{literal:a},contains:[{className:"attr",
+begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,
+className:"punctuation",relevance:0
+},e.QUOTE_STRING_MODE,s,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],
+illegal:"\\S"}}})();hljs.registerLanguage("json",e)})();/*! `latex` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=[{begin:/\^{6}[0-9a-f]{6}/},{
+begin:/\^{5}[0-9a-f]{5}/},{begin:/\^{4}[0-9a-f]{4}/},{begin:/\^{3}[0-9a-f]{3}/
+},{begin:/\^{2}[0-9a-f]{2}/},{begin:/\^{2}[\u0000-\u007f]/}],a=[{
+className:"keyword",begin:/\\/,relevance:0,contains:[{endsParent:!0,
+begin:e.regex.either(...["(?:NeedsTeXFormat|RequirePackage|GetIdInfo)","Provides(?:Expl)?(?:Package|Class|File)","(?:DeclareOption|ProcessOptions)","(?:documentclass|usepackage|input|include)","makeat(?:letter|other)","ExplSyntax(?:On|Off)","(?:new|renew|provide)?command","(?:re)newenvironment","(?:New|Renew|Provide|Declare)(?:Expandable)?DocumentCommand","(?:New|Renew|Provide|Declare)DocumentEnvironment","(?:(?:e|g|x)?def|let)","(?:begin|end)","(?:part|chapter|(?:sub){0,2}section|(?:sub)?paragraph)","caption","(?:label|(?:eq|page|name)?ref|(?:paren|foot|super)?cite)","(?:alpha|beta|[Gg]amma|[Dd]elta|(?:var)?epsilon|zeta|eta|[Tt]heta|vartheta)","(?:iota|(?:var)?kappa|[Ll]ambda|mu|nu|[Xx]i|[Pp]i|varpi|(?:var)rho)","(?:[Ss]igma|varsigma|tau|[Uu]psilon|[Pp]hi|varphi|chi|[Pp]si|[Oo]mega)","(?:frac|sum|prod|lim|infty|times|sqrt|leq|geq|left|right|middle|[bB]igg?)","(?:[lr]angle|q?quad|[lcvdi]?dots|d?dot|hat|tilde|bar)"].map((e=>e+"(?![a-zA-Z@:_])")))
+},{endsParent:!0,
+begin:RegExp(["(?:__)?[a-zA-Z]{2,}_[a-zA-Z](?:_?[a-zA-Z])+:[a-zA-Z]*","[lgc]__?[a-zA-Z](?:_?[a-zA-Z])*_[a-zA-Z]{2,}","[qs]__?[a-zA-Z](?:_?[a-zA-Z])+","use(?:_i)?:[a-zA-Z]*","(?:else|fi|or):","(?:if|cs|exp):w","(?:hbox|vbox):n","::[a-zA-Z]_unbraced","::[a-zA-Z:]"].map((e=>e+"(?![a-zA-Z:_])")).join("|"))
+},{endsParent:!0,variants:n},{endsParent:!0,relevance:0,variants:[{
+begin:/[a-zA-Z@]+/},{begin:/[^a-zA-Z@]?/}]}]},{className:"params",relevance:0,
+begin:/#+\d?/},{variants:n},{className:"built_in",relevance:0,begin:/[$&^_]/},{
+className:"meta",begin:/% ?!(T[eE]X|tex|BIB|bib)/,end:"$",relevance:10
+},e.COMMENT("%","$",{relevance:0})],i={begin:/\{/,end:/\}/,relevance:0,
+contains:["self",...a]},t=e.inherit(i,{relevance:0,endsParent:!0,
+contains:[i,...a]}),r={begin:/\[/,end:/\]/,endsParent:!0,relevance:0,
+contains:[i,...a]},s={begin:/\s+/,relevance:0},c=[t],l=[r],o=(e,n)=>({
+contains:[s],starts:{relevance:0,contains:e,starts:n}}),d=(e,n)=>({
+begin:"\\\\"+e+"(?![a-zA-Z@:_])",keywords:{$pattern:/\\[a-zA-Z]+/,keyword:"\\"+e
+},relevance:0,contains:[s],starts:n}),g=(n,a)=>e.inherit({
+begin:"\\\\begin(?=[ \t]*(\\r?\\n[ \t]*)?\\{"+n+"\\})",keywords:{
+$pattern:/\\[a-zA-Z]+/,keyword:"\\begin"},relevance:0
+},o(c,a)),m=(n="string")=>e.END_SAME_AS_BEGIN({className:n,begin:/(.|\r?\n)/,
+end:/(.|\r?\n)/,excludeBegin:!0,excludeEnd:!0,endsParent:!0}),b=e=>({
+className:"string",end:"(?=\\\\end\\{"+e+"\\})"}),p=(e="string")=>({relevance:0,
+begin:/\{/,starts:{endsParent:!0,contains:[{className:e,end:/(?=\})/,
+endsParent:!0,contains:[{begin:/\{/,end:/\}/,relevance:0,contains:["self"]}]}]}
+});return{name:"LaTeX",aliases:["tex"],
+contains:[...["verb","lstinline"].map((e=>d(e,{contains:[m()]}))),d("mint",o(c,{
+contains:[m()]})),d("mintinline",o(c,{contains:[p(),m()]})),d("url",{
+contains:[p("link"),p("link")]}),d("hyperref",{contains:[p("link")]
+}),d("href",o(l,{contains:[p("link")]
+})),...[].concat(...["","\\*"].map((e=>[g("verbatim"+e,b("verbatim"+e)),g("filecontents"+e,o(c,b("filecontents"+e))),...["","B","L"].map((n=>g(n+"Verbatim"+e,o(l,b(n+"Verbatim"+e)))))]))),g("minted",o(l,o(c,b("minted")))),...a]
+}}})();hljs.registerLanguage("latex",e)})();/*! `lisp` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n="[a-zA-Z_\\-+\\*\\/<=>&#][a-zA-Z0-9_\\-+*\\/<=>&#!]*",a="\\|[^]*?\\|",i="(-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|-)?\\d+)?",s={
+className:"literal",begin:"\\b(t{1}|nil)\\b"},l={className:"number",variants:[{
+begin:i,relevance:0},{begin:"#(b|B)[0-1]+(/[0-1]+)?"},{
+begin:"#(o|O)[0-7]+(/[0-7]+)?"},{begin:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{
+begin:"#(c|C)\\("+i+" +"+i,end:"\\)"}]},b=e.inherit(e.QUOTE_STRING_MODE,{
+illegal:null}),g=e.COMMENT(";","$",{relevance:0}),r={begin:"\\*",end:"\\*"},t={
+className:"symbol",begin:"[:&]"+n},c={begin:n,relevance:0},d={begin:a},o={
+contains:[l,b,r,t,{begin:"\\(",end:"\\)",contains:["self",s,b,l,c]},c],
+variants:[{begin:"['`]\\(",end:"\\)"},{begin:"\\(quote ",end:"\\)",keywords:{
+name:"quote"}},{begin:"'"+a}]},v={variants:[{begin:"'"+n},{
+begin:"#'"+n+"(::"+n+")*"}]},m={begin:"\\(\\s*",end:"\\)"},u={endsWithParent:!0,
+relevance:0};return m.contains=[{className:"name",variants:[{begin:n,relevance:0
+},{begin:a}]},u],u.contains=[o,v,m,s,l,b,g,r,t,d,c],{name:"Lisp",illegal:/\S/,
+contains:[l,e.SHEBANG(),s,b,g,o,v,m,c]}}})();hljs.registerLanguage("lisp",e)
+})();/*! `makefile` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const i={className:"variable",
+variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",
+contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},a={className:"string",
+begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},n={className:"variable",
+begin:/\$\([\w-]+\s/,end:/\)/,keywords:{
+built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"
+},contains:[i,a]},s={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},r={
+className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{
+name:"Makefile",aliases:["mk","mak","make"],keywords:{$pattern:/[\w-]+/,
+keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"
+},contains:[e.HASH_COMMENT_MODE,i,a,n,s,{className:"meta",begin:/^\.PHONY:/,
+end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},r]}}})()
+;hljs.registerLanguage("makefile",e)})();/*! `markdown` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/,
+end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/,
+relevance:0},{
+begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,
+relevance:2},{
+begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),
+relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{
+begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/
+},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,
+returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",
+excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",
+end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[],
+variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]
+},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{
+begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[]
+}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c)
+;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g)
+})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{
+className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{
+begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",
+contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",
+end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g,
+end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{
+begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{
+begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",
+contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{
+begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{
+className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{
+className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal",
+match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}})()
+;hljs.registerLanguage("markdown",e)})();/*! `nestedtext` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var t=(()=>{"use strict";return t=>({name:"Nested Text",aliases:["nt"],
+contains:[t.inherit(t.HASH_COMMENT_MODE,{begin:/^\s*(?=#)/,excludeBegin:!0}),{
+variants:[{match:[/^\s*/,/-/,/[ ]/,/.*$/]},{match:[/^\s*/,/-$/]}],className:{
+2:"bullet",4:"string"}},{match:[/^\s*/,/>/,/[ ]/,/.*$/],className:{
+2:"punctuation",4:"string"}},{match:[/^\s*(?=\S)/,/[^:]+/,/:\s*/,/$/],
+className:{2:"attribute",3:"punctuation"}},{
+match:[/^\s*(?=\S)/,/[^:]*[^: ]/,/[ ]*:/,/[ ]/,/.*$/],className:{2:"attribute",
+3:"punctuation",5:"string"}}]})})();hljs.registerLanguage("nestedtext",t)})();/*! `nginx` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a={
+className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{\w+\}/},{
+begin:n.concat(/[$@]/,e.UNDERSCORE_IDENT_RE)}]},s={endsWithParent:!0,keywords:{
+$pattern:/[a-z_]{2,}|\/dev\/poll/,
+literal:["on","off","yes","no","true","false","none","blocked","debug","info","notice","warn","error","crit","select","break","last","permanent","redirect","kqueue","rtsig","epoll","poll","/dev/poll"]
+},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",
+contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/
+}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[a]
+},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:"\\s\\^",
+end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{
+begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",
+begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{
+className:"number",begin:"\\b\\d+[kKmMgGdshdwy]?\\b",relevance:0},a]};return{
+name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{
+beginKeywords:"upstream location",end:/;|\{/,contains:s.contains,keywords:{
+section:"upstream location"}},{className:"section",
+begin:n.concat(e.UNDERSCORE_IDENT_RE+n.lookahead(/\s+\{/)),relevance:0},{
+begin:n.lookahead(e.UNDERSCORE_IDENT_RE+"\\s"),end:";|\\{",contains:[{
+className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:s}],relevance:0}],
+illegal:"[^\\s\\}\\{]"}}})();hljs.registerLanguage("nginx",e)})();/*! `plaintext` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text",
+aliases:["text","txt"],disableAutodetect:!0})})()
+;hljs.registerLanguage("plaintext",t)})();/*! `powershell` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n={$pattern:/-?[A-z\.\-]+\b/,
+keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",
+built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"
+},s={begin:"`[\\s\\S]",relevance:0},i={className:"variable",variants:[{
+begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]
+},a={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],
+contains:[s,i,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},t={
+className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]
+},r=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,
+end:/#>/}],contains:[{className:"doctag",variants:[{
+begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/
+},{
+begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/
+}]}]}),c={className:"class",beginKeywords:"class enum",end:/\s*[{]/,
+excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},l={className:"function",
+begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,
+contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",
+begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,
+className:"params",relevance:0,contains:[i]}]},o={begin:/using\s/,end:/$/,
+returnBegin:!0,contains:[a,t,{className:"keyword",
+begin:/(using|assembly|command|module|namespace|type)/}]},p={
+className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,
+relevance:0,contains:[{className:"keyword",
+begin:"(".concat(n.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,
+relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]
+},g=[p,r,s,e.NUMBER_MODE,a,t,{className:"built_in",variants:[{
+begin:"(Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where)+(-)[\\w\\d]+"
+}]},i,{className:"literal",begin:/\$(null|true|false)\b/},{
+className:"selector-tag",begin:/@\B/,relevance:0}],m={begin:/\[/,end:/\]/,
+excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",g,{
+begin:"(string|char|byte|int|long|bool|decimal|single|double|DateTime|xml|array|hashtable|void)",
+className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,
+relevance:0})};return p.contains.unshift(m),{name:"PowerShell",
+aliases:["pwsh","ps","ps1"],case_insensitive:!0,keywords:n,
+contains:g.concat(c,l,o,{variants:[{className:"operator",
+begin:"(-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor)\\b"
+},{className:"literal",begin:/(-){1,2}[\w\d-]+/,relevance:0}]},m)}}})()
+;hljs.registerLanguage("powershell",e)})();/*! `prolog` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var n=(()=>{"use strict";return n=>{const e={begin:/\(/,end:/\)/,
+relevance:0},a={begin:/\[/,end:/\]/},s={className:"comment",begin:/%/,end:/$/,
+contains:[n.PHRASAL_WORDS_MODE]},i={className:"string",begin:/`/,end:/`/,
+contains:[n.BACKSLASH_ESCAPE]},g=[{begin:/[a-z][A-Za-z0-9_]*/,relevance:0},{
+className:"symbol",variants:[{begin:/[A-Z][a-zA-Z0-9_]*/},{
+begin:/_[A-Za-z0-9_]*/}],relevance:0},e,{begin:/:-/
+},a,s,n.C_BLOCK_COMMENT_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,i,{
+className:"string",begin:/0'(\\'|.)/},{className:"string",begin:/0'\\s/
+},n.C_NUMBER_MODE];return e.contains=g,a.contains=g,{name:"Prolog",
+contains:g.concat([{begin:/\.$/}])}}})();hljs.registerLanguage("prolog",n)})();/*! `python` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={
+$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s,
+built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],
+literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],
+type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]
+},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/,
+end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={
+className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,
+end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/,
+relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{
+begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,
+end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,
+contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]
+},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),g={
+className:"number",relevance:0,variants:[{
+begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{
+begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{
+begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})`
+},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})`
+}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t,
+contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={
+className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,
+contains:["self",i,g,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,g,i],{
+name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t,
+illegal:/(<\/|\?)|=>/,contains:[i,g,{scope:"variable.language",match:/\bself\b/
+},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"
+},o,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword",
+3:"title.function"},contains:[m]},{variants:[{
+match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}],
+scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{
+className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,o]}]}}})()
+;hljs.registerLanguage("python",e)})();/*! `rust` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const t=e.regex,n=/(r#)?/,a=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),s={
+className:"title.function.invoke",relevance:0,
+begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,t.lookahead(/\s*\(/))
+},r="([ui](8|16|32|64|128|size)|f(32|64))?",l=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],o=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"]
+;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:o,
+keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],
+literal:["true","false","Some","None","Ok","Err"],built_in:l},illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]
+}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{
+className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*(?!')/},{scope:"string",
+variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'/,end:/'/,contains:[{
+scope:"char.escape",match:/\\('|\w|x\w{2}|u\w{4}|U\w{8})/}]}]},{
+className:"number",variants:[{begin:"\\b0b([01_]+)"+r},{begin:"\\b0o([0-7_]+)"+r
+},{begin:"\\b0x([A-Fa-f0-9_]+)"+r},{
+begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+r}],relevance:0},{
+begin:[/fn/,/\s+/,a],className:{1:"keyword",3:"title.function"}},{
+className:"meta",begin:"#!?\\[",end:"\\]",contains:[{className:"string",
+begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{
+begin:[/let/,/\s+/,/(?:mut\s+)?/,a],className:{1:"keyword",3:"keyword",
+4:"variable"}},{begin:[/for/,/\s+/,a,/\s+/,/in/],className:{1:"keyword",
+3:"variable",5:"keyword"}},{begin:[/type/,/\s+/,a],className:{1:"keyword",
+3:"title.class"}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,a],
+className:{1:"keyword",3:"title.class"}},{begin:e.IDENT_RE+"::",keywords:{
+keyword:"Self",built_in:l,type:o}},{className:"punctuation",begin:"->"},s]}}})()
+;hljs.registerLanguage("rust",e)})();/*! `shell` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var s=(()=>{"use strict";return s=>({name:"Shell Session",
+aliases:["console","shellsession"],contains:[{className:"meta.prompt",
+begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,
+subLanguage:"bash"}}]})})();hljs.registerLanguage("shell",s)})();/*! `sql` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const r=e.regex,t=e.COMMENT("--","$"),a=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],n=a,s=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!a.includes(e))),i={
+match:r.concat(/\b/,r.either(...n),/\s*\(/),relevance:0,keywords:{built_in:n}}
+;function o(e){
+return r.concat(/\b/,r.either(...e.map((e=>e.replace(/\s+/,"\\s+")))),/\b/)}
+const c={scope:"keyword",
+match:o(["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"]),
+relevance:0};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{
+$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const a=t
+;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:a(e)?e+"|0":e))
+})(s,{when:e=>e.length<3}),literal:["true","false","unknown"],
+type:["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],
+built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]
+},contains:[{scope:"type",
+match:o(["double precision","large object","with timezone","without timezone"])
+},c,i,{scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},{scope:"string",variants:[{
+begin:/'/,end:/'/,contains:[{match:/''/}]}]},{begin:/"/,end:/"/,contains:[{
+match:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{scope:"operator",
+match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()
+;hljs.registerLanguage("sql",e)})();/*! `typescript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],c=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],r=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(c,t,s)
+;function o(o){const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const a=e[0].length+e.index,t=e.input[a]
+;if("<"===t||","===t)return void n.ignoreMatch();let s
+;">"===t&&(((e,{after:n})=>{const a="</"+e[0].slice(1)
+;return-1!==e.input.indexOf(a,n)})(e,{after:a})||n.ignoreMatch())
+;const c=e.input.substring(a)
+;((s=c.match(/^\s*=/))||(s=c.match(/^\s+extends\s+/))&&0===s.index)&&n.ignoreMatch()
+}},g={$pattern:e,keyword:n,literal:a,built_in:i,"variable.language":r
+},u="[0-9](_?[0-9])*",m=`\\.(${u})`,E="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",A={
+className:"number",variants:[{
+begin:`(\\b(${E})((${m})|\\.)?|(${m}))[eE][+-]?(${u})\\b`},{
+begin:`\\b(${E})\\b((${m})\\b|\\.)?|(${m})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},y={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:g,contains:[]},p={begin:".?html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"xml"}},N={
+begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"css"}},f={begin:".?gql`",end:"",
+starts:{end:"`",returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],
+subLanguage:"graphql"}},_={className:"string",begin:"`",end:"`",
+contains:[o.BACKSLASH_ESCAPE,y]},h={className:"comment",
+variants:[o.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
+excludeBegin:!0,relevance:0},{className:"variable",begin:d+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),o.C_BLOCK_COMMENT_MODE,o.C_LINE_COMMENT_MODE]
+},S=[o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,N,f,_,{match:/\$\d+/},A]
+;y.contains=S.concat({begin:/\{/,end:/\}/,keywords:g,contains:["self"].concat(S)
+});const v=[].concat(h,y.contains),w=v.concat([{begin:/(\s*)\(/,end:/\)/,
+keywords:g,contains:["self"].concat(v)}]),R={className:"params",begin:/(\s*)\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w},k={variants:[{
+match:[/class/,/\s+/,d,/\s+/,/extends/,/\s+/,l.concat(d,"(",l.concat(/\./,d),")*")],
+scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
+match:[/class/,/\s+/,d],scope:{1:"keyword",3:"title.class"}}]},x={relevance:0,
+match:l.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
+className:"title.class",keywords:{_:[...t,...s]}},O={variants:[{
+match:[/function/,/\s+/,d,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
+className:{1:"keyword",3:"title.function"},label:"func.def",contains:[R],
+illegal:/%/},I={
+match:l.concat(/\b/,(C=[...c,"super","import"].map((e=>e+"\\s*\\(")),
+l.concat("(?!",C.join("|"),")")),d,l.lookahead(/\s*\(/)),
+className:"title.function",relevance:0};var C;const T={
+begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d,
+excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={
+match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"},
+contains:[{begin:/\(\)/},R]
+},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={
+match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)],
+keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]}
+;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{
+PARAMS_CONTAINS:w,CLASS_REFERENCE:x},illegal:/#(?![$_A-z])/,
+contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{
+label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,N,f,_,h,{match:/\$\d+/},A,x,{
+scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{
+begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",relevance:0,contains:[h,o.REGEXP_MODE,{
+className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{
+className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{
+className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0
+},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:"</>"},{
+match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin,
+"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{
+begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},O,{
+beginKeywords:"while if switch catch for"},{
+begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d,
+className:"title.function"})]},{match:/\.\.\./,relevance:0},T,{match:"\\$"+d,
+relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
+contains:[R]},I,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
+className:"variable.constant"},k,M,{match:/\$[(.]/}]}}return t=>{
+const s=t.regex,c=o(t),l=e,d=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],b={
+begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}
+},g={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{
+keyword:"interface extends",built_in:d},contains:[c.exports.CLASS_REFERENCE]
+},u={$pattern:e,
+keyword:n.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]),
+literal:a,built_in:i.concat(d),"variable.language":r},m={className:"meta",
+begin:"@"+l},E=(e,n,a)=>{const t=e.contains.findIndex((e=>e.label===n))
+;if(-1===t)throw Error("can not find mode to replace");e.contains.splice(t,1,a)}
+;Object.assign(c.keywords,u),c.exports.PARAMS_CONTAINS.push(m)
+;const A=c.contains.find((e=>"attr"===e.scope)),y=Object.assign({},A,{
+match:s.concat(l,s.lookahead(/\s*\?:/))})
+;return c.exports.PARAMS_CONTAINS.push([c.exports.CLASS_REFERENCE,A,y]),
+c.contains=c.contains.concat([m,b,g,y]),
+E(c,"shebang",t.SHEBANG()),E(c,"use_strict",{className:"meta",relevance:10,
+begin:/^\s*['"]use strict['"]/
+}),c.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(c,{
+name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),c}})()
+;hljs.registerLanguage("typescript",e)})();/*! `yaml` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={
+className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],
+contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{
+begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{variants:[{
+begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{
+begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,
+relevance:0},t={begin:/\{/,end:/\}/,contains:[l],illegal:"\\n",relevance:0},c={
+begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},r=[{
+className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{
+begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{
+begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",
+begin:"^---\\s*$",relevance:10},{className:"string",
+begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{
+begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,
+relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",
+begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a
+},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",
+begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",
+relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{
+className:"number",
+begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"
+},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,c,{
+className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,
+scope:"char.escape",relevance:0}]},s],g=[...r]
+;return g.pop(),g.push(i),l.contains=g,{name:"YAML",case_insensitive:!0,
+aliases:["yml"],contains:r}}})();hljs.registerLanguage("yaml",e)})(); \ No newline at end of file
diff --git a/htroot/js/index.umd.min.js b/htroot/js/index.umd.min.js
new file mode 100644
index 000000000..8955eeb8e
--- /dev/null
+++ b/htroot/js/index.umd.min.js
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).markedHighlight={})}(this,function(e){"use strict";function r(e){return(e||"").match(/\S*/)[0]}function n(t){return e=>{"string"==typeof e&&e!==t.text&&(t.escaped=!0,t.text=e)}}const i=/[&<>"']/,o=new RegExp(i.source,"g"),s=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,g=new RegExp(s.source,"g"),t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},a=e=>t[e];function f(e,t){if(t){if(i.test(e))return e.replace(o,a)}else if(s.test(e))return e.replace(g,a);return e}e.markedHighlight=function(i){if((i="function"==typeof i?{highlight:i}:i)&&"function"==typeof i.highlight)return"string"!=typeof i.langPrefix&&(i.langPrefix="language-"),"string"!=typeof i.emptyLangClass&&(i.emptyLangClass=""),{async:!!i.async,walkTokens(e){if("code"===e.type){var t=r(e.lang);if(i.async)return Promise.resolve(i.highlight(e.text,t,e.lang||"")).then(n(e));t=i.highlight(e.text,t,e.lang||"");if(t instanceof Promise)throw new Error("markedHighlight is not set to async but the highlight function is async. Set the async option to true on markedHighlight to await the async highlight function.");n(e)(t)}},useNewRenderer:!0,renderer:{code(e,t,n){"object"==typeof e&&(n=e.escaped,t=e.lang,e=e.text);t=r(t),t=t?i.langPrefix+f(t):i.emptyLangClass,t=t?` class="${t}"`:"";return e=e.replace(/\n$/,""),`<pre><code${t}>${n?e:f(e,!0)}
+</code></pre>`}}};throw new Error("Must provide highlight function")}}); \ No newline at end of file
diff --git a/htroot/js/languages/actionscript.js b/htroot/js/languages/actionscript.js
new file mode 100644
index 000000000..6588cd93c
--- /dev/null
+++ b/htroot/js/languages/actionscript.js
@@ -0,0 +1,163 @@
+/*! `actionscript` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: ActionScript
+ Author: Alexander Myadzel <myadzel@gmail.com>
+ Category: scripting
+ Audit: 2020
+ */
+
+ /** @type LanguageFn */
+ function actionscript(hljs) {
+ const regex = hljs.regex;
+ const IDENT_RE = /[a-zA-Z_$][a-zA-Z0-9_$]*/;
+ const PKG_NAME_RE = regex.concat(
+ IDENT_RE,
+ regex.concat("(\\.", IDENT_RE, ")*")
+ );
+ const IDENT_FUNC_RETURN_TYPE_RE = /([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/;
+
+ const AS3_REST_ARG_MODE = {
+ className: 'rest_arg',
+ begin: /[.]{3}/,
+ end: IDENT_RE,
+ relevance: 10
+ };
+
+ const KEYWORDS = [
+ "as",
+ "break",
+ "case",
+ "catch",
+ "class",
+ "const",
+ "continue",
+ "default",
+ "delete",
+ "do",
+ "dynamic",
+ "each",
+ "else",
+ "extends",
+ "final",
+ "finally",
+ "for",
+ "function",
+ "get",
+ "if",
+ "implements",
+ "import",
+ "in",
+ "include",
+ "instanceof",
+ "interface",
+ "internal",
+ "is",
+ "namespace",
+ "native",
+ "new",
+ "override",
+ "package",
+ "private",
+ "protected",
+ "public",
+ "return",
+ "set",
+ "static",
+ "super",
+ "switch",
+ "this",
+ "throw",
+ "try",
+ "typeof",
+ "use",
+ "var",
+ "void",
+ "while",
+ "with"
+ ];
+ const LITERALS = [
+ "true",
+ "false",
+ "null",
+ "undefined"
+ ];
+
+ return {
+ name: 'ActionScript',
+ aliases: [ 'as' ],
+ keywords: {
+ keyword: KEYWORDS,
+ literal: LITERALS
+ },
+ contains: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_NUMBER_MODE,
+ {
+ match: [
+ /\bpackage/,
+ /\s+/,
+ PKG_NAME_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+ {
+ match: [
+ /\b(?:class|interface|extends|implements)/,
+ /\s+/,
+ IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+ {
+ className: 'meta',
+ beginKeywords: 'import include',
+ end: /;/,
+ keywords: { keyword: 'import include' }
+ },
+ {
+ beginKeywords: 'function',
+ end: /[{;]/,
+ excludeEnd: true,
+ illegal: /\S/,
+ contains: [
+ hljs.inherit(hljs.TITLE_MODE, { className: "title.function" }),
+ {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ contains: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ AS3_REST_ARG_MODE
+ ]
+ },
+ { begin: regex.concat(/:\s*/, IDENT_FUNC_RETURN_TYPE_RE) }
+ ]
+ },
+ hljs.METHOD_GUARD
+ ],
+ illegal: /#/
+ };
+ }
+
+ return actionscript;
+
+})();
+
+ hljs.registerLanguage('actionscript', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/actionscript.min.js b/htroot/js/languages/actionscript.min.js
new file mode 100644
index 000000000..a8451e891
--- /dev/null
+++ b/htroot/js/languages/actionscript.min.js
@@ -0,0 +1,17 @@
+/*! `actionscript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const a=e.regex,t=/[a-zA-Z_$][a-zA-Z0-9_$]*/,n=a.concat(t,a.concat("(\\.",t,")*")),s={
+className:"rest_arg",begin:/[.]{3}/,end:t,relevance:10};return{
+name:"ActionScript",aliases:["as"],keywords:{
+keyword:["as","break","case","catch","class","const","continue","default","delete","do","dynamic","each","else","extends","final","finally","for","function","get","if","implements","import","in","include","instanceof","interface","internal","is","namespace","native","new","override","package","private","protected","public","return","set","static","super","switch","this","throw","try","typeof","use","var","void","while","with"],
+literal:["true","false","null","undefined"]},
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,{
+match:[/\bpackage/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{
+match:[/\b(?:class|interface|extends|implements)/,/\s+/,t],className:{
+1:"keyword",3:"title.class"}},{className:"meta",beginKeywords:"import include",
+end:/;/,keywords:{keyword:"import include"}},{beginKeywords:"function",
+end:/[{;]/,excludeEnd:!0,illegal:/\S/,contains:[e.inherit(e.TITLE_MODE,{
+className:"title.function"}),{className:"params",begin:/\(/,end:/\)/,
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]
+},{begin:a.concat(/:\s*/,/([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/)}]},e.METHOD_GUARD],
+illegal:/#/}}})();hljs.registerLanguage("actionscript",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/asciidoc.js b/htroot/js/languages/asciidoc.js
new file mode 100644
index 000000000..8de0a89f9
--- /dev/null
+++ b/htroot/js/languages/asciidoc.js
@@ -0,0 +1,271 @@
+/*! `asciidoc` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: AsciiDoc
+ Requires: xml.js
+ Author: Dan Allen <dan.j.allen@gmail.com>
+ Website: http://asciidoc.org
+ Description: A semantic, text-based document format that can be exported to HTML, DocBook and other backends.
+ Category: markup
+ */
+
+ /** @type LanguageFn */
+ function asciidoc(hljs) {
+ const regex = hljs.regex;
+ const HORIZONTAL_RULE = {
+ begin: '^\'{3,}[ \\t]*$',
+ relevance: 10
+ };
+ const ESCAPED_FORMATTING = [
+ // escaped constrained formatting marks (i.e., \* \_ or \`)
+ { begin: /\\[*_`]/ },
+ // escaped unconstrained formatting marks (i.e., \\** \\__ or \\``)
+ // must ignore until the next formatting marks
+ // this rule might not be 100% compliant with Asciidoctor 2.0 but we are entering undefined behavior territory...
+ { begin: /\\\\\*{2}[^\n]*?\*{2}/ },
+ { begin: /\\\\_{2}[^\n]*_{2}/ },
+ { begin: /\\\\`{2}[^\n]*`{2}/ },
+ // guard: constrained formatting mark may not be preceded by ":", ";" or
+ // "}". match these so the constrained rule doesn't see them
+ { begin: /[:;}][*_`](?![*_`])/ }
+ ];
+ const STRONG = [
+ // inline unconstrained strong (single line)
+ {
+ className: 'strong',
+ begin: /\*{2}([^\n]+?)\*{2}/
+ },
+ // inline unconstrained strong (multi-line)
+ {
+ className: 'strong',
+ begin: regex.concat(
+ /\*\*/,
+ /((\*(?!\*)|\\[^\n]|[^*\n\\])+\n)+/,
+ /(\*(?!\*)|\\[^\n]|[^*\n\\])*/,
+ /\*\*/
+ ),
+ relevance: 0
+ },
+ // inline constrained strong (single line)
+ {
+ className: 'strong',
+ // must not precede or follow a word character
+ begin: /\B\*(\S|\S[^\n]*?\S)\*(?!\w)/
+ },
+ // inline constrained strong (multi-line)
+ {
+ className: 'strong',
+ // must not precede or follow a word character
+ begin: /\*[^\s]([^\n]+\n)+([^\n]+)\*/
+ }
+ ];
+ const EMPHASIS = [
+ // inline unconstrained emphasis (single line)
+ {
+ className: 'emphasis',
+ begin: /_{2}([^\n]+?)_{2}/
+ },
+ // inline unconstrained emphasis (multi-line)
+ {
+ className: 'emphasis',
+ begin: regex.concat(
+ /__/,
+ /((_(?!_)|\\[^\n]|[^_\n\\])+\n)+/,
+ /(_(?!_)|\\[^\n]|[^_\n\\])*/,
+ /__/
+ ),
+ relevance: 0
+ },
+ // inline constrained emphasis (single line)
+ {
+ className: 'emphasis',
+ // must not precede or follow a word character
+ begin: /\b_(\S|\S[^\n]*?\S)_(?!\w)/
+ },
+ // inline constrained emphasis (multi-line)
+ {
+ className: 'emphasis',
+ // must not precede or follow a word character
+ begin: /_[^\s]([^\n]+\n)+([^\n]+)_/
+ },
+ // inline constrained emphasis using single quote (legacy)
+ {
+ className: 'emphasis',
+ // must not follow a word character or be followed by a single quote or space
+ begin: '\\B\'(?![\'\\s])',
+ end: '(\\n{2}|\')',
+ // allow escaped single quote followed by word char
+ contains: [
+ {
+ begin: '\\\\\'\\w',
+ relevance: 0
+ }
+ ],
+ relevance: 0
+ }
+ ];
+ const ADMONITION = {
+ className: 'symbol',
+ begin: '^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+',
+ relevance: 10
+ };
+ const BULLET_LIST = {
+ className: 'bullet',
+ begin: '^(\\*+|-+|\\.+|[^\\n]+?::)\\s+'
+ };
+
+ return {
+ name: 'AsciiDoc',
+ aliases: [ 'adoc' ],
+ contains: [
+ // block comment
+ hljs.COMMENT(
+ '^/{4,}\\n',
+ '\\n/{4,}$',
+ // can also be done as...
+ // '^/{4,}$',
+ // '^/{4,}$',
+ { relevance: 10 }
+ ),
+ // line comment
+ hljs.COMMENT(
+ '^//',
+ '$',
+ { relevance: 0 }
+ ),
+ // title
+ {
+ className: 'title',
+ begin: '^\\.\\w.*$'
+ },
+ // example, admonition & sidebar blocks
+ {
+ begin: '^[=\\*]{4,}\\n',
+ end: '\\n^[=\\*]{4,}$',
+ relevance: 10
+ },
+ // headings
+ {
+ className: 'section',
+ relevance: 10,
+ variants: [
+ { begin: '^(={1,6})[ \t].+?([ \t]\\1)?$' },
+ { begin: '^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$' }
+ ]
+ },
+ // document attributes
+ {
+ className: 'meta',
+ begin: '^:.+?:',
+ end: '\\s',
+ excludeEnd: true,
+ relevance: 10
+ },
+ // block attributes
+ {
+ className: 'meta',
+ begin: '^\\[.+?\\]$',
+ relevance: 0
+ },
+ // quoteblocks
+ {
+ className: 'quote',
+ begin: '^_{4,}\\n',
+ end: '\\n_{4,}$',
+ relevance: 10
+ },
+ // listing and literal blocks
+ {
+ className: 'code',
+ begin: '^[\\-\\.]{4,}\\n',
+ end: '\\n[\\-\\.]{4,}$',
+ relevance: 10
+ },
+ // passthrough blocks
+ {
+ begin: '^\\+{4,}\\n',
+ end: '\\n\\+{4,}$',
+ contains: [
+ {
+ begin: '<',
+ end: '>',
+ subLanguage: 'xml',
+ relevance: 0
+ }
+ ],
+ relevance: 10
+ },
+
+ BULLET_LIST,
+ ADMONITION,
+ ...ESCAPED_FORMATTING,
+ ...STRONG,
+ ...EMPHASIS,
+
+ // inline smart quotes
+ {
+ className: 'string',
+ variants: [
+ { begin: "``.+?''" },
+ { begin: "`.+?'" }
+ ]
+ },
+ // inline unconstrained emphasis
+ {
+ className: 'code',
+ begin: /`{2}/,
+ end: /(\n{2}|`{2})/
+ },
+ // inline code snippets (TODO should get same treatment as strong and emphasis)
+ {
+ className: 'code',
+ begin: '(`.+?`|\\+.+?\\+)',
+ relevance: 0
+ },
+ // indented literal block
+ {
+ className: 'code',
+ begin: '^[ \\t]',
+ end: '$',
+ relevance: 0
+ },
+ HORIZONTAL_RULE,
+ // images and links
+ {
+ begin: '(link:)?(http|https|ftp|file|irc|image:?):\\S+?\\[[^[]*?\\]',
+ returnBegin: true,
+ contains: [
+ {
+ begin: '(link|image:?):',
+ relevance: 0
+ },
+ {
+ className: 'link',
+ begin: '\\w',
+ end: '[^\\[]+',
+ relevance: 0
+ },
+ {
+ className: 'string',
+ begin: '\\[',
+ end: '\\]',
+ excludeBegin: true,
+ excludeEnd: true,
+ relevance: 0
+ }
+ ],
+ relevance: 10
+ }
+ ]
+ };
+ }
+
+ return asciidoc;
+
+})();
+
+ hljs.registerLanguage('asciidoc', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/asciidoc.min.js b/htroot/js/languages/asciidoc.min.js
new file mode 100644
index 000000000..22cb28d7e
--- /dev/null
+++ b/htroot/js/languages/asciidoc.min.js
@@ -0,0 +1,35 @@
+/*! `asciidoc` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a=[{
+className:"strong",begin:/\*{2}([^\n]+?)\*{2}/},{className:"strong",
+begin:n.concat(/\*\*/,/((\*(?!\*)|\\[^\n]|[^*\n\\])+\n)+/,/(\*(?!\*)|\\[^\n]|[^*\n\\])*/,/\*\*/),
+relevance:0},{className:"strong",begin:/\B\*(\S|\S[^\n]*?\S)\*(?!\w)/},{
+className:"strong",begin:/\*[^\s]([^\n]+\n)+([^\n]+)\*/}],s=[{
+className:"emphasis",begin:/_{2}([^\n]+?)_{2}/},{className:"emphasis",
+begin:n.concat(/__/,/((_(?!_)|\\[^\n]|[^_\n\\])+\n)+/,/(_(?!_)|\\[^\n]|[^_\n\\])*/,/__/),
+relevance:0},{className:"emphasis",begin:/\b_(\S|\S[^\n]*?\S)_(?!\w)/},{
+className:"emphasis",begin:/_[^\s]([^\n]+\n)+([^\n]+)_/},{className:"emphasis",
+begin:"\\B'(?!['\\s])",end:"(\\n{2}|')",contains:[{begin:"\\\\'\\w",relevance:0
+}],relevance:0}];return{name:"AsciiDoc",aliases:["adoc"],
+contains:[e.COMMENT("^/{4,}\\n","\\n/{4,}$",{relevance:10
+}),e.COMMENT("^//","$",{relevance:0}),{className:"title",begin:"^\\.\\w.*$"},{
+begin:"^[=\\*]{4,}\\n",end:"\\n^[=\\*]{4,}$",relevance:10},{className:"section",
+relevance:10,variants:[{begin:"^(={1,6})[ \t].+?([ \t]\\1)?$"},{
+begin:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{className:"meta",
+begin:"^:.+?:",end:"\\s",excludeEnd:!0,relevance:10},{className:"meta",
+begin:"^\\[.+?\\]$",relevance:0},{className:"quote",begin:"^_{4,}\\n",
+end:"\\n_{4,}$",relevance:10},{className:"code",begin:"^[\\-\\.]{4,}\\n",
+end:"\\n[\\-\\.]{4,}$",relevance:10},{begin:"^\\+{4,}\\n",end:"\\n\\+{4,}$",
+contains:[{begin:"<",end:">",subLanguage:"xml",relevance:0}],relevance:10},{
+className:"bullet",begin:"^(\\*+|-+|\\.+|[^\\n]+?::)\\s+"},{className:"symbol",
+begin:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{
+begin:/\\[*_`]/},{begin:/\\\\\*{2}[^\n]*?\*{2}/},{begin:/\\\\_{2}[^\n]*_{2}/},{
+begin:/\\\\`{2}[^\n]*`{2}/},{begin:/[:;}][*_`](?![*_`])/},...a,...s,{
+className:"string",variants:[{begin:"``.+?''"},{begin:"`.+?'"}]},{
+className:"code",begin:/`{2}/,end:/(\n{2}|`{2})/},{className:"code",
+begin:"(`.+?`|\\+.+?\\+)",relevance:0},{className:"code",begin:"^[ \\t]",
+end:"$",relevance:0},{begin:"^'{3,}[ \\t]*$",relevance:10},{
+begin:"(link:)?(http|https|ftp|file|irc|image:?):\\S+?\\[[^[]*?\\]",
+returnBegin:!0,contains:[{begin:"(link|image:?):",relevance:0},{
+className:"link",begin:"\\w",end:"[^\\[]+",relevance:0},{className:"string",
+begin:"\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0,relevance:0}],relevance:10}]
+}}})();hljs.registerLanguage("asciidoc",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/bash.js b/htroot/js/languages/bash.js
new file mode 100644
index 000000000..c7f837611
--- /dev/null
+++ b/htroot/js/languages/bash.js
@@ -0,0 +1,419 @@
+/*! `bash` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Bash
+ Author: vah <vahtenberg@gmail.com>
+ Contributrors: Benjamin Pannell <contact@sierrasoftworks.com>
+ Website: https://www.gnu.org/software/bash/
+ Category: common, scripting
+ */
+
+ /** @type LanguageFn */
+ function bash(hljs) {
+ const regex = hljs.regex;
+ const VAR = {};
+ const BRACED_VAR = {
+ begin: /\$\{/,
+ end: /\}/,
+ contains: [
+ "self",
+ {
+ begin: /:-/,
+ contains: [ VAR ]
+ } // default values
+ ]
+ };
+ Object.assign(VAR, {
+ className: 'variable',
+ variants: [
+ { begin: regex.concat(/\$[\w\d#@][\w\d_]*/,
+ // negative look-ahead tries to avoid matching patterns that are not
+ // Perl at all like $ident$, @ident@, etc.
+ `(?![\\w\\d])(?![$])`) },
+ BRACED_VAR
+ ]
+ });
+
+ const SUBST = {
+ className: 'subst',
+ begin: /\$\(/,
+ end: /\)/,
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ };
+ const COMMENT = hljs.inherit(
+ hljs.COMMENT(),
+ {
+ match: [
+ /(^|\s)/,
+ /#.*$/
+ ],
+ scope: {
+ 2: 'comment'
+ }
+ }
+ );
+ const HERE_DOC = {
+ begin: /<<-?\s*(?=\w+)/,
+ starts: { contains: [
+ hljs.END_SAME_AS_BEGIN({
+ begin: /(\w+)/,
+ end: /(\w+)/,
+ className: 'string'
+ })
+ ] }
+ };
+ const QUOTE_STRING = {
+ className: 'string',
+ begin: /"/,
+ end: /"/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ VAR,
+ SUBST
+ ]
+ };
+ SUBST.contains.push(QUOTE_STRING);
+ const ESCAPED_QUOTE = {
+ match: /\\"/
+ };
+ const APOS_STRING = {
+ className: 'string',
+ begin: /'/,
+ end: /'/
+ };
+ const ESCAPED_APOS = {
+ match: /\\'/
+ };
+ const ARITHMETIC = {
+ begin: /\$?\(\(/,
+ end: /\)\)/,
+ contains: [
+ {
+ begin: /\d+#[0-9a-f]+/,
+ className: "number"
+ },
+ hljs.NUMBER_MODE,
+ VAR
+ ]
+ };
+ const SH_LIKE_SHELLS = [
+ "fish",
+ "bash",
+ "zsh",
+ "sh",
+ "csh",
+ "ksh",
+ "tcsh",
+ "dash",
+ "scsh",
+ ];
+ const KNOWN_SHEBANG = hljs.SHEBANG({
+ binary: `(${SH_LIKE_SHELLS.join("|")})`,
+ relevance: 10
+ });
+ const FUNCTION = {
+ className: 'function',
+ begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
+ returnBegin: true,
+ contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ }) ],
+ relevance: 0
+ };
+
+ const KEYWORDS = [
+ "if",
+ "then",
+ "else",
+ "elif",
+ "fi",
+ "time",
+ "for",
+ "while",
+ "until",
+ "in",
+ "do",
+ "done",
+ "case",
+ "esac",
+ "coproc",
+ "function",
+ "select"
+ ];
+
+ const LITERALS = [
+ "true",
+ "false"
+ ];
+
+ // to consume paths to prevent keyword matches inside them
+ const PATH_MODE = { match: /(\/[a-z._-]+)+/ };
+
+ // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
+ const SHELL_BUILT_INS = [
+ "break",
+ "cd",
+ "continue",
+ "eval",
+ "exec",
+ "exit",
+ "export",
+ "getopts",
+ "hash",
+ "pwd",
+ "readonly",
+ "return",
+ "shift",
+ "test",
+ "times",
+ "trap",
+ "umask",
+ "unset"
+ ];
+
+ const BASH_BUILT_INS = [
+ "alias",
+ "bind",
+ "builtin",
+ "caller",
+ "command",
+ "declare",
+ "echo",
+ "enable",
+ "help",
+ "let",
+ "local",
+ "logout",
+ "mapfile",
+ "printf",
+ "read",
+ "readarray",
+ "source",
+ "sudo",
+ "type",
+ "typeset",
+ "ulimit",
+ "unalias"
+ ];
+
+ const ZSH_BUILT_INS = [
+ "autoload",
+ "bg",
+ "bindkey",
+ "bye",
+ "cap",
+ "chdir",
+ "clone",
+ "comparguments",
+ "compcall",
+ "compctl",
+ "compdescribe",
+ "compfiles",
+ "compgroups",
+ "compquote",
+ "comptags",
+ "comptry",
+ "compvalues",
+ "dirs",
+ "disable",
+ "disown",
+ "echotc",
+ "echoti",
+ "emulate",
+ "fc",
+ "fg",
+ "float",
+ "functions",
+ "getcap",
+ "getln",
+ "history",
+ "integer",
+ "jobs",
+ "kill",
+ "limit",
+ "log",
+ "noglob",
+ "popd",
+ "print",
+ "pushd",
+ "pushln",
+ "rehash",
+ "sched",
+ "setcap",
+ "setopt",
+ "stat",
+ "suspend",
+ "ttyctl",
+ "unfunction",
+ "unhash",
+ "unlimit",
+ "unsetopt",
+ "vared",
+ "wait",
+ "whence",
+ "where",
+ "which",
+ "zcompile",
+ "zformat",
+ "zftp",
+ "zle",
+ "zmodload",
+ "zparseopts",
+ "zprof",
+ "zpty",
+ "zregexparse",
+ "zsocket",
+ "zstyle",
+ "ztcp"
+ ];
+
+ const GNU_CORE_UTILS = [
+ "chcon",
+ "chgrp",
+ "chown",
+ "chmod",
+ "cp",
+ "dd",
+ "df",
+ "dir",
+ "dircolors",
+ "ln",
+ "ls",
+ "mkdir",
+ "mkfifo",
+ "mknod",
+ "mktemp",
+ "mv",
+ "realpath",
+ "rm",
+ "rmdir",
+ "shred",
+ "sync",
+ "touch",
+ "truncate",
+ "vdir",
+ "b2sum",
+ "base32",
+ "base64",
+ "cat",
+ "cksum",
+ "comm",
+ "csplit",
+ "cut",
+ "expand",
+ "fmt",
+ "fold",
+ "head",
+ "join",
+ "md5sum",
+ "nl",
+ "numfmt",
+ "od",
+ "paste",
+ "ptx",
+ "pr",
+ "sha1sum",
+ "sha224sum",
+ "sha256sum",
+ "sha384sum",
+ "sha512sum",
+ "shuf",
+ "sort",
+ "split",
+ "sum",
+ "tac",
+ "tail",
+ "tr",
+ "tsort",
+ "unexpand",
+ "uniq",
+ "wc",
+ "arch",
+ "basename",
+ "chroot",
+ "date",
+ "dirname",
+ "du",
+ "echo",
+ "env",
+ "expr",
+ "factor",
+ // "false", // keyword literal already
+ "groups",
+ "hostid",
+ "id",
+ "link",
+ "logname",
+ "nice",
+ "nohup",
+ "nproc",
+ "pathchk",
+ "pinky",
+ "printenv",
+ "printf",
+ "pwd",
+ "readlink",
+ "runcon",
+ "seq",
+ "sleep",
+ "stat",
+ "stdbuf",
+ "stty",
+ "tee",
+ "test",
+ "timeout",
+ // "true", // keyword literal already
+ "tty",
+ "uname",
+ "unlink",
+ "uptime",
+ "users",
+ "who",
+ "whoami",
+ "yes"
+ ];
+
+ return {
+ name: 'Bash',
+ aliases: [
+ 'sh',
+ 'zsh'
+ ],
+ keywords: {
+ $pattern: /\b[a-z][a-z0-9._-]+\b/,
+ keyword: KEYWORDS,
+ literal: LITERALS,
+ built_in: [
+ ...SHELL_BUILT_INS,
+ ...BASH_BUILT_INS,
+ // Shell modifiers
+ "set",
+ "shopt",
+ ...ZSH_BUILT_INS,
+ ...GNU_CORE_UTILS
+ ]
+ },
+ contains: [
+ KNOWN_SHEBANG, // to catch known shells and boost relevancy
+ hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang
+ FUNCTION,
+ ARITHMETIC,
+ COMMENT,
+ HERE_DOC,
+ PATH_MODE,
+ QUOTE_STRING,
+ ESCAPED_QUOTE,
+ APOS_STRING,
+ ESCAPED_APOS,
+ VAR
+ ]
+ };
+ }
+
+ return bash;
+
+})();
+
+ hljs.registerLanguage('bash', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/bash.min.js b/htroot/js/languages/bash.min.js
new file mode 100644
index 000000000..226aca00f
--- /dev/null
+++ b/htroot/js/languages/bash.min.js
@@ -0,0 +1,21 @@
+/*! `bash` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const s=e.regex,t={},n={begin:/\$\{/,
+end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{
+className:"variable",variants:[{
+begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={
+className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]
+},i=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),c={
+begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,
+end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const r={begin:/\$?\(\(/,
+end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]
+},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10
+}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,
+contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{
+name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,
+keyword:["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],
+literal:["true","false"],
+built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"]
+},contains:[l,e.SHEBANG(),m,r,i,c,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{
+className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}})()
+;hljs.registerLanguage("bash",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/c.js b/htroot/js/languages/c.js
new file mode 100644
index 000000000..c49da1a67
--- /dev/null
+++ b/htroot/js/languages/c.js
@@ -0,0 +1,343 @@
+/*! `c` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: C
+ Category: common, system
+ Website: https://en.wikipedia.org/wiki/C_(programming_language)
+ */
+
+ /** @type LanguageFn */
+ function c(hljs) {
+ const regex = hljs.regex;
+ // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does
+ // not include such support nor can we be sure all the grammars depending
+ // on it would desire this behavior
+ const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\n/ } ] });
+ const DECLTYPE_AUTO_RE = 'decltype\\(auto\\)';
+ const NAMESPACE_RE = '[a-zA-Z_]\\w*::';
+ const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';
+ const FUNCTION_TYPE_RE = '('
+ + DECLTYPE_AUTO_RE + '|'
+ + regex.optional(NAMESPACE_RE)
+ + '[a-zA-Z_]\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)
+ + ')';
+
+
+ const TYPES = {
+ className: 'type',
+ variants: [
+ { begin: '\\b[a-z\\d_]*_t\\b' },
+ { match: /\batomic_[a-z]{3,6}\b/ }
+ ]
+
+ };
+
+ // https://en.cppreference.com/w/cpp/language/escape
+ // \\ \x \xFF \u2837 \u00323747 \374
+ const CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)';
+ const STRINGS = {
+ className: 'string',
+ variants: [
+ {
+ begin: '(u8?|U|L)?"',
+ end: '"',
+ illegal: '\\n',
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ },
+ {
+ begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + "|.)",
+ end: '\'',
+ illegal: '.'
+ },
+ hljs.END_SAME_AS_BEGIN({
+ begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,
+ end: /\)([^()\\ ]{0,16})"/
+ })
+ ]
+ };
+
+ const NUMBERS = {
+ className: 'number',
+ variants: [
+ { match: /\b(0b[01']+)/ },
+ { match: /(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ },
+ { match: /(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ },
+ { match: /(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/ }
+ ],
+ relevance: 0
+ };
+
+ const PREPROCESSOR = {
+ className: 'meta',
+ begin: /#\s*[a-z]+\b/,
+ end: /$/,
+ keywords: { keyword:
+ 'if else elif endif define undef warning error line '
+ + 'pragma _Pragma ifdef ifndef elifdef elifndef include' },
+ contains: [
+ {
+ begin: /\\\n/,
+ relevance: 0
+ },
+ hljs.inherit(STRINGS, { className: 'string' }),
+ {
+ className: 'string',
+ begin: /<.*?>/
+ },
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE
+ ]
+ };
+
+ const TITLE_MODE = {
+ className: 'title',
+ begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,
+ relevance: 0
+ };
+
+ const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\(';
+
+ const C_KEYWORDS = [
+ "asm",
+ "auto",
+ "break",
+ "case",
+ "continue",
+ "default",
+ "do",
+ "else",
+ "enum",
+ "extern",
+ "for",
+ "fortran",
+ "goto",
+ "if",
+ "inline",
+ "register",
+ "restrict",
+ "return",
+ "sizeof",
+ "typeof",
+ "typeof_unqual",
+ "struct",
+ "switch",
+ "typedef",
+ "union",
+ "volatile",
+ "while",
+ "_Alignas",
+ "_Alignof",
+ "_Atomic",
+ "_Generic",
+ "_Noreturn",
+ "_Static_assert",
+ "_Thread_local",
+ // aliases
+ "alignas",
+ "alignof",
+ "noreturn",
+ "static_assert",
+ "thread_local",
+ // not a C keyword but is, for all intents and purposes, treated exactly like one.
+ "_Pragma"
+ ];
+
+ const C_TYPES = [
+ "float",
+ "double",
+ "signed",
+ "unsigned",
+ "int",
+ "short",
+ "long",
+ "char",
+ "void",
+ "_Bool",
+ "_BitInt",
+ "_Complex",
+ "_Imaginary",
+ "_Decimal32",
+ "_Decimal64",
+ "_Decimal96",
+ "_Decimal128",
+ "_Decimal64x",
+ "_Decimal128x",
+ "_Float16",
+ "_Float32",
+ "_Float64",
+ "_Float128",
+ "_Float32x",
+ "_Float64x",
+ "_Float128x",
+ // modifiers
+ "const",
+ "static",
+ "constexpr",
+ // aliases
+ "complex",
+ "bool",
+ "imaginary"
+ ];
+
+ const KEYWORDS = {
+ keyword: C_KEYWORDS,
+ type: C_TYPES,
+ literal: 'true false NULL',
+ // TODO: apply hinting work similar to what was done in cpp.js
+ built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream '
+ + 'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set '
+ + 'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos '
+ + 'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp '
+ + 'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper '
+ + 'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow '
+ + 'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp '
+ + 'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan '
+ + 'vfprintf vprintf vsprintf endl initializer_list unique_ptr',
+ };
+
+ const EXPRESSION_CONTAINS = [
+ PREPROCESSOR,
+ TYPES,
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ NUMBERS,
+ STRINGS
+ ];
+
+ const EXPRESSION_CONTEXT = {
+ // This mode covers expression context where we can't expect a function
+ // definition and shouldn't highlight anything that looks like one:
+ // `return some()`, `else if()`, `(x*sum(1, 2))`
+ variants: [
+ {
+ begin: /=/,
+ end: /;/
+ },
+ {
+ begin: /\(/,
+ end: /\)/
+ },
+ {
+ beginKeywords: 'new throw return else',
+ end: /;/
+ }
+ ],
+ keywords: KEYWORDS,
+ contains: EXPRESSION_CONTAINS.concat([
+ {
+ begin: /\(/,
+ end: /\)/,
+ keywords: KEYWORDS,
+ contains: EXPRESSION_CONTAINS.concat([ 'self' ]),
+ relevance: 0
+ }
+ ]),
+ relevance: 0
+ };
+
+ const FUNCTION_DECLARATION = {
+ begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE,
+ returnBegin: true,
+ end: /[{;=]/,
+ excludeEnd: true,
+ keywords: KEYWORDS,
+ illegal: /[^\w\s\*&:<>.]/,
+ contains: [
+ { // to prevent it from being confused as the function title
+ begin: DECLTYPE_AUTO_RE,
+ keywords: KEYWORDS,
+ relevance: 0
+ },
+ {
+ begin: FUNCTION_TITLE,
+ returnBegin: true,
+ contains: [ hljs.inherit(TITLE_MODE, { className: "title.function" }) ],
+ relevance: 0
+ },
+ // allow for multiple declarations, e.g.:
+ // extern void f(int), g(char);
+ {
+ relevance: 0,
+ match: /,/
+ },
+ {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ keywords: KEYWORDS,
+ relevance: 0,
+ contains: [
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ STRINGS,
+ NUMBERS,
+ TYPES,
+ // Count matching parentheses.
+ {
+ begin: /\(/,
+ end: /\)/,
+ keywords: KEYWORDS,
+ relevance: 0,
+ contains: [
+ 'self',
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ STRINGS,
+ NUMBERS,
+ TYPES
+ ]
+ }
+ ]
+ },
+ TYPES,
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ PREPROCESSOR
+ ]
+ };
+
+ return {
+ name: "C",
+ aliases: [ 'h' ],
+ keywords: KEYWORDS,
+ // Until differentiations are added between `c` and `cpp`, `c` will
+ // not be auto-detected to avoid auto-detect conflicts between C and C++
+ disableAutodetect: true,
+ illegal: '</',
+ contains: [].concat(
+ EXPRESSION_CONTEXT,
+ FUNCTION_DECLARATION,
+ EXPRESSION_CONTAINS,
+ [
+ PREPROCESSOR,
+ {
+ begin: hljs.IDENT_RE + '::',
+ keywords: KEYWORDS
+ },
+ {
+ className: 'class',
+ beginKeywords: 'enum class struct union',
+ end: /[{;:<>=]/,
+ contains: [
+ { beginKeywords: "final class struct" },
+ hljs.TITLE_MODE
+ ]
+ }
+ ]),
+ exports: {
+ preprocessor: PREPROCESSOR,
+ strings: STRINGS,
+ keywords: KEYWORDS
+ }
+ };
+ }
+
+ return c;
+
+})();
+
+ hljs.registerLanguage('c', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/c.min.js b/htroot/js/languages/c.min.js
new file mode 100644
index 000000000..cf597861e
--- /dev/null
+++ b/htroot/js/languages/c.min.js
@@ -0,0 +1,41 @@
+/*! `c` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,n=e.COMMENT("//","$",{
+contains:[{begin:/\\\n/}]
+}),a="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",r="("+a+"|"+t.optional(s)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",i={
+className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{
+match:/\batomic_[a-z]{3,6}\b/}]},l={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{match:/\b(0b[01']+)/},{
+match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/
+},{
+match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/
+},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0
+},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(l,{className:"string"}),{
+className:"string",begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},d={
+className:"title",begin:t.optional(s)+e.IDENT_RE,relevance:0
+},_=t.optional(s)+e.IDENT_RE+"\\s*\\(",u={
+keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],
+type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"],
+literal:"true false NULL",
+built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"
+},m=[c,i,n,e.C_BLOCK_COMMENT_MODE,o,l],g={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u,
+contains:m.concat(["self"]),relevance:0}]),relevance:0},p={
+begin:"("+r+"[\\*&\\s]+)+"+_,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{
+begin:_,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})],
+relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,
+keywords:u,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,l,o,i,{begin:/\(/,
+end:/\)/,keywords:u,relevance:0,contains:["self",n,e.C_BLOCK_COMMENT_MODE,l,o,i]
+}]},i,n,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u,
+disableAutodetect:!0,illegal:"</",contains:[].concat(g,p,m,[c,{
+begin:e.IDENT_RE+"::",keywords:u},{className:"class",
+beginKeywords:"enum class struct union",end:/[{;:<>=]/,contains:[{
+beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c,
+strings:l,keywords:u}}}})();hljs.registerLanguage("c",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/clojure.js b/htroot/js/languages/clojure.js
new file mode 100644
index 000000000..9be564043
--- /dev/null
+++ b/htroot/js/languages/clojure.js
@@ -0,0 +1,194 @@
+/*! `clojure` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Clojure
+ Description: Clojure syntax (based on lisp.js)
+ Author: mfornos
+ Website: https://clojure.org
+ Category: lisp
+ */
+
+ /** @type LanguageFn */
+ function clojure(hljs) {
+ const SYMBOLSTART = 'a-zA-Z_\\-!.?+*=<>&\'';
+ const SYMBOL_RE = '[#]?[' + SYMBOLSTART + '][' + SYMBOLSTART + '0-9/;:$#]*';
+ const globals = 'def defonce defprotocol defstruct defmulti defmethod defn- defn defmacro deftype defrecord';
+ const keywords = {
+ $pattern: SYMBOL_RE,
+ built_in:
+ // Clojure keywords
+ globals + ' '
+ + 'cond apply if-not if-let if not not= =|0 <|0 >|0 <=|0 >=|0 ==|0 +|0 /|0 *|0 -|0 rem '
+ + 'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '
+ + 'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '
+ + 'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '
+ + 'string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . '
+ + 'inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last '
+ + 'drop-while while intern condp case reduced cycle split-at split-with repeat replicate '
+ + 'iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext '
+ + 'nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends '
+ + 'add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler '
+ + 'set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter '
+ + 'monitor-exit macroexpand macroexpand-1 for dosync and or '
+ + 'when when-not when-let comp juxt partial sequence memoize constantly complement identity assert '
+ + 'peek pop doto proxy first rest cons cast coll last butlast '
+ + 'sigs reify second ffirst fnext nfirst nnext meta with-meta ns in-ns create-ns import '
+ + 'refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! '
+ + 'assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger '
+ + 'bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline '
+ + 'flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking '
+ + 'assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! '
+ + 'reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! '
+ + 'new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty '
+ + 'hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list '
+ + 'disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer '
+ + 'chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate '
+ + 'unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta '
+ + 'lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize'
+ };
+
+ const SYMBOL = {
+ begin: SYMBOL_RE,
+ relevance: 0
+ };
+ const NUMBER = {
+ scope: 'number',
+ relevance: 0,
+ variants: [
+ { match: /[-+]?0[xX][0-9a-fA-F]+N?/ }, // hexadecimal // 0x2a
+ { match: /[-+]?0[0-7]+N?/ }, // octal // 052
+ { match: /[-+]?[1-9][0-9]?[rR][0-9a-zA-Z]+N?/ }, // variable radix from 2 to 36 // 2r101010, 8r52, 36r16
+ { match: /[-+]?[0-9]+\/[0-9]+N?/ }, // ratio // 1/2
+ { match: /[-+]?[0-9]+((\.[0-9]*([eE][+-]?[0-9]+)?M?)|([eE][+-]?[0-9]+M?|M))/ }, // float // 0.42 4.2E-1M 42E1 42M
+ { match: /[-+]?([1-9][0-9]*|0)N?/ }, // int (don't match leading 0) // 42 42N
+ ]
+ };
+ const CHARACTER = {
+ scope: 'character',
+ variants: [
+ { match: /\\o[0-3]?[0-7]{1,2}/ }, // Unicode Octal 0 - 377
+ { match: /\\u[0-9a-fA-F]{4}/ }, // Unicode Hex 0000 - FFFF
+ { match: /\\(newline|space|tab|formfeed|backspace|return)/ }, // special characters
+ {
+ match: /\\\S/,
+ relevance: 0
+ } // any non-whitespace char
+ ]
+ };
+ const REGEX = {
+ scope: 'regex',
+ begin: /#"/,
+ end: /"/,
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ };
+ const STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null });
+ const COMMA = {
+ scope: 'punctuation',
+ match: /,/,
+ relevance: 0
+ };
+ const COMMENT = hljs.COMMENT(
+ ';',
+ '$',
+ { relevance: 0 }
+ );
+ const LITERAL = {
+ className: 'literal',
+ begin: /\b(true|false|nil)\b/
+ };
+ const COLLECTION = {
+ begin: "\\[|(#::?" + SYMBOL_RE + ")?\\{",
+ end: '[\\]\\}]',
+ relevance: 0
+ };
+ const KEY = {
+ className: 'symbol',
+ begin: '[:]{1,2}' + SYMBOL_RE
+ };
+ const LIST = {
+ begin: '\\(',
+ end: '\\)'
+ };
+ const BODY = {
+ endsWithParent: true,
+ relevance: 0
+ };
+ const NAME = {
+ keywords: keywords,
+ className: 'name',
+ begin: SYMBOL_RE,
+ relevance: 0,
+ starts: BODY
+ };
+ const DEFAULT_CONTAINS = [
+ COMMA,
+ LIST,
+ CHARACTER,
+ REGEX,
+ STRING,
+ COMMENT,
+ KEY,
+ COLLECTION,
+ NUMBER,
+ LITERAL,
+ SYMBOL
+ ];
+
+ const GLOBAL = {
+ beginKeywords: globals,
+ keywords: {
+ $pattern: SYMBOL_RE,
+ keyword: globals
+ },
+ end: '(\\[|#|\\d|"|:|\\{|\\)|\\(|$)',
+ contains: [
+ {
+ className: 'title',
+ begin: SYMBOL_RE,
+ relevance: 0,
+ excludeEnd: true,
+ // we can only have a single title
+ endsParent: true
+ }
+ ].concat(DEFAULT_CONTAINS)
+ };
+
+ LIST.contains = [
+ GLOBAL,
+ NAME,
+ BODY
+ ];
+ BODY.contains = DEFAULT_CONTAINS;
+ COLLECTION.contains = DEFAULT_CONTAINS;
+
+ return {
+ name: 'Clojure',
+ aliases: [
+ 'clj',
+ 'edn'
+ ],
+ illegal: /\S/,
+ contains: [
+ COMMA,
+ LIST,
+ CHARACTER,
+ REGEX,
+ STRING,
+ COMMENT,
+ KEY,
+ COLLECTION,
+ NUMBER,
+ LITERAL
+ ]
+ };
+ }
+
+ return clojure;
+
+})();
+
+ hljs.registerLanguage('clojure', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/clojure.min.js b/htroot/js/languages/clojure.min.js
new file mode 100644
index 000000000..6a436858b
--- /dev/null
+++ b/htroot/js/languages/clojure.min.js
@@ -0,0 +1,25 @@
+/*! `clojure` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const t="a-zA-Z_\\-!.?+*=<>&'",n="[#]?["+t+"]["+t+"0-9/;:$#]*",a="def defonce defprotocol defstruct defmulti defmethod defn- defn defmacro deftype defrecord",r={
+$pattern:n,
+built_in:a+" cond apply if-not if-let if not not= =|0 <|0 >|0 <=|0 >=|0 ==|0 +|0 /|0 *|0 -|0 rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy first rest cons cast coll last butlast sigs reify second ffirst fnext nfirst nnext meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"
+},s={begin:n,relevance:0},o={scope:"number",relevance:0,variants:[{
+match:/[-+]?0[xX][0-9a-fA-F]+N?/},{match:/[-+]?0[0-7]+N?/},{
+match:/[-+]?[1-9][0-9]?[rR][0-9a-zA-Z]+N?/},{match:/[-+]?[0-9]+\/[0-9]+N?/},{
+match:/[-+]?[0-9]+((\.[0-9]*([eE][+-]?[0-9]+)?M?)|([eE][+-]?[0-9]+M?|M))/},{
+match:/[-+]?([1-9][0-9]*|0)N?/}]},c={scope:"character",variants:[{
+match:/\\o[0-3]?[0-7]{1,2}/},{match:/\\u[0-9a-fA-F]{4}/},{
+match:/\\(newline|space|tab|formfeed|backspace|return)/},{match:/\\\S/,
+relevance:0}]},i={scope:"regex",begin:/#"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]
+},d=e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),l={scope:"punctuation",
+match:/,/,relevance:0},m=e.COMMENT(";","$",{relevance:0}),p={
+className:"literal",begin:/\b(true|false|nil)\b/},u={
+begin:"\\[|(#::?"+n+")?\\{",end:"[\\]\\}]",relevance:0},f={className:"symbol",
+begin:"[:]{1,2}"+n},h={begin:"\\(",end:"\\)"},y={endsWithParent:!0,relevance:0
+},g={keywords:r,className:"name",begin:n,relevance:0,starts:y
+},b=[l,h,c,i,d,m,f,u,o,p,s],v={beginKeywords:a,keywords:{$pattern:n,keyword:a},
+end:'(\\[|#|\\d|"|:|\\{|\\)|\\(|$)',contains:[{className:"title",begin:n,
+relevance:0,excludeEnd:!0,endsParent:!0}].concat(b)}
+;return h.contains=[v,g,y],y.contains=b,u.contains=b,{name:"Clojure",
+aliases:["clj","edn"],illegal:/\S/,contains:[l,h,c,i,d,m,f,u,o,p]}}})()
+;hljs.registerLanguage("clojure",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/cpp.js b/htroot/js/languages/cpp.js
new file mode 100644
index 000000000..653ad0303
--- /dev/null
+++ b/htroot/js/languages/cpp.js
@@ -0,0 +1,615 @@
+/*! `cpp` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: C++
+ Category: common, system
+ Website: https://isocpp.org
+ */
+
+ /** @type LanguageFn */
+ function cpp(hljs) {
+ const regex = hljs.regex;
+ // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does
+ // not include such support nor can we be sure all the grammars depending
+ // on it would desire this behavior
+ const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\n/ } ] });
+ const DECLTYPE_AUTO_RE = 'decltype\\(auto\\)';
+ const NAMESPACE_RE = '[a-zA-Z_]\\w*::';
+ const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';
+ const FUNCTION_TYPE_RE = '(?!struct)('
+ + DECLTYPE_AUTO_RE + '|'
+ + regex.optional(NAMESPACE_RE)
+ + '[a-zA-Z_]\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)
+ + ')';
+
+ const CPP_PRIMITIVE_TYPES = {
+ className: 'type',
+ begin: '\\b[a-z\\d_]*_t\\b'
+ };
+
+ // https://en.cppreference.com/w/cpp/language/escape
+ // \\ \x \xFF \u2837 \u00323747 \374
+ const CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)';
+ const STRINGS = {
+ className: 'string',
+ variants: [
+ {
+ begin: '(u8?|U|L)?"',
+ end: '"',
+ illegal: '\\n',
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ },
+ {
+ begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + '|.)',
+ end: '\'',
+ illegal: '.'
+ },
+ hljs.END_SAME_AS_BEGIN({
+ begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,
+ end: /\)([^()\\ ]{0,16})"/
+ })
+ ]
+ };
+
+ const NUMBERS = {
+ className: 'number',
+ variants: [
+ // Floating-point literal.
+ { begin:
+ "[+-]?(?:" // Leading sign.
+ // Decimal.
+ + "(?:"
+ +"[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?"
+ + "|\\.[0-9](?:'?[0-9])*"
+ + ")(?:[Ee][+-]?[0-9](?:'?[0-9])*)?"
+ + "|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*"
+ // Hexadecimal.
+ + "|0[Xx](?:"
+ +"[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?"
+ + "|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*"
+ + ")[Pp][+-]?[0-9](?:'?[0-9])*"
+ + ")(?:" // Literal suffixes.
+ + "[Ff](?:16|32|64|128)?"
+ + "|(BF|bf)16"
+ + "|[Ll]"
+ + "|" // Literal suffix is optional.
+ + ")"
+ },
+ // Integer literal.
+ { begin:
+ "[+-]?\\b(?:" // Leading sign.
+ + "0[Bb][01](?:'?[01])*" // Binary.
+ + "|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*" // Hexadecimal.
+ + "|0(?:'?[0-7])*" // Octal or just a lone zero.
+ + "|[1-9](?:'?[0-9])*" // Decimal.
+ + ")(?:" // Literal suffixes.
+ + "[Uu](?:LL?|ll?)"
+ + "|[Uu][Zz]?"
+ + "|(?:LL?|ll?)[Uu]?"
+ + "|[Zz][Uu]"
+ + "|" // Literal suffix is optional.
+ + ")"
+ // Note: there are user-defined literal suffixes too, but perhaps having the custom suffix not part of the
+ // literal highlight actually makes it stand out more.
+ }
+ ],
+ relevance: 0
+ };
+
+ const PREPROCESSOR = {
+ className: 'meta',
+ begin: /#\s*[a-z]+\b/,
+ end: /$/,
+ keywords: { keyword:
+ 'if else elif endif define undef warning error line '
+ + 'pragma _Pragma ifdef ifndef include' },
+ contains: [
+ {
+ begin: /\\\n/,
+ relevance: 0
+ },
+ hljs.inherit(STRINGS, { className: 'string' }),
+ {
+ className: 'string',
+ begin: /<.*?>/
+ },
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE
+ ]
+ };
+
+ const TITLE_MODE = {
+ className: 'title',
+ begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,
+ relevance: 0
+ };
+
+ const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\(';
+
+ // https://en.cppreference.com/w/cpp/keyword
+ const RESERVED_KEYWORDS = [
+ 'alignas',
+ 'alignof',
+ 'and',
+ 'and_eq',
+ 'asm',
+ 'atomic_cancel',
+ 'atomic_commit',
+ 'atomic_noexcept',
+ 'auto',
+ 'bitand',
+ 'bitor',
+ 'break',
+ 'case',
+ 'catch',
+ 'class',
+ 'co_await',
+ 'co_return',
+ 'co_yield',
+ 'compl',
+ 'concept',
+ 'const_cast|10',
+ 'consteval',
+ 'constexpr',
+ 'constinit',
+ 'continue',
+ 'decltype',
+ 'default',
+ 'delete',
+ 'do',
+ 'dynamic_cast|10',
+ 'else',
+ 'enum',
+ 'explicit',
+ 'export',
+ 'extern',
+ 'false',
+ 'final',
+ 'for',
+ 'friend',
+ 'goto',
+ 'if',
+ 'import',
+ 'inline',
+ 'module',
+ 'mutable',
+ 'namespace',
+ 'new',
+ 'noexcept',
+ 'not',
+ 'not_eq',
+ 'nullptr',
+ 'operator',
+ 'or',
+ 'or_eq',
+ 'override',
+ 'private',
+ 'protected',
+ 'public',
+ 'reflexpr',
+ 'register',
+ 'reinterpret_cast|10',
+ 'requires',
+ 'return',
+ 'sizeof',
+ 'static_assert',
+ 'static_cast|10',
+ 'struct',
+ 'switch',
+ 'synchronized',
+ 'template',
+ 'this',
+ 'thread_local',
+ 'throw',
+ 'transaction_safe',
+ 'transaction_safe_dynamic',
+ 'true',
+ 'try',
+ 'typedef',
+ 'typeid',
+ 'typename',
+ 'union',
+ 'using',
+ 'virtual',
+ 'volatile',
+ 'while',
+ 'xor',
+ 'xor_eq'
+ ];
+
+ // https://en.cppreference.com/w/cpp/keyword
+ const RESERVED_TYPES = [
+ 'bool',
+ 'char',
+ 'char16_t',
+ 'char32_t',
+ 'char8_t',
+ 'double',
+ 'float',
+ 'int',
+ 'long',
+ 'short',
+ 'void',
+ 'wchar_t',
+ 'unsigned',
+ 'signed',
+ 'const',
+ 'static'
+ ];
+
+ const TYPE_HINTS = [
+ 'any',
+ 'auto_ptr',
+ 'barrier',
+ 'binary_semaphore',
+ 'bitset',
+ 'complex',
+ 'condition_variable',
+ 'condition_variable_any',
+ 'counting_semaphore',
+ 'deque',
+ 'false_type',
+ 'flat_map',
+ 'flat_set',
+ 'future',
+ 'imaginary',
+ 'initializer_list',
+ 'istringstream',
+ 'jthread',
+ 'latch',
+ 'lock_guard',
+ 'multimap',
+ 'multiset',
+ 'mutex',
+ 'optional',
+ 'ostringstream',
+ 'packaged_task',
+ 'pair',
+ 'promise',
+ 'priority_queue',
+ 'queue',
+ 'recursive_mutex',
+ 'recursive_timed_mutex',
+ 'scoped_lock',
+ 'set',
+ 'shared_future',
+ 'shared_lock',
+ 'shared_mutex',
+ 'shared_timed_mutex',
+ 'shared_ptr',
+ 'stack',
+ 'string_view',
+ 'stringstream',
+ 'timed_mutex',
+ 'thread',
+ 'true_type',
+ 'tuple',
+ 'unique_lock',
+ 'unique_ptr',
+ 'unordered_map',
+ 'unordered_multimap',
+ 'unordered_multiset',
+ 'unordered_set',
+ 'variant',
+ 'vector',
+ 'weak_ptr',
+ 'wstring',
+ 'wstring_view'
+ ];
+
+ const FUNCTION_HINTS = [
+ 'abort',
+ 'abs',
+ 'acos',
+ 'apply',
+ 'as_const',
+ 'asin',
+ 'atan',
+ 'atan2',
+ 'calloc',
+ 'ceil',
+ 'cerr',
+ 'cin',
+ 'clog',
+ 'cos',
+ 'cosh',
+ 'cout',
+ 'declval',
+ 'endl',
+ 'exchange',
+ 'exit',
+ 'exp',
+ 'fabs',
+ 'floor',
+ 'fmod',
+ 'forward',
+ 'fprintf',
+ 'fputs',
+ 'free',
+ 'frexp',
+ 'fscanf',
+ 'future',
+ 'invoke',
+ 'isalnum',
+ 'isalpha',
+ 'iscntrl',
+ 'isdigit',
+ 'isgraph',
+ 'islower',
+ 'isprint',
+ 'ispunct',
+ 'isspace',
+ 'isupper',
+ 'isxdigit',
+ 'labs',
+ 'launder',
+ 'ldexp',
+ 'log',
+ 'log10',
+ 'make_pair',
+ 'make_shared',
+ 'make_shared_for_overwrite',
+ 'make_tuple',
+ 'make_unique',
+ 'malloc',
+ 'memchr',
+ 'memcmp',
+ 'memcpy',
+ 'memset',
+ 'modf',
+ 'move',
+ 'pow',
+ 'printf',
+ 'putchar',
+ 'puts',
+ 'realloc',
+ 'scanf',
+ 'sin',
+ 'sinh',
+ 'snprintf',
+ 'sprintf',
+ 'sqrt',
+ 'sscanf',
+ 'std',
+ 'stderr',
+ 'stdin',
+ 'stdout',
+ 'strcat',
+ 'strchr',
+ 'strcmp',
+ 'strcpy',
+ 'strcspn',
+ 'strlen',
+ 'strncat',
+ 'strncmp',
+ 'strncpy',
+ 'strpbrk',
+ 'strrchr',
+ 'strspn',
+ 'strstr',
+ 'swap',
+ 'tan',
+ 'tanh',
+ 'terminate',
+ 'to_underlying',
+ 'tolower',
+ 'toupper',
+ 'vfprintf',
+ 'visit',
+ 'vprintf',
+ 'vsprintf'
+ ];
+
+ const LITERALS = [
+ 'NULL',
+ 'false',
+ 'nullopt',
+ 'nullptr',
+ 'true'
+ ];
+
+ // https://en.cppreference.com/w/cpp/keyword
+ const BUILT_IN = [ '_Pragma' ];
+
+ const CPP_KEYWORDS = {
+ type: RESERVED_TYPES,
+ keyword: RESERVED_KEYWORDS,
+ literal: LITERALS,
+ built_in: BUILT_IN,
+ _type_hints: TYPE_HINTS
+ };
+
+ const FUNCTION_DISPATCH = {
+ className: 'function.dispatch',
+ relevance: 0,
+ keywords: {
+ // Only for relevance, not highlighting.
+ _hint: FUNCTION_HINTS },
+ begin: regex.concat(
+ /\b/,
+ /(?!decltype)/,
+ /(?!if)/,
+ /(?!for)/,
+ /(?!switch)/,
+ /(?!while)/,
+ hljs.IDENT_RE,
+ regex.lookahead(/(<[^<>]+>|)\s*\(/))
+ };
+
+ const EXPRESSION_CONTAINS = [
+ FUNCTION_DISPATCH,
+ PREPROCESSOR,
+ CPP_PRIMITIVE_TYPES,
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ NUMBERS,
+ STRINGS
+ ];
+
+ const EXPRESSION_CONTEXT = {
+ // This mode covers expression context where we can't expect a function
+ // definition and shouldn't highlight anything that looks like one:
+ // `return some()`, `else if()`, `(x*sum(1, 2))`
+ variants: [
+ {
+ begin: /=/,
+ end: /;/
+ },
+ {
+ begin: /\(/,
+ end: /\)/
+ },
+ {
+ beginKeywords: 'new throw return else',
+ end: /;/
+ }
+ ],
+ keywords: CPP_KEYWORDS,
+ contains: EXPRESSION_CONTAINS.concat([
+ {
+ begin: /\(/,
+ end: /\)/,
+ keywords: CPP_KEYWORDS,
+ contains: EXPRESSION_CONTAINS.concat([ 'self' ]),
+ relevance: 0
+ }
+ ]),
+ relevance: 0
+ };
+
+ const FUNCTION_DECLARATION = {
+ className: 'function',
+ begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE,
+ returnBegin: true,
+ end: /[{;=]/,
+ excludeEnd: true,
+ keywords: CPP_KEYWORDS,
+ illegal: /[^\w\s\*&:<>.]/,
+ contains: [
+ { // to prevent it from being confused as the function title
+ begin: DECLTYPE_AUTO_RE,
+ keywords: CPP_KEYWORDS,
+ relevance: 0
+ },
+ {
+ begin: FUNCTION_TITLE,
+ returnBegin: true,
+ contains: [ TITLE_MODE ],
+ relevance: 0
+ },
+ // needed because we do not have look-behind on the below rule
+ // to prevent it from grabbing the final : in a :: pair
+ {
+ begin: /::/,
+ relevance: 0
+ },
+ // initializers
+ {
+ begin: /:/,
+ endsWithParent: true,
+ contains: [
+ STRINGS,
+ NUMBERS
+ ]
+ },
+ // allow for multiple declarations, e.g.:
+ // extern void f(int), g(char);
+ {
+ relevance: 0,
+ match: /,/
+ },
+ {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ keywords: CPP_KEYWORDS,
+ relevance: 0,
+ contains: [
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ STRINGS,
+ NUMBERS,
+ CPP_PRIMITIVE_TYPES,
+ // Count matching parentheses.
+ {
+ begin: /\(/,
+ end: /\)/,
+ keywords: CPP_KEYWORDS,
+ relevance: 0,
+ contains: [
+ 'self',
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ STRINGS,
+ NUMBERS,
+ CPP_PRIMITIVE_TYPES
+ ]
+ }
+ ]
+ },
+ CPP_PRIMITIVE_TYPES,
+ C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ PREPROCESSOR
+ ]
+ };
+
+ return {
+ name: 'C++',
+ aliases: [
+ 'cc',
+ 'c++',
+ 'h++',
+ 'hpp',
+ 'hh',
+ 'hxx',
+ 'cxx'
+ ],
+ keywords: CPP_KEYWORDS,
+ illegal: '</',
+ classNameAliases: { 'function.dispatch': 'built_in' },
+ contains: [].concat(
+ EXPRESSION_CONTEXT,
+ FUNCTION_DECLARATION,
+ FUNCTION_DISPATCH,
+ EXPRESSION_CONTAINS,
+ [
+ PREPROCESSOR,
+ { // containers: ie, `vector <int> rooms (9);`
+ begin: '\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)',
+ end: '>',
+ keywords: CPP_KEYWORDS,
+ contains: [
+ 'self',
+ CPP_PRIMITIVE_TYPES
+ ]
+ },
+ {
+ begin: hljs.IDENT_RE + '::',
+ keywords: CPP_KEYWORDS
+ },
+ {
+ match: [
+ // extra complexity to deal with `enum class` and `enum struct`
+ /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,
+ /\s+/,
+ /\w+/
+ ],
+ className: {
+ 1: 'keyword',
+ 3: 'title.class'
+ }
+ }
+ ])
+ };
+ }
+
+ return cpp;
+
+})();
+
+ hljs.registerLanguage('cpp', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/cpp.min.js b/htroot/js/languages/cpp.min.js
new file mode 100644
index 000000000..ec11d3b3c
--- /dev/null
+++ b/htroot/js/languages/cpp.min.js
@@ -0,0 +1,47 @@
+/*! `cpp` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,a=e.COMMENT("//","$",{
+contains:[{begin:/\\\n/}]
+}),n="decltype\\(auto\\)",r="[a-zA-Z_]\\w*::",i="(?!struct)("+n+"|"+t.optional(r)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={
+className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{
+begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
+begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
+end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
+begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
+className:"number",variants:[{
+begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"
+},{
+begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"
+}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
+keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{
+className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},u={
+className:"title",begin:t.optional(r)+e.IDENT_RE,relevance:0
+},d=t.optional(r)+e.IDENT_RE+"\\s*\\(",p={
+type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],
+keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],
+literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],
+_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"]
+},_={className:"function.dispatch",relevance:0,keywords:{
+_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"]
+},
+begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))
+},m=[_,l,s,a,e.C_BLOCK_COMMENT_MODE,o,c],f={variants:[{begin:/=/,end:/;/},{
+begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
+keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p,
+contains:m.concat(["self"]),relevance:0}]),relevance:0},g={className:"function",
+begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
+keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:p,relevance:0},{
+begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{
+begin:/:/,endsWithParent:!0,contains:[c,o]},{relevance:0,match:/,/},{
+className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,
+contains:[a,e.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/,end:/\)/,keywords:p,
+relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,c,o,s]}]
+},s,a,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++",
+aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"</",
+classNameAliases:{"function.dispatch":"built_in"},
+contains:[].concat(f,g,_,m,[l,{
+begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)",
+end:">",keywords:p,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:p},{
+match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],
+className:{1:"keyword",3:"title.class"}}])}}})();hljs.registerLanguage("cpp",e)
+})(); \ No newline at end of file
diff --git a/htroot/js/languages/css.js b/htroot/js/languages/css.js
new file mode 100644
index 000000000..fe5078698
--- /dev/null
+++ b/htroot/js/languages/css.js
@@ -0,0 +1,959 @@
+/*! `css` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ const MODES = (hljs) => {
+ return {
+ IMPORTANT: {
+ scope: 'meta',
+ begin: '!important'
+ },
+ BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,
+ HEXCOLOR: {
+ scope: 'number',
+ begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/
+ },
+ FUNCTION_DISPATCH: {
+ className: "built_in",
+ begin: /[\w-]+(?=\()/
+ },
+ ATTRIBUTE_SELECTOR_MODE: {
+ scope: 'selector-attr',
+ begin: /\[/,
+ end: /\]/,
+ illegal: '$',
+ contains: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE
+ ]
+ },
+ CSS_NUMBER_MODE: {
+ scope: 'number',
+ begin: hljs.NUMBER_RE + '(' +
+ '%|em|ex|ch|rem' +
+ '|vw|vh|vmin|vmax' +
+ '|cm|mm|in|pt|pc|px' +
+ '|deg|grad|rad|turn' +
+ '|s|ms' +
+ '|Hz|kHz' +
+ '|dpi|dpcm|dppx' +
+ ')?',
+ relevance: 0
+ },
+ CSS_VARIABLE: {
+ className: "attr",
+ begin: /--[A-Za-z_][A-Za-z0-9_-]*/
+ }
+ };
+ };
+
+ const HTML_TAGS = [
+ 'a',
+ 'abbr',
+ 'address',
+ 'article',
+ 'aside',
+ 'audio',
+ 'b',
+ 'blockquote',
+ 'body',
+ 'button',
+ 'canvas',
+ 'caption',
+ 'cite',
+ 'code',
+ 'dd',
+ 'del',
+ 'details',
+ 'dfn',
+ 'div',
+ 'dl',
+ 'dt',
+ 'em',
+ 'fieldset',
+ 'figcaption',
+ 'figure',
+ 'footer',
+ 'form',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'header',
+ 'hgroup',
+ 'html',
+ 'i',
+ 'iframe',
+ 'img',
+ 'input',
+ 'ins',
+ 'kbd',
+ 'label',
+ 'legend',
+ 'li',
+ 'main',
+ 'mark',
+ 'menu',
+ 'nav',
+ 'object',
+ 'ol',
+ 'optgroup',
+ 'option',
+ 'p',
+ 'picture',
+ 'q',
+ 'quote',
+ 'samp',
+ 'section',
+ 'select',
+ 'source',
+ 'span',
+ 'strong',
+ 'summary',
+ 'sup',
+ 'table',
+ 'tbody',
+ 'td',
+ 'textarea',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'time',
+ 'tr',
+ 'ul',
+ 'var',
+ 'video'
+ ];
+
+ const SVG_TAGS = [
+ 'defs',
+ 'g',
+ 'marker',
+ 'mask',
+ 'pattern',
+ 'svg',
+ 'switch',
+ 'symbol',
+ 'feBlend',
+ 'feColorMatrix',
+ 'feComponentTransfer',
+ 'feComposite',
+ 'feConvolveMatrix',
+ 'feDiffuseLighting',
+ 'feDisplacementMap',
+ 'feFlood',
+ 'feGaussianBlur',
+ 'feImage',
+ 'feMerge',
+ 'feMorphology',
+ 'feOffset',
+ 'feSpecularLighting',
+ 'feTile',
+ 'feTurbulence',
+ 'linearGradient',
+ 'radialGradient',
+ 'stop',
+ 'circle',
+ 'ellipse',
+ 'image',
+ 'line',
+ 'path',
+ 'polygon',
+ 'polyline',
+ 'rect',
+ 'text',
+ 'use',
+ 'textPath',
+ 'tspan',
+ 'foreignObject',
+ 'clipPath'
+ ];
+
+ const TAGS = [
+ ...HTML_TAGS,
+ ...SVG_TAGS,
+ ];
+
+ // Sorting, then reversing makes sure longer attributes/elements like
+ // `font-weight` are matched fully instead of getting false positives on say `font`
+
+ const MEDIA_FEATURES = [
+ 'any-hover',
+ 'any-pointer',
+ 'aspect-ratio',
+ 'color',
+ 'color-gamut',
+ 'color-index',
+ 'device-aspect-ratio',
+ 'device-height',
+ 'device-width',
+ 'display-mode',
+ 'forced-colors',
+ 'grid',
+ 'height',
+ 'hover',
+ 'inverted-colors',
+ 'monochrome',
+ 'orientation',
+ 'overflow-block',
+ 'overflow-inline',
+ 'pointer',
+ 'prefers-color-scheme',
+ 'prefers-contrast',
+ 'prefers-reduced-motion',
+ 'prefers-reduced-transparency',
+ 'resolution',
+ 'scan',
+ 'scripting',
+ 'update',
+ 'width',
+ // TODO: find a better solution?
+ 'min-width',
+ 'max-width',
+ 'min-height',
+ 'max-height'
+ ].sort().reverse();
+
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes
+ const PSEUDO_CLASSES = [
+ 'active',
+ 'any-link',
+ 'blank',
+ 'checked',
+ 'current',
+ 'default',
+ 'defined',
+ 'dir', // dir()
+ 'disabled',
+ 'drop',
+ 'empty',
+ 'enabled',
+ 'first',
+ 'first-child',
+ 'first-of-type',
+ 'fullscreen',
+ 'future',
+ 'focus',
+ 'focus-visible',
+ 'focus-within',
+ 'has', // has()
+ 'host', // host or host()
+ 'host-context', // host-context()
+ 'hover',
+ 'indeterminate',
+ 'in-range',
+ 'invalid',
+ 'is', // is()
+ 'lang', // lang()
+ 'last-child',
+ 'last-of-type',
+ 'left',
+ 'link',
+ 'local-link',
+ 'not', // not()
+ 'nth-child', // nth-child()
+ 'nth-col', // nth-col()
+ 'nth-last-child', // nth-last-child()
+ 'nth-last-col', // nth-last-col()
+ 'nth-last-of-type', //nth-last-of-type()
+ 'nth-of-type', //nth-of-type()
+ 'only-child',
+ 'only-of-type',
+ 'optional',
+ 'out-of-range',
+ 'past',
+ 'placeholder-shown',
+ 'read-only',
+ 'read-write',
+ 'required',
+ 'right',
+ 'root',
+ 'scope',
+ 'target',
+ 'target-within',
+ 'user-invalid',
+ 'valid',
+ 'visited',
+ 'where' // where()
+ ].sort().reverse();
+
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements
+ const PSEUDO_ELEMENTS = [
+ 'after',
+ 'backdrop',
+ 'before',
+ 'cue',
+ 'cue-region',
+ 'first-letter',
+ 'first-line',
+ 'grammar-error',
+ 'marker',
+ 'part',
+ 'placeholder',
+ 'selection',
+ 'slotted',
+ 'spelling-error'
+ ].sort().reverse();
+
+ const ATTRIBUTES = [
+ 'accent-color',
+ 'align-content',
+ 'align-items',
+ 'align-self',
+ 'alignment-baseline',
+ 'all',
+ 'anchor-name',
+ 'animation',
+ 'animation-composition',
+ 'animation-delay',
+ 'animation-direction',
+ 'animation-duration',
+ 'animation-fill-mode',
+ 'animation-iteration-count',
+ 'animation-name',
+ 'animation-play-state',
+ 'animation-range',
+ 'animation-range-end',
+ 'animation-range-start',
+ 'animation-timeline',
+ 'animation-timing-function',
+ 'appearance',
+ 'aspect-ratio',
+ 'backdrop-filter',
+ 'backface-visibility',
+ 'background',
+ 'background-attachment',
+ 'background-blend-mode',
+ 'background-clip',
+ 'background-color',
+ 'background-image',
+ 'background-origin',
+ 'background-position',
+ 'background-position-x',
+ 'background-position-y',
+ 'background-repeat',
+ 'background-size',
+ 'baseline-shift',
+ 'block-size',
+ 'border',
+ 'border-block',
+ 'border-block-color',
+ 'border-block-end',
+ 'border-block-end-color',
+ 'border-block-end-style',
+ 'border-block-end-width',
+ 'border-block-start',
+ 'border-block-start-color',
+ 'border-block-start-style',
+ 'border-block-start-width',
+ 'border-block-style',
+ 'border-block-width',
+ 'border-bottom',
+ 'border-bottom-color',
+ 'border-bottom-left-radius',
+ 'border-bottom-right-radius',
+ 'border-bottom-style',
+ 'border-bottom-width',
+ 'border-collapse',
+ 'border-color',
+ 'border-end-end-radius',
+ 'border-end-start-radius',
+ 'border-image',
+ 'border-image-outset',
+ 'border-image-repeat',
+ 'border-image-slice',
+ 'border-image-source',
+ 'border-image-width',
+ 'border-inline',
+ 'border-inline-color',
+ 'border-inline-end',
+ 'border-inline-end-color',
+ 'border-inline-end-style',
+ 'border-inline-end-width',
+ 'border-inline-start',
+ 'border-inline-start-color',
+ 'border-inline-start-style',
+ 'border-inline-start-width',
+ 'border-inline-style',
+ 'border-inline-width',
+ 'border-left',
+ 'border-left-color',
+ 'border-left-style',
+ 'border-left-width',
+ 'border-radius',
+ 'border-right',
+ 'border-right-color',
+ 'border-right-style',
+ 'border-right-width',
+ 'border-spacing',
+ 'border-start-end-radius',
+ 'border-start-start-radius',
+ 'border-style',
+ 'border-top',
+ 'border-top-color',
+ 'border-top-left-radius',
+ 'border-top-right-radius',
+ 'border-top-style',
+ 'border-top-width',
+ 'border-width',
+ 'bottom',
+ 'box-align',
+ 'box-decoration-break',
+ 'box-direction',
+ 'box-flex',
+ 'box-flex-group',
+ 'box-lines',
+ 'box-ordinal-group',
+ 'box-orient',
+ 'box-pack',
+ 'box-shadow',
+ 'box-sizing',
+ 'break-after',
+ 'break-before',
+ 'break-inside',
+ 'caption-side',
+ 'caret-color',
+ 'clear',
+ 'clip',
+ 'clip-path',
+ 'clip-rule',
+ 'color',
+ 'color-interpolation',
+ 'color-interpolation-filters',
+ 'color-profile',
+ 'color-rendering',
+ 'color-scheme',
+ 'column-count',
+ 'column-fill',
+ 'column-gap',
+ 'column-rule',
+ 'column-rule-color',
+ 'column-rule-style',
+ 'column-rule-width',
+ 'column-span',
+ 'column-width',
+ 'columns',
+ 'contain',
+ 'contain-intrinsic-block-size',
+ 'contain-intrinsic-height',
+ 'contain-intrinsic-inline-size',
+ 'contain-intrinsic-size',
+ 'contain-intrinsic-width',
+ 'container',
+ 'container-name',
+ 'container-type',
+ 'content',
+ 'content-visibility',
+ 'counter-increment',
+ 'counter-reset',
+ 'counter-set',
+ 'cue',
+ 'cue-after',
+ 'cue-before',
+ 'cursor',
+ 'cx',
+ 'cy',
+ 'direction',
+ 'display',
+ 'dominant-baseline',
+ 'empty-cells',
+ 'enable-background',
+ 'field-sizing',
+ 'fill',
+ 'fill-opacity',
+ 'fill-rule',
+ 'filter',
+ 'flex',
+ 'flex-basis',
+ 'flex-direction',
+ 'flex-flow',
+ 'flex-grow',
+ 'flex-shrink',
+ 'flex-wrap',
+ 'float',
+ 'flood-color',
+ 'flood-opacity',
+ 'flow',
+ 'font',
+ 'font-display',
+ 'font-family',
+ 'font-feature-settings',
+ 'font-kerning',
+ 'font-language-override',
+ 'font-optical-sizing',
+ 'font-palette',
+ 'font-size',
+ 'font-size-adjust',
+ 'font-smooth',
+ 'font-smoothing',
+ 'font-stretch',
+ 'font-style',
+ 'font-synthesis',
+ 'font-synthesis-position',
+ 'font-synthesis-small-caps',
+ 'font-synthesis-style',
+ 'font-synthesis-weight',
+ 'font-variant',
+ 'font-variant-alternates',
+ 'font-variant-caps',
+ 'font-variant-east-asian',
+ 'font-variant-emoji',
+ 'font-variant-ligatures',
+ 'font-variant-numeric',
+ 'font-variant-position',
+ 'font-variation-settings',
+ 'font-weight',
+ 'forced-color-adjust',
+ 'gap',
+ 'glyph-orientation-horizontal',
+ 'glyph-orientation-vertical',
+ 'grid',
+ 'grid-area',
+ 'grid-auto-columns',
+ 'grid-auto-flow',
+ 'grid-auto-rows',
+ 'grid-column',
+ 'grid-column-end',
+ 'grid-column-start',
+ 'grid-gap',
+ 'grid-row',
+ 'grid-row-end',
+ 'grid-row-start',
+ 'grid-template',
+ 'grid-template-areas',
+ 'grid-template-columns',
+ 'grid-template-rows',
+ 'hanging-punctuation',
+ 'height',
+ 'hyphenate-character',
+ 'hyphenate-limit-chars',
+ 'hyphens',
+ 'icon',
+ 'image-orientation',
+ 'image-rendering',
+ 'image-resolution',
+ 'ime-mode',
+ 'initial-letter',
+ 'initial-letter-align',
+ 'inline-size',
+ 'inset',
+ 'inset-area',
+ 'inset-block',
+ 'inset-block-end',
+ 'inset-block-start',
+ 'inset-inline',
+ 'inset-inline-end',
+ 'inset-inline-start',
+ 'isolation',
+ 'justify-content',
+ 'justify-items',
+ 'justify-self',
+ 'kerning',
+ 'left',
+ 'letter-spacing',
+ 'lighting-color',
+ 'line-break',
+ 'line-height',
+ 'line-height-step',
+ 'list-style',
+ 'list-style-image',
+ 'list-style-position',
+ 'list-style-type',
+ 'margin',
+ 'margin-block',
+ 'margin-block-end',
+ 'margin-block-start',
+ 'margin-bottom',
+ 'margin-inline',
+ 'margin-inline-end',
+ 'margin-inline-start',
+ 'margin-left',
+ 'margin-right',
+ 'margin-top',
+ 'margin-trim',
+ 'marker',
+ 'marker-end',
+ 'marker-mid',
+ 'marker-start',
+ 'marks',
+ 'mask',
+ 'mask-border',
+ 'mask-border-mode',
+ 'mask-border-outset',
+ 'mask-border-repeat',
+ 'mask-border-slice',
+ 'mask-border-source',
+ 'mask-border-width',
+ 'mask-clip',
+ 'mask-composite',
+ 'mask-image',
+ 'mask-mode',
+ 'mask-origin',
+ 'mask-position',
+ 'mask-repeat',
+ 'mask-size',
+ 'mask-type',
+ 'masonry-auto-flow',
+ 'math-depth',
+ 'math-shift',
+ 'math-style',
+ 'max-block-size',
+ 'max-height',
+ 'max-inline-size',
+ 'max-width',
+ 'min-block-size',
+ 'min-height',
+ 'min-inline-size',
+ 'min-width',
+ 'mix-blend-mode',
+ 'nav-down',
+ 'nav-index',
+ 'nav-left',
+ 'nav-right',
+ 'nav-up',
+ 'none',
+ 'normal',
+ 'object-fit',
+ 'object-position',
+ 'offset',
+ 'offset-anchor',
+ 'offset-distance',
+ 'offset-path',
+ 'offset-position',
+ 'offset-rotate',
+ 'opacity',
+ 'order',
+ 'orphans',
+ 'outline',
+ 'outline-color',
+ 'outline-offset',
+ 'outline-style',
+ 'outline-width',
+ 'overflow',
+ 'overflow-anchor',
+ 'overflow-block',
+ 'overflow-clip-margin',
+ 'overflow-inline',
+ 'overflow-wrap',
+ 'overflow-x',
+ 'overflow-y',
+ 'overlay',
+ 'overscroll-behavior',
+ 'overscroll-behavior-block',
+ 'overscroll-behavior-inline',
+ 'overscroll-behavior-x',
+ 'overscroll-behavior-y',
+ 'padding',
+ 'padding-block',
+ 'padding-block-end',
+ 'padding-block-start',
+ 'padding-bottom',
+ 'padding-inline',
+ 'padding-inline-end',
+ 'padding-inline-start',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top',
+ 'page',
+ 'page-break-after',
+ 'page-break-before',
+ 'page-break-inside',
+ 'paint-order',
+ 'pause',
+ 'pause-after',
+ 'pause-before',
+ 'perspective',
+ 'perspective-origin',
+ 'place-content',
+ 'place-items',
+ 'place-self',
+ 'pointer-events',
+ 'position',
+ 'position-anchor',
+ 'position-visibility',
+ 'print-color-adjust',
+ 'quotes',
+ 'r',
+ 'resize',
+ 'rest',
+ 'rest-after',
+ 'rest-before',
+ 'right',
+ 'rotate',
+ 'row-gap',
+ 'ruby-align',
+ 'ruby-position',
+ 'scale',
+ 'scroll-behavior',
+ 'scroll-margin',
+ 'scroll-margin-block',
+ 'scroll-margin-block-end',
+ 'scroll-margin-block-start',
+ 'scroll-margin-bottom',
+ 'scroll-margin-inline',
+ 'scroll-margin-inline-end',
+ 'scroll-margin-inline-start',
+ 'scroll-margin-left',
+ 'scroll-margin-right',
+ 'scroll-margin-top',
+ 'scroll-padding',
+ 'scroll-padding-block',
+ 'scroll-padding-block-end',
+ 'scroll-padding-block-start',
+ 'scroll-padding-bottom',
+ 'scroll-padding-inline',
+ 'scroll-padding-inline-end',
+ 'scroll-padding-inline-start',
+ 'scroll-padding-left',
+ 'scroll-padding-right',
+ 'scroll-padding-top',
+ 'scroll-snap-align',
+ 'scroll-snap-stop',
+ 'scroll-snap-type',
+ 'scroll-timeline',
+ 'scroll-timeline-axis',
+ 'scroll-timeline-name',
+ 'scrollbar-color',
+ 'scrollbar-gutter',
+ 'scrollbar-width',
+ 'shape-image-threshold',
+ 'shape-margin',
+ 'shape-outside',
+ 'shape-rendering',
+ 'speak',
+ 'speak-as',
+ 'src', // @font-face
+ 'stop-color',
+ 'stop-opacity',
+ 'stroke',
+ 'stroke-dasharray',
+ 'stroke-dashoffset',
+ 'stroke-linecap',
+ 'stroke-linejoin',
+ 'stroke-miterlimit',
+ 'stroke-opacity',
+ 'stroke-width',
+ 'tab-size',
+ 'table-layout',
+ 'text-align',
+ 'text-align-all',
+ 'text-align-last',
+ 'text-anchor',
+ 'text-combine-upright',
+ 'text-decoration',
+ 'text-decoration-color',
+ 'text-decoration-line',
+ 'text-decoration-skip',
+ 'text-decoration-skip-ink',
+ 'text-decoration-style',
+ 'text-decoration-thickness',
+ 'text-emphasis',
+ 'text-emphasis-color',
+ 'text-emphasis-position',
+ 'text-emphasis-style',
+ 'text-indent',
+ 'text-justify',
+ 'text-orientation',
+ 'text-overflow',
+ 'text-rendering',
+ 'text-shadow',
+ 'text-size-adjust',
+ 'text-transform',
+ 'text-underline-offset',
+ 'text-underline-position',
+ 'text-wrap',
+ 'text-wrap-mode',
+ 'text-wrap-style',
+ 'timeline-scope',
+ 'top',
+ 'touch-action',
+ 'transform',
+ 'transform-box',
+ 'transform-origin',
+ 'transform-style',
+ 'transition',
+ 'transition-behavior',
+ 'transition-delay',
+ 'transition-duration',
+ 'transition-property',
+ 'transition-timing-function',
+ 'translate',
+ 'unicode-bidi',
+ 'user-modify',
+ 'user-select',
+ 'vector-effect',
+ 'vertical-align',
+ 'view-timeline',
+ 'view-timeline-axis',
+ 'view-timeline-inset',
+ 'view-timeline-name',
+ 'view-transition-name',
+ 'visibility',
+ 'voice-balance',
+ 'voice-duration',
+ 'voice-family',
+ 'voice-pitch',
+ 'voice-range',
+ 'voice-rate',
+ 'voice-stress',
+ 'voice-volume',
+ 'white-space',
+ 'white-space-collapse',
+ 'widows',
+ 'width',
+ 'will-change',
+ 'word-break',
+ 'word-spacing',
+ 'word-wrap',
+ 'writing-mode',
+ 'x',
+ 'y',
+ 'z-index',
+ 'zoom'
+ ].sort().reverse();
+
+ /*
+ Language: CSS
+ Category: common, css, web
+ Website: https://developer.mozilla.org/en-US/docs/Web/CSS
+ */
+
+
+ /** @type LanguageFn */
+ function css(hljs) {
+ const regex = hljs.regex;
+ const modes = MODES(hljs);
+ const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };
+ const AT_MODIFIERS = "and or not only";
+ const AT_PROPERTY_RE = /@-?\w[\w]*(-\w+)*/; // @-webkit-keyframes
+ const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';
+ const STRINGS = [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE
+ ];
+
+ return {
+ name: 'CSS',
+ case_insensitive: true,
+ illegal: /[=|'\$]/,
+ keywords: { keyframePosition: "from to" },
+ classNameAliases: {
+ // for visual continuity with `tag {}` and because we
+ // don't have a great class for this?
+ keyframePosition: "selector-tag" },
+ contains: [
+ modes.BLOCK_COMMENT,
+ VENDOR_PREFIX,
+ // to recognize keyframe 40% etc which are outside the scope of our
+ // attribute value mode
+ modes.CSS_NUMBER_MODE,
+ {
+ className: 'selector-id',
+ begin: /#[A-Za-z0-9_-]+/,
+ relevance: 0
+ },
+ {
+ className: 'selector-class',
+ begin: '\\.' + IDENT_RE,
+ relevance: 0
+ },
+ modes.ATTRIBUTE_SELECTOR_MODE,
+ {
+ className: 'selector-pseudo',
+ variants: [
+ { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },
+ { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }
+ ]
+ },
+ // we may actually need this (12/2020)
+ // { // pseudo-selector params
+ // begin: /\(/,
+ // end: /\)/,
+ // contains: [ hljs.CSS_NUMBER_MODE ]
+ // },
+ modes.CSS_VARIABLE,
+ {
+ className: 'attribute',
+ begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b'
+ },
+ // attribute values
+ {
+ begin: /:/,
+ end: /[;}{]/,
+ contains: [
+ modes.BLOCK_COMMENT,
+ modes.HEXCOLOR,
+ modes.IMPORTANT,
+ modes.CSS_NUMBER_MODE,
+ ...STRINGS,
+ // needed to highlight these as strings and to avoid issues with
+ // illegal characters that might be inside urls that would tigger the
+ // languages illegal stack
+ {
+ begin: /(url|data-uri)\(/,
+ end: /\)/,
+ relevance: 0, // from keywords
+ keywords: { built_in: "url data-uri" },
+ contains: [
+ ...STRINGS,
+ {
+ className: "string",
+ // any character other than `)` as in `url()` will be the start
+ // of a string, which ends with `)` (from the parent mode)
+ begin: /[^)]/,
+ endsWithParent: true,
+ excludeEnd: true
+ }
+ ]
+ },
+ modes.FUNCTION_DISPATCH
+ ]
+ },
+ {
+ begin: regex.lookahead(/@/),
+ end: '[{;]',
+ relevance: 0,
+ illegal: /:/, // break on Less variables @var: ...
+ contains: [
+ {
+ className: 'keyword',
+ begin: AT_PROPERTY_RE
+ },
+ {
+ begin: /\s/,
+ endsWithParent: true,
+ excludeEnd: true,
+ relevance: 0,
+ keywords: {
+ $pattern: /[a-z-]+/,
+ keyword: AT_MODIFIERS,
+ attribute: MEDIA_FEATURES.join(" ")
+ },
+ contains: [
+ {
+ begin: /[a-z-]+(?=:)/,
+ className: "attribute"
+ },
+ ...STRINGS,
+ modes.CSS_NUMBER_MODE
+ ]
+ }
+ ]
+ },
+ {
+ className: 'selector-tag',
+ begin: '\\b(' + TAGS.join('|') + ')\\b'
+ }
+ ]
+ };
+ }
+
+ return css;
+
+})();
+
+ hljs.registerLanguage('css', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/css.min.js b/htroot/js/languages/css.min.js
new file mode 100644
index 000000000..dd991357c
--- /dev/null
+++ b/htroot/js/languages/css.min.js
@@ -0,0 +1,31 @@
+/*! `css` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],i=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),t=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),r=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse()
+;return n=>{const a=n.regex,l=(e=>({IMPORTANT:{scope:"meta",begin:"!important"},
+BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",
+begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{
+className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{
+scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",
+contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{
+scope:"number",
+begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",
+relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}
+}))(n),s=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS",
+case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},
+classNameAliases:{keyframePosition:"selector-tag"},contains:[l.BLOCK_COMMENT,{
+begin:/-(webkit|moz|ms|o)-(?=[a-z])/},l.CSS_NUMBER_MODE,{
+className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{
+className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0
+},l.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{
+begin:":("+t.join("|")+")"},{begin:":(:)?("+o.join("|")+")"}]},l.CSS_VARIABLE,{
+className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,
+contains:[l.BLOCK_COMMENT,l.HEXCOLOR,l.IMPORTANT,l.CSS_NUMBER_MODE,...s,{
+begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"
+},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0,
+excludeEnd:!0}]},l.FUNCTION_DISPATCH]},{begin:a.lookahead(/@/),end:"[{;]",
+relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/
+},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{
+$pattern:/[a-z-]+/,keyword:"and or not only",attribute:i.join(" ")},contains:[{
+begin:/[a-z-]+(?=:)/,className:"attribute"},...s,l.CSS_NUMBER_MODE]}]},{
+className:"selector-tag",begin:"\\b("+e.join("|")+")\\b"}]}}})()
+;hljs.registerLanguage("css",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/diff.js b/htroot/js/languages/diff.js
new file mode 100644
index 000000000..c2e845c2c
--- /dev/null
+++ b/htroot/js/languages/diff.js
@@ -0,0 +1,72 @@
+/*! `diff` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Diff
+ Description: Unified and context diff
+ Author: Vasily Polovnyov <vast@whiteants.net>
+ Website: https://www.gnu.org/software/diffutils/
+ Category: common
+ */
+
+ /** @type LanguageFn */
+ function diff(hljs) {
+ const regex = hljs.regex;
+ return {
+ name: 'Diff',
+ aliases: [ 'patch' ],
+ contains: [
+ {
+ className: 'meta',
+ relevance: 10,
+ match: regex.either(
+ /^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,
+ /^\*\*\* +\d+,\d+ +\*\*\*\*$/,
+ /^--- +\d+,\d+ +----$/
+ )
+ },
+ {
+ className: 'comment',
+ variants: [
+ {
+ begin: regex.either(
+ /Index: /,
+ /^index/,
+ /={3,}/,
+ /^-{3}/,
+ /^\*{3} /,
+ /^\+{3}/,
+ /^diff --git/
+ ),
+ end: /$/
+ },
+ { match: /^\*{15}$/ }
+ ]
+ },
+ {
+ className: 'addition',
+ begin: /^\+/,
+ end: /$/
+ },
+ {
+ className: 'deletion',
+ begin: /^-/,
+ end: /$/
+ },
+ {
+ className: 'addition',
+ begin: /^!/,
+ end: /$/
+ }
+ ]
+ };
+ }
+
+ return diff;
+
+})();
+
+ hljs.registerLanguage('diff', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/diff.min.js b/htroot/js/languages/diff.min.js
new file mode 100644
index 000000000..7178f67d5
--- /dev/null
+++ b/htroot/js/languages/diff.min.js
@@ -0,0 +1,9 @@
+/*! `diff` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=e.regex;return{name:"Diff",
+aliases:["patch"],contains:[{className:"meta",relevance:10,
+match:a.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)
+},{className:"comment",variants:[{
+begin:a.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),
+end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{
+className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,
+end:/$/}]}}})();hljs.registerLanguage("diff",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/dockerfile.js b/htroot/js/languages/dockerfile.js
new file mode 100644
index 000000000..ba6d110c3
--- /dev/null
+++ b/htroot/js/languages/dockerfile.js
@@ -0,0 +1,54 @@
+/*! `dockerfile` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Dockerfile
+ Requires: bash.js
+ Author: Alexis Hénaut <alexis@henaut.net>
+ Description: language definition for Dockerfile files
+ Website: https://docs.docker.com/engine/reference/builder/
+ Category: config
+ */
+
+ /** @type LanguageFn */
+ function dockerfile(hljs) {
+ const KEYWORDS = [
+ "from",
+ "maintainer",
+ "expose",
+ "env",
+ "arg",
+ "user",
+ "onbuild",
+ "stopsignal"
+ ];
+ return {
+ name: 'Dockerfile',
+ aliases: [ 'docker' ],
+ case_insensitive: true,
+ keywords: KEYWORDS,
+ contains: [
+ hljs.HASH_COMMENT_MODE,
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.NUMBER_MODE,
+ {
+ beginKeywords: 'run cmd entrypoint volume add copy workdir label healthcheck shell',
+ starts: {
+ end: /[^\\]$/,
+ subLanguage: 'bash'
+ }
+ }
+ ],
+ illegal: '</'
+ };
+ }
+
+ return dockerfile;
+
+})();
+
+ hljs.registerLanguage('dockerfile', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/dockerfile.min.js b/htroot/js/languages/dockerfile.min.js
new file mode 100644
index 000000000..86f7e8c35
--- /dev/null
+++ b/htroot/js/languages/dockerfile.min.js
@@ -0,0 +1,8 @@
+/*! `dockerfile` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>({name:"Dockerfile",aliases:["docker"],
+case_insensitive:!0,
+keywords:["from","maintainer","expose","env","arg","user","onbuild","stopsignal"],
+contains:[e.HASH_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{
+beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell",
+starts:{end:/[^\\]$/,subLanguage:"bash"}}],illegal:"</"})})()
+;hljs.registerLanguage("dockerfile",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/ebnf.js b/htroot/js/languages/ebnf.js
new file mode 100644
index 000000000..267d8a086
--- /dev/null
+++ b/htroot/js/languages/ebnf.js
@@ -0,0 +1,64 @@
+/*! `ebnf` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Extended Backus-Naur Form
+ Author: Alex McKibben <alex@nullscope.net>
+ Website: https://en.wikipedia.org/wiki/Extended_Backus–Naur_form
+ Category: syntax
+ */
+
+ /** @type LanguageFn */
+ function ebnf(hljs) {
+ const commentMode = hljs.COMMENT(/\(\*/, /\*\)/);
+
+ const nonTerminalMode = {
+ className: "attribute",
+ begin: /^[ ]*[a-zA-Z]+([\s_-]+[a-zA-Z]+)*/
+ };
+
+ const specialSequenceMode = {
+ className: "meta",
+ begin: /\?.*\?/
+ };
+
+ const ruleBodyMode = {
+ begin: /=/,
+ end: /[.;]/,
+ contains: [
+ commentMode,
+ specialSequenceMode,
+ {
+ // terminals
+ className: 'string',
+ variants: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ {
+ begin: '`',
+ end: '`'
+ }
+ ]
+ }
+ ]
+ };
+
+ return {
+ name: 'Extended Backus-Naur Form',
+ illegal: /\S/,
+ contains: [
+ commentMode,
+ nonTerminalMode,
+ ruleBodyMode
+ ]
+ };
+ }
+
+ return ebnf;
+
+})();
+
+ hljs.registerLanguage('ebnf', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/ebnf.min.js b/htroot/js/languages/ebnf.min.js
new file mode 100644
index 000000000..47979220d
--- /dev/null
+++ b/htroot/js/languages/ebnf.min.js
@@ -0,0 +1,7 @@
+/*! `ebnf` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=e.COMMENT(/\(\*/,/\*\)/)
+;return{name:"Extended Backus-Naur Form",illegal:/\S/,contains:[a,{
+className:"attribute",begin:/^[ ]*[a-zA-Z]+([\s_-]+[a-zA-Z]+)*/},{begin:/=/,
+end:/[.;]/,contains:[a,{className:"meta",begin:/\?.*\?/},{className:"string",
+variants:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{begin:"`",end:"`"}]}]}]}}})()
+;hljs.registerLanguage("ebnf",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/fortran.js b/htroot/js/languages/fortran.js
new file mode 100644
index 000000000..96634dca8
--- /dev/null
+++ b/htroot/js/languages/fortran.js
@@ -0,0 +1,584 @@
+/*! `fortran` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Fortran
+ Author: Anthony Scemama <scemama@irsamc.ups-tlse.fr>
+ Website: https://en.wikipedia.org/wiki/Fortran
+ Category: scientific
+ */
+
+ /** @type LanguageFn */
+ function fortran(hljs) {
+ const regex = hljs.regex;
+ const PARAMS = {
+ className: 'params',
+ begin: '\\(',
+ end: '\\)'
+ };
+
+ const COMMENT = { variants: [
+ hljs.COMMENT('!', '$', { relevance: 0 }),
+ // allow FORTRAN 77 style comments
+ hljs.COMMENT('^C[ ]', '$', { relevance: 0 }),
+ hljs.COMMENT('^C$', '$', { relevance: 0 })
+ ] };
+
+ // regex in both fortran and irpf90 should match
+ const OPTIONAL_NUMBER_SUFFIX = /(_[a-z_\d]+)?/;
+ const OPTIONAL_NUMBER_EXP = /([de][+-]?\d+)?/;
+ const NUMBER = {
+ className: 'number',
+ variants: [
+ { begin: regex.concat(/\b\d+/, /\.(\d*)/, OPTIONAL_NUMBER_EXP, OPTIONAL_NUMBER_SUFFIX) },
+ { begin: regex.concat(/\b\d+/, OPTIONAL_NUMBER_EXP, OPTIONAL_NUMBER_SUFFIX) },
+ { begin: regex.concat(/\.\d+/, OPTIONAL_NUMBER_EXP, OPTIONAL_NUMBER_SUFFIX) }
+ ],
+ relevance: 0
+ };
+
+ const FUNCTION_DEF = {
+ className: 'function',
+ beginKeywords: 'subroutine function program',
+ illegal: '[${=\\n]',
+ contains: [
+ hljs.UNDERSCORE_TITLE_MODE,
+ PARAMS
+ ]
+ };
+
+ const STRING = {
+ className: 'string',
+ relevance: 0,
+ variants: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE
+ ]
+ };
+
+ const KEYWORDS = [
+ "kind",
+ "do",
+ "concurrent",
+ "local",
+ "shared",
+ "while",
+ "private",
+ "call",
+ "intrinsic",
+ "where",
+ "elsewhere",
+ "type",
+ "endtype",
+ "endmodule",
+ "endselect",
+ "endinterface",
+ "end",
+ "enddo",
+ "endif",
+ "if",
+ "forall",
+ "endforall",
+ "only",
+ "contains",
+ "default",
+ "return",
+ "stop",
+ "then",
+ "block",
+ "endblock",
+ "endassociate",
+ "public",
+ "subroutine|10",
+ "function",
+ "program",
+ ".and.",
+ ".or.",
+ ".not.",
+ ".le.",
+ ".eq.",
+ ".ge.",
+ ".gt.",
+ ".lt.",
+ "goto",
+ "save",
+ "else",
+ "use",
+ "module",
+ "select",
+ "case",
+ "access",
+ "blank",
+ "direct",
+ "exist",
+ "file",
+ "fmt",
+ "form",
+ "formatted",
+ "iostat",
+ "name",
+ "named",
+ "nextrec",
+ "number",
+ "opened",
+ "rec",
+ "recl",
+ "sequential",
+ "status",
+ "unformatted",
+ "unit",
+ "continue",
+ "format",
+ "pause",
+ "cycle",
+ "exit",
+ "c_null_char",
+ "c_alert",
+ "c_backspace",
+ "c_form_feed",
+ "flush",
+ "wait",
+ "decimal",
+ "round",
+ "iomsg",
+ "synchronous",
+ "nopass",
+ "non_overridable",
+ "pass",
+ "protected",
+ "volatile",
+ "abstract",
+ "extends",
+ "import",
+ "non_intrinsic",
+ "value",
+ "deferred",
+ "generic",
+ "final",
+ "enumerator",
+ "class",
+ "associate",
+ "bind",
+ "enum",
+ "c_int",
+ "c_short",
+ "c_long",
+ "c_long_long",
+ "c_signed_char",
+ "c_size_t",
+ "c_int8_t",
+ "c_int16_t",
+ "c_int32_t",
+ "c_int64_t",
+ "c_int_least8_t",
+ "c_int_least16_t",
+ "c_int_least32_t",
+ "c_int_least64_t",
+ "c_int_fast8_t",
+ "c_int_fast16_t",
+ "c_int_fast32_t",
+ "c_int_fast64_t",
+ "c_intmax_t",
+ "C_intptr_t",
+ "c_float",
+ "c_double",
+ "c_long_double",
+ "c_float_complex",
+ "c_double_complex",
+ "c_long_double_complex",
+ "c_bool",
+ "c_char",
+ "c_null_ptr",
+ "c_null_funptr",
+ "c_new_line",
+ "c_carriage_return",
+ "c_horizontal_tab",
+ "c_vertical_tab",
+ "iso_c_binding",
+ "c_loc",
+ "c_funloc",
+ "c_associated",
+ "c_f_pointer",
+ "c_ptr",
+ "c_funptr",
+ "iso_fortran_env",
+ "character_storage_size",
+ "error_unit",
+ "file_storage_size",
+ "input_unit",
+ "iostat_end",
+ "iostat_eor",
+ "numeric_storage_size",
+ "output_unit",
+ "c_f_procpointer",
+ "ieee_arithmetic",
+ "ieee_support_underflow_control",
+ "ieee_get_underflow_mode",
+ "ieee_set_underflow_mode",
+ "newunit",
+ "contiguous",
+ "recursive",
+ "pad",
+ "position",
+ "action",
+ "delim",
+ "readwrite",
+ "eor",
+ "advance",
+ "nml",
+ "interface",
+ "procedure",
+ "namelist",
+ "include",
+ "sequence",
+ "elemental",
+ "pure",
+ "impure",
+ "integer",
+ "real",
+ "character",
+ "complex",
+ "logical",
+ "codimension",
+ "dimension",
+ "allocatable|10",
+ "parameter",
+ "external",
+ "implicit|10",
+ "none",
+ "double",
+ "precision",
+ "assign",
+ "intent",
+ "optional",
+ "pointer",
+ "target",
+ "in",
+ "out",
+ "common",
+ "equivalence",
+ "data"
+ ];
+ const LITERALS = [
+ ".False.",
+ ".True."
+ ];
+ const BUILT_INS = [
+ "alog",
+ "alog10",
+ "amax0",
+ "amax1",
+ "amin0",
+ "amin1",
+ "amod",
+ "cabs",
+ "ccos",
+ "cexp",
+ "clog",
+ "csin",
+ "csqrt",
+ "dabs",
+ "dacos",
+ "dasin",
+ "datan",
+ "datan2",
+ "dcos",
+ "dcosh",
+ "ddim",
+ "dexp",
+ "dint",
+ "dlog",
+ "dlog10",
+ "dmax1",
+ "dmin1",
+ "dmod",
+ "dnint",
+ "dsign",
+ "dsin",
+ "dsinh",
+ "dsqrt",
+ "dtan",
+ "dtanh",
+ "float",
+ "iabs",
+ "idim",
+ "idint",
+ "idnint",
+ "ifix",
+ "isign",
+ "max0",
+ "max1",
+ "min0",
+ "min1",
+ "sngl",
+ "algama",
+ "cdabs",
+ "cdcos",
+ "cdexp",
+ "cdlog",
+ "cdsin",
+ "cdsqrt",
+ "cqabs",
+ "cqcos",
+ "cqexp",
+ "cqlog",
+ "cqsin",
+ "cqsqrt",
+ "dcmplx",
+ "dconjg",
+ "derf",
+ "derfc",
+ "dfloat",
+ "dgamma",
+ "dimag",
+ "dlgama",
+ "iqint",
+ "qabs",
+ "qacos",
+ "qasin",
+ "qatan",
+ "qatan2",
+ "qcmplx",
+ "qconjg",
+ "qcos",
+ "qcosh",
+ "qdim",
+ "qerf",
+ "qerfc",
+ "qexp",
+ "qgamma",
+ "qimag",
+ "qlgama",
+ "qlog",
+ "qlog10",
+ "qmax1",
+ "qmin1",
+ "qmod",
+ "qnint",
+ "qsign",
+ "qsin",
+ "qsinh",
+ "qsqrt",
+ "qtan",
+ "qtanh",
+ "abs",
+ "acos",
+ "aimag",
+ "aint",
+ "anint",
+ "asin",
+ "atan",
+ "atan2",
+ "char",
+ "cmplx",
+ "conjg",
+ "cos",
+ "cosh",
+ "exp",
+ "ichar",
+ "index",
+ "int",
+ "log",
+ "log10",
+ "max",
+ "min",
+ "nint",
+ "sign",
+ "sin",
+ "sinh",
+ "sqrt",
+ "tan",
+ "tanh",
+ "print",
+ "write",
+ "dim",
+ "lge",
+ "lgt",
+ "lle",
+ "llt",
+ "mod",
+ "nullify",
+ "allocate",
+ "deallocate",
+ "adjustl",
+ "adjustr",
+ "all",
+ "allocated",
+ "any",
+ "associated",
+ "bit_size",
+ "btest",
+ "ceiling",
+ "count",
+ "cshift",
+ "date_and_time",
+ "digits",
+ "dot_product",
+ "eoshift",
+ "epsilon",
+ "exponent",
+ "floor",
+ "fraction",
+ "huge",
+ "iand",
+ "ibclr",
+ "ibits",
+ "ibset",
+ "ieor",
+ "ior",
+ "ishft",
+ "ishftc",
+ "lbound",
+ "len_trim",
+ "matmul",
+ "maxexponent",
+ "maxloc",
+ "maxval",
+ "merge",
+ "minexponent",
+ "minloc",
+ "minval",
+ "modulo",
+ "mvbits",
+ "nearest",
+ "pack",
+ "present",
+ "product",
+ "radix",
+ "random_number",
+ "random_seed",
+ "range",
+ "repeat",
+ "reshape",
+ "rrspacing",
+ "scale",
+ "scan",
+ "selected_int_kind",
+ "selected_real_kind",
+ "set_exponent",
+ "shape",
+ "size",
+ "spacing",
+ "spread",
+ "sum",
+ "system_clock",
+ "tiny",
+ "transpose",
+ "trim",
+ "ubound",
+ "unpack",
+ "verify",
+ "achar",
+ "iachar",
+ "transfer",
+ "dble",
+ "entry",
+ "dprod",
+ "cpu_time",
+ "command_argument_count",
+ "get_command",
+ "get_command_argument",
+ "get_environment_variable",
+ "is_iostat_end",
+ "ieee_arithmetic",
+ "ieee_support_underflow_control",
+ "ieee_get_underflow_mode",
+ "ieee_set_underflow_mode",
+ "is_iostat_eor",
+ "move_alloc",
+ "new_line",
+ "selected_char_kind",
+ "same_type_as",
+ "extends_type_of",
+ "acosh",
+ "asinh",
+ "atanh",
+ "bessel_j0",
+ "bessel_j1",
+ "bessel_jn",
+ "bessel_y0",
+ "bessel_y1",
+ "bessel_yn",
+ "erf",
+ "erfc",
+ "erfc_scaled",
+ "gamma",
+ "log_gamma",
+ "hypot",
+ "norm2",
+ "atomic_define",
+ "atomic_ref",
+ "execute_command_line",
+ "leadz",
+ "trailz",
+ "storage_size",
+ "merge_bits",
+ "bge",
+ "bgt",
+ "ble",
+ "blt",
+ "dshiftl",
+ "dshiftr",
+ "findloc",
+ "iall",
+ "iany",
+ "iparity",
+ "image_index",
+ "lcobound",
+ "ucobound",
+ "maskl",
+ "maskr",
+ "num_images",
+ "parity",
+ "popcnt",
+ "poppar",
+ "shifta",
+ "shiftl",
+ "shiftr",
+ "this_image",
+ "sync",
+ "change",
+ "team",
+ "co_broadcast",
+ "co_max",
+ "co_min",
+ "co_sum",
+ "co_reduce"
+ ];
+ return {
+ name: 'Fortran',
+ case_insensitive: true,
+ aliases: [
+ 'f90',
+ 'f95'
+ ],
+ keywords: {
+ $pattern: /\b[a-z][a-z0-9_]+\b|\.[a-z][a-z0-9_]+\./,
+ keyword: KEYWORDS,
+ literal: LITERALS,
+ built_in: BUILT_INS
+ },
+ illegal: /\/\*/,
+ contains: [
+ STRING,
+ FUNCTION_DEF,
+ // allow `C = value` for assignments so they aren't misdetected
+ // as Fortran 77 style comments
+ {
+ begin: /^C\s*=(?!=)/,
+ relevance: 0
+ },
+ COMMENT,
+ NUMBER
+ ]
+ };
+ }
+
+ return fortran;
+
+})();
+
+ hljs.registerLanguage('fortran', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/fortran.min.js b/htroot/js/languages/fortran.min.js
new file mode 100644
index 000000000..331daea37
--- /dev/null
+++ b/htroot/js/languages/fortran.min.js
@@ -0,0 +1,17 @@
+/*! `fortran` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a={
+variants:[e.COMMENT("!","$",{relevance:0}),e.COMMENT("^C[ ]","$",{relevance:0
+}),e.COMMENT("^C$","$",{relevance:0})]
+},t=/(_[a-z_\d]+)?/,i=/([de][+-]?\d+)?/,c={className:"number",variants:[{
+begin:n.concat(/\b\d+/,/\.(\d*)/,i,t)},{begin:n.concat(/\b\d+/,i,t)},{
+begin:n.concat(/\.\d+/,i,t)}],relevance:0},o={className:"function",
+beginKeywords:"subroutine function program",illegal:"[${=\\n]",
+contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]}
+;return{name:"Fortran",case_insensitive:!0,aliases:["f90","f95"],keywords:{
+$pattern:/\b[a-z][a-z0-9_]+\b|\.[a-z][a-z0-9_]+\./,
+keyword:["kind","do","concurrent","local","shared","while","private","call","intrinsic","where","elsewhere","type","endtype","endmodule","endselect","endinterface","end","enddo","endif","if","forall","endforall","only","contains","default","return","stop","then","block","endblock","endassociate","public","subroutine|10","function","program",".and.",".or.",".not.",".le.",".eq.",".ge.",".gt.",".lt.","goto","save","else","use","module","select","case","access","blank","direct","exist","file","fmt","form","formatted","iostat","name","named","nextrec","number","opened","rec","recl","sequential","status","unformatted","unit","continue","format","pause","cycle","exit","c_null_char","c_alert","c_backspace","c_form_feed","flush","wait","decimal","round","iomsg","synchronous","nopass","non_overridable","pass","protected","volatile","abstract","extends","import","non_intrinsic","value","deferred","generic","final","enumerator","class","associate","bind","enum","c_int","c_short","c_long","c_long_long","c_signed_char","c_size_t","c_int8_t","c_int16_t","c_int32_t","c_int64_t","c_int_least8_t","c_int_least16_t","c_int_least32_t","c_int_least64_t","c_int_fast8_t","c_int_fast16_t","c_int_fast32_t","c_int_fast64_t","c_intmax_t","C_intptr_t","c_float","c_double","c_long_double","c_float_complex","c_double_complex","c_long_double_complex","c_bool","c_char","c_null_ptr","c_null_funptr","c_new_line","c_carriage_return","c_horizontal_tab","c_vertical_tab","iso_c_binding","c_loc","c_funloc","c_associated","c_f_pointer","c_ptr","c_funptr","iso_fortran_env","character_storage_size","error_unit","file_storage_size","input_unit","iostat_end","iostat_eor","numeric_storage_size","output_unit","c_f_procpointer","ieee_arithmetic","ieee_support_underflow_control","ieee_get_underflow_mode","ieee_set_underflow_mode","newunit","contiguous","recursive","pad","position","action","delim","readwrite","eor","advance","nml","interface","procedure","namelist","include","sequence","elemental","pure","impure","integer","real","character","complex","logical","codimension","dimension","allocatable|10","parameter","external","implicit|10","none","double","precision","assign","intent","optional","pointer","target","in","out","common","equivalence","data"],
+literal:[".False.",".True."],
+built_in:["alog","alog10","amax0","amax1","amin0","amin1","amod","cabs","ccos","cexp","clog","csin","csqrt","dabs","dacos","dasin","datan","datan2","dcos","dcosh","ddim","dexp","dint","dlog","dlog10","dmax1","dmin1","dmod","dnint","dsign","dsin","dsinh","dsqrt","dtan","dtanh","float","iabs","idim","idint","idnint","ifix","isign","max0","max1","min0","min1","sngl","algama","cdabs","cdcos","cdexp","cdlog","cdsin","cdsqrt","cqabs","cqcos","cqexp","cqlog","cqsin","cqsqrt","dcmplx","dconjg","derf","derfc","dfloat","dgamma","dimag","dlgama","iqint","qabs","qacos","qasin","qatan","qatan2","qcmplx","qconjg","qcos","qcosh","qdim","qerf","qerfc","qexp","qgamma","qimag","qlgama","qlog","qlog10","qmax1","qmin1","qmod","qnint","qsign","qsin","qsinh","qsqrt","qtan","qtanh","abs","acos","aimag","aint","anint","asin","atan","atan2","char","cmplx","conjg","cos","cosh","exp","ichar","index","int","log","log10","max","min","nint","sign","sin","sinh","sqrt","tan","tanh","print","write","dim","lge","lgt","lle","llt","mod","nullify","allocate","deallocate","adjustl","adjustr","all","allocated","any","associated","bit_size","btest","ceiling","count","cshift","date_and_time","digits","dot_product","eoshift","epsilon","exponent","floor","fraction","huge","iand","ibclr","ibits","ibset","ieor","ior","ishft","ishftc","lbound","len_trim","matmul","maxexponent","maxloc","maxval","merge","minexponent","minloc","minval","modulo","mvbits","nearest","pack","present","product","radix","random_number","random_seed","range","repeat","reshape","rrspacing","scale","scan","selected_int_kind","selected_real_kind","set_exponent","shape","size","spacing","spread","sum","system_clock","tiny","transpose","trim","ubound","unpack","verify","achar","iachar","transfer","dble","entry","dprod","cpu_time","command_argument_count","get_command","get_command_argument","get_environment_variable","is_iostat_end","ieee_arithmetic","ieee_support_underflow_control","ieee_get_underflow_mode","ieee_set_underflow_mode","is_iostat_eor","move_alloc","new_line","selected_char_kind","same_type_as","extends_type_of","acosh","asinh","atanh","bessel_j0","bessel_j1","bessel_jn","bessel_y0","bessel_y1","bessel_yn","erf","erfc","erfc_scaled","gamma","log_gamma","hypot","norm2","atomic_define","atomic_ref","execute_command_line","leadz","trailz","storage_size","merge_bits","bge","bgt","ble","blt","dshiftl","dshiftr","findloc","iall","iany","iparity","image_index","lcobound","ucobound","maskl","maskr","num_images","parity","popcnt","poppar","shifta","shiftl","shiftr","this_image","sync","change","team","co_broadcast","co_max","co_min","co_sum","co_reduce"]
+},illegal:/\/\*/,contains:[{className:"string",relevance:0,
+variants:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},o,{begin:/^C\s*=(?!=)/,
+relevance:0},a,c]}}})();hljs.registerLanguage("fortran",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/go.js b/htroot/js/languages/go.js
new file mode 100644
index 000000000..732619afc
--- /dev/null
+++ b/htroot/js/languages/go.js
@@ -0,0 +1,166 @@
+/*! `go` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Go
+ Author: Stephan Kountso aka StepLg <steplg@gmail.com>
+ Contributors: Evgeny Stepanischev <imbolk@gmail.com>
+ Description: Google go language (golang). For info about language
+ Website: http://golang.org/
+ Category: common, system
+ */
+
+ function go(hljs) {
+ const LITERALS = [
+ "true",
+ "false",
+ "iota",
+ "nil"
+ ];
+ const BUILT_INS = [
+ "append",
+ "cap",
+ "close",
+ "complex",
+ "copy",
+ "imag",
+ "len",
+ "make",
+ "new",
+ "panic",
+ "print",
+ "println",
+ "real",
+ "recover",
+ "delete"
+ ];
+ const TYPES = [
+ "bool",
+ "byte",
+ "complex64",
+ "complex128",
+ "error",
+ "float32",
+ "float64",
+ "int8",
+ "int16",
+ "int32",
+ "int64",
+ "string",
+ "uint8",
+ "uint16",
+ "uint32",
+ "uint64",
+ "int",
+ "uint",
+ "uintptr",
+ "rune"
+ ];
+ const KWS = [
+ "break",
+ "case",
+ "chan",
+ "const",
+ "continue",
+ "default",
+ "defer",
+ "else",
+ "fallthrough",
+ "for",
+ "func",
+ "go",
+ "goto",
+ "if",
+ "import",
+ "interface",
+ "map",
+ "package",
+ "range",
+ "return",
+ "select",
+ "struct",
+ "switch",
+ "type",
+ "var",
+ ];
+ const KEYWORDS = {
+ keyword: KWS,
+ type: TYPES,
+ literal: LITERALS,
+ built_in: BUILT_INS
+ };
+ return {
+ name: 'Go',
+ aliases: [ 'golang' ],
+ keywords: KEYWORDS,
+ illegal: '</',
+ contains: [
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ {
+ className: 'string',
+ variants: [
+ hljs.QUOTE_STRING_MODE,
+ hljs.APOS_STRING_MODE,
+ {
+ begin: '`',
+ end: '`'
+ }
+ ]
+ },
+ {
+ className: 'number',
+ variants: [
+ {
+ match: /-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/, // hex without a present digit before . (making a digit afterwards required)
+ relevance: 0
+ },
+ {
+ match: /-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/, // hex with a present digit before . (making a digit afterwards optional)
+ relevance: 0
+ },
+ {
+ match: /-?\b0[oO](_?[0-7])*i?/, // leading 0o octal
+ relevance: 0
+ },
+ {
+ match: /-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/, // decimal without a present digit before . (making a digit afterwards required)
+ relevance: 0
+ },
+ {
+ match: /-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/, // decimal with a present digit before . (making a digit afterwards optional)
+ relevance: 0
+ }
+ ]
+ },
+ { begin: /:=/ // relevance booster
+ },
+ {
+ className: 'function',
+ beginKeywords: 'func',
+ end: '\\s*(\\{|$)',
+ excludeEnd: true,
+ contains: [
+ hljs.TITLE_MODE,
+ {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ endsParent: true,
+ keywords: KEYWORDS,
+ illegal: /["']/
+ }
+ ]
+ }
+ ]
+ };
+ }
+
+ return go;
+
+})();
+
+ hljs.registerLanguage('go', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/go.min.js b/htroot/js/languages/go.min.js
new file mode 100644
index 000000000..fdb009a7c
--- /dev/null
+++ b/htroot/js/languages/go.min.js
@@ -0,0 +1,20 @@
+/*! `go` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a={
+keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],
+type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],
+literal:["true","false","iota","nil"],
+built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]
+};return{name:"Go",aliases:["golang"],keywords:a,illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",
+variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{
+className:"number",variants:[{
+match:/-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/,relevance:0
+},{
+match:/-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/,
+relevance:0},{match:/-?\b0[oO](_?[0-7])*i?/,relevance:0},{
+match:/-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/,relevance:0},{
+match:/-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/,relevance:0}]},{
+begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",
+excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,
+endsParent:!0,keywords:a,illegal:/["']/}]}]}}})();hljs.registerLanguage("go",e)
+})(); \ No newline at end of file
diff --git a/htroot/js/languages/gradle.js b/htroot/js/languages/gradle.js
new file mode 100644
index 000000000..c4eda5f04
--- /dev/null
+++ b/htroot/js/languages/gradle.js
@@ -0,0 +1,200 @@
+/*! `gradle` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Gradle
+ Description: Gradle is an open-source build automation tool focused on flexibility and performance.
+ Website: https://gradle.org
+ Author: Damian Mee <mee.damian@gmail.com>
+ Category: build-system
+ */
+
+ function gradle(hljs) {
+ const KEYWORDS = [
+ "task",
+ "project",
+ "allprojects",
+ "subprojects",
+ "artifacts",
+ "buildscript",
+ "configurations",
+ "dependencies",
+ "repositories",
+ "sourceSets",
+ "description",
+ "delete",
+ "from",
+ "into",
+ "include",
+ "exclude",
+ "source",
+ "classpath",
+ "destinationDir",
+ "includes",
+ "options",
+ "sourceCompatibility",
+ "targetCompatibility",
+ "group",
+ "flatDir",
+ "doLast",
+ "doFirst",
+ "flatten",
+ "todir",
+ "fromdir",
+ "ant",
+ "def",
+ "abstract",
+ "break",
+ "case",
+ "catch",
+ "continue",
+ "default",
+ "do",
+ "else",
+ "extends",
+ "final",
+ "finally",
+ "for",
+ "if",
+ "implements",
+ "instanceof",
+ "native",
+ "new",
+ "private",
+ "protected",
+ "public",
+ "return",
+ "static",
+ "switch",
+ "synchronized",
+ "throw",
+ "throws",
+ "transient",
+ "try",
+ "volatile",
+ "while",
+ "strictfp",
+ "package",
+ "import",
+ "false",
+ "null",
+ "super",
+ "this",
+ "true",
+ "antlrtask",
+ "checkstyle",
+ "codenarc",
+ "copy",
+ "boolean",
+ "byte",
+ "char",
+ "class",
+ "double",
+ "float",
+ "int",
+ "interface",
+ "long",
+ "short",
+ "void",
+ "compile",
+ "runTime",
+ "file",
+ "fileTree",
+ "abs",
+ "any",
+ "append",
+ "asList",
+ "asWritable",
+ "call",
+ "collect",
+ "compareTo",
+ "count",
+ "div",
+ "dump",
+ "each",
+ "eachByte",
+ "eachFile",
+ "eachLine",
+ "every",
+ "find",
+ "findAll",
+ "flatten",
+ "getAt",
+ "getErr",
+ "getIn",
+ "getOut",
+ "getText",
+ "grep",
+ "immutable",
+ "inject",
+ "inspect",
+ "intersect",
+ "invokeMethods",
+ "isCase",
+ "join",
+ "leftShift",
+ "minus",
+ "multiply",
+ "newInputStream",
+ "newOutputStream",
+ "newPrintWriter",
+ "newReader",
+ "newWriter",
+ "next",
+ "plus",
+ "pop",
+ "power",
+ "previous",
+ "print",
+ "println",
+ "push",
+ "putAt",
+ "read",
+ "readBytes",
+ "readLines",
+ "reverse",
+ "reverseEach",
+ "round",
+ "size",
+ "sort",
+ "splitEachLine",
+ "step",
+ "subMap",
+ "times",
+ "toInteger",
+ "toList",
+ "tokenize",
+ "upto",
+ "waitForOrKill",
+ "withPrintWriter",
+ "withReader",
+ "withStream",
+ "withWriter",
+ "withWriterAppend",
+ "write",
+ "writeLine"
+ ];
+ return {
+ name: 'Gradle',
+ case_insensitive: true,
+ keywords: KEYWORDS,
+ contains: [
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.NUMBER_MODE,
+ hljs.REGEXP_MODE
+
+ ]
+ };
+ }
+
+ return gradle;
+
+})();
+
+ hljs.registerLanguage('gradle', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/gradle.min.js b/htroot/js/languages/gradle.min.js
new file mode 100644
index 000000000..d600da38c
--- /dev/null
+++ b/htroot/js/languages/gradle.min.js
@@ -0,0 +1,5 @@
+/*! `gradle` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>({name:"Gradle",case_insensitive:!0,
+keywords:["task","project","allprojects","subprojects","artifacts","buildscript","configurations","dependencies","repositories","sourceSets","description","delete","from","into","include","exclude","source","classpath","destinationDir","includes","options","sourceCompatibility","targetCompatibility","group","flatDir","doLast","doFirst","flatten","todir","fromdir","ant","def","abstract","break","case","catch","continue","default","do","else","extends","final","finally","for","if","implements","instanceof","native","new","private","protected","public","return","static","switch","synchronized","throw","throws","transient","try","volatile","while","strictfp","package","import","false","null","super","this","true","antlrtask","checkstyle","codenarc","copy","boolean","byte","char","class","double","float","int","interface","long","short","void","compile","runTime","file","fileTree","abs","any","append","asList","asWritable","call","collect","compareTo","count","div","dump","each","eachByte","eachFile","eachLine","every","find","findAll","flatten","getAt","getErr","getIn","getOut","getText","grep","immutable","inject","inspect","intersect","invokeMethods","isCase","join","leftShift","minus","multiply","newInputStream","newOutputStream","newPrintWriter","newReader","newWriter","next","plus","pop","power","previous","print","println","push","putAt","read","readBytes","readLines","reverse","reverseEach","round","size","sort","splitEachLine","step","subMap","times","toInteger","toList","tokenize","upto","waitForOrKill","withPrintWriter","withReader","withStream","withWriter","withWriterAppend","write","writeLine"],
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,e.REGEXP_MODE]
+})})();hljs.registerLanguage("gradle",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/http.js b/htroot/js/languages/http.js
new file mode 100644
index 000000000..8bc54e36b
--- /dev/null
+++ b/htroot/js/languages/http.js
@@ -0,0 +1,107 @@
+/*! `http` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: HTTP
+ Description: HTTP request and response headers with automatic body highlighting
+ Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
+ Category: protocols, web
+ Website: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview
+ */
+
+ function http(hljs) {
+ const regex = hljs.regex;
+ const VERSION = 'HTTP/([32]|1\\.[01])';
+ const HEADER_NAME = /[A-Za-z][A-Za-z0-9-]*/;
+ const HEADER = {
+ className: 'attribute',
+ begin: regex.concat('^', HEADER_NAME, '(?=\\:\\s)'),
+ starts: { contains: [
+ {
+ className: "punctuation",
+ begin: /: /,
+ relevance: 0,
+ starts: {
+ end: '$',
+ relevance: 0
+ }
+ }
+ ] }
+ };
+ const HEADERS_AND_BODY = [
+ HEADER,
+ {
+ begin: '\\n\\n',
+ starts: {
+ subLanguage: [],
+ endsWithParent: true
+ }
+ }
+ ];
+
+ return {
+ name: 'HTTP',
+ aliases: [ 'https' ],
+ illegal: /\S/,
+ contains: [
+ // response
+ {
+ begin: '^(?=' + VERSION + " \\d{3})",
+ end: /$/,
+ contains: [
+ {
+ className: "meta",
+ begin: VERSION
+ },
+ {
+ className: 'number',
+ begin: '\\b\\d{3}\\b'
+ }
+ ],
+ starts: {
+ end: /\b\B/,
+ illegal: /\S/,
+ contains: HEADERS_AND_BODY
+ }
+ },
+ // request
+ {
+ begin: '(?=^[A-Z]+ (.*?) ' + VERSION + '$)',
+ end: /$/,
+ contains: [
+ {
+ className: 'string',
+ begin: ' ',
+ end: ' ',
+ excludeBegin: true,
+ excludeEnd: true
+ },
+ {
+ className: "meta",
+ begin: VERSION
+ },
+ {
+ className: 'keyword',
+ begin: '[A-Z]+'
+ }
+ ],
+ starts: {
+ end: /\b\B/,
+ illegal: /\S/,
+ contains: HEADERS_AND_BODY
+ }
+ },
+ // to allow headers to work even without a preamble
+ hljs.inherit(HEADER, { relevance: 0 })
+ ]
+ };
+ }
+
+ return http;
+
+})();
+
+ hljs.registerLanguage('http', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/http.min.js b/htroot/js/languages/http.min.js
new file mode 100644
index 000000000..e8fac4c26
--- /dev/null
+++ b/htroot/js/languages/http.min.js
@@ -0,0 +1,14 @@
+/*! `http` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n="HTTP/([32]|1\\.[01])",a={
+className:"attribute",
+begin:e.regex.concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{
+contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",
+relevance:0}}]}},s=[a,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}
+}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{
+begin:"^(?="+n+" \\d{3})",end:/$/,contains:[{className:"meta",begin:n},{
+className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,
+contains:s}},{begin:"(?=^[A-Z]+ (.*?) "+n+"$)",end:/$/,contains:[{
+className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{
+className:"meta",begin:n},{className:"keyword",begin:"[A-Z]+"}],starts:{
+end:/\b\B/,illegal:/\S/,contains:s}},e.inherit(a,{relevance:0})]}}})()
+;hljs.registerLanguage("http",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/java.js b/htroot/js/languages/java.js
new file mode 100644
index 000000000..20f42bec3
--- /dev/null
+++ b/htroot/js/languages/java.js
@@ -0,0 +1,301 @@
+/*! `java` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10
+ var decimalDigits = '[0-9](_*[0-9])*';
+ var frac = `\\.(${decimalDigits})`;
+ var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';
+ var NUMERIC = {
+ className: 'number',
+ variants: [
+ // DecimalFloatingPointLiteral
+ // including ExponentPart
+ { begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` +
+ `[eE][+-]?(${decimalDigits})[fFdD]?\\b` },
+ // excluding ExponentPart
+ { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` },
+ { begin: `(${frac})[fFdD]?\\b` },
+ { begin: `\\b(${decimalDigits})[fFdD]\\b` },
+
+ // HexadecimalFloatingPointLiteral
+ { begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` +
+ `[pP][+-]?(${decimalDigits})[fFdD]?\\b` },
+
+ // DecimalIntegerLiteral
+ { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' },
+
+ // HexIntegerLiteral
+ { begin: `\\b0[xX](${hexDigits})[lL]?\\b` },
+
+ // OctalIntegerLiteral
+ { begin: '\\b0(_*[0-7])*[lL]?\\b' },
+
+ // BinaryIntegerLiteral
+ { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' },
+ ],
+ relevance: 0
+ };
+
+ /*
+ Language: Java
+ Author: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>
+ Category: common, enterprise
+ Website: https://www.java.com/
+ */
+
+
+ /**
+ * Allows recursive regex expressions to a given depth
+ *
+ * ie: recurRegex("(abc~~~)", /~~~/g, 2) becomes:
+ * (abc(abc(abc)))
+ *
+ * @param {string} re
+ * @param {RegExp} substitution (should be a g mode regex)
+ * @param {number} depth
+ * @returns {string}``
+ */
+ function recurRegex(re, substitution, depth) {
+ if (depth === -1) return "";
+
+ return re.replace(substitution, _ => {
+ return recurRegex(re, substitution, depth - 1);
+ });
+ }
+
+ /** @type LanguageFn */
+ function java(hljs) {
+ const regex = hljs.regex;
+ const JAVA_IDENT_RE = '[\u00C0-\u02B8a-zA-Z_$][\u00C0-\u02B8a-zA-Z_$0-9]*';
+ const GENERIC_IDENT_RE = JAVA_IDENT_RE
+ + recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\s*,\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2);
+ const MAIN_KEYWORDS = [
+ 'synchronized',
+ 'abstract',
+ 'private',
+ 'var',
+ 'static',
+ 'if',
+ 'const ',
+ 'for',
+ 'while',
+ 'strictfp',
+ 'finally',
+ 'protected',
+ 'import',
+ 'native',
+ 'final',
+ 'void',
+ 'enum',
+ 'else',
+ 'break',
+ 'transient',
+ 'catch',
+ 'instanceof',
+ 'volatile',
+ 'case',
+ 'assert',
+ 'package',
+ 'default',
+ 'public',
+ 'try',
+ 'switch',
+ 'continue',
+ 'throws',
+ 'protected',
+ 'public',
+ 'private',
+ 'module',
+ 'requires',
+ 'exports',
+ 'do',
+ 'sealed',
+ 'yield',
+ 'permits',
+ 'goto',
+ 'when'
+ ];
+
+ const BUILT_INS = [
+ 'super',
+ 'this'
+ ];
+
+ const LITERALS = [
+ 'false',
+ 'true',
+ 'null'
+ ];
+
+ const TYPES = [
+ 'char',
+ 'boolean',
+ 'long',
+ 'float',
+ 'int',
+ 'byte',
+ 'short',
+ 'double'
+ ];
+
+ const KEYWORDS = {
+ keyword: MAIN_KEYWORDS,
+ literal: LITERALS,
+ type: TYPES,
+ built_in: BUILT_INS
+ };
+
+ const ANNOTATION = {
+ className: 'meta',
+ begin: '@' + JAVA_IDENT_RE,
+ contains: [
+ {
+ begin: /\(/,
+ end: /\)/,
+ contains: [ "self" ] // allow nested () inside our annotation
+ }
+ ]
+ };
+ const PARAMS = {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ keywords: KEYWORDS,
+ relevance: 0,
+ contains: [ hljs.C_BLOCK_COMMENT_MODE ],
+ endsParent: true
+ };
+
+ return {
+ name: 'Java',
+ aliases: [ 'jsp' ],
+ keywords: KEYWORDS,
+ illegal: /<\/|#/,
+ contains: [
+ hljs.COMMENT(
+ '/\\*\\*',
+ '\\*/',
+ {
+ relevance: 0,
+ contains: [
+ {
+ // eat up @'s in emails to prevent them to be recognized as doctags
+ begin: /\w+@/,
+ relevance: 0
+ },
+ {
+ className: 'doctag',
+ begin: '@[A-Za-z]+'
+ }
+ ]
+ }
+ ),
+ // relevance boost
+ {
+ begin: /import java\.[a-z]+\./,
+ keywords: "import",
+ relevance: 2
+ },
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ {
+ begin: /"""/,
+ end: /"""/,
+ className: "string",
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ },
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ {
+ match: [
+ /\b(?:class|interface|enum|extends|implements|new)/,
+ /\s+/,
+ JAVA_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+ {
+ // Exceptions for hyphenated keywords
+ match: /non-sealed/,
+ scope: "keyword"
+ },
+ {
+ begin: [
+ regex.concat(/(?!else)/, JAVA_IDENT_RE),
+ /\s+/,
+ JAVA_IDENT_RE,
+ /\s+/,
+ /=(?!=)/
+ ],
+ className: {
+ 1: "type",
+ 3: "variable",
+ 5: "operator"
+ }
+ },
+ {
+ begin: [
+ /record/,
+ /\s+/,
+ JAVA_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ },
+ contains: [
+ PARAMS,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE
+ ]
+ },
+ {
+ // Expression keywords prevent 'keyword Name(...)' from being
+ // recognized as a function definition
+ beginKeywords: 'new throw return else',
+ relevance: 0
+ },
+ {
+ begin: [
+ '(?:' + GENERIC_IDENT_RE + '\\s+)',
+ hljs.UNDERSCORE_IDENT_RE,
+ /\s*(?=\()/
+ ],
+ className: { 2: "title.function" },
+ keywords: KEYWORDS,
+ contains: [
+ {
+ className: 'params',
+ begin: /\(/,
+ end: /\)/,
+ keywords: KEYWORDS,
+ relevance: 0,
+ contains: [
+ ANNOTATION,
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ NUMERIC,
+ hljs.C_BLOCK_COMMENT_MODE
+ ]
+ },
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE
+ ]
+ },
+ NUMERIC,
+ ANNOTATION
+ ]
+ };
+ }
+
+ return java;
+
+})();
+
+ hljs.registerLanguage('java', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/java.min.js b/htroot/js/languages/java.min.js
new file mode 100644
index 000000000..25f67df3b
--- /dev/null
+++ b/htroot/js/languages/java.min.js
@@ -0,0 +1,38 @@
+/*! `java` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;var e="[0-9](_*[0-9])*",a=`\\.(${e})`,n="[0-9a-fA-F](_*[0-9a-fA-F])*",s={
+className:"number",variants:[{
+begin:`(\\b(${e})((${a})|\\.)?|(${a}))[eE][+-]?(${e})[fFdD]?\\b`},{
+begin:`\\b(${e})((${a})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${a})[fFdD]?\\b`
+},{begin:`\\b(${e})[fFdD]\\b`},{
+begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?(${e})[fFdD]?\\b`},{
+begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{
+begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],
+relevance:0};function t(e,a,n){return-1===n?"":e.replace(a,(s=>t(e,a,n-1)))}
+return e=>{
+const a=e.regex,n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",i=n+t("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),r={
+keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"],
+literal:["false","true","null"],
+type:["char","boolean","long","float","int","byte","short","double"],
+built_in:["super","this"]},l={className:"meta",begin:"@"+n,contains:[{
+begin:/\(/,end:/\)/,contains:["self"]}]},c={className:"params",begin:/\(/,
+end:/\)/,keywords:r,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0}
+;return{name:"Java",aliases:["jsp"],keywords:r,illegal:/<\/|#/,
+contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,
+relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{
+begin:/import java\.[a-z]+\./,keywords:"import",relevance:2
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,
+className:"string",contains:[e.BACKSLASH_ESCAPE]
+},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{
+match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{
+1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{
+begin:[a.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",
+3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",
+3:"title.class"},contains:[c,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{
+beginKeywords:"new throw return else",relevance:0},{
+begin:["(?:"+i+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{
+2:"title.function"},keywords:r,contains:[{className:"params",begin:/\(/,
+end:/\)/,keywords:r,relevance:0,
+contains:[l,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},s,l]}}})()
+;hljs.registerLanguage("java",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/javascript.js b/htroot/js/languages/javascript.js
new file mode 100644
index 000000000..e5525ec99
--- /dev/null
+++ b/htroot/js/languages/javascript.js
@@ -0,0 +1,779 @@
+/*! `javascript` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
+ const KEYWORDS = [
+ "as", // for exports
+ "in",
+ "of",
+ "if",
+ "for",
+ "while",
+ "finally",
+ "var",
+ "new",
+ "function",
+ "do",
+ "return",
+ "void",
+ "else",
+ "break",
+ "catch",
+ "instanceof",
+ "with",
+ "throw",
+ "case",
+ "default",
+ "try",
+ "switch",
+ "continue",
+ "typeof",
+ "delete",
+ "let",
+ "yield",
+ "const",
+ "class",
+ // JS handles these with a special rule
+ // "get",
+ // "set",
+ "debugger",
+ "async",
+ "await",
+ "static",
+ "import",
+ "from",
+ "export",
+ "extends",
+ // It's reached stage 3, which is "recommended for implementation":
+ "using"
+ ];
+ const LITERALS = [
+ "true",
+ "false",
+ "null",
+ "undefined",
+ "NaN",
+ "Infinity"
+ ];
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
+ const TYPES = [
+ // Fundamental objects
+ "Object",
+ "Function",
+ "Boolean",
+ "Symbol",
+ // numbers and dates
+ "Math",
+ "Date",
+ "Number",
+ "BigInt",
+ // text
+ "String",
+ "RegExp",
+ // Indexed collections
+ "Array",
+ "Float32Array",
+ "Float64Array",
+ "Int8Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "Int16Array",
+ "Int32Array",
+ "Uint16Array",
+ "Uint32Array",
+ "BigInt64Array",
+ "BigUint64Array",
+ // Keyed collections
+ "Set",
+ "Map",
+ "WeakSet",
+ "WeakMap",
+ // Structured data
+ "ArrayBuffer",
+ "SharedArrayBuffer",
+ "Atomics",
+ "DataView",
+ "JSON",
+ // Control abstraction objects
+ "Promise",
+ "Generator",
+ "GeneratorFunction",
+ "AsyncFunction",
+ // Reflection
+ "Reflect",
+ "Proxy",
+ // Internationalization
+ "Intl",
+ // WebAssembly
+ "WebAssembly"
+ ];
+
+ const ERROR_TYPES = [
+ "Error",
+ "EvalError",
+ "InternalError",
+ "RangeError",
+ "ReferenceError",
+ "SyntaxError",
+ "TypeError",
+ "URIError"
+ ];
+
+ const BUILT_IN_GLOBALS = [
+ "setInterval",
+ "setTimeout",
+ "clearInterval",
+ "clearTimeout",
+
+ "require",
+ "exports",
+
+ "eval",
+ "isFinite",
+ "isNaN",
+ "parseFloat",
+ "parseInt",
+ "decodeURI",
+ "decodeURIComponent",
+ "encodeURI",
+ "encodeURIComponent",
+ "escape",
+ "unescape"
+ ];
+
+ const BUILT_IN_VARIABLES = [
+ "arguments",
+ "this",
+ "super",
+ "console",
+ "window",
+ "document",
+ "localStorage",
+ "sessionStorage",
+ "module",
+ "global" // Node.js
+ ];
+
+ const BUILT_INS = [].concat(
+ BUILT_IN_GLOBALS,
+ TYPES,
+ ERROR_TYPES
+ );
+
+ /*
+ Language: JavaScript
+ Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
+ Category: common, scripting, web
+ Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
+ */
+
+
+ /** @type LanguageFn */
+ function javascript(hljs) {
+ const regex = hljs.regex;
+ /**
+ * Takes a string like "<Booger" and checks to see
+ * if we can find a matching "</Booger" later in the
+ * content.
+ * @param {RegExpMatchArray} match
+ * @param {{after:number}} param1
+ */
+ const hasClosingTag = (match, { after }) => {
+ const tag = "</" + match[0].slice(1);
+ const pos = match.input.indexOf(tag, after);
+ return pos !== -1;
+ };
+
+ const IDENT_RE$1 = IDENT_RE;
+ const FRAGMENT = {
+ begin: '<>',
+ end: '</>'
+ };
+ // to avoid some special cases inside isTrulyOpeningTag
+ const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/;
+ const XML_TAG = {
+ begin: /<[A-Za-z0-9\\._:-]+/,
+ end: /\/[A-Za-z0-9\\._:-]+>|\/>/,
+ /**
+ * @param {RegExpMatchArray} match
+ * @param {CallbackResponse} response
+ */
+ isTrulyOpeningTag: (match, response) => {
+ const afterMatchIndex = match[0].length + match.index;
+ const nextChar = match.input[afterMatchIndex];
+ if (
+ // HTML should not include another raw `<` inside a tag
+ // nested type?
+ // `<Array<Array<number>>`, etc.
+ nextChar === "<" ||
+ // the , gives away that this is not HTML
+ // `<T, A extends keyof T, V>`
+ nextChar === ","
+ ) {
+ response.ignoreMatch();
+ return;
+ }
+
+ // `<something>`
+ // Quite possibly a tag, lets look for a matching closing tag...
+ if (nextChar === ">") {
+ // if we cannot find a matching closing tag, then we
+ // will ignore it
+ if (!hasClosingTag(match, { after: afterMatchIndex })) {
+ response.ignoreMatch();
+ }
+ }
+
+ // `<blah />` (self-closing)
+ // handled by simpleSelfClosing rule
+
+ let m;
+ const afterMatch = match.input.substring(afterMatchIndex);
+
+ // some more template typing stuff
+ // <T = any>(key?: string) => Modify<
+ if ((m = afterMatch.match(/^\s*=/))) {
+ response.ignoreMatch();
+ return;
+ }
+
+ // `<From extends string>`
+ // technically this could be HTML, but it smells like a type
+ // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276
+ if ((m = afterMatch.match(/^\s+extends\s+/))) {
+ if (m.index === 0) {
+ response.ignoreMatch();
+ // eslint-disable-next-line no-useless-return
+ return;
+ }
+ }
+ }
+ };
+ const KEYWORDS$1 = {
+ $pattern: IDENT_RE,
+ keyword: KEYWORDS,
+ literal: LITERALS,
+ built_in: BUILT_INS,
+ "variable.language": BUILT_IN_VARIABLES
+ };
+
+ // https://tc39.es/ecma262/#sec-literals-numeric-literals
+ const decimalDigits = '[0-9](_?[0-9])*';
+ const frac = `\\.(${decimalDigits})`;
+ // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral
+ // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
+ const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;
+ const NUMBER = {
+ className: 'number',
+ variants: [
+ // DecimalLiteral
+ { begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` +
+ `[eE][+-]?(${decimalDigits})\\b` },
+ { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` },
+
+ // DecimalBigIntegerLiteral
+ { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` },
+
+ // NonDecimalIntegerLiteral
+ { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" },
+ { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" },
+ { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" },
+
+ // LegacyOctalIntegerLiteral (does not include underscore separators)
+ // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
+ { begin: "\\b0[0-7]+n?\\b" },
+ ],
+ relevance: 0
+ };
+
+ const SUBST = {
+ className: 'subst',
+ begin: '\\$\\{',
+ end: '\\}',
+ keywords: KEYWORDS$1,
+ contains: [] // defined later
+ };
+ const HTML_TEMPLATE = {
+ begin: '\.?html`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'xml'
+ }
+ };
+ const CSS_TEMPLATE = {
+ begin: '\.?css`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'css'
+ }
+ };
+ const GRAPHQL_TEMPLATE = {
+ begin: '\.?gql`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'graphql'
+ }
+ };
+ const TEMPLATE_STRING = {
+ className: 'string',
+ begin: '`',
+ end: '`',
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ]
+ };
+ const JSDOC_COMMENT = hljs.COMMENT(
+ /\/\*\*(?!\/)/,
+ '\\*/',
+ {
+ relevance: 0,
+ contains: [
+ {
+ begin: '(?=@[A-Za-z]+)',
+ relevance: 0,
+ contains: [
+ {
+ className: 'doctag',
+ begin: '@[A-Za-z]+'
+ },
+ {
+ className: 'type',
+ begin: '\\{',
+ end: '\\}',
+ excludeEnd: true,
+ excludeBegin: true,
+ relevance: 0
+ },
+ {
+ className: 'variable',
+ begin: IDENT_RE$1 + '(?=\\s*(-)|$)',
+ endsParent: true,
+ relevance: 0
+ },
+ // eat spaces (not newlines) so we can find
+ // types or variables
+ {
+ begin: /(?=[^\n])\s/,
+ relevance: 0
+ }
+ ]
+ }
+ ]
+ }
+ );
+ const COMMENT = {
+ className: "comment",
+ variants: [
+ JSDOC_COMMENT,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_LINE_COMMENT_MODE
+ ]
+ };
+ const SUBST_INTERNALS = [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ HTML_TEMPLATE,
+ CSS_TEMPLATE,
+ GRAPHQL_TEMPLATE,
+ TEMPLATE_STRING,
+ // Skip numbers when they are part of a variable name
+ { match: /\$\d+/ },
+ NUMBER,
+ // This is intentional:
+ // See https://github.com/highlightjs/highlight.js/issues/3288
+ // hljs.REGEXP_MODE
+ ];
+ SUBST.contains = SUBST_INTERNALS
+ .concat({
+ // we need to pair up {} inside our subst to prevent
+ // it from ending too early by matching another }
+ begin: /\{/,
+ end: /\}/,
+ keywords: KEYWORDS$1,
+ contains: [
+ "self"
+ ].concat(SUBST_INTERNALS)
+ });
+ const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);
+ const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([
+ // eat recursive parens in sub expressions
+ {
+ begin: /(\s*)\(/,
+ end: /\)/,
+ keywords: KEYWORDS$1,
+ contains: ["self"].concat(SUBST_AND_COMMENTS)
+ }
+ ]);
+ const PARAMS = {
+ className: 'params',
+ // convert this to negative lookbehind in v12
+ begin: /(\s*)\(/, // to match the parms with
+ end: /\)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ keywords: KEYWORDS$1,
+ contains: PARAMS_CONTAINS
+ };
+
+ // ES6 classes
+ const CLASS_OR_EXTENDS = {
+ variants: [
+ // class Car extends vehicle
+ {
+ match: [
+ /class/,
+ /\s+/,
+ IDENT_RE$1,
+ /\s+/,
+ /extends/,
+ /\s+/,
+ regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*")
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.class",
+ 5: "keyword",
+ 7: "title.class.inherited"
+ }
+ },
+ // class Car
+ {
+ match: [
+ /class/,
+ /\s+/,
+ IDENT_RE$1
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+
+ ]
+ };
+
+ const CLASS_REFERENCE = {
+ relevance: 0,
+ match:
+ regex.either(
+ // Hard coded exceptions
+ /\bJSON/,
+ // Float32Array, OutT
+ /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,
+ // CSSFactory, CSSFactoryT
+ /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,
+ // FPs, FPsT
+ /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/,
+ // P
+ // single letters are not highlighted
+ // BLAH
+ // this will be flagged as a UPPER_CASE_CONSTANT instead
+ ),
+ className: "title.class",
+ keywords: {
+ _: [
+ // se we still get relevance credit for JS library classes
+ ...TYPES,
+ ...ERROR_TYPES
+ ]
+ }
+ };
+
+ const USE_STRICT = {
+ label: "use_strict",
+ className: 'meta',
+ relevance: 10,
+ begin: /^\s*['"]use (strict|asm)['"]/
+ };
+
+ const FUNCTION_DEFINITION = {
+ variants: [
+ {
+ match: [
+ /function/,
+ /\s+/,
+ IDENT_RE$1,
+ /(?=\s*\()/
+ ]
+ },
+ // anonymous function
+ {
+ match: [
+ /function/,
+ /\s*(?=\()/
+ ]
+ }
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ label: "func.def",
+ contains: [ PARAMS ],
+ illegal: /%/
+ };
+
+ const UPPER_CASE_CONSTANT = {
+ relevance: 0,
+ match: /\b[A-Z][A-Z_0-9]+\b/,
+ className: "variable.constant"
+ };
+
+ function noneOf(list) {
+ return regex.concat("(?!", list.join("|"), ")");
+ }
+
+ const FUNCTION_CALL = {
+ match: regex.concat(
+ /\b/,
+ noneOf([
+ ...BUILT_IN_GLOBALS,
+ "super",
+ "import"
+ ].map(x => `${x}\\s*\\(`)),
+ IDENT_RE$1, regex.lookahead(/\s*\(/)),
+ className: "title.function",
+ relevance: 0
+ };
+
+ const PROPERTY_ACCESS = {
+ begin: regex.concat(/\./, regex.lookahead(
+ regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)
+ )),
+ end: IDENT_RE$1,
+ excludeBegin: true,
+ keywords: "prototype",
+ className: "property",
+ relevance: 0
+ };
+
+ const GETTER_OR_SETTER = {
+ match: [
+ /get|set/,
+ /\s+/,
+ IDENT_RE$1,
+ /(?=\()/
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ contains: [
+ { // eat to avoid empty params
+ begin: /\(\)/
+ },
+ PARAMS
+ ]
+ };
+
+ const FUNC_LEAD_IN_RE = '(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*' +
+ '\\)[^()]*)*' +
+ '\\)[^()]*)*' +
+ '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>';
+
+ const FUNCTION_VARIABLE = {
+ match: [
+ /const|var|let/, /\s+/,
+ IDENT_RE$1, /\s*/,
+ /=\s*/,
+ /(async\s*)?/, // async is optional
+ regex.lookahead(FUNC_LEAD_IN_RE)
+ ],
+ keywords: "async",
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ contains: [
+ PARAMS
+ ]
+ };
+
+ return {
+ name: 'JavaScript',
+ aliases: ['js', 'jsx', 'mjs', 'cjs'],
+ keywords: KEYWORDS$1,
+ // this will be extended by TypeScript
+ exports: { PARAMS_CONTAINS, CLASS_REFERENCE },
+ illegal: /#(?![$_A-z])/,
+ contains: [
+ hljs.SHEBANG({
+ label: "shebang",
+ binary: "node",
+ relevance: 5
+ }),
+ USE_STRICT,
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ HTML_TEMPLATE,
+ CSS_TEMPLATE,
+ GRAPHQL_TEMPLATE,
+ TEMPLATE_STRING,
+ COMMENT,
+ // Skip numbers when they are part of a variable name
+ { match: /\$\d+/ },
+ NUMBER,
+ CLASS_REFERENCE,
+ {
+ scope: 'attr',
+ match: IDENT_RE$1 + regex.lookahead(':'),
+ relevance: 0
+ },
+ FUNCTION_VARIABLE,
+ { // "value" container
+ begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
+ keywords: 'return throw case',
+ relevance: 0,
+ contains: [
+ COMMENT,
+ hljs.REGEXP_MODE,
+ {
+ className: 'function',
+ // we have to count the parens to make sure we actually have the
+ // correct bounding ( ) before the =>. There could be any number of
+ // sub-expressions inside also surrounded by parens.
+ begin: FUNC_LEAD_IN_RE,
+ returnBegin: true,
+ end: '\\s*=>',
+ contains: [
+ {
+ className: 'params',
+ variants: [
+ {
+ begin: hljs.UNDERSCORE_IDENT_RE,
+ relevance: 0
+ },
+ {
+ className: null,
+ begin: /\(\s*\)/,
+ skip: true
+ },
+ {
+ begin: /(\s*)\(/,
+ end: /\)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ keywords: KEYWORDS$1,
+ contains: PARAMS_CONTAINS
+ }
+ ]
+ }
+ ]
+ },
+ { // could be a comma delimited list of params to a function call
+ begin: /,/,
+ relevance: 0
+ },
+ {
+ match: /\s+/,
+ relevance: 0
+ },
+ { // JSX
+ variants: [
+ { begin: FRAGMENT.begin, end: FRAGMENT.end },
+ { match: XML_SELF_CLOSING },
+ {
+ begin: XML_TAG.begin,
+ // we carefully check the opening tag to see if it truly
+ // is a tag and not a false positive
+ 'on:begin': XML_TAG.isTrulyOpeningTag,
+ end: XML_TAG.end
+ }
+ ],
+ subLanguage: 'xml',
+ contains: [
+ {
+ begin: XML_TAG.begin,
+ end: XML_TAG.end,
+ skip: true,
+ contains: ['self']
+ }
+ ]
+ }
+ ],
+ },
+ FUNCTION_DEFINITION,
+ {
+ // prevent this from getting swallowed up by function
+ // since they appear "function like"
+ beginKeywords: "while if switch catch for"
+ },
+ {
+ // we have to count the parens to make sure we actually have the correct
+ // bounding ( ). There could be any number of sub-expressions inside
+ // also surrounded by parens.
+ begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +
+ '\\(' + // first parens
+ '[^()]*(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*' +
+ '\\)[^()]*)*' +
+ '\\)[^()]*)*' +
+ '\\)\\s*\\{', // end parens
+ returnBegin:true,
+ label: "func.def",
+ contains: [
+ PARAMS,
+ hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" })
+ ]
+ },
+ // catch ... so it won't trigger the property rule below
+ {
+ match: /\.\.\./,
+ relevance: 0
+ },
+ PROPERTY_ACCESS,
+ // hack: prevents detection of keywords in some circumstances
+ // .keyword()
+ // $keyword = x
+ {
+ match: '\\$' + IDENT_RE$1,
+ relevance: 0
+ },
+ {
+ match: [ /\bconstructor(?=\s*\()/ ],
+ className: { 1: "title.function" },
+ contains: [ PARAMS ]
+ },
+ FUNCTION_CALL,
+ UPPER_CASE_CONSTANT,
+ CLASS_OR_EXTENDS,
+ GETTER_OR_SETTER,
+ {
+ match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
+ }
+ ]
+ };
+ }
+
+ return javascript;
+
+})();
+
+ hljs.registerLanguage('javascript', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/javascript.min.js b/htroot/js/languages/javascript.min.js
new file mode 100644
index 000000000..7df9939f1
--- /dev/null
+++ b/htroot/js/languages/javascript.min.js
@@ -0,0 +1,81 @@
+/*! `javascript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s)
+;return o=>{const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const a=e[0].length+e.index,t=e.input[a]
+;if("<"===t||","===t)return void n.ignoreMatch();let s
+;">"===t&&(((e,{after:n})=>{const a="</"+e[0].slice(1)
+;return-1!==e.input.indexOf(a,n)})(e,{after:a})||n.ignoreMatch())
+;const r=e.input.substring(a)
+;((s=r.match(/^\s*=/))||(s=r.match(/^\s+extends\s+/))&&0===s.index)&&n.ignoreMatch()
+}},g={$pattern:e,keyword:n,literal:a,built_in:i,"variable.language":c
+},u="[0-9](_?[0-9])*",m=`\\.(${u})`,E="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",A={
+className:"number",variants:[{
+begin:`(\\b(${E})((${m})|\\.)?|(${m}))[eE][+-]?(${u})\\b`},{
+begin:`\\b(${E})\\b((${m})\\b|\\.)?|(${m})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},y={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:g,contains:[]},h={begin:".?html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"xml"}},_={
+begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"css"}},N={begin:".?gql`",end:"",
+starts:{end:"`",returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],
+subLanguage:"graphql"}},f={className:"string",begin:"`",end:"`",
+contains:[o.BACKSLASH_ESCAPE,y]},p={className:"comment",
+variants:[o.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
+excludeBegin:!0,relevance:0},{className:"variable",begin:d+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),o.C_BLOCK_COMMENT_MODE,o.C_LINE_COMMENT_MODE]
+},v=[o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,{match:/\$\d+/},A]
+;y.contains=v.concat({begin:/\{/,end:/\}/,keywords:g,contains:["self"].concat(v)
+});const S=[].concat(p,y.contains),w=S.concat([{begin:/(\s*)\(/,end:/\)/,
+keywords:g,contains:["self"].concat(S)}]),R={className:"params",begin:/(\s*)\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w},O={variants:[{
+match:[/class/,/\s+/,d,/\s+/,/extends/,/\s+/,l.concat(d,"(",l.concat(/\./,d),")*")],
+scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
+match:[/class/,/\s+/,d],scope:{1:"keyword",3:"title.class"}}]},k={relevance:0,
+match:l.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
+className:"title.class",keywords:{_:[...t,...s]}},I={variants:[{
+match:[/function/,/\s+/,d,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
+className:{1:"keyword",3:"title.function"},label:"func.def",contains:[R],
+illegal:/%/},x={
+match:l.concat(/\b/,(T=[...r,"super","import"].map((e=>e+"\\s*\\(")),
+l.concat("(?!",T.join("|"),")")),d,l.lookahead(/\s*\(/)),
+className:"title.function",relevance:0};var T;const C={
+begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d,
+excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={
+match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"},
+contains:[{begin:/\(\)/},R]
+},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={
+match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)],
+keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]}
+;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{
+PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/,
+contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{
+label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,_,N,f,p,{match:/\$\d+/},A,k,{
+scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{
+begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",relevance:0,contains:[p,o.REGEXP_MODE,{
+className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{
+className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{
+className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0
+},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:"</>"},{
+match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin,
+"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{
+begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},I,{
+beginKeywords:"while if switch catch for"},{
+begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d,
+className:"title.function"})]},{match:/\.\.\./,relevance:0},C,{match:"\\$"+d,
+relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
+contains:[R]},x,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
+className:"variable.constant"},O,M,{match:/\$[(.]/}]}}})()
+;hljs.registerLanguage("javascript",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/json.js b/htroot/js/languages/json.js
new file mode 100644
index 000000000..3eadcd81d
--- /dev/null
+++ b/htroot/js/languages/json.js
@@ -0,0 +1,64 @@
+/*! `json` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: JSON
+ Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format.
+ Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
+ Website: http://www.json.org
+ Category: common, protocols, web
+ */
+
+ function json(hljs) {
+ const ATTRIBUTE = {
+ className: 'attr',
+ begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/,
+ relevance: 1.01
+ };
+ const PUNCTUATION = {
+ match: /[{}[\],:]/,
+ className: "punctuation",
+ relevance: 0
+ };
+ const LITERALS = [
+ "true",
+ "false",
+ "null"
+ ];
+ // NOTE: normally we would rely on `keywords` for this but using a mode here allows us
+ // - to use the very tight `illegal: \S` rule later to flag any other character
+ // - as illegal indicating that despite looking like JSON we do not truly have
+ // - JSON and thus improve false-positively greatly since JSON will try and claim
+ // - all sorts of JSON looking stuff
+ const LITERALS_MODE = {
+ scope: "literal",
+ beginKeywords: LITERALS.join(" "),
+ };
+
+ return {
+ name: 'JSON',
+ aliases: ['jsonc'],
+ keywords:{
+ literal: LITERALS,
+ },
+ contains: [
+ ATTRIBUTE,
+ PUNCTUATION,
+ hljs.QUOTE_STRING_MODE,
+ LITERALS_MODE,
+ hljs.C_NUMBER_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE
+ ],
+ illegal: '\\S'
+ };
+ }
+
+ return json;
+
+})();
+
+ hljs.registerLanguage('json', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/json.min.js b/htroot/js/languages/json.min.js
new file mode 100644
index 000000000..48edba3de
--- /dev/null
+++ b/htroot/js/languages/json.min.js
@@ -0,0 +1,8 @@
+/*! `json` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const a=["true","false","null"],s={
+scope:"literal",beginKeywords:a.join(" ")};return{name:"JSON",aliases:["jsonc"],
+keywords:{literal:a},contains:[{className:"attr",
+begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,
+className:"punctuation",relevance:0
+},e.QUOTE_STRING_MODE,s,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],
+illegal:"\\S"}}})();hljs.registerLanguage("json",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/latex.js b/htroot/js/languages/latex.js
new file mode 100644
index 000000000..28a281ec1
--- /dev/null
+++ b/htroot/js/languages/latex.js
@@ -0,0 +1,288 @@
+/*! `latex` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: LaTeX
+ Author: Benedikt Wilde <bwilde@posteo.de>
+ Website: https://www.latex-project.org
+ Category: markup
+ */
+
+ /** @type LanguageFn */
+ function latex(hljs) {
+ const regex = hljs.regex;
+ const KNOWN_CONTROL_WORDS = regex.either(...[
+ '(?:NeedsTeXFormat|RequirePackage|GetIdInfo)',
+ 'Provides(?:Expl)?(?:Package|Class|File)',
+ '(?:DeclareOption|ProcessOptions)',
+ '(?:documentclass|usepackage|input|include)',
+ 'makeat(?:letter|other)',
+ 'ExplSyntax(?:On|Off)',
+ '(?:new|renew|provide)?command',
+ '(?:re)newenvironment',
+ '(?:New|Renew|Provide|Declare)(?:Expandable)?DocumentCommand',
+ '(?:New|Renew|Provide|Declare)DocumentEnvironment',
+ '(?:(?:e|g|x)?def|let)',
+ '(?:begin|end)',
+ '(?:part|chapter|(?:sub){0,2}section|(?:sub)?paragraph)',
+ 'caption',
+ '(?:label|(?:eq|page|name)?ref|(?:paren|foot|super)?cite)',
+ '(?:alpha|beta|[Gg]amma|[Dd]elta|(?:var)?epsilon|zeta|eta|[Tt]heta|vartheta)',
+ '(?:iota|(?:var)?kappa|[Ll]ambda|mu|nu|[Xx]i|[Pp]i|varpi|(?:var)rho)',
+ '(?:[Ss]igma|varsigma|tau|[Uu]psilon|[Pp]hi|varphi|chi|[Pp]si|[Oo]mega)',
+ '(?:frac|sum|prod|lim|infty|times|sqrt|leq|geq|left|right|middle|[bB]igg?)',
+ '(?:[lr]angle|q?quad|[lcvdi]?dots|d?dot|hat|tilde|bar)'
+ ].map(word => word + '(?![a-zA-Z@:_])'));
+ const L3_REGEX = new RegExp([
+ // A function \module_function_name:signature or \__module_function_name:signature,
+ // where both module and function_name need at least two characters and
+ // function_name may contain single underscores.
+ '(?:__)?[a-zA-Z]{2,}_[a-zA-Z](?:_?[a-zA-Z])+:[a-zA-Z]*',
+ // A variable \scope_module_and_name_type or \scope__module_ane_name_type,
+ // where scope is one of l, g or c, type needs at least two characters
+ // and module_and_name may contain single underscores.
+ '[lgc]__?[a-zA-Z](?:_?[a-zA-Z])*_[a-zA-Z]{2,}',
+ // A quark \q_the_name or \q__the_name or
+ // scan mark \s_the_name or \s__vthe_name,
+ // where variable_name needs at least two characters and
+ // may contain single underscores.
+ '[qs]__?[a-zA-Z](?:_?[a-zA-Z])+',
+ // Other LaTeX3 macro names that are not covered by the three rules above.
+ 'use(?:_i)?:[a-zA-Z]*',
+ '(?:else|fi|or):',
+ '(?:if|cs|exp):w',
+ '(?:hbox|vbox):n',
+ '::[a-zA-Z]_unbraced',
+ '::[a-zA-Z:]'
+ ].map(pattern => pattern + '(?![a-zA-Z:_])').join('|'));
+ const L2_VARIANTS = [
+ { begin: /[a-zA-Z@]+/ }, // control word
+ { begin: /[^a-zA-Z@]?/ } // control symbol
+ ];
+ const DOUBLE_CARET_VARIANTS = [
+ { begin: /\^{6}[0-9a-f]{6}/ },
+ { begin: /\^{5}[0-9a-f]{5}/ },
+ { begin: /\^{4}[0-9a-f]{4}/ },
+ { begin: /\^{3}[0-9a-f]{3}/ },
+ { begin: /\^{2}[0-9a-f]{2}/ },
+ { begin: /\^{2}[\u0000-\u007f]/ }
+ ];
+ const CONTROL_SEQUENCE = {
+ className: 'keyword',
+ begin: /\\/,
+ relevance: 0,
+ contains: [
+ {
+ endsParent: true,
+ begin: KNOWN_CONTROL_WORDS
+ },
+ {
+ endsParent: true,
+ begin: L3_REGEX
+ },
+ {
+ endsParent: true,
+ variants: DOUBLE_CARET_VARIANTS
+ },
+ {
+ endsParent: true,
+ relevance: 0,
+ variants: L2_VARIANTS
+ }
+ ]
+ };
+ const MACRO_PARAM = {
+ className: 'params',
+ relevance: 0,
+ begin: /#+\d?/
+ };
+ const DOUBLE_CARET_CHAR = {
+ // relevance: 1
+ variants: DOUBLE_CARET_VARIANTS };
+ const SPECIAL_CATCODE = {
+ className: 'built_in',
+ relevance: 0,
+ begin: /[$&^_]/
+ };
+ const MAGIC_COMMENT = {
+ className: 'meta',
+ begin: /% ?!(T[eE]X|tex|BIB|bib)/,
+ end: '$',
+ relevance: 10
+ };
+ const COMMENT = hljs.COMMENT(
+ '%',
+ '$',
+ { relevance: 0 }
+ );
+ const EVERYTHING_BUT_VERBATIM = [
+ CONTROL_SEQUENCE,
+ MACRO_PARAM,
+ DOUBLE_CARET_CHAR,
+ SPECIAL_CATCODE,
+ MAGIC_COMMENT,
+ COMMENT
+ ];
+ const BRACE_GROUP_NO_VERBATIM = {
+ begin: /\{/,
+ end: /\}/,
+ relevance: 0,
+ contains: [
+ 'self',
+ ...EVERYTHING_BUT_VERBATIM
+ ]
+ };
+ const ARGUMENT_BRACES = hljs.inherit(
+ BRACE_GROUP_NO_VERBATIM,
+ {
+ relevance: 0,
+ endsParent: true,
+ contains: [
+ BRACE_GROUP_NO_VERBATIM,
+ ...EVERYTHING_BUT_VERBATIM
+ ]
+ }
+ );
+ const ARGUMENT_BRACKETS = {
+ begin: /\[/,
+ end: /\]/,
+ endsParent: true,
+ relevance: 0,
+ contains: [
+ BRACE_GROUP_NO_VERBATIM,
+ ...EVERYTHING_BUT_VERBATIM
+ ]
+ };
+ const SPACE_GOBBLER = {
+ begin: /\s+/,
+ relevance: 0
+ };
+ const ARGUMENT_M = [ ARGUMENT_BRACES ];
+ const ARGUMENT_O = [ ARGUMENT_BRACKETS ];
+ const ARGUMENT_AND_THEN = function(arg, starts_mode) {
+ return {
+ contains: [ SPACE_GOBBLER ],
+ starts: {
+ relevance: 0,
+ contains: arg,
+ starts: starts_mode
+ }
+ };
+ };
+ const CSNAME = function(csname, starts_mode) {
+ return {
+ begin: '\\\\' + csname + '(?![a-zA-Z@:_])',
+ keywords: {
+ $pattern: /\\[a-zA-Z]+/,
+ keyword: '\\' + csname
+ },
+ relevance: 0,
+ contains: [ SPACE_GOBBLER ],
+ starts: starts_mode
+ };
+ };
+ const BEGIN_ENV = function(envname, starts_mode) {
+ return hljs.inherit(
+ {
+ begin: '\\\\begin(?=[ \t]*(\\r?\\n[ \t]*)?\\{' + envname + '\\})',
+ keywords: {
+ $pattern: /\\[a-zA-Z]+/,
+ keyword: '\\begin'
+ },
+ relevance: 0,
+ },
+ ARGUMENT_AND_THEN(ARGUMENT_M, starts_mode)
+ );
+ };
+ const VERBATIM_DELIMITED_EQUAL = (innerName = "string") => {
+ return hljs.END_SAME_AS_BEGIN({
+ className: innerName,
+ begin: /(.|\r?\n)/,
+ end: /(.|\r?\n)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ endsParent: true
+ });
+ };
+ const VERBATIM_DELIMITED_ENV = function(envname) {
+ return {
+ className: 'string',
+ end: '(?=\\\\end\\{' + envname + '\\})'
+ };
+ };
+
+ const VERBATIM_DELIMITED_BRACES = (innerName = "string") => {
+ return {
+ relevance: 0,
+ begin: /\{/,
+ starts: {
+ endsParent: true,
+ contains: [
+ {
+ className: innerName,
+ end: /(?=\})/,
+ endsParent: true,
+ contains: [
+ {
+ begin: /\{/,
+ end: /\}/,
+ relevance: 0,
+ contains: [ "self" ]
+ }
+ ],
+ }
+ ]
+ }
+ };
+ };
+ const VERBATIM = [
+ ...[
+ 'verb',
+ 'lstinline'
+ ].map(csname => CSNAME(csname, { contains: [ VERBATIM_DELIMITED_EQUAL() ] })),
+ CSNAME('mint', ARGUMENT_AND_THEN(ARGUMENT_M, { contains: [ VERBATIM_DELIMITED_EQUAL() ] })),
+ CSNAME('mintinline', ARGUMENT_AND_THEN(ARGUMENT_M, { contains: [
+ VERBATIM_DELIMITED_BRACES(),
+ VERBATIM_DELIMITED_EQUAL()
+ ] })),
+ CSNAME('url', { contains: [
+ VERBATIM_DELIMITED_BRACES("link"),
+ VERBATIM_DELIMITED_BRACES("link")
+ ] }),
+ CSNAME('hyperref', { contains: [ VERBATIM_DELIMITED_BRACES("link") ] }),
+ CSNAME('href', ARGUMENT_AND_THEN(ARGUMENT_O, { contains: [ VERBATIM_DELIMITED_BRACES("link") ] })),
+ ...[].concat(...[
+ '',
+ '\\*'
+ ].map(suffix => [
+ BEGIN_ENV('verbatim' + suffix, VERBATIM_DELIMITED_ENV('verbatim' + suffix)),
+ BEGIN_ENV('filecontents' + suffix, ARGUMENT_AND_THEN(ARGUMENT_M, VERBATIM_DELIMITED_ENV('filecontents' + suffix))),
+ ...[
+ '',
+ 'B',
+ 'L'
+ ].map(prefix =>
+ BEGIN_ENV(prefix + 'Verbatim' + suffix, ARGUMENT_AND_THEN(ARGUMENT_O, VERBATIM_DELIMITED_ENV(prefix + 'Verbatim' + suffix)))
+ )
+ ])),
+ BEGIN_ENV('minted', ARGUMENT_AND_THEN(ARGUMENT_O, ARGUMENT_AND_THEN(ARGUMENT_M, VERBATIM_DELIMITED_ENV('minted')))),
+ ];
+
+ return {
+ name: 'LaTeX',
+ aliases: [ 'tex' ],
+ contains: [
+ ...VERBATIM,
+ ...EVERYTHING_BUT_VERBATIM
+ ]
+ };
+ }
+
+ return latex;
+
+})();
+
+ hljs.registerLanguage('latex', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/latex.min.js b/htroot/js/languages/latex.min.js
new file mode 100644
index 000000000..0c7efe1f9
--- /dev/null
+++ b/htroot/js/languages/latex.min.js
@@ -0,0 +1,33 @@
+/*! `latex` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=[{begin:/\^{6}[0-9a-f]{6}/},{
+begin:/\^{5}[0-9a-f]{5}/},{begin:/\^{4}[0-9a-f]{4}/},{begin:/\^{3}[0-9a-f]{3}/
+},{begin:/\^{2}[0-9a-f]{2}/},{begin:/\^{2}[\u0000-\u007f]/}],a=[{
+className:"keyword",begin:/\\/,relevance:0,contains:[{endsParent:!0,
+begin:e.regex.either(...["(?:NeedsTeXFormat|RequirePackage|GetIdInfo)","Provides(?:Expl)?(?:Package|Class|File)","(?:DeclareOption|ProcessOptions)","(?:documentclass|usepackage|input|include)","makeat(?:letter|other)","ExplSyntax(?:On|Off)","(?:new|renew|provide)?command","(?:re)newenvironment","(?:New|Renew|Provide|Declare)(?:Expandable)?DocumentCommand","(?:New|Renew|Provide|Declare)DocumentEnvironment","(?:(?:e|g|x)?def|let)","(?:begin|end)","(?:part|chapter|(?:sub){0,2}section|(?:sub)?paragraph)","caption","(?:label|(?:eq|page|name)?ref|(?:paren|foot|super)?cite)","(?:alpha|beta|[Gg]amma|[Dd]elta|(?:var)?epsilon|zeta|eta|[Tt]heta|vartheta)","(?:iota|(?:var)?kappa|[Ll]ambda|mu|nu|[Xx]i|[Pp]i|varpi|(?:var)rho)","(?:[Ss]igma|varsigma|tau|[Uu]psilon|[Pp]hi|varphi|chi|[Pp]si|[Oo]mega)","(?:frac|sum|prod|lim|infty|times|sqrt|leq|geq|left|right|middle|[bB]igg?)","(?:[lr]angle|q?quad|[lcvdi]?dots|d?dot|hat|tilde|bar)"].map((e=>e+"(?![a-zA-Z@:_])")))
+},{endsParent:!0,
+begin:RegExp(["(?:__)?[a-zA-Z]{2,}_[a-zA-Z](?:_?[a-zA-Z])+:[a-zA-Z]*","[lgc]__?[a-zA-Z](?:_?[a-zA-Z])*_[a-zA-Z]{2,}","[qs]__?[a-zA-Z](?:_?[a-zA-Z])+","use(?:_i)?:[a-zA-Z]*","(?:else|fi|or):","(?:if|cs|exp):w","(?:hbox|vbox):n","::[a-zA-Z]_unbraced","::[a-zA-Z:]"].map((e=>e+"(?![a-zA-Z:_])")).join("|"))
+},{endsParent:!0,variants:n},{endsParent:!0,relevance:0,variants:[{
+begin:/[a-zA-Z@]+/},{begin:/[^a-zA-Z@]?/}]}]},{className:"params",relevance:0,
+begin:/#+\d?/},{variants:n},{className:"built_in",relevance:0,begin:/[$&^_]/},{
+className:"meta",begin:/% ?!(T[eE]X|tex|BIB|bib)/,end:"$",relevance:10
+},e.COMMENT("%","$",{relevance:0})],i={begin:/\{/,end:/\}/,relevance:0,
+contains:["self",...a]},t=e.inherit(i,{relevance:0,endsParent:!0,
+contains:[i,...a]}),r={begin:/\[/,end:/\]/,endsParent:!0,relevance:0,
+contains:[i,...a]},s={begin:/\s+/,relevance:0},c=[t],l=[r],o=(e,n)=>({
+contains:[s],starts:{relevance:0,contains:e,starts:n}}),d=(e,n)=>({
+begin:"\\\\"+e+"(?![a-zA-Z@:_])",keywords:{$pattern:/\\[a-zA-Z]+/,keyword:"\\"+e
+},relevance:0,contains:[s],starts:n}),g=(n,a)=>e.inherit({
+begin:"\\\\begin(?=[ \t]*(\\r?\\n[ \t]*)?\\{"+n+"\\})",keywords:{
+$pattern:/\\[a-zA-Z]+/,keyword:"\\begin"},relevance:0
+},o(c,a)),m=(n="string")=>e.END_SAME_AS_BEGIN({className:n,begin:/(.|\r?\n)/,
+end:/(.|\r?\n)/,excludeBegin:!0,excludeEnd:!0,endsParent:!0}),b=e=>({
+className:"string",end:"(?=\\\\end\\{"+e+"\\})"}),p=(e="string")=>({relevance:0,
+begin:/\{/,starts:{endsParent:!0,contains:[{className:e,end:/(?=\})/,
+endsParent:!0,contains:[{begin:/\{/,end:/\}/,relevance:0,contains:["self"]}]}]}
+});return{name:"LaTeX",aliases:["tex"],
+contains:[...["verb","lstinline"].map((e=>d(e,{contains:[m()]}))),d("mint",o(c,{
+contains:[m()]})),d("mintinline",o(c,{contains:[p(),m()]})),d("url",{
+contains:[p("link"),p("link")]}),d("hyperref",{contains:[p("link")]
+}),d("href",o(l,{contains:[p("link")]
+})),...[].concat(...["","\\*"].map((e=>[g("verbatim"+e,b("verbatim"+e)),g("filecontents"+e,o(c,b("filecontents"+e))),...["","B","L"].map((n=>g(n+"Verbatim"+e,o(l,b(n+"Verbatim"+e)))))]))),g("minted",o(l,o(c,b("minted")))),...a]
+}}})();hljs.registerLanguage("latex",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/lisp.js b/htroot/js/languages/lisp.js
new file mode 100644
index 000000000..c8befffb1
--- /dev/null
+++ b/htroot/js/languages/lisp.js
@@ -0,0 +1,149 @@
+/*! `lisp` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Lisp
+ Description: Generic lisp syntax
+ Author: Vasily Polovnyov <vast@whiteants.net>
+ Category: lisp
+ */
+
+ function lisp(hljs) {
+ const LISP_IDENT_RE = '[a-zA-Z_\\-+\\*\\/<=>&#][a-zA-Z0-9_\\-+*\\/<=>&#!]*';
+ const MEC_RE = '\\|[^]*?\\|';
+ const LISP_SIMPLE_NUMBER_RE = '(-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|-)?\\d+)?';
+ const LITERAL = {
+ className: 'literal',
+ begin: '\\b(t{1}|nil)\\b'
+ };
+ const NUMBER = {
+ className: 'number',
+ variants: [
+ {
+ begin: LISP_SIMPLE_NUMBER_RE,
+ relevance: 0
+ },
+ { begin: '#(b|B)[0-1]+(/[0-1]+)?' },
+ { begin: '#(o|O)[0-7]+(/[0-7]+)?' },
+ { begin: '#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?' },
+ {
+ begin: '#(c|C)\\(' + LISP_SIMPLE_NUMBER_RE + ' +' + LISP_SIMPLE_NUMBER_RE,
+ end: '\\)'
+ }
+ ]
+ };
+ const STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null });
+ const COMMENT = hljs.COMMENT(
+ ';', '$',
+ { relevance: 0 }
+ );
+ const VARIABLE = {
+ begin: '\\*',
+ end: '\\*'
+ };
+ const KEYWORD = {
+ className: 'symbol',
+ begin: '[:&]' + LISP_IDENT_RE
+ };
+ const IDENT = {
+ begin: LISP_IDENT_RE,
+ relevance: 0
+ };
+ const MEC = { begin: MEC_RE };
+ const QUOTED_LIST = {
+ begin: '\\(',
+ end: '\\)',
+ contains: [
+ 'self',
+ LITERAL,
+ STRING,
+ NUMBER,
+ IDENT
+ ]
+ };
+ const QUOTED = {
+ contains: [
+ NUMBER,
+ STRING,
+ VARIABLE,
+ KEYWORD,
+ QUOTED_LIST,
+ IDENT
+ ],
+ variants: [
+ {
+ begin: '[\'`]\\(',
+ end: '\\)'
+ },
+ {
+ begin: '\\(quote ',
+ end: '\\)',
+ keywords: { name: 'quote' }
+ },
+ { begin: '\'' + MEC_RE }
+ ]
+ };
+ const QUOTED_ATOM = { variants: [
+ { begin: '\'' + LISP_IDENT_RE },
+ { begin: '#\'' + LISP_IDENT_RE + '(::' + LISP_IDENT_RE + ')*' }
+ ] };
+ const LIST = {
+ begin: '\\(\\s*',
+ end: '\\)'
+ };
+ const BODY = {
+ endsWithParent: true,
+ relevance: 0
+ };
+ LIST.contains = [
+ {
+ className: 'name',
+ variants: [
+ {
+ begin: LISP_IDENT_RE,
+ relevance: 0,
+ },
+ { begin: MEC_RE }
+ ]
+ },
+ BODY
+ ];
+ BODY.contains = [
+ QUOTED,
+ QUOTED_ATOM,
+ LIST,
+ LITERAL,
+ NUMBER,
+ STRING,
+ COMMENT,
+ VARIABLE,
+ KEYWORD,
+ MEC,
+ IDENT
+ ];
+
+ return {
+ name: 'Lisp',
+ illegal: /\S/,
+ contains: [
+ NUMBER,
+ hljs.SHEBANG(),
+ LITERAL,
+ STRING,
+ COMMENT,
+ QUOTED,
+ QUOTED_ATOM,
+ LIST,
+ IDENT
+ ]
+ };
+ }
+
+ return lisp;
+
+})();
+
+ hljs.registerLanguage('lisp', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/lisp.min.js b/htroot/js/languages/lisp.min.js
new file mode 100644
index 000000000..41d7b20fd
--- /dev/null
+++ b/htroot/js/languages/lisp.min.js
@@ -0,0 +1,17 @@
+/*! `lisp` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n="[a-zA-Z_\\-+\\*\\/<=>&#][a-zA-Z0-9_\\-+*\\/<=>&#!]*",a="\\|[^]*?\\|",i="(-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|-)?\\d+)?",s={
+className:"literal",begin:"\\b(t{1}|nil)\\b"},l={className:"number",variants:[{
+begin:i,relevance:0},{begin:"#(b|B)[0-1]+(/[0-1]+)?"},{
+begin:"#(o|O)[0-7]+(/[0-7]+)?"},{begin:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{
+begin:"#(c|C)\\("+i+" +"+i,end:"\\)"}]},b=e.inherit(e.QUOTE_STRING_MODE,{
+illegal:null}),g=e.COMMENT(";","$",{relevance:0}),r={begin:"\\*",end:"\\*"},t={
+className:"symbol",begin:"[:&]"+n},c={begin:n,relevance:0},d={begin:a},o={
+contains:[l,b,r,t,{begin:"\\(",end:"\\)",contains:["self",s,b,l,c]},c],
+variants:[{begin:"['`]\\(",end:"\\)"},{begin:"\\(quote ",end:"\\)",keywords:{
+name:"quote"}},{begin:"'"+a}]},v={variants:[{begin:"'"+n},{
+begin:"#'"+n+"(::"+n+")*"}]},m={begin:"\\(\\s*",end:"\\)"},u={endsWithParent:!0,
+relevance:0};return m.contains=[{className:"name",variants:[{begin:n,relevance:0
+},{begin:a}]},u],u.contains=[o,v,m,s,l,b,g,r,t,d,c],{name:"Lisp",illegal:/\S/,
+contains:[l,e.SHEBANG(),s,b,g,o,v,m,c]}}})();hljs.registerLanguage("lisp",e)
+})(); \ No newline at end of file
diff --git a/htroot/js/languages/makefile.js b/htroot/js/languages/makefile.js
new file mode 100644
index 000000000..d1561da07
--- /dev/null
+++ b/htroot/js/languages/makefile.js
@@ -0,0 +1,99 @@
+/*! `makefile` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Makefile
+ Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
+ Contributors: Joël Porquet <joel@porquet.org>
+ Website: https://www.gnu.org/software/make/manual/html_node/Introduction.html
+ Category: common, build-system
+ */
+
+ function makefile(hljs) {
+ /* Variables: simple (eg $(var)) and special (eg $@) */
+ const VARIABLE = {
+ className: 'variable',
+ variants: [
+ {
+ begin: '\\$\\(' + hljs.UNDERSCORE_IDENT_RE + '\\)',
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ },
+ { begin: /\$[@%<?\^\+\*]/ }
+ ]
+ };
+ /* Quoted string with variables inside */
+ const QUOTE_STRING = {
+ className: 'string',
+ begin: /"/,
+ end: /"/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ VARIABLE
+ ]
+ };
+ /* Function: $(func arg,...) */
+ const FUNC = {
+ className: 'variable',
+ begin: /\$\([\w-]+\s/,
+ end: /\)/,
+ keywords: { built_in:
+ 'subst patsubst strip findstring filter filter-out sort '
+ + 'word wordlist firstword lastword dir notdir suffix basename '
+ + 'addsuffix addprefix join wildcard realpath abspath error warning '
+ + 'shell origin flavor foreach if or and call eval file value' },
+ contains: [
+ VARIABLE,
+ QUOTE_STRING // Added QUOTE_STRING as they can be a part of functions
+ ]
+ };
+ /* Variable assignment */
+ const ASSIGNMENT = { begin: '^' + hljs.UNDERSCORE_IDENT_RE + '\\s*(?=[:+?]?=)' };
+ /* Meta targets (.PHONY) */
+ const META = {
+ className: 'meta',
+ begin: /^\.PHONY:/,
+ end: /$/,
+ keywords: {
+ $pattern: /[\.\w]+/,
+ keyword: '.PHONY'
+ }
+ };
+ /* Targets */
+ const TARGET = {
+ className: 'section',
+ begin: /^[^\s]+:/,
+ end: /$/,
+ contains: [ VARIABLE ]
+ };
+ return {
+ name: 'Makefile',
+ aliases: [
+ 'mk',
+ 'mak',
+ 'make',
+ ],
+ keywords: {
+ $pattern: /[\w-]+/,
+ keyword: 'define endef undefine ifdef ifndef ifeq ifneq else endif '
+ + 'include -include sinclude override export unexport private vpath'
+ },
+ contains: [
+ hljs.HASH_COMMENT_MODE,
+ VARIABLE,
+ QUOTE_STRING,
+ FUNC,
+ ASSIGNMENT,
+ META,
+ TARGET
+ ]
+ };
+ }
+
+ return makefile;
+
+})();
+
+ hljs.registerLanguage('makefile', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/makefile.min.js b/htroot/js/languages/makefile.min.js
new file mode 100644
index 000000000..d8d941def
--- /dev/null
+++ b/htroot/js/languages/makefile.min.js
@@ -0,0 +1,14 @@
+/*! `makefile` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const i={className:"variable",
+variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",
+contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},a={className:"string",
+begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},n={className:"variable",
+begin:/\$\([\w-]+\s/,end:/\)/,keywords:{
+built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"
+},contains:[i,a]},s={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},r={
+className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{
+name:"Makefile",aliases:["mk","mak","make"],keywords:{$pattern:/[\w-]+/,
+keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"
+},contains:[e.HASH_COMMENT_MODE,i,a,n,s,{className:"meta",begin:/^\.PHONY:/,
+end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},r]}}})()
+;hljs.registerLanguage("makefile",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/markdown.js b/htroot/js/languages/markdown.js
new file mode 100644
index 000000000..9ca2b358c
--- /dev/null
+++ b/htroot/js/languages/markdown.js
@@ -0,0 +1,258 @@
+/*! `markdown` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Markdown
+ Requires: xml.js
+ Author: John Crepezzi <john.crepezzi@gmail.com>
+ Website: https://daringfireball.net/projects/markdown/
+ Category: common, markup
+ */
+
+ function markdown(hljs) {
+ const regex = hljs.regex;
+ const INLINE_HTML = {
+ begin: /<\/?[A-Za-z_]/,
+ end: '>',
+ subLanguage: 'xml',
+ relevance: 0
+ };
+ const HORIZONTAL_RULE = {
+ begin: '^[-\\*]{3,}',
+ end: '$'
+ };
+ const CODE = {
+ className: 'code',
+ variants: [
+ // TODO: fix to allow these to work with sublanguage also
+ { begin: '(`{3,})[^`](.|\\n)*?\\1`*[ ]*' },
+ { begin: '(~{3,})[^~](.|\\n)*?\\1~*[ ]*' },
+ // needed to allow markdown as a sublanguage to work
+ {
+ begin: '```',
+ end: '```+[ ]*$'
+ },
+ {
+ begin: '~~~',
+ end: '~~~+[ ]*$'
+ },
+ { begin: '`.+?`' },
+ {
+ begin: '(?=^( {4}|\\t))',
+ // use contains to gobble up multiple lines to allow the block to be whatever size
+ // but only have a single open/close tag vs one per line
+ contains: [
+ {
+ begin: '^( {4}|\\t)',
+ end: '(\\n)$'
+ }
+ ],
+ relevance: 0
+ }
+ ]
+ };
+ const LIST = {
+ className: 'bullet',
+ begin: '^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)',
+ end: '\\s+',
+ excludeEnd: true
+ };
+ const LINK_REFERENCE = {
+ begin: /^\[[^\n]+\]:/,
+ returnBegin: true,
+ contains: [
+ {
+ className: 'symbol',
+ begin: /\[/,
+ end: /\]/,
+ excludeBegin: true,
+ excludeEnd: true
+ },
+ {
+ className: 'link',
+ begin: /:\s*/,
+ end: /$/,
+ excludeBegin: true
+ }
+ ]
+ };
+ const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/;
+ const LINK = {
+ variants: [
+ // too much like nested array access in so many languages
+ // to have any real relevance
+ {
+ begin: /\[.+?\]\[.*?\]/,
+ relevance: 0
+ },
+ // popular internet URLs
+ {
+ begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,
+ relevance: 2
+ },
+ {
+ begin: regex.concat(/\[.+?\]\(/, URL_SCHEME, /:\/\/.*?\)/),
+ relevance: 2
+ },
+ // relative urls
+ {
+ begin: /\[.+?\]\([./?&#].*?\)/,
+ relevance: 1
+ },
+ // whatever else, lower relevance (might not be a link at all)
+ {
+ begin: /\[.*?\]\(.*?\)/,
+ relevance: 0
+ }
+ ],
+ returnBegin: true,
+ contains: [
+ {
+ // empty strings for alt or link text
+ match: /\[(?=\])/ },
+ {
+ className: 'string',
+ relevance: 0,
+ begin: '\\[',
+ end: '\\]',
+ excludeBegin: true,
+ returnEnd: true
+ },
+ {
+ className: 'link',
+ relevance: 0,
+ begin: '\\]\\(',
+ end: '\\)',
+ excludeBegin: true,
+ excludeEnd: true
+ },
+ {
+ className: 'symbol',
+ relevance: 0,
+ begin: '\\]\\[',
+ end: '\\]',
+ excludeBegin: true,
+ excludeEnd: true
+ }
+ ]
+ };
+ const BOLD = {
+ className: 'strong',
+ contains: [], // defined later
+ variants: [
+ {
+ begin: /_{2}(?!\s)/,
+ end: /_{2}/
+ },
+ {
+ begin: /\*{2}(?!\s)/,
+ end: /\*{2}/
+ }
+ ]
+ };
+ const ITALIC = {
+ className: 'emphasis',
+ contains: [], // defined later
+ variants: [
+ {
+ begin: /\*(?![*\s])/,
+ end: /\*/
+ },
+ {
+ begin: /_(?![_\s])/,
+ end: /_/,
+ relevance: 0
+ }
+ ]
+ };
+
+ // 3 level deep nesting is not allowed because it would create confusion
+ // in cases like `***testing***` because where we don't know if the last
+ // `***` is starting a new bold/italic or finishing the last one
+ const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] });
+ const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] });
+ BOLD.contains.push(ITALIC_WITHOUT_BOLD);
+ ITALIC.contains.push(BOLD_WITHOUT_ITALIC);
+
+ let CONTAINABLE = [
+ INLINE_HTML,
+ LINK
+ ];
+
+ [
+ BOLD,
+ ITALIC,
+ BOLD_WITHOUT_ITALIC,
+ ITALIC_WITHOUT_BOLD
+ ].forEach(m => {
+ m.contains = m.contains.concat(CONTAINABLE);
+ });
+
+ CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC);
+
+ const HEADER = {
+ className: 'section',
+ variants: [
+ {
+ begin: '^#{1,6}',
+ end: '$',
+ contains: CONTAINABLE
+ },
+ {
+ begin: '(?=^.+?\\n[=-]{2,}$)',
+ contains: [
+ { begin: '^[=-]*$' },
+ {
+ begin: '^',
+ end: "\\n",
+ contains: CONTAINABLE
+ }
+ ]
+ }
+ ]
+ };
+
+ const BLOCKQUOTE = {
+ className: 'quote',
+ begin: '^>\\s+',
+ contains: CONTAINABLE,
+ end: '$'
+ };
+
+ const ENTITY = {
+ //https://spec.commonmark.org/0.31.2/#entity-references
+ scope: 'literal',
+ match: /&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/
+ };
+
+ return {
+ name: 'Markdown',
+ aliases: [
+ 'md',
+ 'mkdown',
+ 'mkd'
+ ],
+ contains: [
+ HEADER,
+ INLINE_HTML,
+ LIST,
+ BOLD,
+ ITALIC,
+ BLOCKQUOTE,
+ CODE,
+ HORIZONTAL_RULE,
+ LINK,
+ LINK_REFERENCE,
+ ENTITY
+ ]
+ };
+ }
+
+ return markdown;
+
+})();
+
+ hljs.registerLanguage('markdown', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/markdown.min.js b/htroot/js/languages/markdown.min.js
new file mode 100644
index 000000000..f223e36d1
--- /dev/null
+++ b/htroot/js/languages/markdown.min.js
@@ -0,0 +1,32 @@
+/*! `markdown` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/,
+end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/,
+relevance:0},{
+begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,
+relevance:2},{
+begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),
+relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{
+begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/
+},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,
+returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",
+excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",
+end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[],
+variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]
+},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{
+begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[]
+}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c)
+;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g)
+})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{
+className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{
+begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",
+contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",
+end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g,
+end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{
+begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{
+begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",
+contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{
+begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{
+className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{
+className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal",
+match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}})()
+;hljs.registerLanguage("markdown",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/nestedtext.js b/htroot/js/languages/nestedtext.js
new file mode 100644
index 000000000..c4c59a70f
--- /dev/null
+++ b/htroot/js/languages/nestedtext.js
@@ -0,0 +1,93 @@
+/*! `nestedtext` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: NestedText
+ Description: NestedText is a file format for holding data that is to be entered, edited, or viewed by people.
+ Website: https://nestedtext.org/
+ Category: config
+ */
+
+ /** @type LanguageFn */
+ function nestedtext(hljs) {
+ const NESTED = {
+ match: [
+ /^\s*(?=\S)/, // have to look forward here to avoid polynomial backtracking
+ /[^:]+/,
+ /:\s*/,
+ /$/
+ ],
+ className: {
+ 2: "attribute",
+ 3: "punctuation"
+ }
+ };
+ const DICTIONARY_ITEM = {
+ match: [
+ /^\s*(?=\S)/, // have to look forward here to avoid polynomial backtracking
+ /[^:]*[^: ]/,
+ /[ ]*:/,
+ /[ ]/,
+ /.*$/
+ ],
+ className: {
+ 2: "attribute",
+ 3: "punctuation",
+ 5: "string"
+ }
+ };
+ const STRING = {
+ match: [
+ /^\s*/,
+ />/,
+ /[ ]/,
+ /.*$/
+ ],
+ className: {
+ 2: "punctuation",
+ 4: "string"
+ }
+ };
+ const LIST_ITEM = {
+ variants: [
+ { match: [
+ /^\s*/,
+ /-/,
+ /[ ]/,
+ /.*$/
+ ] },
+ { match: [
+ /^\s*/,
+ /-$/
+ ] }
+ ],
+ className: {
+ 2: "bullet",
+ 4: "string"
+ }
+ };
+
+ return {
+ name: 'Nested Text',
+ aliases: [ 'nt' ],
+ contains: [
+ hljs.inherit(hljs.HASH_COMMENT_MODE, {
+ begin: /^\s*(?=#)/,
+ excludeBegin: true
+ }),
+ LIST_ITEM,
+ STRING,
+ NESTED,
+ DICTIONARY_ITEM
+ ]
+ };
+ }
+
+ return nestedtext;
+
+})();
+
+ hljs.registerLanguage('nestedtext', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/nestedtext.min.js b/htroot/js/languages/nestedtext.min.js
new file mode 100644
index 000000000..548b7aba8
--- /dev/null
+++ b/htroot/js/languages/nestedtext.min.js
@@ -0,0 +1,9 @@
+/*! `nestedtext` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var t=(()=>{"use strict";return t=>({name:"Nested Text",aliases:["nt"],
+contains:[t.inherit(t.HASH_COMMENT_MODE,{begin:/^\s*(?=#)/,excludeBegin:!0}),{
+variants:[{match:[/^\s*/,/-/,/[ ]/,/.*$/]},{match:[/^\s*/,/-$/]}],className:{
+2:"bullet",4:"string"}},{match:[/^\s*/,/>/,/[ ]/,/.*$/],className:{
+2:"punctuation",4:"string"}},{match:[/^\s*(?=\S)/,/[^:]+/,/:\s*/,/$/],
+className:{2:"attribute",3:"punctuation"}},{
+match:[/^\s*(?=\S)/,/[^:]*[^: ]/,/[ ]*:/,/[ ]/,/.*$/],className:{2:"attribute",
+3:"punctuation",5:"string"}}]})})();hljs.registerLanguage("nestedtext",t)})(); \ No newline at end of file
diff --git a/htroot/js/languages/nginx.js b/htroot/js/languages/nginx.js
new file mode 100644
index 000000000..3b2e45e3f
--- /dev/null
+++ b/htroot/js/languages/nginx.js
@@ -0,0 +1,163 @@
+/*! `nginx` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Nginx config
+ Author: Peter Leonov <gojpeg@yandex.ru>
+ Contributors: Ivan Sagalaev <maniac@softwaremaniacs.org>
+ Category: config, web
+ Website: https://www.nginx.com
+ */
+
+ /** @type LanguageFn */
+ function nginx(hljs) {
+ const regex = hljs.regex;
+ const VAR = {
+ className: 'variable',
+ variants: [
+ { begin: /\$\d+/ },
+ { begin: /\$\{\w+\}/ },
+ { begin: regex.concat(/[$@]/, hljs.UNDERSCORE_IDENT_RE) }
+ ]
+ };
+ const LITERALS = [
+ "on",
+ "off",
+ "yes",
+ "no",
+ "true",
+ "false",
+ "none",
+ "blocked",
+ "debug",
+ "info",
+ "notice",
+ "warn",
+ "error",
+ "crit",
+ "select",
+ "break",
+ "last",
+ "permanent",
+ "redirect",
+ "kqueue",
+ "rtsig",
+ "epoll",
+ "poll",
+ "/dev/poll"
+ ];
+ const DEFAULT = {
+ endsWithParent: true,
+ keywords: {
+ $pattern: /[a-z_]{2,}|\/dev\/poll/,
+ literal: LITERALS
+ },
+ relevance: 0,
+ illegal: '=>',
+ contains: [
+ hljs.HASH_COMMENT_MODE,
+ {
+ className: 'string',
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ VAR
+ ],
+ variants: [
+ {
+ begin: /"/,
+ end: /"/
+ },
+ {
+ begin: /'/,
+ end: /'/
+ }
+ ]
+ },
+ // this swallows entire URLs to avoid detecting numbers within
+ {
+ begin: '([a-z]+):/',
+ end: '\\s',
+ endsWithParent: true,
+ excludeEnd: true,
+ contains: [ VAR ]
+ },
+ {
+ className: 'regexp',
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ VAR
+ ],
+ variants: [
+ {
+ begin: "\\s\\^",
+ end: "\\s|\\{|;",
+ returnEnd: true
+ },
+ // regexp locations (~, ~*)
+ {
+ begin: "~\\*?\\s+",
+ end: "\\s|\\{|;",
+ returnEnd: true
+ },
+ // *.example.com
+ { begin: "\\*(\\.[a-z\\-]+)+" },
+ // sub.example.*
+ { begin: "([a-z\\-]+\\.)+\\*" }
+ ]
+ },
+ // IP
+ {
+ className: 'number',
+ begin: '\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b'
+ },
+ // units
+ {
+ className: 'number',
+ begin: '\\b\\d+[kKmMgGdshdwy]?\\b',
+ relevance: 0
+ },
+ VAR
+ ]
+ };
+
+ return {
+ name: 'Nginx config',
+ aliases: [ 'nginxconf' ],
+ contains: [
+ hljs.HASH_COMMENT_MODE,
+ {
+ beginKeywords: "upstream location",
+ end: /;|\{/,
+ contains: DEFAULT.contains,
+ keywords: { section: "upstream location" }
+ },
+ {
+ className: 'section',
+ begin: regex.concat(hljs.UNDERSCORE_IDENT_RE + regex.lookahead(/\s+\{/)),
+ relevance: 0
+ },
+ {
+ begin: regex.lookahead(hljs.UNDERSCORE_IDENT_RE + '\\s'),
+ end: ';|\\{',
+ contains: [
+ {
+ className: 'attribute',
+ begin: hljs.UNDERSCORE_IDENT_RE,
+ starts: DEFAULT
+ }
+ ],
+ relevance: 0
+ }
+ ],
+ illegal: '[^\\s\\}\\{]'
+ };
+ }
+
+ return nginx;
+
+})();
+
+ hljs.registerLanguage('nginx', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/nginx.min.js b/htroot/js/languages/nginx.min.js
new file mode 100644
index 000000000..bdd39e7bd
--- /dev/null
+++ b/htroot/js/languages/nginx.min.js
@@ -0,0 +1,21 @@
+/*! `nginx` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,a={
+className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{\w+\}/},{
+begin:n.concat(/[$@]/,e.UNDERSCORE_IDENT_RE)}]},s={endsWithParent:!0,keywords:{
+$pattern:/[a-z_]{2,}|\/dev\/poll/,
+literal:["on","off","yes","no","true","false","none","blocked","debug","info","notice","warn","error","crit","select","break","last","permanent","redirect","kqueue","rtsig","epoll","poll","/dev/poll"]
+},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",
+contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/
+}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[a]
+},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,a],variants:[{begin:"\\s\\^",
+end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{
+begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",
+begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{
+className:"number",begin:"\\b\\d+[kKmMgGdshdwy]?\\b",relevance:0},a]};return{
+name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{
+beginKeywords:"upstream location",end:/;|\{/,contains:s.contains,keywords:{
+section:"upstream location"}},{className:"section",
+begin:n.concat(e.UNDERSCORE_IDENT_RE+n.lookahead(/\s+\{/)),relevance:0},{
+begin:n.lookahead(e.UNDERSCORE_IDENT_RE+"\\s"),end:";|\\{",contains:[{
+className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:s}],relevance:0}],
+illegal:"[^\\s\\}\\{]"}}})();hljs.registerLanguage("nginx",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/plaintext.js b/htroot/js/languages/plaintext.js
new file mode 100644
index 000000000..af3548442
--- /dev/null
+++ b/htroot/js/languages/plaintext.js
@@ -0,0 +1,29 @@
+/*! `plaintext` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Plain text
+ Author: Egor Rogov (e.rogov@postgrespro.ru)
+ Description: Plain text without any highlighting.
+ Category: common
+ */
+
+ function plaintext(hljs) {
+ return {
+ name: 'Plain text',
+ aliases: [
+ 'text',
+ 'txt'
+ ],
+ disableAutodetect: true
+ };
+ }
+
+ return plaintext;
+
+})();
+
+ hljs.registerLanguage('plaintext', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/plaintext.min.js b/htroot/js/languages/plaintext.min.js
new file mode 100644
index 000000000..cbcebf272
--- /dev/null
+++ b/htroot/js/languages/plaintext.min.js
@@ -0,0 +1,4 @@
+/*! `plaintext` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text",
+aliases:["text","txt"],disableAutodetect:!0})})()
+;hljs.registerLanguage("plaintext",t)})(); \ No newline at end of file
diff --git a/htroot/js/languages/powershell.js b/htroot/js/languages/powershell.js
new file mode 100644
index 000000000..3ce8ffa8c
--- /dev/null
+++ b/htroot/js/languages/powershell.js
@@ -0,0 +1,327 @@
+/*! `powershell` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: PowerShell
+ Description: PowerShell is a task-based command-line shell and scripting language built on .NET.
+ Author: David Mohundro <david@mohundro.com>
+ Contributors: Nicholas Blumhardt <nblumhardt@nblumhardt.com>, Victor Zhou <OiCMudkips@users.noreply.github.com>, Nicolas Le Gall <contact@nlegall.fr>
+ Website: https://docs.microsoft.com/en-us/powershell/
+ Category: scripting
+ */
+
+ function powershell(hljs) {
+ const TYPES = [
+ "string",
+ "char",
+ "byte",
+ "int",
+ "long",
+ "bool",
+ "decimal",
+ "single",
+ "double",
+ "DateTime",
+ "xml",
+ "array",
+ "hashtable",
+ "void"
+ ];
+
+ // https://docs.microsoft.com/en-us/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands
+ const VALID_VERBS =
+ 'Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|'
+ + 'Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|'
+ + 'Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|'
+ + 'Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|'
+ + 'ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|'
+ + 'Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|'
+ + 'Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|'
+ + 'Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|'
+ + 'Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|'
+ + 'Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|'
+ + 'Unprotect|Use|ForEach|Sort|Tee|Where';
+
+ const COMPARISON_OPERATORS =
+ '-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|'
+ + '-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|'
+ + '-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|'
+ + '-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|'
+ + '-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|'
+ + '-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|'
+ + '-split|-wildcard|-xor';
+
+ const KEYWORDS = {
+ $pattern: /-?[A-z\.\-]+\b/,
+ keyword:
+ 'if else foreach return do while until elseif begin for trap data dynamicparam '
+ + 'end break throw param continue finally in switch exit filter try process catch '
+ + 'hidden static parameter',
+ // "echo" relevance has been set to 0 to avoid auto-detect conflicts with shell transcripts
+ built_in:
+ 'ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp '
+ + 'cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx '
+ + 'fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group '
+ + 'gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi '
+ + 'iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh '
+ + 'popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp '
+ + 'rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp '
+ + 'spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write'
+ // TODO: 'validate[A-Z]+' can't work in keywords
+ };
+
+ const TITLE_NAME_RE = /\w[\w\d]*((-)[\w\d]+)*/;
+
+ const BACKTICK_ESCAPE = {
+ begin: '`[\\s\\S]',
+ relevance: 0
+ };
+
+ const VAR = {
+ className: 'variable',
+ variants: [
+ { begin: /\$\B/ },
+ {
+ className: 'keyword',
+ begin: /\$this/
+ },
+ { begin: /\$[\w\d][\w\d_:]*/ }
+ ]
+ };
+
+ const LITERAL = {
+ className: 'literal',
+ begin: /\$(null|true|false)\b/
+ };
+
+ const QUOTE_STRING = {
+ className: "string",
+ variants: [
+ {
+ begin: /"/,
+ end: /"/
+ },
+ {
+ begin: /@"/,
+ end: /^"@/
+ }
+ ],
+ contains: [
+ BACKTICK_ESCAPE,
+ VAR,
+ {
+ className: 'variable',
+ begin: /\$[A-z]/,
+ end: /[^A-z]/
+ }
+ ]
+ };
+
+ const APOS_STRING = {
+ className: 'string',
+ variants: [
+ {
+ begin: /'/,
+ end: /'/
+ },
+ {
+ begin: /@'/,
+ end: /^'@/
+ }
+ ]
+ };
+
+ const PS_HELPTAGS = {
+ className: "doctag",
+ variants: [
+ /* no paramater help tags */
+ { begin: /\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/ },
+ /* one parameter help tags */
+ { begin: /\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/ }
+ ]
+ };
+
+ const PS_COMMENT = hljs.inherit(
+ hljs.COMMENT(null, null),
+ {
+ variants: [
+ /* single-line comment */
+ {
+ begin: /#/,
+ end: /$/
+ },
+ /* multi-line comment */
+ {
+ begin: /<#/,
+ end: /#>/
+ }
+ ],
+ contains: [ PS_HELPTAGS ]
+ }
+ );
+
+ const CMDLETS = {
+ className: 'built_in',
+ variants: [ { begin: '('.concat(VALID_VERBS, ')+(-)[\\w\\d]+') } ]
+ };
+
+ const PS_CLASS = {
+ className: 'class',
+ beginKeywords: 'class enum',
+ end: /\s*[{]/,
+ excludeEnd: true,
+ relevance: 0,
+ contains: [ hljs.TITLE_MODE ]
+ };
+
+ const PS_FUNCTION = {
+ className: 'function',
+ begin: /function\s+/,
+ end: /\s*\{|$/,
+ excludeEnd: true,
+ returnBegin: true,
+ relevance: 0,
+ contains: [
+ {
+ begin: "function",
+ relevance: 0,
+ className: "keyword"
+ },
+ {
+ className: "title",
+ begin: TITLE_NAME_RE,
+ relevance: 0
+ },
+ {
+ begin: /\(/,
+ end: /\)/,
+ className: "params",
+ relevance: 0,
+ contains: [ VAR ]
+ }
+ // CMDLETS
+ ]
+ };
+
+ // Using statment, plus type, plus assembly name.
+ const PS_USING = {
+ begin: /using\s/,
+ end: /$/,
+ returnBegin: true,
+ contains: [
+ QUOTE_STRING,
+ APOS_STRING,
+ {
+ className: 'keyword',
+ begin: /(using|assembly|command|module|namespace|type)/
+ }
+ ]
+ };
+
+ // Comperison operators & function named parameters.
+ const PS_ARGUMENTS = { variants: [
+ // PS literals are pretty verbose so it's a good idea to accent them a bit.
+ {
+ className: 'operator',
+ begin: '('.concat(COMPARISON_OPERATORS, ')\\b')
+ },
+ {
+ className: 'literal',
+ begin: /(-){1,2}[\w\d-]+/,
+ relevance: 0
+ }
+ ] };
+
+ const HASH_SIGNS = {
+ className: 'selector-tag',
+ begin: /@\B/,
+ relevance: 0
+ };
+
+ // It's a very general rule so I'll narrow it a bit with some strict boundaries
+ // to avoid any possible false-positive collisions!
+ const PS_METHODS = {
+ className: 'function',
+ begin: /\[.*\]\s*[\w]+[ ]??\(/,
+ end: /$/,
+ returnBegin: true,
+ relevance: 0,
+ contains: [
+ {
+ className: 'keyword',
+ begin: '('.concat(
+ KEYWORDS.keyword.toString().replace(/\s/g, '|'
+ ), ')\\b'),
+ endsParent: true,
+ relevance: 0
+ },
+ hljs.inherit(hljs.TITLE_MODE, { endsParent: true })
+ ]
+ };
+
+ const GENTLEMANS_SET = [
+ // STATIC_MEMBER,
+ PS_METHODS,
+ PS_COMMENT,
+ BACKTICK_ESCAPE,
+ hljs.NUMBER_MODE,
+ QUOTE_STRING,
+ APOS_STRING,
+ // PS_NEW_OBJECT_TYPE,
+ CMDLETS,
+ VAR,
+ LITERAL,
+ HASH_SIGNS
+ ];
+
+ const PS_TYPE = {
+ begin: /\[/,
+ end: /\]/,
+ excludeBegin: true,
+ excludeEnd: true,
+ relevance: 0,
+ contains: [].concat(
+ 'self',
+ GENTLEMANS_SET,
+ {
+ begin: "(" + TYPES.join("|") + ")",
+ className: "built_in",
+ relevance: 0
+ },
+ {
+ className: 'type',
+ begin: /[\.\w\d]+/,
+ relevance: 0
+ }
+ )
+ };
+
+ PS_METHODS.contains.unshift(PS_TYPE);
+
+ return {
+ name: 'PowerShell',
+ aliases: [
+ "pwsh",
+ "ps",
+ "ps1"
+ ],
+ case_insensitive: true,
+ keywords: KEYWORDS,
+ contains: GENTLEMANS_SET.concat(
+ PS_CLASS,
+ PS_FUNCTION,
+ PS_USING,
+ PS_ARGUMENTS,
+ PS_TYPE
+ )
+ };
+ }
+
+ return powershell;
+
+})();
+
+ hljs.registerLanguage('powershell', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/powershell.min.js b/htroot/js/languages/powershell.min.js
new file mode 100644
index 000000000..fbfadbb1e
--- /dev/null
+++ b/htroot/js/languages/powershell.min.js
@@ -0,0 +1,39 @@
+/*! `powershell` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{const n={$pattern:/-?[A-z\.\-]+\b/,
+keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",
+built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"
+},s={begin:"`[\\s\\S]",relevance:0},i={className:"variable",variants:[{
+begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]
+},a={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],
+contains:[s,i,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},t={
+className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]
+},r=e.inherit(e.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,
+end:/#>/}],contains:[{className:"doctag",variants:[{
+begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/
+},{
+begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/
+}]}]}),c={className:"class",beginKeywords:"class enum",end:/\s*[{]/,
+excludeEnd:!0,relevance:0,contains:[e.TITLE_MODE]},l={className:"function",
+begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,
+contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",
+begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,
+className:"params",relevance:0,contains:[i]}]},o={begin:/using\s/,end:/$/,
+returnBegin:!0,contains:[a,t,{className:"keyword",
+begin:/(using|assembly|command|module|namespace|type)/}]},p={
+className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,
+relevance:0,contains:[{className:"keyword",
+begin:"(".concat(n.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,
+relevance:0},e.inherit(e.TITLE_MODE,{endsParent:!0})]
+},g=[p,r,s,e.NUMBER_MODE,a,t,{className:"built_in",variants:[{
+begin:"(Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where)+(-)[\\w\\d]+"
+}]},i,{className:"literal",begin:/\$(null|true|false)\b/},{
+className:"selector-tag",begin:/@\B/,relevance:0}],m={begin:/\[/,end:/\]/,
+excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",g,{
+begin:"(string|char|byte|int|long|bool|decimal|single|double|DateTime|xml|array|hashtable|void)",
+className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,
+relevance:0})};return p.contains.unshift(m),{name:"PowerShell",
+aliases:["pwsh","ps","ps1"],case_insensitive:!0,keywords:n,
+contains:g.concat(c,l,o,{variants:[{className:"operator",
+begin:"(-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor)\\b"
+},{className:"literal",begin:/(-){1,2}[\w\d-]+/,relevance:0}]},m)}}})()
+;hljs.registerLanguage("powershell",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/prolog.js b/htroot/js/languages/prolog.js
new file mode 100644
index 000000000..cbadbc57d
--- /dev/null
+++ b/htroot/js/languages/prolog.js
@@ -0,0 +1,107 @@
+/*! `prolog` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Prolog
+ Description: Prolog is a general purpose logic programming language associated with artificial intelligence and computational linguistics.
+ Author: Raivo Laanemets <raivo@infdot.com>
+ Website: https://en.wikipedia.org/wiki/Prolog
+ Category: functional
+ */
+
+ function prolog(hljs) {
+ const ATOM = {
+
+ begin: /[a-z][A-Za-z0-9_]*/,
+ relevance: 0
+ };
+
+ const VAR = {
+
+ className: 'symbol',
+ variants: [
+ { begin: /[A-Z][a-zA-Z0-9_]*/ },
+ { begin: /_[A-Za-z0-9_]*/ }
+ ],
+ relevance: 0
+ };
+
+ const PARENTED = {
+
+ begin: /\(/,
+ end: /\)/,
+ relevance: 0
+ };
+
+ const LIST = {
+
+ begin: /\[/,
+ end: /\]/
+ };
+
+ const LINE_COMMENT = {
+
+ className: 'comment',
+ begin: /%/,
+ end: /$/,
+ contains: [ hljs.PHRASAL_WORDS_MODE ]
+ };
+
+ const BACKTICK_STRING = {
+
+ className: 'string',
+ begin: /`/,
+ end: /`/,
+ contains: [ hljs.BACKSLASH_ESCAPE ]
+ };
+
+ const CHAR_CODE = {
+ className: 'string', // 0'a etc.
+ begin: /0'(\\'|.)/
+ };
+
+ const SPACE_CODE = {
+ className: 'string',
+ begin: /0'\\s/ // 0'\s
+ };
+
+ const PRED_OP = { // relevance booster
+ begin: /:-/ };
+
+ const inner = [
+
+ ATOM,
+ VAR,
+ PARENTED,
+ PRED_OP,
+ LIST,
+ LINE_COMMENT,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.APOS_STRING_MODE,
+ BACKTICK_STRING,
+ CHAR_CODE,
+ SPACE_CODE,
+ hljs.C_NUMBER_MODE
+ ];
+
+ PARENTED.contains = inner;
+ LIST.contains = inner;
+
+ return {
+ name: 'Prolog',
+ contains: inner.concat([
+ { // relevance booster
+ begin: /\.$/ }
+ ])
+ };
+ }
+
+ return prolog;
+
+})();
+
+ hljs.registerLanguage('prolog', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/prolog.min.js b/htroot/js/languages/prolog.min.js
new file mode 100644
index 000000000..04b55c24f
--- /dev/null
+++ b/htroot/js/languages/prolog.min.js
@@ -0,0 +1,11 @@
+/*! `prolog` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var n=(()=>{"use strict";return n=>{const e={begin:/\(/,end:/\)/,
+relevance:0},a={begin:/\[/,end:/\]/},s={className:"comment",begin:/%/,end:/$/,
+contains:[n.PHRASAL_WORDS_MODE]},i={className:"string",begin:/`/,end:/`/,
+contains:[n.BACKSLASH_ESCAPE]},g=[{begin:/[a-z][A-Za-z0-9_]*/,relevance:0},{
+className:"symbol",variants:[{begin:/[A-Z][a-zA-Z0-9_]*/},{
+begin:/_[A-Za-z0-9_]*/}],relevance:0},e,{begin:/:-/
+},a,s,n.C_BLOCK_COMMENT_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,i,{
+className:"string",begin:/0'(\\'|.)/},{className:"string",begin:/0'\\s/
+},n.C_NUMBER_MODE];return e.contains=g,a.contains=g,{name:"Prolog",
+contains:g.concat([{begin:/\.$/}])}}})();hljs.registerLanguage("prolog",n)})(); \ No newline at end of file
diff --git a/htroot/js/languages/python.js b/htroot/js/languages/python.js
new file mode 100644
index 000000000..6ef1afee1
--- /dev/null
+++ b/htroot/js/languages/python.js
@@ -0,0 +1,446 @@
+/*! `python` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Python
+ Description: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.
+ Website: https://www.python.org
+ Category: common
+ */
+
+ function python(hljs) {
+ const regex = hljs.regex;
+ const IDENT_RE = /[\p{XID_Start}_]\p{XID_Continue}*/u;
+ const RESERVED_WORDS = [
+ 'and',
+ 'as',
+ 'assert',
+ 'async',
+ 'await',
+ 'break',
+ 'case',
+ 'class',
+ 'continue',
+ 'def',
+ 'del',
+ 'elif',
+ 'else',
+ 'except',
+ 'finally',
+ 'for',
+ 'from',
+ 'global',
+ 'if',
+ 'import',
+ 'in',
+ 'is',
+ 'lambda',
+ 'match',
+ 'nonlocal|10',
+ 'not',
+ 'or',
+ 'pass',
+ 'raise',
+ 'return',
+ 'try',
+ 'while',
+ 'with',
+ 'yield'
+ ];
+
+ const BUILT_INS = [
+ '__import__',
+ 'abs',
+ 'all',
+ 'any',
+ 'ascii',
+ 'bin',
+ 'bool',
+ 'breakpoint',
+ 'bytearray',
+ 'bytes',
+ 'callable',
+ 'chr',
+ 'classmethod',
+ 'compile',
+ 'complex',
+ 'delattr',
+ 'dict',
+ 'dir',
+ 'divmod',
+ 'enumerate',
+ 'eval',
+ 'exec',
+ 'filter',
+ 'float',
+ 'format',
+ 'frozenset',
+ 'getattr',
+ 'globals',
+ 'hasattr',
+ 'hash',
+ 'help',
+ 'hex',
+ 'id',
+ 'input',
+ 'int',
+ 'isinstance',
+ 'issubclass',
+ 'iter',
+ 'len',
+ 'list',
+ 'locals',
+ 'map',
+ 'max',
+ 'memoryview',
+ 'min',
+ 'next',
+ 'object',
+ 'oct',
+ 'open',
+ 'ord',
+ 'pow',
+ 'print',
+ 'property',
+ 'range',
+ 'repr',
+ 'reversed',
+ 'round',
+ 'set',
+ 'setattr',
+ 'slice',
+ 'sorted',
+ 'staticmethod',
+ 'str',
+ 'sum',
+ 'super',
+ 'tuple',
+ 'type',
+ 'vars',
+ 'zip'
+ ];
+
+ const LITERALS = [
+ '__debug__',
+ 'Ellipsis',
+ 'False',
+ 'None',
+ 'NotImplemented',
+ 'True'
+ ];
+
+ // https://docs.python.org/3/library/typing.html
+ // TODO: Could these be supplemented by a CamelCase matcher in certain
+ // contexts, leaving these remaining only for relevance hinting?
+ const TYPES = [
+ "Any",
+ "Callable",
+ "Coroutine",
+ "Dict",
+ "List",
+ "Literal",
+ "Generic",
+ "Optional",
+ "Sequence",
+ "Set",
+ "Tuple",
+ "Type",
+ "Union"
+ ];
+
+ const KEYWORDS = {
+ $pattern: /[A-Za-z]\w+|__\w+__/,
+ keyword: RESERVED_WORDS,
+ built_in: BUILT_INS,
+ literal: LITERALS,
+ type: TYPES
+ };
+
+ const PROMPT = {
+ className: 'meta',
+ begin: /^(>>>|\.\.\.) /
+ };
+
+ const SUBST = {
+ className: 'subst',
+ begin: /\{/,
+ end: /\}/,
+ keywords: KEYWORDS,
+ illegal: /#/
+ };
+
+ const LITERAL_BRACKET = {
+ begin: /\{\{/,
+ relevance: 0
+ };
+
+ const STRING = {
+ className: 'string',
+ contains: [ hljs.BACKSLASH_ESCAPE ],
+ variants: [
+ {
+ begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,
+ end: /'''/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ PROMPT
+ ],
+ relevance: 10
+ },
+ {
+ begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,
+ end: /"""/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ PROMPT
+ ],
+ relevance: 10
+ },
+ {
+ begin: /([fF][rR]|[rR][fF]|[fF])'''/,
+ end: /'''/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ PROMPT,
+ LITERAL_BRACKET,
+ SUBST
+ ]
+ },
+ {
+ begin: /([fF][rR]|[rR][fF]|[fF])"""/,
+ end: /"""/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ PROMPT,
+ LITERAL_BRACKET,
+ SUBST
+ ]
+ },
+ {
+ begin: /([uU]|[rR])'/,
+ end: /'/,
+ relevance: 10
+ },
+ {
+ begin: /([uU]|[rR])"/,
+ end: /"/,
+ relevance: 10
+ },
+ {
+ begin: /([bB]|[bB][rR]|[rR][bB])'/,
+ end: /'/
+ },
+ {
+ begin: /([bB]|[bB][rR]|[rR][bB])"/,
+ end: /"/
+ },
+ {
+ begin: /([fF][rR]|[rR][fF]|[fF])'/,
+ end: /'/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ LITERAL_BRACKET,
+ SUBST
+ ]
+ },
+ {
+ begin: /([fF][rR]|[rR][fF]|[fF])"/,
+ end: /"/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ LITERAL_BRACKET,
+ SUBST
+ ]
+ },
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE
+ ]
+ };
+
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals
+ const digitpart = '[0-9](_?[0-9])*';
+ const pointfloat = `(\\b(${digitpart}))?\\.(${digitpart})|\\b(${digitpart})\\.`;
+ // Whitespace after a number (or any lexical token) is needed only if its absence
+ // would change the tokenization
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens
+ // We deviate slightly, requiring a word boundary or a keyword
+ // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)
+ const lookahead = `\\b|${RESERVED_WORDS.join('|')}`;
+ const NUMBER = {
+ className: 'number',
+ relevance: 0,
+ variants: [
+ // exponentfloat, pointfloat
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals
+ // optionally imaginary
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
+ // Note: no leading \b because floats can start with a decimal point
+ // and we don't want to mishandle e.g. `fn(.5)`,
+ // no trailing \b for pointfloat because it can end with a decimal point
+ // and we don't want to mishandle e.g. `0..hex()`; this should be safe
+ // because both MUST contain a decimal point and so cannot be confused with
+ // the interior part of an identifier
+ {
+ begin: `(\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`
+ },
+ {
+ begin: `(${pointfloat})[jJ]?`
+ },
+
+ // decinteger, bininteger, octinteger, hexinteger
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals
+ // optionally "long" in Python 2
+ // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals
+ // decinteger is optionally imaginary
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
+ {
+ begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`
+ },
+ {
+ begin: `\\b0[bB](_?[01])+[lL]?(?=${lookahead})`
+ },
+ {
+ begin: `\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`
+ },
+ {
+ begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`
+ },
+
+ // imagnumber (digitpart-based)
+ // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
+ {
+ begin: `\\b(${digitpart})[jJ](?=${lookahead})`
+ }
+ ]
+ };
+ const COMMENT_TYPE = {
+ className: "comment",
+ begin: regex.lookahead(/# type:/),
+ end: /$/,
+ keywords: KEYWORDS,
+ contains: [
+ { // prevent keywords from coloring `type`
+ begin: /# type:/
+ },
+ // comment within a datatype comment includes no keywords
+ {
+ begin: /#/,
+ end: /\b\B/,
+ endsWithParent: true
+ }
+ ]
+ };
+ const PARAMS = {
+ className: 'params',
+ variants: [
+ // Exclude params in functions without params
+ {
+ className: "",
+ begin: /\(\s*\)/,
+ skip: true
+ },
+ {
+ begin: /\(/,
+ end: /\)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ keywords: KEYWORDS,
+ contains: [
+ 'self',
+ PROMPT,
+ NUMBER,
+ STRING,
+ hljs.HASH_COMMENT_MODE
+ ]
+ }
+ ]
+ };
+ SUBST.contains = [
+ STRING,
+ NUMBER,
+ PROMPT
+ ];
+
+ return {
+ name: 'Python',
+ aliases: [
+ 'py',
+ 'gyp',
+ 'ipython'
+ ],
+ unicodeRegex: true,
+ keywords: KEYWORDS,
+ illegal: /(<\/|\?)|=>/,
+ contains: [
+ PROMPT,
+ NUMBER,
+ {
+ // very common convention
+ scope: 'variable.language',
+ match: /\bself\b/
+ },
+ {
+ // eat "if" prior to string so that it won't accidentally be
+ // labeled as an f-string
+ beginKeywords: "if",
+ relevance: 0
+ },
+ { match: /\bor\b/, scope: "keyword" },
+ STRING,
+ COMMENT_TYPE,
+ hljs.HASH_COMMENT_MODE,
+ {
+ match: [
+ /\bdef/, /\s+/,
+ IDENT_RE,
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ contains: [ PARAMS ]
+ },
+ {
+ variants: [
+ {
+ match: [
+ /\bclass/, /\s+/,
+ IDENT_RE, /\s*/,
+ /\(\s*/, IDENT_RE,/\s*\)/
+ ],
+ },
+ {
+ match: [
+ /\bclass/, /\s+/,
+ IDENT_RE
+ ],
+ }
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.class",
+ 6: "title.class.inherited",
+ }
+ },
+ {
+ className: 'meta',
+ begin: /^[\t ]*@/,
+ end: /(?=#)|$/,
+ contains: [
+ NUMBER,
+ PARAMS,
+ STRING
+ ]
+ }
+ ]
+ };
+ }
+
+ return python;
+
+})();
+
+ hljs.registerLanguage('python', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/python.min.js b/htroot/js/languages/python.min.js
new file mode 100644
index 000000000..57337c48e
--- /dev/null
+++ b/htroot/js/languages/python.min.js
@@ -0,0 +1,42 @@
+/*! `python` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={
+$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s,
+built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],
+literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],
+type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]
+},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/,
+end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={
+className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,
+contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{
+begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,
+end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/,
+relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{
+begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,
+end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,
+contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]
+},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),g={
+className:"number",relevance:0,variants:[{
+begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{
+begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{
+begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})`
+},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})`
+}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t,
+contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={
+className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,
+contains:["self",i,g,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,g,i],{
+name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t,
+illegal:/(<\/|\?)|=>/,contains:[i,g,{scope:"variable.language",match:/\bself\b/
+},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"
+},o,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword",
+3:"title.function"},contains:[m]},{variants:[{
+match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}],
+scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{
+className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,o]}]}}})()
+;hljs.registerLanguage("python",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/rust.js b/htroot/js/languages/rust.js
new file mode 100644
index 000000000..45a9fa62e
--- /dev/null
+++ b/htroot/js/languages/rust.js
@@ -0,0 +1,336 @@
+/*! `rust` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Rust
+ Author: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
+ Contributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>
+ Website: https://www.rust-lang.org
+ Category: common, system
+ */
+
+ /** @type LanguageFn */
+
+ function rust(hljs) {
+ const regex = hljs.regex;
+ // ============================================
+ // Added to support the r# keyword, which is a raw identifier in Rust.
+ const RAW_IDENTIFIER = /(r#)?/;
+ const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE);
+ const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE);
+ // ============================================
+ const FUNCTION_INVOKE = {
+ className: "title.function.invoke",
+ relevance: 0,
+ begin: regex.concat(
+ /\b/,
+ /(?!let|for|while|if|else|match\b)/,
+ IDENT_RE,
+ regex.lookahead(/\s*\(/))
+ };
+ const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\?';
+ const KEYWORDS = [
+ "abstract",
+ "as",
+ "async",
+ "await",
+ "become",
+ "box",
+ "break",
+ "const",
+ "continue",
+ "crate",
+ "do",
+ "dyn",
+ "else",
+ "enum",
+ "extern",
+ "false",
+ "final",
+ "fn",
+ "for",
+ "if",
+ "impl",
+ "in",
+ "let",
+ "loop",
+ "macro",
+ "match",
+ "mod",
+ "move",
+ "mut",
+ "override",
+ "priv",
+ "pub",
+ "ref",
+ "return",
+ "self",
+ "Self",
+ "static",
+ "struct",
+ "super",
+ "trait",
+ "true",
+ "try",
+ "type",
+ "typeof",
+ "union",
+ "unsafe",
+ "unsized",
+ "use",
+ "virtual",
+ "where",
+ "while",
+ "yield"
+ ];
+ const LITERALS = [
+ "true",
+ "false",
+ "Some",
+ "None",
+ "Ok",
+ "Err"
+ ];
+ const BUILTINS = [
+ // functions
+ 'drop ',
+ // traits
+ "Copy",
+ "Send",
+ "Sized",
+ "Sync",
+ "Drop",
+ "Fn",
+ "FnMut",
+ "FnOnce",
+ "ToOwned",
+ "Clone",
+ "Debug",
+ "PartialEq",
+ "PartialOrd",
+ "Eq",
+ "Ord",
+ "AsRef",
+ "AsMut",
+ "Into",
+ "From",
+ "Default",
+ "Iterator",
+ "Extend",
+ "IntoIterator",
+ "DoubleEndedIterator",
+ "ExactSizeIterator",
+ "SliceConcatExt",
+ "ToString",
+ // macros
+ "assert!",
+ "assert_eq!",
+ "bitflags!",
+ "bytes!",
+ "cfg!",
+ "col!",
+ "concat!",
+ "concat_idents!",
+ "debug_assert!",
+ "debug_assert_eq!",
+ "env!",
+ "eprintln!",
+ "panic!",
+ "file!",
+ "format!",
+ "format_args!",
+ "include_bytes!",
+ "include_str!",
+ "line!",
+ "local_data_key!",
+ "module_path!",
+ "option_env!",
+ "print!",
+ "println!",
+ "select!",
+ "stringify!",
+ "try!",
+ "unimplemented!",
+ "unreachable!",
+ "vec!",
+ "write!",
+ "writeln!",
+ "macro_rules!",
+ "assert_ne!",
+ "debug_assert_ne!"
+ ];
+ const TYPES = [
+ "i8",
+ "i16",
+ "i32",
+ "i64",
+ "i128",
+ "isize",
+ "u8",
+ "u16",
+ "u32",
+ "u64",
+ "u128",
+ "usize",
+ "f32",
+ "f64",
+ "str",
+ "char",
+ "bool",
+ "Box",
+ "Option",
+ "Result",
+ "String",
+ "Vec"
+ ];
+ return {
+ name: 'Rust',
+ aliases: [ 'rs' ],
+ keywords: {
+ $pattern: hljs.IDENT_RE + '!?',
+ type: TYPES,
+ keyword: KEYWORDS,
+ literal: LITERALS,
+ built_in: BUILTINS
+ },
+ illegal: '</',
+ contains: [
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.COMMENT('/\\*', '\\*/', { contains: [ 'self' ] }),
+ hljs.inherit(hljs.QUOTE_STRING_MODE, {
+ begin: /b?"/,
+ illegal: null
+ }),
+ {
+ className: 'symbol',
+ // negative lookahead to avoid matching `'`
+ begin: /'[a-zA-Z_][a-zA-Z0-9_]*(?!')/
+ },
+ {
+ scope: 'string',
+ variants: [
+ { begin: /b?r(#*)"(.|\n)*?"\1(?!#)/ },
+ {
+ begin: /b?'/,
+ end: /'/,
+ contains: [
+ {
+ scope: "char.escape",
+ match: /\\('|\w|x\w{2}|u\w{4}|U\w{8})/
+ }
+ ]
+ }
+ ]
+ },
+ {
+ className: 'number',
+ variants: [
+ { begin: '\\b0b([01_]+)' + NUMBER_SUFFIX },
+ { begin: '\\b0o([0-7_]+)' + NUMBER_SUFFIX },
+ { begin: '\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },
+ { begin: '\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'
+ + NUMBER_SUFFIX }
+ ],
+ relevance: 0
+ },
+ {
+ begin: [
+ /fn/,
+ /\s+/,
+ UNDERSCORE_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ }
+ },
+ {
+ className: 'meta',
+ begin: '#!?\\[',
+ end: '\\]',
+ contains: [
+ {
+ className: 'string',
+ begin: /"/,
+ end: /"/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE
+ ]
+ }
+ ]
+ },
+ {
+ begin: [
+ /let/,
+ /\s+/,
+ /(?:mut\s+)?/,
+ UNDERSCORE_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "keyword",
+ 4: "variable"
+ }
+ },
+ // must come before impl/for rule later
+ {
+ begin: [
+ /for/,
+ /\s+/,
+ UNDERSCORE_IDENT_RE,
+ /\s+/,
+ /in/
+ ],
+ className: {
+ 1: "keyword",
+ 3: "variable",
+ 5: "keyword"
+ }
+ },
+ {
+ begin: [
+ /type/,
+ /\s+/,
+ UNDERSCORE_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+ {
+ begin: [
+ /(?:trait|enum|struct|union|impl|for)/,
+ /\s+/,
+ UNDERSCORE_IDENT_RE
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+ {
+ begin: hljs.IDENT_RE + '::',
+ keywords: {
+ keyword: "Self",
+ built_in: BUILTINS,
+ type: TYPES
+ }
+ },
+ {
+ className: "punctuation",
+ begin: '->'
+ },
+ FUNCTION_INVOKE
+ ]
+ };
+ }
+
+ return rust;
+
+})();
+
+ hljs.registerLanguage('rust', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/rust.min.js b/htroot/js/languages/rust.min.js
new file mode 100644
index 000000000..3b839910f
--- /dev/null
+++ b/htroot/js/languages/rust.min.js
@@ -0,0 +1,27 @@
+/*! `rust` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const t=e.regex,n=/(r#)?/,a=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),s={
+className:"title.function.invoke",relevance:0,
+begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,t.lookahead(/\s*\(/))
+},r="([ui](8|16|32|64|128|size)|f(32|64))?",l=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],o=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"]
+;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:o,
+keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],
+literal:["true","false","Some","None","Ok","Err"],built_in:l},illegal:"</",
+contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]
+}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{
+className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*(?!')/},{scope:"string",
+variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'/,end:/'/,contains:[{
+scope:"char.escape",match:/\\('|\w|x\w{2}|u\w{4}|U\w{8})/}]}]},{
+className:"number",variants:[{begin:"\\b0b([01_]+)"+r},{begin:"\\b0o([0-7_]+)"+r
+},{begin:"\\b0x([A-Fa-f0-9_]+)"+r},{
+begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+r}],relevance:0},{
+begin:[/fn/,/\s+/,a],className:{1:"keyword",3:"title.function"}},{
+className:"meta",begin:"#!?\\[",end:"\\]",contains:[{className:"string",
+begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{
+begin:[/let/,/\s+/,/(?:mut\s+)?/,a],className:{1:"keyword",3:"keyword",
+4:"variable"}},{begin:[/for/,/\s+/,a,/\s+/,/in/],className:{1:"keyword",
+3:"variable",5:"keyword"}},{begin:[/type/,/\s+/,a],className:{1:"keyword",
+3:"title.class"}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,a],
+className:{1:"keyword",3:"title.class"}},{begin:e.IDENT_RE+"::",keywords:{
+keyword:"Self",built_in:l,type:o}},{className:"punctuation",begin:"->"},s]}}})()
+;hljs.registerLanguage("rust",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/shell.js b/htroot/js/languages/shell.js
new file mode 100644
index 000000000..16ecb899d
--- /dev/null
+++ b/htroot/js/languages/shell.js
@@ -0,0 +1,43 @@
+/*! `shell` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: Shell Session
+ Requires: bash.js
+ Author: TSUYUSATO Kitsune <make.just.on@gmail.com>
+ Category: common
+ Audit: 2020
+ */
+
+ /** @type LanguageFn */
+ function shell(hljs) {
+ return {
+ name: 'Shell Session',
+ aliases: [
+ 'console',
+ 'shellsession'
+ ],
+ contains: [
+ {
+ className: 'meta.prompt',
+ // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result.
+ // For instance, in the following example, it would match "echo /path/to/home >" as a prompt:
+ // echo /path/to/home > t.exe
+ begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,
+ starts: {
+ end: /[^\\](?=\s*$)/,
+ subLanguage: 'bash'
+ }
+ }
+ ]
+ };
+ }
+
+ return shell;
+
+})();
+
+ hljs.registerLanguage('shell', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/shell.min.js b/htroot/js/languages/shell.min.js
new file mode 100644
index 000000000..fefe7ec0d
--- /dev/null
+++ b/htroot/js/languages/shell.min.js
@@ -0,0 +1,5 @@
+/*! `shell` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var s=(()=>{"use strict";return s=>({name:"Shell Session",
+aliases:["console","shellsession"],contains:[{className:"meta.prompt",
+begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,
+subLanguage:"bash"}}]})})();hljs.registerLanguage("shell",s)})(); \ No newline at end of file
diff --git a/htroot/js/languages/sql.js b/htroot/js/languages/sql.js
new file mode 100644
index 000000000..17810b3a9
--- /dev/null
+++ b/htroot/js/languages/sql.js
@@ -0,0 +1,703 @@
+/*! `sql` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: SQL
+ Website: https://en.wikipedia.org/wiki/SQL
+ Category: common, database
+ */
+
+ /*
+
+ Goals:
+
+ SQL is intended to highlight basic/common SQL keywords and expressions
+
+ - If pretty much every single SQL server includes supports, then it's a canidate.
+ - It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,
+ PostgreSQL) although the list of data types is purposely a bit more expansive.
+ - For more specific SQL grammars please see:
+ - PostgreSQL and PL/pgSQL - core
+ - T-SQL - https://github.com/highlightjs/highlightjs-tsql
+ - sql_more (core)
+
+ */
+
+ function sql(hljs) {
+ const regex = hljs.regex;
+ const COMMENT_MODE = hljs.COMMENT('--', '$');
+ const STRING = {
+ scope: 'string',
+ variants: [
+ {
+ begin: /'/,
+ end: /'/,
+ contains: [ { match: /''/ } ]
+ }
+ ]
+ };
+ const QUOTED_IDENTIFIER = {
+ begin: /"/,
+ end: /"/,
+ contains: [ { match: /""/ } ]
+ };
+
+ const LITERALS = [
+ "true",
+ "false",
+ // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.
+ // "null",
+ "unknown"
+ ];
+
+ const MULTI_WORD_TYPES = [
+ "double precision",
+ "large object",
+ "with timezone",
+ "without timezone"
+ ];
+
+ const TYPES = [
+ 'bigint',
+ 'binary',
+ 'blob',
+ 'boolean',
+ 'char',
+ 'character',
+ 'clob',
+ 'date',
+ 'dec',
+ 'decfloat',
+ 'decimal',
+ 'float',
+ 'int',
+ 'integer',
+ 'interval',
+ 'nchar',
+ 'nclob',
+ 'national',
+ 'numeric',
+ 'real',
+ 'row',
+ 'smallint',
+ 'time',
+ 'timestamp',
+ 'varchar',
+ 'varying', // modifier (character varying)
+ 'varbinary'
+ ];
+
+ const NON_RESERVED_WORDS = [
+ "add",
+ "asc",
+ "collation",
+ "desc",
+ "final",
+ "first",
+ "last",
+ "view"
+ ];
+
+ // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word
+ const RESERVED_WORDS = [
+ "abs",
+ "acos",
+ "all",
+ "allocate",
+ "alter",
+ "and",
+ "any",
+ "are",
+ "array",
+ "array_agg",
+ "array_max_cardinality",
+ "as",
+ "asensitive",
+ "asin",
+ "asymmetric",
+ "at",
+ "atan",
+ "atomic",
+ "authorization",
+ "avg",
+ "begin",
+ "begin_frame",
+ "begin_partition",
+ "between",
+ "bigint",
+ "binary",
+ "blob",
+ "boolean",
+ "both",
+ "by",
+ "call",
+ "called",
+ "cardinality",
+ "cascaded",
+ "case",
+ "cast",
+ "ceil",
+ "ceiling",
+ "char",
+ "char_length",
+ "character",
+ "character_length",
+ "check",
+ "classifier",
+ "clob",
+ "close",
+ "coalesce",
+ "collate",
+ "collect",
+ "column",
+ "commit",
+ "condition",
+ "connect",
+ "constraint",
+ "contains",
+ "convert",
+ "copy",
+ "corr",
+ "corresponding",
+ "cos",
+ "cosh",
+ "count",
+ "covar_pop",
+ "covar_samp",
+ "create",
+ "cross",
+ "cube",
+ "cume_dist",
+ "current",
+ "current_catalog",
+ "current_date",
+ "current_default_transform_group",
+ "current_path",
+ "current_role",
+ "current_row",
+ "current_schema",
+ "current_time",
+ "current_timestamp",
+ "current_path",
+ "current_role",
+ "current_transform_group_for_type",
+ "current_user",
+ "cursor",
+ "cycle",
+ "date",
+ "day",
+ "deallocate",
+ "dec",
+ "decimal",
+ "decfloat",
+ "declare",
+ "default",
+ "define",
+ "delete",
+ "dense_rank",
+ "deref",
+ "describe",
+ "deterministic",
+ "disconnect",
+ "distinct",
+ "double",
+ "drop",
+ "dynamic",
+ "each",
+ "element",
+ "else",
+ "empty",
+ "end",
+ "end_frame",
+ "end_partition",
+ "end-exec",
+ "equals",
+ "escape",
+ "every",
+ "except",
+ "exec",
+ "execute",
+ "exists",
+ "exp",
+ "external",
+ "extract",
+ "false",
+ "fetch",
+ "filter",
+ "first_value",
+ "float",
+ "floor",
+ "for",
+ "foreign",
+ "frame_row",
+ "free",
+ "from",
+ "full",
+ "function",
+ "fusion",
+ "get",
+ "global",
+ "grant",
+ "group",
+ "grouping",
+ "groups",
+ "having",
+ "hold",
+ "hour",
+ "identity",
+ "in",
+ "indicator",
+ "initial",
+ "inner",
+ "inout",
+ "insensitive",
+ "insert",
+ "int",
+ "integer",
+ "intersect",
+ "intersection",
+ "interval",
+ "into",
+ "is",
+ "join",
+ "json_array",
+ "json_arrayagg",
+ "json_exists",
+ "json_object",
+ "json_objectagg",
+ "json_query",
+ "json_table",
+ "json_table_primitive",
+ "json_value",
+ "lag",
+ "language",
+ "large",
+ "last_value",
+ "lateral",
+ "lead",
+ "leading",
+ "left",
+ "like",
+ "like_regex",
+ "listagg",
+ "ln",
+ "local",
+ "localtime",
+ "localtimestamp",
+ "log",
+ "log10",
+ "lower",
+ "match",
+ "match_number",
+ "match_recognize",
+ "matches",
+ "max",
+ "member",
+ "merge",
+ "method",
+ "min",
+ "minute",
+ "mod",
+ "modifies",
+ "module",
+ "month",
+ "multiset",
+ "national",
+ "natural",
+ "nchar",
+ "nclob",
+ "new",
+ "no",
+ "none",
+ "normalize",
+ "not",
+ "nth_value",
+ "ntile",
+ "null",
+ "nullif",
+ "numeric",
+ "octet_length",
+ "occurrences_regex",
+ "of",
+ "offset",
+ "old",
+ "omit",
+ "on",
+ "one",
+ "only",
+ "open",
+ "or",
+ "order",
+ "out",
+ "outer",
+ "over",
+ "overlaps",
+ "overlay",
+ "parameter",
+ "partition",
+ "pattern",
+ "per",
+ "percent",
+ "percent_rank",
+ "percentile_cont",
+ "percentile_disc",
+ "period",
+ "portion",
+ "position",
+ "position_regex",
+ "power",
+ "precedes",
+ "precision",
+ "prepare",
+ "primary",
+ "procedure",
+ "ptf",
+ "range",
+ "rank",
+ "reads",
+ "real",
+ "recursive",
+ "ref",
+ "references",
+ "referencing",
+ "regr_avgx",
+ "regr_avgy",
+ "regr_count",
+ "regr_intercept",
+ "regr_r2",
+ "regr_slope",
+ "regr_sxx",
+ "regr_sxy",
+ "regr_syy",
+ "release",
+ "result",
+ "return",
+ "returns",
+ "revoke",
+ "right",
+ "rollback",
+ "rollup",
+ "row",
+ "row_number",
+ "rows",
+ "running",
+ "savepoint",
+ "scope",
+ "scroll",
+ "search",
+ "second",
+ "seek",
+ "select",
+ "sensitive",
+ "session_user",
+ "set",
+ "show",
+ "similar",
+ "sin",
+ "sinh",
+ "skip",
+ "smallint",
+ "some",
+ "specific",
+ "specifictype",
+ "sql",
+ "sqlexception",
+ "sqlstate",
+ "sqlwarning",
+ "sqrt",
+ "start",
+ "static",
+ "stddev_pop",
+ "stddev_samp",
+ "submultiset",
+ "subset",
+ "substring",
+ "substring_regex",
+ "succeeds",
+ "sum",
+ "symmetric",
+ "system",
+ "system_time",
+ "system_user",
+ "table",
+ "tablesample",
+ "tan",
+ "tanh",
+ "then",
+ "time",
+ "timestamp",
+ "timezone_hour",
+ "timezone_minute",
+ "to",
+ "trailing",
+ "translate",
+ "translate_regex",
+ "translation",
+ "treat",
+ "trigger",
+ "trim",
+ "trim_array",
+ "true",
+ "truncate",
+ "uescape",
+ "union",
+ "unique",
+ "unknown",
+ "unnest",
+ "update",
+ "upper",
+ "user",
+ "using",
+ "value",
+ "values",
+ "value_of",
+ "var_pop",
+ "var_samp",
+ "varbinary",
+ "varchar",
+ "varying",
+ "versioning",
+ "when",
+ "whenever",
+ "where",
+ "width_bucket",
+ "window",
+ "with",
+ "within",
+ "without",
+ "year",
+ ];
+
+ // these are reserved words we have identified to be functions
+ // and should only be highlighted in a dispatch-like context
+ // ie, array_agg(...), etc.
+ const RESERVED_FUNCTIONS = [
+ "abs",
+ "acos",
+ "array_agg",
+ "asin",
+ "atan",
+ "avg",
+ "cast",
+ "ceil",
+ "ceiling",
+ "coalesce",
+ "corr",
+ "cos",
+ "cosh",
+ "count",
+ "covar_pop",
+ "covar_samp",
+ "cume_dist",
+ "dense_rank",
+ "deref",
+ "element",
+ "exp",
+ "extract",
+ "first_value",
+ "floor",
+ "json_array",
+ "json_arrayagg",
+ "json_exists",
+ "json_object",
+ "json_objectagg",
+ "json_query",
+ "json_table",
+ "json_table_primitive",
+ "json_value",
+ "lag",
+ "last_value",
+ "lead",
+ "listagg",
+ "ln",
+ "log",
+ "log10",
+ "lower",
+ "max",
+ "min",
+ "mod",
+ "nth_value",
+ "ntile",
+ "nullif",
+ "percent_rank",
+ "percentile_cont",
+ "percentile_disc",
+ "position",
+ "position_regex",
+ "power",
+ "rank",
+ "regr_avgx",
+ "regr_avgy",
+ "regr_count",
+ "regr_intercept",
+ "regr_r2",
+ "regr_slope",
+ "regr_sxx",
+ "regr_sxy",
+ "regr_syy",
+ "row_number",
+ "sin",
+ "sinh",
+ "sqrt",
+ "stddev_pop",
+ "stddev_samp",
+ "substring",
+ "substring_regex",
+ "sum",
+ "tan",
+ "tanh",
+ "translate",
+ "translate_regex",
+ "treat",
+ "trim",
+ "trim_array",
+ "unnest",
+ "upper",
+ "value_of",
+ "var_pop",
+ "var_samp",
+ "width_bucket",
+ ];
+
+ // these functions can
+ const POSSIBLE_WITHOUT_PARENS = [
+ "current_catalog",
+ "current_date",
+ "current_default_transform_group",
+ "current_path",
+ "current_role",
+ "current_schema",
+ "current_transform_group_for_type",
+ "current_user",
+ "session_user",
+ "system_time",
+ "system_user",
+ "current_time",
+ "localtime",
+ "current_timestamp",
+ "localtimestamp"
+ ];
+
+ // those exist to boost relevance making these very
+ // "SQL like" keyword combos worth +1 extra relevance
+ const COMBOS = [
+ "create table",
+ "insert into",
+ "primary key",
+ "foreign key",
+ "not null",
+ "alter table",
+ "add constraint",
+ "grouping sets",
+ "on overflow",
+ "character set",
+ "respect nulls",
+ "ignore nulls",
+ "nulls first",
+ "nulls last",
+ "depth first",
+ "breadth first"
+ ];
+
+ const FUNCTIONS = RESERVED_FUNCTIONS;
+
+ const KEYWORDS = [
+ ...RESERVED_WORDS,
+ ...NON_RESERVED_WORDS
+ ].filter((keyword) => {
+ return !RESERVED_FUNCTIONS.includes(keyword);
+ });
+
+ const VARIABLE = {
+ scope: "variable",
+ match: /@[a-z0-9][a-z0-9_]*/,
+ };
+
+ const OPERATOR = {
+ scope: "operator",
+ match: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,
+ relevance: 0,
+ };
+
+ const FUNCTION_CALL = {
+ match: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/),
+ relevance: 0,
+ keywords: { built_in: FUNCTIONS }
+ };
+
+ // turns a multi-word keyword combo into a regex that doesn't
+ // care about extra whitespace etc.
+ // input: "START QUERY"
+ // output: /\bSTART\s+QUERY\b/
+ function kws_to_regex(list) {
+ return regex.concat(
+ /\b/,
+ regex.either(...list.map((kw) => {
+ return kw.replace(/\s+/, "\\s+")
+ })),
+ /\b/
+ )
+ }
+
+ const MULTI_WORD_KEYWORDS = {
+ scope: "keyword",
+ match: kws_to_regex(COMBOS),
+ relevance: 0,
+ };
+
+ // keywords with less than 3 letters are reduced in relevancy
+ function reduceRelevancy(list, {
+ exceptions, when
+ } = {}) {
+ const qualifyFn = when;
+ exceptions = exceptions || [];
+ return list.map((item) => {
+ if (item.match(/\|\d+$/) || exceptions.includes(item)) {
+ return item;
+ } else if (qualifyFn(item)) {
+ return `${item}|0`;
+ } else {
+ return item;
+ }
+ });
+ }
+
+ return {
+ name: 'SQL',
+ case_insensitive: true,
+ // does not include {} or HTML tags `</`
+ illegal: /[{}]|<\//,
+ keywords: {
+ $pattern: /\b[\w\.]+/,
+ keyword:
+ reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),
+ literal: LITERALS,
+ type: TYPES,
+ built_in: POSSIBLE_WITHOUT_PARENS
+ },
+ contains: [
+ {
+ scope: "type",
+ match: kws_to_regex(MULTI_WORD_TYPES)
+ },
+ MULTI_WORD_KEYWORDS,
+ FUNCTION_CALL,
+ VARIABLE,
+ STRING,
+ QUOTED_IDENTIFIER,
+ hljs.C_NUMBER_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ COMMENT_MODE,
+ OPERATOR
+ ]
+ };
+ }
+
+ return sql;
+
+})();
+
+ hljs.registerLanguage('sql', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/sql.min.js b/htroot/js/languages/sql.min.js
new file mode 100644
index 000000000..bac943a7f
--- /dev/null
+++ b/htroot/js/languages/sql.min.js
@@ -0,0 +1,21 @@
+/*! `sql` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const r=e.regex,t=e.COMMENT("--","$"),a=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],n=a,s=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!a.includes(e))),i={
+match:r.concat(/\b/,r.either(...n),/\s*\(/),relevance:0,keywords:{built_in:n}}
+;function o(e){
+return r.concat(/\b/,r.either(...e.map((e=>e.replace(/\s+/,"\\s+")))),/\b/)}
+const c={scope:"keyword",
+match:o(["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"]),
+relevance:0};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{
+$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const a=t
+;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:a(e)?e+"|0":e))
+})(s,{when:e=>e.length<3}),literal:["true","false","unknown"],
+type:["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],
+built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]
+},contains:[{scope:"type",
+match:o(["double precision","large object","with timezone","without timezone"])
+},c,i,{scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},{scope:"string",variants:[{
+begin:/'/,end:/'/,contains:[{match:/''/}]}]},{begin:/"/,end:/"/,contains:[{
+match:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{scope:"operator",
+match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})()
+;hljs.registerLanguage("sql",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/typescript.js b/htroot/js/languages/typescript.js
new file mode 100644
index 000000000..dfae24a5d
--- /dev/null
+++ b/htroot/js/languages/typescript.js
@@ -0,0 +1,923 @@
+/*! `typescript` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
+ const KEYWORDS = [
+ "as", // for exports
+ "in",
+ "of",
+ "if",
+ "for",
+ "while",
+ "finally",
+ "var",
+ "new",
+ "function",
+ "do",
+ "return",
+ "void",
+ "else",
+ "break",
+ "catch",
+ "instanceof",
+ "with",
+ "throw",
+ "case",
+ "default",
+ "try",
+ "switch",
+ "continue",
+ "typeof",
+ "delete",
+ "let",
+ "yield",
+ "const",
+ "class",
+ // JS handles these with a special rule
+ // "get",
+ // "set",
+ "debugger",
+ "async",
+ "await",
+ "static",
+ "import",
+ "from",
+ "export",
+ "extends",
+ // It's reached stage 3, which is "recommended for implementation":
+ "using"
+ ];
+ const LITERALS = [
+ "true",
+ "false",
+ "null",
+ "undefined",
+ "NaN",
+ "Infinity"
+ ];
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
+ const TYPES = [
+ // Fundamental objects
+ "Object",
+ "Function",
+ "Boolean",
+ "Symbol",
+ // numbers and dates
+ "Math",
+ "Date",
+ "Number",
+ "BigInt",
+ // text
+ "String",
+ "RegExp",
+ // Indexed collections
+ "Array",
+ "Float32Array",
+ "Float64Array",
+ "Int8Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "Int16Array",
+ "Int32Array",
+ "Uint16Array",
+ "Uint32Array",
+ "BigInt64Array",
+ "BigUint64Array",
+ // Keyed collections
+ "Set",
+ "Map",
+ "WeakSet",
+ "WeakMap",
+ // Structured data
+ "ArrayBuffer",
+ "SharedArrayBuffer",
+ "Atomics",
+ "DataView",
+ "JSON",
+ // Control abstraction objects
+ "Promise",
+ "Generator",
+ "GeneratorFunction",
+ "AsyncFunction",
+ // Reflection
+ "Reflect",
+ "Proxy",
+ // Internationalization
+ "Intl",
+ // WebAssembly
+ "WebAssembly"
+ ];
+
+ const ERROR_TYPES = [
+ "Error",
+ "EvalError",
+ "InternalError",
+ "RangeError",
+ "ReferenceError",
+ "SyntaxError",
+ "TypeError",
+ "URIError"
+ ];
+
+ const BUILT_IN_GLOBALS = [
+ "setInterval",
+ "setTimeout",
+ "clearInterval",
+ "clearTimeout",
+
+ "require",
+ "exports",
+
+ "eval",
+ "isFinite",
+ "isNaN",
+ "parseFloat",
+ "parseInt",
+ "decodeURI",
+ "decodeURIComponent",
+ "encodeURI",
+ "encodeURIComponent",
+ "escape",
+ "unescape"
+ ];
+
+ const BUILT_IN_VARIABLES = [
+ "arguments",
+ "this",
+ "super",
+ "console",
+ "window",
+ "document",
+ "localStorage",
+ "sessionStorage",
+ "module",
+ "global" // Node.js
+ ];
+
+ const BUILT_INS = [].concat(
+ BUILT_IN_GLOBALS,
+ TYPES,
+ ERROR_TYPES
+ );
+
+ /*
+ Language: JavaScript
+ Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
+ Category: common, scripting, web
+ Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
+ */
+
+
+ /** @type LanguageFn */
+ function javascript(hljs) {
+ const regex = hljs.regex;
+ /**
+ * Takes a string like "<Booger" and checks to see
+ * if we can find a matching "</Booger" later in the
+ * content.
+ * @param {RegExpMatchArray} match
+ * @param {{after:number}} param1
+ */
+ const hasClosingTag = (match, { after }) => {
+ const tag = "</" + match[0].slice(1);
+ const pos = match.input.indexOf(tag, after);
+ return pos !== -1;
+ };
+
+ const IDENT_RE$1 = IDENT_RE;
+ const FRAGMENT = {
+ begin: '<>',
+ end: '</>'
+ };
+ // to avoid some special cases inside isTrulyOpeningTag
+ const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/;
+ const XML_TAG = {
+ begin: /<[A-Za-z0-9\\._:-]+/,
+ end: /\/[A-Za-z0-9\\._:-]+>|\/>/,
+ /**
+ * @param {RegExpMatchArray} match
+ * @param {CallbackResponse} response
+ */
+ isTrulyOpeningTag: (match, response) => {
+ const afterMatchIndex = match[0].length + match.index;
+ const nextChar = match.input[afterMatchIndex];
+ if (
+ // HTML should not include another raw `<` inside a tag
+ // nested type?
+ // `<Array<Array<number>>`, etc.
+ nextChar === "<" ||
+ // the , gives away that this is not HTML
+ // `<T, A extends keyof T, V>`
+ nextChar === ","
+ ) {
+ response.ignoreMatch();
+ return;
+ }
+
+ // `<something>`
+ // Quite possibly a tag, lets look for a matching closing tag...
+ if (nextChar === ">") {
+ // if we cannot find a matching closing tag, then we
+ // will ignore it
+ if (!hasClosingTag(match, { after: afterMatchIndex })) {
+ response.ignoreMatch();
+ }
+ }
+
+ // `<blah />` (self-closing)
+ // handled by simpleSelfClosing rule
+
+ let m;
+ const afterMatch = match.input.substring(afterMatchIndex);
+
+ // some more template typing stuff
+ // <T = any>(key?: string) => Modify<
+ if ((m = afterMatch.match(/^\s*=/))) {
+ response.ignoreMatch();
+ return;
+ }
+
+ // `<From extends string>`
+ // technically this could be HTML, but it smells like a type
+ // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276
+ if ((m = afterMatch.match(/^\s+extends\s+/))) {
+ if (m.index === 0) {
+ response.ignoreMatch();
+ // eslint-disable-next-line no-useless-return
+ return;
+ }
+ }
+ }
+ };
+ const KEYWORDS$1 = {
+ $pattern: IDENT_RE,
+ keyword: KEYWORDS,
+ literal: LITERALS,
+ built_in: BUILT_INS,
+ "variable.language": BUILT_IN_VARIABLES
+ };
+
+ // https://tc39.es/ecma262/#sec-literals-numeric-literals
+ const decimalDigits = '[0-9](_?[0-9])*';
+ const frac = `\\.(${decimalDigits})`;
+ // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral
+ // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
+ const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;
+ const NUMBER = {
+ className: 'number',
+ variants: [
+ // DecimalLiteral
+ { begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` +
+ `[eE][+-]?(${decimalDigits})\\b` },
+ { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` },
+
+ // DecimalBigIntegerLiteral
+ { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` },
+
+ // NonDecimalIntegerLiteral
+ { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" },
+ { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" },
+ { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" },
+
+ // LegacyOctalIntegerLiteral (does not include underscore separators)
+ // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
+ { begin: "\\b0[0-7]+n?\\b" },
+ ],
+ relevance: 0
+ };
+
+ const SUBST = {
+ className: 'subst',
+ begin: '\\$\\{',
+ end: '\\}',
+ keywords: KEYWORDS$1,
+ contains: [] // defined later
+ };
+ const HTML_TEMPLATE = {
+ begin: '\.?html`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'xml'
+ }
+ };
+ const CSS_TEMPLATE = {
+ begin: '\.?css`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'css'
+ }
+ };
+ const GRAPHQL_TEMPLATE = {
+ begin: '\.?gql`',
+ end: '',
+ starts: {
+ end: '`',
+ returnEnd: false,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ],
+ subLanguage: 'graphql'
+ }
+ };
+ const TEMPLATE_STRING = {
+ className: 'string',
+ begin: '`',
+ end: '`',
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ SUBST
+ ]
+ };
+ const JSDOC_COMMENT = hljs.COMMENT(
+ /\/\*\*(?!\/)/,
+ '\\*/',
+ {
+ relevance: 0,
+ contains: [
+ {
+ begin: '(?=@[A-Za-z]+)',
+ relevance: 0,
+ contains: [
+ {
+ className: 'doctag',
+ begin: '@[A-Za-z]+'
+ },
+ {
+ className: 'type',
+ begin: '\\{',
+ end: '\\}',
+ excludeEnd: true,
+ excludeBegin: true,
+ relevance: 0
+ },
+ {
+ className: 'variable',
+ begin: IDENT_RE$1 + '(?=\\s*(-)|$)',
+ endsParent: true,
+ relevance: 0
+ },
+ // eat spaces (not newlines) so we can find
+ // types or variables
+ {
+ begin: /(?=[^\n])\s/,
+ relevance: 0
+ }
+ ]
+ }
+ ]
+ }
+ );
+ const COMMENT = {
+ className: "comment",
+ variants: [
+ JSDOC_COMMENT,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_LINE_COMMENT_MODE
+ ]
+ };
+ const SUBST_INTERNALS = [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ HTML_TEMPLATE,
+ CSS_TEMPLATE,
+ GRAPHQL_TEMPLATE,
+ TEMPLATE_STRING,
+ // Skip numbers when they are part of a variable name
+ { match: /\$\d+/ },
+ NUMBER,
+ // This is intentional:
+ // See https://github.com/highlightjs/highlight.js/issues/3288
+ // hljs.REGEXP_MODE
+ ];
+ SUBST.contains = SUBST_INTERNALS
+ .concat({
+ // we need to pair up {} inside our subst to prevent
+ // it from ending too early by matching another }
+ begin: /\{/,
+ end: /\}/,
+ keywords: KEYWORDS$1,
+ contains: [
+ "self"
+ ].concat(SUBST_INTERNALS)
+ });
+ const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);
+ const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([
+ // eat recursive parens in sub expressions
+ {
+ begin: /(\s*)\(/,
+ end: /\)/,
+ keywords: KEYWORDS$1,
+ contains: ["self"].concat(SUBST_AND_COMMENTS)
+ }
+ ]);
+ const PARAMS = {
+ className: 'params',
+ // convert this to negative lookbehind in v12
+ begin: /(\s*)\(/, // to match the parms with
+ end: /\)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ keywords: KEYWORDS$1,
+ contains: PARAMS_CONTAINS
+ };
+
+ // ES6 classes
+ const CLASS_OR_EXTENDS = {
+ variants: [
+ // class Car extends vehicle
+ {
+ match: [
+ /class/,
+ /\s+/,
+ IDENT_RE$1,
+ /\s+/,
+ /extends/,
+ /\s+/,
+ regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*")
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.class",
+ 5: "keyword",
+ 7: "title.class.inherited"
+ }
+ },
+ // class Car
+ {
+ match: [
+ /class/,
+ /\s+/,
+ IDENT_RE$1
+ ],
+ scope: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ },
+
+ ]
+ };
+
+ const CLASS_REFERENCE = {
+ relevance: 0,
+ match:
+ regex.either(
+ // Hard coded exceptions
+ /\bJSON/,
+ // Float32Array, OutT
+ /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,
+ // CSSFactory, CSSFactoryT
+ /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,
+ // FPs, FPsT
+ /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/,
+ // P
+ // single letters are not highlighted
+ // BLAH
+ // this will be flagged as a UPPER_CASE_CONSTANT instead
+ ),
+ className: "title.class",
+ keywords: {
+ _: [
+ // se we still get relevance credit for JS library classes
+ ...TYPES,
+ ...ERROR_TYPES
+ ]
+ }
+ };
+
+ const USE_STRICT = {
+ label: "use_strict",
+ className: 'meta',
+ relevance: 10,
+ begin: /^\s*['"]use (strict|asm)['"]/
+ };
+
+ const FUNCTION_DEFINITION = {
+ variants: [
+ {
+ match: [
+ /function/,
+ /\s+/,
+ IDENT_RE$1,
+ /(?=\s*\()/
+ ]
+ },
+ // anonymous function
+ {
+ match: [
+ /function/,
+ /\s*(?=\()/
+ ]
+ }
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ label: "func.def",
+ contains: [ PARAMS ],
+ illegal: /%/
+ };
+
+ const UPPER_CASE_CONSTANT = {
+ relevance: 0,
+ match: /\b[A-Z][A-Z_0-9]+\b/,
+ className: "variable.constant"
+ };
+
+ function noneOf(list) {
+ return regex.concat("(?!", list.join("|"), ")");
+ }
+
+ const FUNCTION_CALL = {
+ match: regex.concat(
+ /\b/,
+ noneOf([
+ ...BUILT_IN_GLOBALS,
+ "super",
+ "import"
+ ].map(x => `${x}\\s*\\(`)),
+ IDENT_RE$1, regex.lookahead(/\s*\(/)),
+ className: "title.function",
+ relevance: 0
+ };
+
+ const PROPERTY_ACCESS = {
+ begin: regex.concat(/\./, regex.lookahead(
+ regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)
+ )),
+ end: IDENT_RE$1,
+ excludeBegin: true,
+ keywords: "prototype",
+ className: "property",
+ relevance: 0
+ };
+
+ const GETTER_OR_SETTER = {
+ match: [
+ /get|set/,
+ /\s+/,
+ IDENT_RE$1,
+ /(?=\()/
+ ],
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ contains: [
+ { // eat to avoid empty params
+ begin: /\(\)/
+ },
+ PARAMS
+ ]
+ };
+
+ const FUNC_LEAD_IN_RE = '(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*' +
+ '\\)[^()]*)*' +
+ '\\)[^()]*)*' +
+ '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>';
+
+ const FUNCTION_VARIABLE = {
+ match: [
+ /const|var|let/, /\s+/,
+ IDENT_RE$1, /\s*/,
+ /=\s*/,
+ /(async\s*)?/, // async is optional
+ regex.lookahead(FUNC_LEAD_IN_RE)
+ ],
+ keywords: "async",
+ className: {
+ 1: "keyword",
+ 3: "title.function"
+ },
+ contains: [
+ PARAMS
+ ]
+ };
+
+ return {
+ name: 'JavaScript',
+ aliases: ['js', 'jsx', 'mjs', 'cjs'],
+ keywords: KEYWORDS$1,
+ // this will be extended by TypeScript
+ exports: { PARAMS_CONTAINS, CLASS_REFERENCE },
+ illegal: /#(?![$_A-z])/,
+ contains: [
+ hljs.SHEBANG({
+ label: "shebang",
+ binary: "node",
+ relevance: 5
+ }),
+ USE_STRICT,
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ HTML_TEMPLATE,
+ CSS_TEMPLATE,
+ GRAPHQL_TEMPLATE,
+ TEMPLATE_STRING,
+ COMMENT,
+ // Skip numbers when they are part of a variable name
+ { match: /\$\d+/ },
+ NUMBER,
+ CLASS_REFERENCE,
+ {
+ scope: 'attr',
+ match: IDENT_RE$1 + regex.lookahead(':'),
+ relevance: 0
+ },
+ FUNCTION_VARIABLE,
+ { // "value" container
+ begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
+ keywords: 'return throw case',
+ relevance: 0,
+ contains: [
+ COMMENT,
+ hljs.REGEXP_MODE,
+ {
+ className: 'function',
+ // we have to count the parens to make sure we actually have the
+ // correct bounding ( ) before the =>. There could be any number of
+ // sub-expressions inside also surrounded by parens.
+ begin: FUNC_LEAD_IN_RE,
+ returnBegin: true,
+ end: '\\s*=>',
+ contains: [
+ {
+ className: 'params',
+ variants: [
+ {
+ begin: hljs.UNDERSCORE_IDENT_RE,
+ relevance: 0
+ },
+ {
+ className: null,
+ begin: /\(\s*\)/,
+ skip: true
+ },
+ {
+ begin: /(\s*)\(/,
+ end: /\)/,
+ excludeBegin: true,
+ excludeEnd: true,
+ keywords: KEYWORDS$1,
+ contains: PARAMS_CONTAINS
+ }
+ ]
+ }
+ ]
+ },
+ { // could be a comma delimited list of params to a function call
+ begin: /,/,
+ relevance: 0
+ },
+ {
+ match: /\s+/,
+ relevance: 0
+ },
+ { // JSX
+ variants: [
+ { begin: FRAGMENT.begin, end: FRAGMENT.end },
+ { match: XML_SELF_CLOSING },
+ {
+ begin: XML_TAG.begin,
+ // we carefully check the opening tag to see if it truly
+ // is a tag and not a false positive
+ 'on:begin': XML_TAG.isTrulyOpeningTag,
+ end: XML_TAG.end
+ }
+ ],
+ subLanguage: 'xml',
+ contains: [
+ {
+ begin: XML_TAG.begin,
+ end: XML_TAG.end,
+ skip: true,
+ contains: ['self']
+ }
+ ]
+ }
+ ],
+ },
+ FUNCTION_DEFINITION,
+ {
+ // prevent this from getting swallowed up by function
+ // since they appear "function like"
+ beginKeywords: "while if switch catch for"
+ },
+ {
+ // we have to count the parens to make sure we actually have the correct
+ // bounding ( ). There could be any number of sub-expressions inside
+ // also surrounded by parens.
+ begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +
+ '\\(' + // first parens
+ '[^()]*(\\(' +
+ '[^()]*(\\(' +
+ '[^()]*' +
+ '\\)[^()]*)*' +
+ '\\)[^()]*)*' +
+ '\\)\\s*\\{', // end parens
+ returnBegin:true,
+ label: "func.def",
+ contains: [
+ PARAMS,
+ hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" })
+ ]
+ },
+ // catch ... so it won't trigger the property rule below
+ {
+ match: /\.\.\./,
+ relevance: 0
+ },
+ PROPERTY_ACCESS,
+ // hack: prevents detection of keywords in some circumstances
+ // .keyword()
+ // $keyword = x
+ {
+ match: '\\$' + IDENT_RE$1,
+ relevance: 0
+ },
+ {
+ match: [ /\bconstructor(?=\s*\()/ ],
+ className: { 1: "title.function" },
+ contains: [ PARAMS ]
+ },
+ FUNCTION_CALL,
+ UPPER_CASE_CONSTANT,
+ CLASS_OR_EXTENDS,
+ GETTER_OR_SETTER,
+ {
+ match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
+ }
+ ]
+ };
+ }
+
+ /*
+ Language: TypeScript
+ Author: Panu Horsmalahti <panu.horsmalahti@iki.fi>
+ Contributors: Ike Ku <dempfi@yahoo.com>
+ Description: TypeScript is a strict superset of JavaScript
+ Website: https://www.typescriptlang.org
+ Category: common, scripting
+ */
+
+
+ /** @type LanguageFn */
+ function typescript(hljs) {
+ const regex = hljs.regex;
+ const tsLanguage = javascript(hljs);
+
+ const IDENT_RE$1 = IDENT_RE;
+ const TYPES = [
+ "any",
+ "void",
+ "number",
+ "boolean",
+ "string",
+ "object",
+ "never",
+ "symbol",
+ "bigint",
+ "unknown"
+ ];
+ const NAMESPACE = {
+ begin: [
+ /namespace/,
+ /\s+/,
+ hljs.IDENT_RE
+ ],
+ beginScope: {
+ 1: "keyword",
+ 3: "title.class"
+ }
+ };
+ const INTERFACE = {
+ beginKeywords: 'interface',
+ end: /\{/,
+ excludeEnd: true,
+ keywords: {
+ keyword: 'interface extends',
+ built_in: TYPES
+ },
+ contains: [ tsLanguage.exports.CLASS_REFERENCE ]
+ };
+ const USE_STRICT = {
+ className: 'meta',
+ relevance: 10,
+ begin: /^\s*['"]use strict['"]/
+ };
+ const TS_SPECIFIC_KEYWORDS = [
+ "type",
+ // "namespace",
+ "interface",
+ "public",
+ "private",
+ "protected",
+ "implements",
+ "declare",
+ "abstract",
+ "readonly",
+ "enum",
+ "override",
+ "satisfies"
+ ];
+ /*
+ namespace is a TS keyword but it's fine to use it as a variable name too.
+ const message = 'foo';
+ const namespace = 'bar';
+ */
+ const KEYWORDS$1 = {
+ $pattern: IDENT_RE,
+ keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),
+ literal: LITERALS,
+ built_in: BUILT_INS.concat(TYPES),
+ "variable.language": BUILT_IN_VARIABLES
+ };
+
+ const DECORATOR = {
+ className: 'meta',
+ begin: '@' + IDENT_RE$1,
+ };
+
+ const swapMode = (mode, label, replacement) => {
+ const indx = mode.contains.findIndex(m => m.label === label);
+ if (indx === -1) { throw new Error("can not find mode to replace"); }
+
+ mode.contains.splice(indx, 1, replacement);
+ };
+
+
+ // this should update anywhere keywords is used since
+ // it will be the same actual JS object
+ Object.assign(tsLanguage.keywords, KEYWORDS$1);
+
+ tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);
+
+ // highlight the function params
+ const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === "attr");
+
+ // take default attr rule and extend it to support optionals
+ const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},
+ ATTRIBUTE_HIGHLIGHT,
+ { match: regex.concat(IDENT_RE$1, regex.lookahead(/\s*\?:/)) }
+ );
+ tsLanguage.exports.PARAMS_CONTAINS.push([
+ tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types
+ ATTRIBUTE_HIGHLIGHT, // highlight the params key
+ OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting
+ ]);
+
+ // Add the optional property assignment highlighting for objects or classes
+ tsLanguage.contains = tsLanguage.contains.concat([
+ DECORATOR,
+ NAMESPACE,
+ INTERFACE,
+ OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting
+ ]);
+
+ // TS gets a simpler shebang rule than JS
+ swapMode(tsLanguage, "shebang", hljs.SHEBANG());
+ // JS use strict rule purposely excludes `asm` which makes no sense
+ swapMode(tsLanguage, "use_strict", USE_STRICT);
+
+ const functionDeclaration = tsLanguage.contains.find(m => m.label === "func.def");
+ functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript
+
+ Object.assign(tsLanguage, {
+ name: 'TypeScript',
+ aliases: [
+ 'ts',
+ 'tsx',
+ 'mts',
+ 'cts'
+ ]
+ });
+
+ return tsLanguage;
+ }
+
+ return typescript;
+
+})();
+
+ hljs.registerLanguage('typescript', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/typescript.min.js b/htroot/js/languages/typescript.min.js
new file mode 100644
index 000000000..075d577a7
--- /dev/null
+++ b/htroot/js/languages/typescript.min.js
@@ -0,0 +1,99 @@
+/*! `typescript` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],c=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],r=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(c,t,s)
+;function o(o){const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const a=e[0].length+e.index,t=e.input[a]
+;if("<"===t||","===t)return void n.ignoreMatch();let s
+;">"===t&&(((e,{after:n})=>{const a="</"+e[0].slice(1)
+;return-1!==e.input.indexOf(a,n)})(e,{after:a})||n.ignoreMatch())
+;const c=e.input.substring(a)
+;((s=c.match(/^\s*=/))||(s=c.match(/^\s+extends\s+/))&&0===s.index)&&n.ignoreMatch()
+}},g={$pattern:e,keyword:n,literal:a,built_in:i,"variable.language":r
+},u="[0-9](_?[0-9])*",m=`\\.(${u})`,E="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",A={
+className:"number",variants:[{
+begin:`(\\b(${E})((${m})|\\.)?|(${m}))[eE][+-]?(${u})\\b`},{
+begin:`\\b(${E})\\b((${m})\\b|\\.)?|(${m})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},y={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:g,contains:[]},p={begin:".?html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"xml"}},N={
+begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[o.BACKSLASH_ESCAPE,y],subLanguage:"css"}},f={begin:".?gql`",end:"",
+starts:{end:"`",returnEnd:!1,contains:[o.BACKSLASH_ESCAPE,y],
+subLanguage:"graphql"}},_={className:"string",begin:"`",end:"`",
+contains:[o.BACKSLASH_ESCAPE,y]},h={className:"comment",
+variants:[o.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",
+begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,
+excludeBegin:!0,relevance:0},{className:"variable",begin:d+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),o.C_BLOCK_COMMENT_MODE,o.C_LINE_COMMENT_MODE]
+},S=[o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,N,f,_,{match:/\$\d+/},A]
+;y.contains=S.concat({begin:/\{/,end:/\}/,keywords:g,contains:["self"].concat(S)
+});const v=[].concat(h,y.contains),w=v.concat([{begin:/(\s*)\(/,end:/\)/,
+keywords:g,contains:["self"].concat(v)}]),R={className:"params",begin:/(\s*)\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w},k={variants:[{
+match:[/class/,/\s+/,d,/\s+/,/extends/,/\s+/,l.concat(d,"(",l.concat(/\./,d),")*")],
+scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{
+match:[/class/,/\s+/,d],scope:{1:"keyword",3:"title.class"}}]},x={relevance:0,
+match:l.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
+className:"title.class",keywords:{_:[...t,...s]}},O={variants:[{
+match:[/function/,/\s+/,d,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],
+className:{1:"keyword",3:"title.function"},label:"func.def",contains:[R],
+illegal:/%/},I={
+match:l.concat(/\b/,(C=[...c,"super","import"].map((e=>e+"\\s*\\(")),
+l.concat("(?!",C.join("|"),")")),d,l.lookahead(/\s*\(/)),
+className:"title.function",relevance:0};var C;const T={
+begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d,
+excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={
+match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"},
+contains:[{begin:/\(\)/},R]
+},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={
+match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)],
+keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]}
+;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{
+PARAMS_CONTAINS:w,CLASS_REFERENCE:x},illegal:/#(?![$_A-z])/,
+contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{
+label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,N,f,_,h,{match:/\$\d+/},A,x,{
+scope:"attr",match:d+l.lookahead(":"),relevance:0},$,{
+begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",relevance:0,contains:[h,o.REGEXP_MODE,{
+className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{
+className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{
+className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0
+},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:"</>"},{
+match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin,
+"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{
+begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},O,{
+beginKeywords:"while if switch catch for"},{
+begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d,
+className:"title.function"})]},{match:/\.\.\./,relevance:0},T,{match:"\\$"+d,
+relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},
+contains:[R]},I,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,
+className:"variable.constant"},k,M,{match:/\$[(.]/}]}}return t=>{
+const s=t.regex,c=o(t),l=e,d=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],b={
+begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}
+},g={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{
+keyword:"interface extends",built_in:d},contains:[c.exports.CLASS_REFERENCE]
+},u={$pattern:e,
+keyword:n.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]),
+literal:a,built_in:i.concat(d),"variable.language":r},m={className:"meta",
+begin:"@"+l},E=(e,n,a)=>{const t=e.contains.findIndex((e=>e.label===n))
+;if(-1===t)throw Error("can not find mode to replace");e.contains.splice(t,1,a)}
+;Object.assign(c.keywords,u),c.exports.PARAMS_CONTAINS.push(m)
+;const A=c.contains.find((e=>"attr"===e.scope)),y=Object.assign({},A,{
+match:s.concat(l,s.lookahead(/\s*\?:/))})
+;return c.exports.PARAMS_CONTAINS.push([c.exports.CLASS_REFERENCE,A,y]),
+c.contains=c.contains.concat([m,b,g,y]),
+E(c,"shebang",t.SHEBANG()),E(c,"use_strict",{className:"meta",relevance:10,
+begin:/^\s*['"]use strict['"]/
+}),c.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(c,{
+name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),c}})()
+;hljs.registerLanguage("typescript",e)})(); \ No newline at end of file
diff --git a/htroot/js/languages/yaml.js b/htroot/js/languages/yaml.js
new file mode 100644
index 000000000..4f588eec2
--- /dev/null
+++ b/htroot/js/languages/yaml.js
@@ -0,0 +1,223 @@
+/*! `yaml` grammar compiled for Highlight.js 11.11.1 */
+ (function(){
+ var hljsGrammar = (function () {
+ 'use strict';
+
+ /*
+ Language: YAML
+ Description: Yet Another Markdown Language
+ Author: Stefan Wienert <stwienert@gmail.com>
+ Contributors: Carl Baxter <carl@cbax.tech>
+ Requires: ruby.js
+ Website: https://yaml.org
+ Category: common, config
+ */
+ function yaml(hljs) {
+ const LITERALS = 'true false yes no null';
+
+ // YAML spec allows non-reserved URI characters in tags.
+ const URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\'()[\\]]+';
+
+ // Define keys as starting with a word character
+ // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods
+ // ...and ending with a colon followed immediately by a space, tab or newline.
+ // The YAML spec allows for much more than this, but this covers most use-cases.
+ const KEY = {
+ className: 'attr',
+ variants: [
+ // added brackets support and special char support
+ { begin: /[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/ },
+ { // double quoted keys - with brackets and special char support
+ begin: /"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/ },
+ { // single quoted keys - with brackets and special char support
+ begin: /'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/ },
+ ]
+ };
+
+ const TEMPLATE_VARIABLES = {
+ className: 'template-variable',
+ variants: [
+ { // jinja templates Ansible
+ begin: /\{\{/,
+ end: /\}\}/
+ },
+ { // Ruby i18n
+ begin: /%\{/,
+ end: /\}/
+ }
+ ]
+ };
+
+ const SINGLE_QUOTE_STRING = {
+ className: 'string',
+ relevance: 0,
+ begin: /'/,
+ end: /'/,
+ contains: [
+ {
+ match: /''/,
+ scope: 'char.escape',
+ relevance: 0
+ }
+ ]
+ };
+
+ const STRING = {
+ className: 'string',
+ relevance: 0,
+ variants: [
+ {
+ begin: /"/,
+ end: /"/
+ },
+ { begin: /\S+/ }
+ ],
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ TEMPLATE_VARIABLES
+ ]
+ };
+
+ // Strings inside of value containers (objects) can't contain braces,
+ // brackets, or commas
+ const CONTAINER_STRING = hljs.inherit(STRING, { variants: [
+ {
+ begin: /'/,
+ end: /'/,
+ contains: [
+ {
+ begin: /''/,
+ relevance: 0
+ }
+ ]
+ },
+ {
+ begin: /"/,
+ end: /"/
+ },
+ { begin: /[^\s,{}[\]]+/ }
+ ] });
+
+ const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';
+ const TIME_RE = '([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?';
+ const FRACTION_RE = '(\\.[0-9]*)?';
+ const ZONE_RE = '([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';
+ const TIMESTAMP = {
+ className: 'number',
+ begin: '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b'
+ };
+
+ const VALUE_CONTAINER = {
+ end: ',',
+ endsWithParent: true,
+ excludeEnd: true,
+ keywords: LITERALS,
+ relevance: 0
+ };
+ const OBJECT = {
+ begin: /\{/,
+ end: /\}/,
+ contains: [ VALUE_CONTAINER ],
+ illegal: '\\n',
+ relevance: 0
+ };
+ const ARRAY = {
+ begin: '\\[',
+ end: '\\]',
+ contains: [ VALUE_CONTAINER ],
+ illegal: '\\n',
+ relevance: 0
+ };
+
+ const MODES = [
+ KEY,
+ {
+ className: 'meta',
+ begin: '^---\\s*$',
+ relevance: 10
+ },
+ { // multi line string
+ // Blocks start with a | or > followed by a newline
+ //
+ // Indentation of subsequent lines must be the same to
+ // be considered part of the block
+ className: 'string',
+ begin: '[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*'
+ },
+ { // Ruby/Rails erb
+ begin: '<%[%=-]?',
+ end: '[%-]?%>',
+ subLanguage: 'ruby',
+ excludeBegin: true,
+ excludeEnd: true,
+ relevance: 0
+ },
+ { // named tags
+ className: 'type',
+ begin: '!\\w+!' + URI_CHARACTERS
+ },
+ // https://yaml.org/spec/1.2/spec.html#id2784064
+ { // verbatim tags
+ className: 'type',
+ begin: '!<' + URI_CHARACTERS + ">"
+ },
+ { // primary tags
+ className: 'type',
+ begin: '!' + URI_CHARACTERS
+ },
+ { // secondary tags
+ className: 'type',
+ begin: '!!' + URI_CHARACTERS
+ },
+ { // fragment id &ref
+ className: 'meta',
+ begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$'
+ },
+ { // fragment reference *ref
+ className: 'meta',
+ begin: '\\*' + hljs.UNDERSCORE_IDENT_RE + '$'
+ },
+ { // array listing
+ className: 'bullet',
+ // TODO: remove |$ hack when we have proper look-ahead support
+ begin: '-(?=[ ]|$)',
+ relevance: 0
+ },
+ hljs.HASH_COMMENT_MODE,
+ {
+ beginKeywords: LITERALS,
+ keywords: { literal: LITERALS }
+ },
+ TIMESTAMP,
+ // numbers are any valid C-style number that
+ // sit isolated from other words
+ {
+ className: 'number',
+ begin: hljs.C_NUMBER_RE + '\\b',
+ relevance: 0
+ },
+ OBJECT,
+ ARRAY,
+ SINGLE_QUOTE_STRING,
+ STRING
+ ];
+
+ const VALUE_MODES = [ ...MODES ];
+ VALUE_MODES.pop();
+ VALUE_MODES.push(CONTAINER_STRING);
+ VALUE_CONTAINER.contains = VALUE_MODES;
+
+ return {
+ name: 'YAML',
+ case_insensitive: true,
+ aliases: [ 'yml' ],
+ contains: MODES
+ };
+ }
+
+ return yaml;
+
+})();
+
+ hljs.registerLanguage('yaml', hljsGrammar);
+ })(); \ No newline at end of file
diff --git a/htroot/js/languages/yaml.min.js b/htroot/js/languages/yaml.min.js
new file mode 100644
index 000000000..482659192
--- /dev/null
+++ b/htroot/js/languages/yaml.min.js
@@ -0,0 +1,28 @@
+/*! `yaml` grammar compiled for Highlight.js 11.11.1 */
+(()=>{var e=(()=>{"use strict";return e=>{
+const n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={
+className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],
+contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{
+begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{variants:[{
+begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{
+begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,
+relevance:0},t={begin:/\{/,end:/\}/,contains:[l],illegal:"\\n",relevance:0},c={
+begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},r=[{
+className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{
+begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{
+begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",
+begin:"^---\\s*$",relevance:10},{className:"string",
+begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{
+begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,
+relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",
+begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a
+},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",
+begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",
+relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{
+className:"number",
+begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"
+},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,c,{
+className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,
+scope:"char.escape",relevance:0}]},s],g=[...r]
+;return g.pop(),g.push(i),l.contains=g,{name:"YAML",case_insensitive:!0,
+aliases:["yml"],contains:r}}})();hljs.registerLanguage("yaml",e)})(); \ No newline at end of file
diff --git a/htroot/js/marked.umd.js b/htroot/js/marked.umd.js
new file mode 100644
index 000000000..0f11cff7e
--- /dev/null
+++ b/htroot/js/marked.umd.js
@@ -0,0 +1,74 @@
+/**
+ * marked v17.0.1 - a markdown parser
+ * Copyright (c) 2018-2025, MarkedJS. (MIT License)
+ * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
+ * https://github.com/markedjs/marked
+ */
+
+/**
+ * DO NOT EDIT THIS FILE
+ * The code in this file is generated from files in ./src/
+ */
+(function(g,f){if(typeof exports=="object"&&typeof module<"u"){module.exports=f()}else if("function"==typeof define && define.amd){define("marked",f)}else {g["marked"]=f()}}(typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : this,function(){var exports={};var __exports=exports;var module={exports};
+"use strict";var Z=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var Re=Object.prototype.hasOwnProperty;var Te=(l,e)=>{for(var t in e)Z(l,t,{get:e[t],enumerable:!0})},Oe=(l,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of be(e))!Re.call(l,r)&&r!==t&&Z(l,r,{get:()=>e[r],enumerable:!(n=xe(e,r))||n.enumerable});return l};var we=l=>Oe(Z({},"__esModule",{value:!0}),l);var kt={};Te(kt,{Hooks:()=>S,Lexer:()=>x,Marked:()=>A,Parser:()=>b,Renderer:()=>P,TextRenderer:()=>$,Tokenizer:()=>y,defaults:()=>T,getDefaults:()=>_,lexer:()=>ht,marked:()=>d,options:()=>it,parse:()=>pt,parseInline:()=>ut,parser:()=>ct,setOptions:()=>ot,use:()=>at,walkTokens:()=>lt});module.exports=we(kt);function _(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=_();function G(l){T=l}var I={exec:()=>null};function k(l,e=""){let t=typeof l=="string"?l:l.source,n={replace:(r,i)=>{let s=typeof i=="string"?i:i.source;return s=s.replace(m.caret,"$1"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var ye=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}#`),htmlBeginRegex:l=>new RegExp(`^ {0,${Math.min(3,l-1)}}<(?:[a-z].*>|!--)`,"i")},Pe=/^(?:[ \t]*(?:\n|$))+/,Se=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,$e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,E=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,_e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Q=/(?:[*+-]|\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ie=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Le=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),F=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Me=/^[^\n]+/,j=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,ze=k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",j).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ae=k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Q).getRegex(),v="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",U=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Ce=k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",U).replace("tag",v).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),oe=k(F).replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex(),Ie=k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",oe).getRegex(),K={blockquote:Ie,code:Se,def:ze,fences:$e,heading:_e,hr:E,html:Ce,lheading:ie,list:Ae,newline:Pe,paragraph:oe,table:I,text:Me},ne=k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex(),Ee={...K,lheading:Le,table:ne,paragraph:k(F).replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ne).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex()},Be={...K,html:k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",U).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:I,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:k(F).replace("hr",E).replace("heading",` *#{1,6} *[^
+]`).replace("lheading",ie).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},qe=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ve=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ae=/^( {2,}|\\)\n(?!\s*$)/,De=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,D=/[\p{P}\p{S}]/u,W=/[\s\p{P}\p{S}]/u,le=/[^\s\p{P}\p{S}]/u,He=k(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,W).getRegex(),ue=/(?!~)[\p{P}\p{S}]/u,Ze=/(?!~)[\s\p{P}\p{S}]/u,Ge=/(?:[^\s\p{P}\p{S}]|~)/u,Ne=k(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",ye?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),pe=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Qe=k(pe,"u").replace(/punct/g,D).getRegex(),Fe=k(pe,"u").replace(/punct/g,ue).getRegex(),ce="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",je=k(ce,"gu").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),Ue=k(ce,"gu").replace(/notPunctSpace/g,Ge).replace(/punctSpace/g,Ze).replace(/punct/g,ue).getRegex(),Ke=k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),We=k(/\\(punct)/,"gu").replace(/punct/g,D).getRegex(),Xe=k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Je=k(U).replace("(?:-->|$)","-->").getRegex(),Ve=k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Je).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),q=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Ye=k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",q).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),he=k(/^!?\[(label)\]\[(ref)\]/).replace("label",q).replace("ref",j).getRegex(),ke=k(/^!?\[(ref)\](?:\[\])?/).replace("ref",j).getRegex(),et=k("reflink|nolink(?!\\()","g").replace("reflink",he).replace("nolink",ke).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,X={_backpedal:I,anyPunctuation:We,autolink:Xe,blockSkip:Ne,br:ae,code:ve,del:I,emStrongLDelim:Qe,emStrongRDelimAst:je,emStrongRDelimUnd:Ke,escape:qe,link:Ye,nolink:ke,punctuation:He,reflink:he,reflinkSearch:et,tag:Ve,text:De,url:I},tt={...X,link:k(/^!?\[(label)\]\((.*?)\)/).replace("label",q).getRegex(),reflink:k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",q).getRegex()},N={...X,emStrongRDelimAst:Ue,emStrongLDelim:Fe,url:k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",re).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",re).getRegex()},nt={...N,br:k(ae).replace("{2,}","*").getRegex(),text:k(N.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},B={normal:K,gfm:Ee,pedantic:Be},M={normal:X,gfm:N,breaks:nt,pedantic:tt};var rt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},de=l=>rt[l];function w(l,e){if(e){if(m.escapeTest.test(l))return l.replace(m.escapeReplace,de)}else if(m.escapeTestNoEncode.test(l))return l.replace(m.escapeReplaceNoEncode,de);return l}function J(l){try{l=encodeURI(l).replace(m.percentDecode,"%")}catch{return null}return l}function V(l,e){let t=l.replace(m.findPipe,(i,s,a)=>{let o=!1,u=s;for(;--u>=0&&a[u]==="\\";)o=!o;return o?"|":" |"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,"|");return n}function z(l,e,t){let n=l.length;if(n===0)return"";let r=0;for(;r<n;){let i=l.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return l.slice(0,n-r)}function ge(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]==="\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function fe(l,e,t,n,r){let i=e.href,s=e.title||null,a=l[1].replace(r.other.outputLinkReplace,"$1");n.state.inLink=!0;let o={type:l[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function st(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`
+`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`
+`)}var y=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:z(n,`
+`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=st(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:z(t[0],`
+`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`
+`).split(`
+`),r="",i="",s=[];for(;n.length>0;){let a=!1,o=[],u;for(u=0;u<n.length;u++)if(this.rules.other.blockquoteStart.test(n[u]))o.push(n[u]),a=!0;else if(!a)o.push(n[u]);else break;n=n.slice(u);let p=o.join(`
+`),c=p.replace(this.rules.other.blockquoteSetextReplace,`
+ $1`).replace(this.rules.other.blockquoteSetextReplace2,"");r=r?`${r}
+${p}`:p,i=i?`${i}
+${c}`:c;let g=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=g,n.length===0)break;let h=s.at(-1);if(h?.type==="code")break;if(h?.type==="blockquote"){let R=h,f=R.raw+`
+`+n.join(`
+`),O=this.blockquote(f);s[s.length-1]=O,r=r.substring(0,r.length-R.raw.length)+O.raw,i=i.substring(0,i.length-R.text.length)+O.text;break}else if(h?.type==="list"){let R=h,f=R.raw+`
+`+n.join(`
+`),O=this.list(f);s[s.length-1]=O,r=r.substring(0,r.length-h.raw.length)+O.raw,i=i.substring(0,i.length-R.raw.length)+O.raw,n=f.substring(s.at(-1).raw.length).split(`
+`);continue}}return{type:"blockquote",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let u=!1,p="",c="";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let g=t[2].split(`
+`,1)[0].replace(this.rules.other.listReplaceTabs,O=>" ".repeat(3*O.length)),h=e.split(`
+`,1)[0],R=!g.trim(),f=0;if(this.options.pedantic?(f=2,c=g.trimStart()):R?f=t[1].length+1:(f=t[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=g.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`
+`,e=e.substring(h.length+1),u=!0),!u){let O=this.rules.other.nextBulletRegex(f),Y=this.rules.other.hrRegex(f),ee=this.rules.other.fencesBeginRegex(f),te=this.rules.other.headingBeginRegex(f),me=this.rules.other.htmlBeginRegex(f);for(;e;){let H=e.split(`
+`,1)[0],C;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting," "),C=h):C=h.replace(this.rules.other.tabCharGlobal," "),ee.test(h)||te.test(h)||me.test(h)||O.test(h)||Y.test(h))break;if(C.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`
+`+C.slice(f);else{if(R||g.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||ee.test(g)||te.test(g)||Y.test(g))break;c+=`
+`+h}!R&&!h.trim()&&(R=!0),p+=H+`
+`,e=e.substring(H.length+1),g=C.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:"list_item",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u of i.items){if(this.lexer.state.top=!1,u.tokens=this.lexer.blockTokens(u.text,[]),u.task){if(u.text=u.text.replace(this.rules.other.listReplaceTask,""),u.tokens[0]?.type==="text"||u.tokens[0]?.type==="paragraph"){u.tokens[0].raw=u.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),u.tokens[0].text=u.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,"");break}}let p=this.rules.other.listTaskCheckbox.exec(u.raw);if(p){let c={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};u.checked=c.checked,i.loose?u.tokens[0]&&["paragraph","text"].includes(u.tokens[0].type)&&"tokens"in u.tokens[0]&&u.tokens[0].tokens?(u.tokens[0].raw=c.raw+u.tokens[0].raw,u.tokens[0].text=c.raw+u.tokens[0].text,u.tokens[0].tokens.unshift(c)):u.tokens.unshift({type:"paragraph",raw:c.raw,text:c.raw,tokens:[c]}):u.tokens.unshift(c)}}if(!i.loose){let p=u.tokens.filter(g=>g.type==="space"),c=p.length>0&&p.some(g=>this.rules.other.anyLine.test(g.raw));i.loose=c}}if(i.loose)for(let u of i.items){u.loose=!0;for(let p of u.tokens)p.type==="text"&&(p.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
+`):[],s={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push("right"):this.rules.other.tableAlignCenter.test(a)?s.align.push("center"):this.rules.other.tableAlignLeft.test(a)?s.align.push("left"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(V(a,s.header.length).map((o,u)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[u]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
+`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=ge(t[2],"()");if(s===-2)return;if(s>-1){let o=(t[0].indexOf("!")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let r=t[2],i="";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),fe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return fe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,u=s,p=0,c=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){u+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(u-=o,u>0)continue;o=Math.min(o,o+u+p);let g=[...r[0]][0].length,h=e.slice(0,s+r.index+g+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:"em",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:"strong",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]==="@"?(n=t[1],r="mailto:"+n):(n=t[1],r=n),{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]==="@")n=t[0],r="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?r="http://"+t[0]:r=t[0]}return{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}};var x=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:M.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:M}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`
+`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal," ").replace(m.spaceLine,""));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`
+`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(`
+`)?"":`
+`)+r.raw,s.text+=`
+`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(`
+`)?"":`
+`)+r.raw,s.text+=`
+`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(u=>{o=u.call({lexer:this},a),typeof o=="number"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(`
+`)?"":`
+`)+r.raw,s.text+=`
+`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(`
+`)?"":`
+`)+r.raw,s.text+=`
+`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+"["+"a".repeat(r[0].length-i-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a="";for(;e;){s||(a=""),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type==="text"&&p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let u=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),g;this.options.extensions.startInline.forEach(h=>{g=h.call({lexer:this},c),typeof g=="number"&&g>=0&&(p=Math.min(p,g))}),p<1/0&&p>=0&&(u=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(u)){e=e.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var P=class{options;parser;constructor(e){this.options=e||T}space(e){return""}code({text:e,lang:t,escaped:n}){let r=(t||"").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,"")+`
+`;return r?'<pre><code class="language-'+w(r)+'">'+(n?i:w(i,!0))+`</code></pre>
+`:"<pre><code>"+(n?i:w(i,!0))+`</code></pre>
+`}blockquote({tokens:e}){return`<blockquote>
+${this.parser.parse(e)}</blockquote>
+`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
+`}hr(e){return`<hr>
+`}list(e){let t=e.ordered,n=e.start,r="";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?"ol":"ul",s=t&&n!==1?' start="'+n+'"':"";return"<"+i+s+`>
+`+r+"</"+i+`>
+`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
+`}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
+`}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r="";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n="";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>
+<thead>
+`+t+`</thead>
+`+r+`</table>
+`}tablerow({text:e}){return`<tr>
+${e}</tr>
+`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
+`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${w(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href="'+e+'"';return t&&(s+=' title="'+w(t)+'"'),s+=">"+r+"</a>",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return w(n);e=i;let s=`<img src="${e}" alt="${n}"`;return t&&(s+=` title="${w(t)}"`),s+=">",s}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:w(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}};var b=class l{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){let t="";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(s.type)){t+=a||"";continue}}let i=r;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let s='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(s),"";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n="";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){n+=a||"";continue}}let s=i;switch(s.type){case"escape":{n+=t.text(s);break}case"html":{n+=t.html(s);break}case"link":{n+=t.link(s);break}case"image":{n+=t.image(s);break}case"checkbox":{n+=t.checkbox(s);break}case"strong":{n+=t.strong(s);break}case"em":{n+=t.em(s);break}case"codespan":{n+=t.codespan(s);break}case"br":{n+=t.br(s);break}case"del":{n+=t.del(s);break}case"text":{n+=t.text(s);break}default:{let a='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return n}};var S=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var A=class{defaults=_();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=$;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case"table":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case"list":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let a=s,o=n.renderer[a],u=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c||""}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let a=s,o=n.tokenizer[a],u=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new S;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if(["options","block"].includes(s))continue;let a=s,o=n.hooks[a],u=i[a];S.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(s))return(async()=>{let g=await o.call(i,p);return u.call(i,g)})();let c=o.call(i,p);return u.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let g=await o.apply(i,p);return g===!1&&(g=await u.apply(i,p)),g})();let c=o.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let u=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(u=s.hooks.processAllTokens(u)),s.walkTokens&&this.walkTokens(u,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(u,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`
+Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+w(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L=new A;function d(l,e){return L.parse(l,e)}d.options=d.setOptions=function(l){return L.setOptions(l),d.defaults=L.defaults,G(d.defaults),d};d.getDefaults=_;d.defaults=T;d.use=function(...l){return L.use(...l),d.defaults=L.defaults,G(d.defaults),d};d.walkTokens=function(l,e){return L.walkTokens(l,e)};d.parseInline=L.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=$;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=S;d.parse=d;var it=d.options,ot=d.setOptions,at=d.use,lt=d.walkTokens,ut=d.parseInline,pt=d,ct=b.parse,ht=x.lex;
+
+if(__exports != exports)module.exports = exports;return module.exports}));
+//# sourceMappingURL=marked.umd.js.map
diff --git a/htroot/js/styles/a11y-dark.min.css b/htroot/js/styles/a11y-dark.min.css
new file mode 100644
index 000000000..7820d7db1
--- /dev/null
+++ b/htroot/js/styles/a11y-dark.min.css
@@ -0,0 +1,7 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: a11y-dark
+ Author: @ericwbailey
+ Maintainer: @ericwbailey
+
+ Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
+*/.hljs{background:#2b2b2b;color:#f8f8f2}.hljs-comment,.hljs-quote{color:#d4d0ab}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#ffa07a}.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#f5ab35}.hljs-attribute{color:gold}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#abe338}.hljs-section,.hljs-title{color:#00e0e0}.hljs-keyword,.hljs-selector-tag{color:#dcc6e0}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@media screen and (-ms-high-contrast:active){.hljs-addition,.hljs-attribute,.hljs-built_in,.hljs-bullet,.hljs-comment,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-quote,.hljs-string,.hljs-symbol,.hljs-type{color:highlight}.hljs-keyword,.hljs-selector-tag{font-weight:700}} \ No newline at end of file
diff --git a/htroot/js/styles/a11y-light.min.css b/htroot/js/styles/a11y-light.min.css
new file mode 100644
index 000000000..8b5ab9093
--- /dev/null
+++ b/htroot/js/styles/a11y-light.min.css
@@ -0,0 +1,7 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: a11y-light
+ Author: @ericwbailey
+ Maintainer: @ericwbailey
+
+ Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
+*/.hljs{background:#fefefe;color:#545454}.hljs-comment,.hljs-quote{color:#696969}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#d91e18}.hljs-attribute,.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#aa5d00}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:green}.hljs-section,.hljs-title{color:#007faa}.hljs-keyword,.hljs-selector-tag{color:#7928a1}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@media screen and (-ms-high-contrast:active){.hljs-addition,.hljs-attribute,.hljs-built_in,.hljs-bullet,.hljs-comment,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-quote,.hljs-string,.hljs-symbol,.hljs-type{color:highlight}.hljs-keyword,.hljs-selector-tag{font-weight:700}} \ No newline at end of file
diff --git a/htroot/js/styles/atom-one-dark.css b/htroot/js/styles/atom-one-dark.css
new file mode 100644
index 000000000..3c51ce688
--- /dev/null
+++ b/htroot/js/styles/atom-one-dark.css
@@ -0,0 +1,90 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+
+Atom One Dark by Daniel Gamage
+Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
+
+base: #282c34
+mono-1: #abb2bf
+mono-2: #818896
+mono-3: #5c6370
+hue-1: #56b6c2
+hue-2: #61aeee
+hue-3: #c678dd
+hue-4: #98c379
+hue-5: #e06c75
+hue-5-2: #be5046
+hue-6: #d19a66
+hue-6-2: #e6c07b
+
+*/
+.hljs {
+ color: #abb2bf;
+ background: #282c34
+}
+.hljs-comment,
+.hljs-quote {
+ color: #5c6370;
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula {
+ color: #c678dd
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: #e06c75
+}
+.hljs-literal {
+ color: #56b6c2
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: #98c379
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number {
+ color: #d19a66
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title {
+ color: #61aeee
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-class .hljs-title {
+ color: #e6c07b
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+} \ No newline at end of file
diff --git a/htroot/js/styles/atom-one-dark.min.css b/htroot/js/styles/atom-one-dark.min.css
new file mode 100644
index 000000000..5344ee381
--- /dev/null
+++ b/htroot/js/styles/atom-one-dark.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} \ No newline at end of file
diff --git a/htroot/js/styles/atom-one-light.css b/htroot/js/styles/atom-one-light.css
new file mode 100644
index 000000000..26dd7ec0c
--- /dev/null
+++ b/htroot/js/styles/atom-one-light.css
@@ -0,0 +1,90 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+
+Atom One Light by Daniel Gamage
+Original One Light Syntax theme from https://github.com/atom/one-light-syntax
+
+base: #fafafa
+mono-1: #383a42
+mono-2: #686b77
+mono-3: #a0a1a7
+hue-1: #0184bb
+hue-2: #4078f2
+hue-3: #a626a4
+hue-4: #50a14f
+hue-5: #e45649
+hue-5-2: #c91243
+hue-6: #986801
+hue-6-2: #c18401
+
+*/
+.hljs {
+ color: #383a42;
+ background: #fafafa
+}
+.hljs-comment,
+.hljs-quote {
+ color: #a0a1a7;
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula {
+ color: #a626a4
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: #e45649
+}
+.hljs-literal {
+ color: #0184bb
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: #50a14f
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number {
+ color: #986801
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title {
+ color: #4078f2
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-class .hljs-title {
+ color: #c18401
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+} \ No newline at end of file
diff --git a/htroot/js/styles/atom-one-light.min.css b/htroot/js/styles/atom-one-light.min.css
new file mode 100644
index 000000000..df0268a94
--- /dev/null
+++ b/htroot/js/styles/atom-one-light.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-cherry.css b/htroot/js/styles/cybertopia-cherry.css
new file mode 100644
index 000000000..273a250b8
--- /dev/null
+++ b/htroot/js/styles/cybertopia-cherry.css
@@ -0,0 +1,103 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Theme: Cybertopia Cherry
+ Author: Alexandre ZANNI (noraj)
+ Repository: https://github.com/noraj/cybertopia-highlightjs
+*/
+:root {
+ --hljs-bg: #101010;
+ --hljs-mono-1: #abb2bf;
+ --hljs-mono-3: #5c6370;
+ --hljs-hue-1: #C50243;
+ --hljs-hue-2: #C50253;
+ --hljs-hue-3: #C50263;
+ --hljs-hue-4: #02c797;
+ --hljs-hue-5: #02C584;
+ --hljs-hue-6: #02C574;
+ --hljs-hue-6-2: #02C563;
+ --hljs-hue-7: #C50233
+}
+.hljs {
+ color: var(--hljs-mono-1);
+ background: var(--hljs-bg)
+}
+.hljs-comment,
+.hljs-quote,
+.hljs-code {
+ color: var(--hljs-mono-3);
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula,
+.hljs-meta .hljs-keyword {
+ color: var(--hljs-hue-3)
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: var(--hljs-hue-5)
+}
+.hljs-literal {
+ color: var(--hljs-hue-1)
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: var(--hljs-hue-4)
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number,
+.hljs-punctuation,
+.hljs-variable.language_ {
+ color: var(--hljs-hue-6)
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title,
+.hljs-title.function_,
+.hljs-property,
+.hljs-tag,
+.hljs-char.escape_ {
+ color: var(--hljs-hue-2)
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-class .hljs-title {
+ color: var(--hljs-hue-6-2)
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-params,
+.hljs-operator,
+.hljs-template-tag {
+ color: var(--hljs-hue-7)
+} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-cherry.min.css b/htroot/js/styles/cybertopia-cherry.min.css
new file mode 100644
index 000000000..837da4534
--- /dev/null
+++ b/htroot/js/styles/cybertopia-cherry.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}:root{--hljs-bg:#101010;--hljs-mono-1:#abb2bf;--hljs-mono-3:#5c6370;--hljs-hue-1:#C50243;--hljs-hue-2:#C50253;--hljs-hue-3:#C50263;--hljs-hue-4:#02c797;--hljs-hue-5:#02C584;--hljs-hue-6:#02C574;--hljs-hue-6-2:#02C563;--hljs-hue-7:#C50233}.hljs{color:var(--hljs-mono-1);background:var(--hljs-bg)}.hljs-code,.hljs-comment,.hljs-quote{color:var(--hljs-mono-3);font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword,.hljs-meta .hljs-keyword{color:var(--hljs-hue-3)}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:var(--hljs-hue-5)}.hljs-literal{color:var(--hljs-hue-1)}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:var(--hljs-hue-4)}.hljs-attr,.hljs-number,.hljs-punctuation,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable,.hljs-variable.language_{color:var(--hljs-hue-6)}.hljs-bullet,.hljs-char.escape_,.hljs-link,.hljs-meta,.hljs-property,.hljs-selector-id,.hljs-symbol,.hljs-tag,.hljs-title,.hljs-title.function_{color:var(--hljs-hue-2)}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__{color:var(--hljs-hue-6-2)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-operator,.hljs-params,.hljs-template-tag{color:var(--hljs-hue-7)} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-dimmer.css b/htroot/js/styles/cybertopia-dimmer.css
new file mode 100644
index 000000000..314f06c16
--- /dev/null
+++ b/htroot/js/styles/cybertopia-dimmer.css
@@ -0,0 +1,103 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Theme: Cybertopia Dimmer
+ Author: Alexandre ZANNI (noraj)
+ Repository: https://github.com/noraj/cybertopia-highlightjs
+*/
+:root {
+ --hljs-bg: #101010;
+ --hljs-mono-1: #abb2bf;
+ --hljs-mono-3: #5c6370;
+ --hljs-hue-1: #97C502;
+ --hljs-hue-2: #469EBE;
+ --hljs-hue-3: #A246BE;
+ --hljs-hue-4: #02c797;
+ --hljs-hue-5: #C50233;
+ --hljs-hue-6: #BE6446;
+ --hljs-hue-6-2: #c5bb02;
+ --hljs-hue-7: #64BE46
+}
+.hljs {
+ color: var(--hljs-mono-1);
+ background: var(--hljs-bg)
+}
+.hljs-comment,
+.hljs-quote,
+.hljs-code {
+ color: var(--hljs-mono-3);
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula,
+.hljs-meta .hljs-keyword {
+ color: var(--hljs-hue-3)
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: var(--hljs-hue-5)
+}
+.hljs-literal {
+ color: var(--hljs-hue-1)
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: var(--hljs-hue-4)
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number,
+.hljs-punctuation,
+.hljs-variable.language_ {
+ color: var(--hljs-hue-6)
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title,
+.hljs-title.function_,
+.hljs-property,
+.hljs-tag,
+.hljs-char.escape_ {
+ color: var(--hljs-hue-2)
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-class .hljs-title {
+ color: var(--hljs-hue-6-2)
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-params,
+.hljs-operator,
+.hljs-template-tag {
+ color: var(--hljs-hue-7)
+} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-dimmer.min.css b/htroot/js/styles/cybertopia-dimmer.min.css
new file mode 100644
index 000000000..df0f7f2eb
--- /dev/null
+++ b/htroot/js/styles/cybertopia-dimmer.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}:root{--hljs-bg:#101010;--hljs-mono-1:#abb2bf;--hljs-mono-3:#5c6370;--hljs-hue-1:#97C502;--hljs-hue-2:#469EBE;--hljs-hue-3:#A246BE;--hljs-hue-4:#02c797;--hljs-hue-5:#C50233;--hljs-hue-6:#BE6446;--hljs-hue-6-2:#c5bb02;--hljs-hue-7:#64BE46}.hljs{color:var(--hljs-mono-1);background:var(--hljs-bg)}.hljs-code,.hljs-comment,.hljs-quote{color:var(--hljs-mono-3);font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword,.hljs-meta .hljs-keyword{color:var(--hljs-hue-3)}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:var(--hljs-hue-5)}.hljs-literal{color:var(--hljs-hue-1)}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:var(--hljs-hue-4)}.hljs-attr,.hljs-number,.hljs-punctuation,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable,.hljs-variable.language_{color:var(--hljs-hue-6)}.hljs-bullet,.hljs-char.escape_,.hljs-link,.hljs-meta,.hljs-property,.hljs-selector-id,.hljs-symbol,.hljs-tag,.hljs-title,.hljs-title.function_{color:var(--hljs-hue-2)}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__{color:var(--hljs-hue-6-2)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-operator,.hljs-params,.hljs-template-tag{color:var(--hljs-hue-7)} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-icecap.css b/htroot/js/styles/cybertopia-icecap.css
new file mode 100644
index 000000000..1244a6c25
--- /dev/null
+++ b/htroot/js/styles/cybertopia-icecap.css
@@ -0,0 +1,103 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Theme: Cybertopia Icecap
+ Author: Alexandre ZANNI (noraj)
+ Repository: https://github.com/noraj/cybertopia-highlightjs
+*/
+:root {
+ --hljs-bg: #101010;
+ --hljs-mono-1: #abb2bf;
+ --hljs-mono-3: #5c6370;
+ --hljs-hue-1: #0274C5;
+ --hljs-hue-2: #025AC5;
+ --hljs-hue-3: #0240C5;
+ --hljs-hue-4: #02c797;
+ --hljs-hue-5: #02C5AE;
+ --hljs-hue-6: #02C2C5;
+ --hljs-hue-6-2: #02A8C5;
+ --hljs-hue-7: #028EC5
+}
+.hljs {
+ color: var(--hljs-mono-1);
+ background: var(--hljs-bg)
+}
+.hljs-comment,
+.hljs-quote,
+.hljs-code {
+ color: var(--hljs-mono-3);
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula,
+.hljs-meta .hljs-keyword {
+ color: var(--hljs-hue-3)
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: var(--hljs-hue-5)
+}
+.hljs-literal {
+ color: var(--hljs-hue-1)
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: var(--hljs-hue-4)
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number,
+.hljs-punctuation,
+.hljs-variable.language_ {
+ color: var(--hljs-hue-6)
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title,
+.hljs-title.function_,
+.hljs-property,
+.hljs-tag,
+.hljs-char.escape_ {
+ color: var(--hljs-hue-2)
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-class .hljs-title {
+ color: var(--hljs-hue-6-2)
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-params,
+.hljs-operator,
+.hljs-template-tag {
+ color: var(--hljs-hue-7)
+} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-icecap.min.css b/htroot/js/styles/cybertopia-icecap.min.css
new file mode 100644
index 000000000..8ef72ad6d
--- /dev/null
+++ b/htroot/js/styles/cybertopia-icecap.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}:root{--hljs-bg:#101010;--hljs-mono-1:#abb2bf;--hljs-mono-3:#5c6370;--hljs-hue-1:#0274C5;--hljs-hue-2:#025AC5;--hljs-hue-3:#0240C5;--hljs-hue-4:#02c797;--hljs-hue-5:#02C5AE;--hljs-hue-6:#02C2C5;--hljs-hue-6-2:#02A8C5;--hljs-hue-7:#028EC5}.hljs{color:var(--hljs-mono-1);background:var(--hljs-bg)}.hljs-code,.hljs-comment,.hljs-quote{color:var(--hljs-mono-3);font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword,.hljs-meta .hljs-keyword{color:var(--hljs-hue-3)}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:var(--hljs-hue-5)}.hljs-literal{color:var(--hljs-hue-1)}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:var(--hljs-hue-4)}.hljs-attr,.hljs-number,.hljs-punctuation,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable,.hljs-variable.language_{color:var(--hljs-hue-6)}.hljs-bullet,.hljs-char.escape_,.hljs-link,.hljs-meta,.hljs-property,.hljs-selector-id,.hljs-symbol,.hljs-tag,.hljs-title,.hljs-title.function_{color:var(--hljs-hue-2)}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__{color:var(--hljs-hue-6-2)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-operator,.hljs-params,.hljs-template-tag{color:var(--hljs-hue-7)} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-saturated.css b/htroot/js/styles/cybertopia-saturated.css
new file mode 100644
index 000000000..f5a8b4e54
--- /dev/null
+++ b/htroot/js/styles/cybertopia-saturated.css
@@ -0,0 +1,103 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Theme: Cybertopia Saturated
+ Author: Alexandre ZANNI (noraj)
+ Repository: https://github.com/noraj/cybertopia-highlightjs
+*/
+:root {
+ --hljs-bg: #101010;
+ --hljs-mono-1: #abb2bf;
+ --hljs-mono-3: #5c6370;
+ --hljs-hue-1: #5AF202;
+ --hljs-hue-2: #08B7FD;
+ --hljs-hue-3: #E917FD;
+ --hljs-hue-4: #02c797;
+ --hljs-hue-5: #E30202;
+ --hljs-hue-6: #FD9926;
+ --hljs-hue-6-2: #ffea00;
+ --hljs-hue-7: #35FD56
+}
+.hljs {
+ color: var(--hljs-mono-1);
+ background: var(--hljs-bg)
+}
+.hljs-comment,
+.hljs-quote,
+.hljs-code {
+ color: var(--hljs-mono-3);
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula,
+.hljs-meta .hljs-keyword {
+ color: var(--hljs-hue-3)
+}
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: var(--hljs-hue-5)
+}
+.hljs-literal {
+ color: var(--hljs-hue-1)
+}
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta .hljs-string {
+ color: var(--hljs-hue-4)
+}
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-type,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number,
+.hljs-punctuation,
+.hljs-variable.language_ {
+ color: var(--hljs-hue-6)
+}
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id,
+.hljs-title,
+.hljs-title.function_,
+.hljs-property,
+.hljs-tag,
+.hljs-char.escape_ {
+ color: var(--hljs-hue-2)
+}
+.hljs-built_in,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-class .hljs-title {
+ color: var(--hljs-hue-6-2)
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-params,
+.hljs-operator,
+.hljs-template-tag {
+ color: var(--hljs-hue-7)
+} \ No newline at end of file
diff --git a/htroot/js/styles/cybertopia-saturated.min.css b/htroot/js/styles/cybertopia-saturated.min.css
new file mode 100644
index 000000000..212060337
--- /dev/null
+++ b/htroot/js/styles/cybertopia-saturated.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}:root{--hljs-bg:#101010;--hljs-mono-1:#abb2bf;--hljs-mono-3:#5c6370;--hljs-hue-1:#5AF202;--hljs-hue-2:#08B7FD;--hljs-hue-3:#E917FD;--hljs-hue-4:#02c797;--hljs-hue-5:#E30202;--hljs-hue-6:#FD9926;--hljs-hue-6-2:#ffea00;--hljs-hue-7:#35FD56}.hljs{color:var(--hljs-mono-1);background:var(--hljs-bg)}.hljs-code,.hljs-comment,.hljs-quote{color:var(--hljs-mono-3);font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword,.hljs-meta .hljs-keyword{color:var(--hljs-hue-3)}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:var(--hljs-hue-5)}.hljs-literal{color:var(--hljs-hue-1)}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:var(--hljs-hue-4)}.hljs-attr,.hljs-number,.hljs-punctuation,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable,.hljs-variable.language_{color:var(--hljs-hue-6)}.hljs-bullet,.hljs-char.escape_,.hljs-link,.hljs-meta,.hljs-property,.hljs-selector-id,.hljs-symbol,.hljs-tag,.hljs-title,.hljs-title.function_{color:var(--hljs-hue-2)}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__{color:var(--hljs-hue-6-2)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-operator,.hljs-params,.hljs-template-tag{color:var(--hljs-hue-7)} \ No newline at end of file
diff --git a/htroot/js/styles/default.min.css b/htroot/js/styles/default.min.css
new file mode 100644
index 000000000..a75ea9116
--- /dev/null
+++ b/htroot/js/styles/default.min.css
@@ -0,0 +1,9 @@
+/*!
+ Theme: Default
+ Description: Original highlight.js style
+ Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
+ Maintainer: @highlightjs/core-team
+ Website: https://highlightjs.org/
+ License: see project LICENSE
+ Touched: 2021
+*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/js/styles/github-dark.min.css b/htroot/js/styles/github-dark.min.css
new file mode 100644
index 000000000..03b6da8bf
--- /dev/null
+++ b/htroot/js/styles/github-dark.min.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: GitHub Dark
+ Description: Dark theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-dark
+ Current colors taken from GitHub's CSS
+*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} \ No newline at end of file
diff --git a/htroot/js/styles/github.min.css b/htroot/js/styles/github.min.css
new file mode 100644
index 000000000..275239a7a
--- /dev/null
+++ b/htroot/js/styles/github.min.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: GitHub
+ Description: Light theme as seen on github.com
+ Author: github.com
+ Maintainer: @Hirse
+ Updated: 2021-05-15
+
+ Outdated base version: https://github.com/primer/github-syntax-light
+ Current colors taken from GitHub's CSS
+*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0} \ No newline at end of file
diff --git a/htroot/js/styles/grayscale.min.css b/htroot/js/styles/grayscale.min.css
new file mode 100644
index 000000000..5eefdaa93
--- /dev/null
+++ b/htroot/js/styles/grayscale.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#333;background:#fff}.hljs-comment,.hljs-quote{color:#777;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number{color:#777}.hljs-doctag,.hljs-formula,.hljs-string{color:#333;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC)}.hljs-section,.hljs-selector-id,.hljs-title{color:#000;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-name,.hljs-title.class_,.hljs-type{color:#333;font-weight:700}.hljs-tag{color:#333}.hljs-regexp{color:#333;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==)}.hljs-bullet,.hljs-link,.hljs-symbol{color:#000;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==)}.hljs-built_in{color:#000;text-decoration:underline}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{color:#fff;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==)}.hljs-addition{color:#000;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/js/styles/mono-blue.css b/htroot/js/styles/mono-blue.css
new file mode 100644
index 000000000..bc9bceae4
--- /dev/null
+++ b/htroot/js/styles/mono-blue.css
@@ -0,0 +1,56 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Five-color theme from a single blue hue.
+*/
+.hljs {
+ background: #eaeef3;
+ color: #00193a
+}
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-name,
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-comment {
+ color: #738191
+}
+.hljs-string,
+.hljs-title,
+.hljs-section,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-addition,
+.hljs-tag,
+.hljs-quote,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class {
+ color: #0048ab
+}
+.hljs-meta,
+.hljs-subst,
+.hljs-symbol,
+.hljs-regexp,
+.hljs-attribute,
+.hljs-deletion,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-link,
+.hljs-bullet {
+ color: #4c81c9
+}
+.hljs-emphasis {
+ font-style: italic
+} \ No newline at end of file
diff --git a/htroot/js/styles/mono-blue.min.css b/htroot/js/styles/mono-blue.min.css
new file mode 100644
index 000000000..fb74d4056
--- /dev/null
+++ b/htroot/js/styles/mono-blue.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#eaeef3;color:#00193a}.hljs-doctag,.hljs-keyword,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-strong,.hljs-title{font-weight:700}.hljs-comment{color:#738191}.hljs-addition,.hljs-built_in,.hljs-literal,.hljs-name,.hljs-quote,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-tag,.hljs-title,.hljs-type{color:#0048ab}.hljs-attribute,.hljs-bullet,.hljs-deletion,.hljs-link,.hljs-meta,.hljs-regexp,.hljs-subst,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#4c81c9}.hljs-emphasis{font-style:italic} \ No newline at end of file
diff --git a/htroot/js/styles/night-owl.css b/htroot/js/styles/night-owl.css
new file mode 100644
index 000000000..3cad0ebf9
--- /dev/null
+++ b/htroot/js/styles/night-owl.css
@@ -0,0 +1,174 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+
+Night Owl for highlight.js (c) Carl Baxter <carl@cbax.tech>
+
+An adaptation of Sarah Drasner's Night Owl VS Code Theme
+https://github.com/sdras/night-owl-vscode-theme
+
+Copyright (c) 2018 Sarah Drasner
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
+
+*/
+.hljs {
+ background: #011627;
+ color: #d6deeb
+}
+/* General Purpose */
+.hljs-keyword {
+ color: #c792ea;
+ font-style: italic
+}
+.hljs-built_in {
+ color: #addb67;
+ font-style: italic
+}
+.hljs-type {
+ color: #82aaff
+}
+.hljs-literal {
+ color: #ff5874
+}
+.hljs-number {
+ color: #F78C6C
+}
+.hljs-regexp {
+ color: #5ca7e4
+}
+.hljs-string {
+ color: #ecc48d
+}
+.hljs-subst {
+ color: #d3423e
+}
+.hljs-symbol {
+ color: #82aaff
+}
+.hljs-class {
+ color: #ffcb8b
+}
+.hljs-function {
+ color: #82AAFF
+}
+.hljs-title {
+ color: #DCDCAA;
+ font-style: italic
+}
+.hljs-params {
+ color: #7fdbca
+}
+/* Meta */
+.hljs-comment {
+ color: #637777;
+ font-style: italic
+}
+.hljs-doctag {
+ color: #7fdbca
+}
+.hljs-meta {
+ color: #82aaff
+}
+.hljs-meta .hljs-keyword {
+ color: #82aaff
+}
+.hljs-meta .hljs-string {
+ color: #ecc48d
+}
+/* Tags, attributes, config */
+.hljs-section {
+ color: #82b1ff
+}
+.hljs-tag,
+.hljs-name {
+ color: #7fdbca
+}
+.hljs-attr {
+ color: #7fdbca
+}
+.hljs-attribute {
+ color: #80cbc4
+}
+.hljs-variable {
+ color: #addb67
+}
+/* Markup */
+.hljs-bullet {
+ color: #d9f5dd
+}
+.hljs-code {
+ color: #80CBC4
+}
+.hljs-emphasis {
+ color: #c792ea;
+ font-style: italic
+}
+.hljs-strong {
+ color: #addb67;
+ font-weight: bold
+}
+.hljs-formula {
+ color: #c792ea
+}
+.hljs-link {
+ color: #ff869a
+}
+.hljs-quote {
+ color: #697098;
+ font-style: italic
+}
+/* CSS */
+.hljs-selector-tag {
+ color: #ff6363
+}
+.hljs-selector-id {
+ color: #fad430
+}
+.hljs-selector-class {
+ color: #addb67;
+ font-style: italic
+}
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #c792ea;
+ font-style: italic
+}
+/* Templates */
+.hljs-template-tag {
+ color: #c792ea
+}
+.hljs-template-variable {
+ color: #addb67
+}
+/* diff */
+.hljs-addition {
+ color: #addb67ff;
+ font-style: italic
+}
+.hljs-deletion {
+ color: #EF535090;
+ font-style: italic
+} \ No newline at end of file
diff --git a/htroot/js/styles/night-owl.min.css b/htroot/js/styles/night-owl.min.css
new file mode 100644
index 000000000..ed945902d
--- /dev/null
+++ b/htroot/js/styles/night-owl.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#011627;color:#d6deeb}.hljs-keyword{color:#c792ea;font-style:italic}.hljs-built_in{color:#addb67;font-style:italic}.hljs-type{color:#82aaff}.hljs-literal{color:#ff5874}.hljs-number{color:#f78c6c}.hljs-regexp{color:#5ca7e4}.hljs-string{color:#ecc48d}.hljs-subst{color:#d3423e}.hljs-symbol{color:#82aaff}.hljs-class{color:#ffcb8b}.hljs-function{color:#82aaff}.hljs-title{color:#dcdcaa;font-style:italic}.hljs-params{color:#7fdbca}.hljs-comment{color:#637777;font-style:italic}.hljs-doctag{color:#7fdbca}.hljs-meta,.hljs-meta .hljs-keyword{color:#82aaff}.hljs-meta .hljs-string{color:#ecc48d}.hljs-section{color:#82b1ff}.hljs-attr,.hljs-name,.hljs-tag{color:#7fdbca}.hljs-attribute{color:#80cbc4}.hljs-variable{color:#addb67}.hljs-bullet{color:#d9f5dd}.hljs-code{color:#80cbc4}.hljs-emphasis{color:#c792ea;font-style:italic}.hljs-strong{color:#addb67;font-weight:700}.hljs-formula{color:#c792ea}.hljs-link{color:#ff869a}.hljs-quote{color:#697098;font-style:italic}.hljs-selector-tag{color:#ff6363}.hljs-selector-id{color:#fad430}.hljs-selector-class{color:#addb67;font-style:italic}.hljs-selector-attr,.hljs-selector-pseudo{color:#c792ea;font-style:italic}.hljs-template-tag{color:#c792ea}.hljs-template-variable{color:#addb67}.hljs-addition{color:#addb67ff;font-style:italic}.hljs-deletion{color:#ef535090;font-style:italic} \ No newline at end of file
diff --git a/htroot/js/styles/nnfx-dark.css b/htroot/js/styles/nnfx-dark.css
new file mode 100644
index 000000000..cbacc2884
--- /dev/null
+++ b/htroot/js/styles/nnfx-dark.css
@@ -0,0 +1,104 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*!
+ Theme: nnfx dark
+ Description: a theme inspired by Netscape Navigator/Firefox
+ Author: (c) 2020-2021 Jim Mason <jmason@ibinx.com>
+ Maintainer: @RocketMan
+ License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ Updated: 2021-05-17
+
+ @version 1.1.0
+*/
+.hljs {
+ background: #333;
+ color: #fff
+}
+.language-xml .hljs-meta,
+.language-xml .hljs-meta-string {
+ font-weight: bold;
+ font-style: italic;
+ color: #69f
+}
+.hljs-comment,
+.hljs-quote {
+ font-style: italic;
+ color: #9c6
+}
+.hljs-name,
+.hljs-keyword,
+.hljs-built_in {
+ color: #a7a
+}
+.hljs-name,
+.hljs-attr {
+ font-weight: bold
+}
+.hljs-string {
+ font-weight: normal
+}
+.hljs-code,
+.hljs-string,
+.hljs-meta .hljs-string,
+.hljs-number,
+.hljs-regexp,
+.hljs-link {
+ color: #bce
+}
+.hljs-title,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-variable,
+.hljs-template-variable {
+ color: #d40
+}
+.hljs-title.class_,
+.hljs-class .hljs-title,
+.hljs-type {
+ font-weight: bold;
+ color: #96c
+}
+.hljs-title.function_,
+.hljs-function .hljs-title,
+.hljs-attr,
+.hljs-subst,
+.hljs-tag {
+ color: #fff
+}
+.hljs-formula {
+ background-color: #eee;
+ font-style: italic
+}
+.hljs-addition {
+ background-color: #797
+}
+.hljs-deletion {
+ background-color: #c99
+}
+.hljs-meta {
+ color: #69f
+}
+.hljs-section,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-pseudo,
+.hljs-selector-tag {
+ font-weight: bold;
+ color: #69f
+}
+.hljs-selector-pseudo {
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-emphasis {
+ font-style: italic
+} \ No newline at end of file
diff --git a/htroot/js/styles/nnfx-dark.min.css b/htroot/js/styles/nnfx-dark.min.css
new file mode 100644
index 000000000..4e6403d6e
--- /dev/null
+++ b/htroot/js/styles/nnfx-dark.min.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: nnfx dark
+ Description: a theme inspired by Netscape Navigator/Firefox
+ Author: (c) 2020-2021 Jim Mason <jmason@ibinx.com>
+ Maintainer: @RocketMan
+ License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ Updated: 2021-05-17
+
+ @version 1.1.0
+*/.hljs{background:#333;color:#fff}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#69f}.hljs-comment,.hljs-quote{font-style:italic;color:#9c6}.hljs-built_in,.hljs-keyword,.hljs-name{color:#a7a}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#bce}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#d40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#96c}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#fff}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#797}.hljs-deletion{background-color:#c99}.hljs-meta{color:#69f}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#69f}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file
diff --git a/htroot/js/styles/nnfx-light.css b/htroot/js/styles/nnfx-light.css
new file mode 100644
index 000000000..87a04c69b
--- /dev/null
+++ b/htroot/js/styles/nnfx-light.css
@@ -0,0 +1,104 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*!
+ Theme: nnfx light
+ Description: a theme inspired by Netscape Navigator/Firefox
+ Author: (c) 2020-2021 Jim Mason <jmason@ibinx.com>
+ Maintainer: @RocketMan
+ License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ Updated: 2021-05-17
+
+ @version 1.1.0
+*/
+.hljs {
+ background: #fff;
+ color: #000
+}
+.language-xml .hljs-meta,
+.language-xml .hljs-meta-string {
+ font-weight: bold;
+ font-style: italic;
+ color: #48b
+}
+.hljs-comment,
+.hljs-quote {
+ font-style: italic;
+ color: #070
+}
+.hljs-name,
+.hljs-keyword,
+.hljs-built_in {
+ color: #808
+}
+.hljs-name,
+.hljs-attr {
+ font-weight: bold
+}
+.hljs-string {
+ font-weight: normal
+}
+.hljs-code,
+.hljs-string,
+.hljs-meta .hljs-string,
+.hljs-number,
+.hljs-regexp,
+.hljs-link {
+ color: #00f
+}
+.hljs-title,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-variable,
+.hljs-template-variable {
+ color: #f40
+}
+.hljs-title.class_,
+.hljs-class .hljs-title,
+.hljs-type {
+ font-weight: bold;
+ color: #639
+}
+.hljs-title.function_,
+.hljs-function .hljs-title,
+.hljs-attr,
+.hljs-subst,
+.hljs-tag {
+ color: #000
+}
+.hljs-formula {
+ background-color: #eee;
+ font-style: italic
+}
+.hljs-addition {
+ background-color: #beb
+}
+.hljs-deletion {
+ background-color: #fbb
+}
+.hljs-meta {
+ color: #269
+}
+.hljs-section,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-pseudo,
+.hljs-selector-tag {
+ font-weight: bold;
+ color: #48b
+}
+.hljs-selector-pseudo {
+ font-style: italic
+}
+.hljs-doctag,
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-emphasis {
+ font-style: italic
+} \ No newline at end of file
diff --git a/htroot/js/styles/nnfx-light.min.css b/htroot/js/styles/nnfx-light.min.css
new file mode 100644
index 000000000..469223a98
--- /dev/null
+++ b/htroot/js/styles/nnfx-light.min.css
@@ -0,0 +1,10 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
+ Theme: nnfx light
+ Description: a theme inspired by Netscape Navigator/Firefox
+ Author: (c) 2020-2021 Jim Mason <jmason@ibinx.com>
+ Maintainer: @RocketMan
+ License: https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ Updated: 2021-05-17
+
+ @version 1.1.0
+*/.hljs{background:#fff;color:#000}.language-xml .hljs-meta,.language-xml .hljs-meta-string{font-weight:700;font-style:italic;color:#48b}.hljs-comment,.hljs-quote{font-style:italic;color:#070}.hljs-built_in,.hljs-keyword,.hljs-name{color:#808}.hljs-attr,.hljs-name{font-weight:700}.hljs-string{font-weight:400}.hljs-code,.hljs-link,.hljs-meta .hljs-string,.hljs-number,.hljs-regexp,.hljs-string{color:#00f}.hljs-bullet,.hljs-symbol,.hljs-template-variable,.hljs-title,.hljs-variable{color:#f40}.hljs-class .hljs-title,.hljs-title.class_,.hljs-type{font-weight:700;color:#639}.hljs-attr,.hljs-function .hljs-title,.hljs-subst,.hljs-tag,.hljs-title.function_{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#beb}.hljs-deletion{background-color:#fbb}.hljs-meta{color:#269}.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{font-weight:700;color:#48b}.hljs-selector-pseudo{font-style:italic}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file
diff --git a/htroot/js/styles/panda-syntax-dark.css b/htroot/js/styles/panda-syntax-dark.css
new file mode 100644
index 000000000..9a0695d13
--- /dev/null
+++ b/htroot/js/styles/panda-syntax-dark.css
@@ -0,0 +1,92 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/**
+ * Panda Syntax Theme for Highlight.js
+ * Based on: https://github.com/tinkertrain/panda-syntax-vscode
+ * Author: Annmarie Switzer <https://github.com/annmarie-switzer>
+ */
+.hljs {
+ color: #e6e6e6;
+ background: #2a2c2d
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-comment,
+.hljs-quote {
+ color: #bbbbbb;
+ font-style: italic
+}
+.hljs-params {
+ color: #bbbbbb
+}
+.hljs-punctuation,
+.hljs-attr {
+ color: #e6e6e6
+}
+.hljs-selector-tag,
+.hljs-name,
+.hljs-meta {
+ color: #ff4b82
+}
+.hljs-operator,
+.hljs-char.escape_ {
+ color: #b084eb
+}
+.hljs-keyword,
+.hljs-deletion {
+ color: #ff75b5
+}
+.hljs-regexp,
+.hljs-selector-pseudo,
+.hljs-selector-attr,
+.hljs-variable.language_ {
+ color: #ff9ac1
+}
+.hljs-subst,
+.hljs-property,
+.hljs-code,
+.hljs-formula,
+.hljs-section,
+.hljs-title.function_ {
+ color: #45a9f9
+}
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-selector-class,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-meta .hljs-string {
+ color: #19f9d8
+}
+.hljs-variable,
+.hljs-template-variable,
+.hljs-number,
+.hljs-literal,
+.hljs-type,
+.hljs-link,
+.hljs-built_in,
+.hljs-title,
+.hljs-selector-id,
+.hljs-tag,
+.hljs-doctag,
+.hljs-attribute,
+.hljs-template-tag,
+.hljs-meta .hljs-keyword,
+.hljs-punctuation {
+ color: #ffb86c
+} \ No newline at end of file
diff --git a/htroot/js/styles/panda-syntax-dark.min.css b/htroot/js/styles/panda-syntax-dark.min.css
new file mode 100644
index 000000000..55e26c684
--- /dev/null
+++ b/htroot/js/styles/panda-syntax-dark.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#e6e6e6;background:#2a2c2d}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-comment,.hljs-quote{color:#bbb;font-style:italic}.hljs-params{color:#bbb}.hljs-attr,.hljs-punctuation{color:#e6e6e6}.hljs-meta,.hljs-name,.hljs-selector-tag{color:#ff4b82}.hljs-char.escape_,.hljs-operator{color:#b084eb}.hljs-deletion,.hljs-keyword{color:#ff75b5}.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-variable.language_{color:#ff9ac1}.hljs-code,.hljs-formula,.hljs-property,.hljs-section,.hljs-subst,.hljs-title.function_{color:#45a9f9}.hljs-addition,.hljs-bullet,.hljs-meta .hljs-string,.hljs-selector-class,.hljs-string,.hljs-symbol,.hljs-title.class_,.hljs-title.class_.inherited__{color:#19f9d8}.hljs-attribute,.hljs-built_in,.hljs-doctag,.hljs-link,.hljs-literal,.hljs-meta .hljs-keyword,.hljs-number,.hljs-punctuation,.hljs-selector-id,.hljs-tag,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type,.hljs-variable{color:#ffb86c} \ No newline at end of file
diff --git a/htroot/js/styles/panda-syntax-light.css b/htroot/js/styles/panda-syntax-light.css
new file mode 100644
index 000000000..4bb402472
--- /dev/null
+++ b/htroot/js/styles/panda-syntax-light.css
@@ -0,0 +1,89 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/**
+ * Panda Syntax Theme for Highlight.js
+ * Based on: https://github.com/tinkertrain/panda-syntax-vscode
+ * Author: Annmarie Switzer <https://github.com/annmarie-switzer>
+ */
+.hljs {
+ color: #2a2c2d;
+ background: #e6e6e6
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+}
+.hljs-link {
+ text-decoration: underline
+}
+.hljs-comment,
+.hljs-quote {
+ color: #676B79;
+ font-style: italic
+}
+.hljs-params {
+ color: #676B79
+}
+.hljs-punctuation,
+.hljs-attr {
+ color: #2a2c2d
+}
+.hljs-selector-tag,
+.hljs-name,
+.hljs-meta,
+.hljs-operator,
+.hljs-char.escape_ {
+ color: #c56200
+}
+.hljs-keyword,
+.hljs-deletion {
+ color: #d92792
+}
+.hljs-regexp,
+.hljs-selector-pseudo,
+.hljs-selector-attr,
+.hljs-variable.language_ {
+ color: #cc5e91
+}
+.hljs-subst,
+.hljs-property,
+.hljs-code,
+.hljs-formula,
+.hljs-section,
+.hljs-title.function_ {
+ color: #3787c7
+}
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-selector-class,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-meta .hljs-string {
+ color: #0d7d6c
+}
+.hljs-variable,
+.hljs-template-variable,
+.hljs-number,
+.hljs-literal,
+.hljs-type,
+.hljs-link,
+.hljs-built_in,
+.hljs-title,
+.hljs-selector-id,
+.hljs-tag,
+.hljs-doctag,
+.hljs-attribute,
+.hljs-template-tag,
+.hljs-meta .hljs-keyword {
+ color: #7641bb
+} \ No newline at end of file
diff --git a/htroot/js/styles/panda-syntax-light.min.css b/htroot/js/styles/panda-syntax-light.min.css
new file mode 100644
index 000000000..6710dbdf4
--- /dev/null
+++ b/htroot/js/styles/panda-syntax-light.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#2a2c2d;background:#e6e6e6}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.hljs-comment,.hljs-quote{color:#676b79;font-style:italic}.hljs-params{color:#676b79}.hljs-attr,.hljs-punctuation{color:#2a2c2d}.hljs-char.escape_,.hljs-meta,.hljs-name,.hljs-operator,.hljs-selector-tag{color:#c56200}.hljs-deletion,.hljs-keyword{color:#d92792}.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-variable.language_{color:#cc5e91}.hljs-code,.hljs-formula,.hljs-property,.hljs-section,.hljs-subst,.hljs-title.function_{color:#3787c7}.hljs-addition,.hljs-bullet,.hljs-meta .hljs-string,.hljs-selector-class,.hljs-string,.hljs-symbol,.hljs-title.class_,.hljs-title.class_.inherited__{color:#0d7d6c}.hljs-attribute,.hljs-built_in,.hljs-doctag,.hljs-link,.hljs-literal,.hljs-meta .hljs-keyword,.hljs-number,.hljs-selector-id,.hljs-tag,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type,.hljs-variable{color:#7641bb} \ No newline at end of file
diff --git a/htroot/js/styles/paraiso-dark.css b/htroot/js/styles/paraiso-dark.css
new file mode 100644
index 000000000..e375a8831
--- /dev/null
+++ b/htroot/js/styles/paraiso-dark.css
@@ -0,0 +1,67 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Paraíso (dark)
+ Created by Jan T. Sott (http://github.com/idleberg)
+ Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
+*/
+.hljs {
+ background: #2f1e2e;
+ color: #a39e9b
+}
+/* Paraíso Comment */
+.hljs-comment,
+.hljs-quote {
+ color: #8d8687
+}
+/* Paraíso Red */
+.hljs-variable,
+.hljs-template-variable,
+.hljs-tag,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-regexp,
+.hljs-link,
+.hljs-meta {
+ color: #ef6155
+}
+/* Paraíso Orange */
+.hljs-number,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-params,
+.hljs-deletion {
+ color: #f99b15
+}
+/* Paraíso Yellow */
+.hljs-title,
+.hljs-section,
+.hljs-attribute {
+ color: #fec418
+}
+/* Paraíso Green */
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition {
+ color: #48b685
+}
+/* Paraíso Purple */
+.hljs-keyword,
+.hljs-selector-tag {
+ color: #815ba4
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+} \ No newline at end of file
diff --git a/htroot/js/styles/paraiso-dark.min.css b/htroot/js/styles/paraiso-dark.min.css
new file mode 100644
index 000000000..d51dd185b
--- /dev/null
+++ b/htroot/js/styles/paraiso-dark.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#2f1e2e;color:#a39e9b}.hljs-comment,.hljs-quote{color:#8d8687}.hljs-link,.hljs-meta,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#ef6155}.hljs-built_in,.hljs-deletion,.hljs-literal,.hljs-number,.hljs-params,.hljs-type{color:#f99b15}.hljs-attribute,.hljs-section,.hljs-title{color:#fec418}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#48b685}.hljs-keyword,.hljs-selector-tag{color:#815ba4}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/js/styles/paraiso-light.css b/htroot/js/styles/paraiso-light.css
new file mode 100644
index 000000000..ef527f090
--- /dev/null
+++ b/htroot/js/styles/paraiso-light.css
@@ -0,0 +1,67 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/*
+ Paraíso (light)
+ Created by Jan T. Sott (http://github.com/idleberg)
+ Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
+*/
+.hljs {
+ background: #e7e9db;
+ color: #4f424c
+}
+/* Paraíso Comment */
+.hljs-comment,
+.hljs-quote {
+ color: #776e71
+}
+/* Paraíso Red */
+.hljs-variable,
+.hljs-template-variable,
+.hljs-tag,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-regexp,
+.hljs-link,
+.hljs-meta {
+ color: #ef6155
+}
+/* Paraíso Orange */
+.hljs-number,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-params,
+.hljs-deletion {
+ color: #f99b15
+}
+/* Paraíso Yellow */
+.hljs-title,
+.hljs-section,
+.hljs-attribute {
+ color: #fec418
+}
+/* Paraíso Green */
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition {
+ color: #48b685
+}
+/* Paraíso Purple */
+.hljs-keyword,
+.hljs-selector-tag {
+ color: #815ba4
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+} \ No newline at end of file
diff --git a/htroot/js/styles/paraiso-light.min.css b/htroot/js/styles/paraiso-light.min.css
new file mode 100644
index 000000000..3a17c3f87
--- /dev/null
+++ b/htroot/js/styles/paraiso-light.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#e7e9db;color:#4f424c}.hljs-comment,.hljs-quote{color:#776e71}.hljs-link,.hljs-meta,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#ef6155}.hljs-built_in,.hljs-deletion,.hljs-literal,.hljs-number,.hljs-params,.hljs-type{color:#f99b15}.hljs-attribute,.hljs-section,.hljs-title{color:#fec418}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#48b685}.hljs-keyword,.hljs-selector-tag{color:#815ba4}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/js/styles/tomorrow-night-blue.css b/htroot/js/styles/tomorrow-night-blue.css
new file mode 100644
index 000000000..ae57a713c
--- /dev/null
+++ b/htroot/js/styles/tomorrow-night-blue.css
@@ -0,0 +1,69 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/* Tomorrow Night Blue Theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Tomorrow Comment */
+.hljs-comment,
+.hljs-quote {
+ color: #7285b7
+}
+/* Tomorrow Red */
+.hljs-variable,
+.hljs-template-variable,
+.hljs-tag,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-regexp,
+.hljs-deletion {
+ color: #ff9da4
+}
+/* Tomorrow Orange */
+.hljs-number,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-params,
+.hljs-meta,
+.hljs-link {
+ color: #ffc58f
+}
+/* Tomorrow Yellow */
+.hljs-attribute {
+ color: #ffeead
+}
+/* Tomorrow Green */
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition {
+ color: #d1f1a9
+}
+/* Tomorrow Blue */
+.hljs-title,
+.hljs-section {
+ color: #bbdaff
+}
+/* Tomorrow Purple */
+.hljs-keyword,
+.hljs-selector-tag {
+ color: #ebbbff
+}
+.hljs {
+ background: #002451;
+ color: white
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+} \ No newline at end of file
diff --git a/htroot/js/styles/tomorrow-night-blue.min.css b/htroot/js/styles/tomorrow-night-blue.min.css
new file mode 100644
index 000000000..2f71b26ba
--- /dev/null
+++ b/htroot/js/styles/tomorrow-night-blue.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs-comment,.hljs-quote{color:#7285b7}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#ff9da4}.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#ffc58f}.hljs-attribute{color:#ffeead}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#d1f1a9}.hljs-section,.hljs-title{color:#bbdaff}.hljs-keyword,.hljs-selector-tag{color:#ebbbff}.hljs{background:#002451;color:#fff}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/js/styles/tomorrow-night-bright.css b/htroot/js/styles/tomorrow-night-bright.css
new file mode 100644
index 000000000..b3b532d1b
--- /dev/null
+++ b/htroot/js/styles/tomorrow-night-bright.css
@@ -0,0 +1,68 @@
+pre code.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 1em
+}
+code.hljs {
+ padding: 3px 5px
+}
+/* Tomorrow Night Bright Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Tomorrow Comment */
+.hljs-comment,
+.hljs-quote {
+ color: #969896
+}
+/* Tomorrow Red */
+.hljs-variable,
+.hljs-template-variable,
+.hljs-tag,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-regexp,
+.hljs-deletion {
+ color: #d54e53
+}
+/* Tomorrow Orange */
+.hljs-number,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-params,
+.hljs-meta,
+.hljs-link {
+ color: #e78c45
+}
+/* Tomorrow Yellow */
+.hljs-attribute {
+ color: #e7c547
+}
+/* Tomorrow Green */
+.hljs-string,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition {
+ color: #b9ca4a
+}
+/* Tomorrow Blue */
+.hljs-title,
+.hljs-section {
+ color: #7aa6da
+}
+/* Tomorrow Purple */
+.hljs-keyword,
+.hljs-selector-tag {
+ color: #c397d8
+}
+.hljs {
+ background: black;
+ color: #eaeaea
+}
+.hljs-emphasis {
+ font-style: italic
+}
+.hljs-strong {
+ font-weight: bold
+} \ No newline at end of file
diff --git a/htroot/js/styles/tomorrow-night-bright.min.css b/htroot/js/styles/tomorrow-night-bright.min.css
new file mode 100644
index 000000000..d33562994
--- /dev/null
+++ b/htroot/js/styles/tomorrow-night-bright.min.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs-comment,.hljs-quote{color:#969896}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#d54e53}.hljs-built_in,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e78c45}.hljs-attribute{color:#e7c547}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#b9ca4a}.hljs-section,.hljs-title{color:#7aa6da}.hljs-keyword,.hljs-selector-tag{color:#c397d8}.hljs{background:#000;color:#eaeaea}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file
diff --git a/htroot/yacychat.html b/htroot/yacychat.html
index 14d63934a..9fd87e58a 100644
--- a/htroot/yacychat.html
+++ b/htroot/yacychat.html
@@ -3,6 +3,7 @@
<head>
<title>YaCy '#[clientname]#': Chat</title>
#%env/templates/metas.template%#
+ <link rel="stylesheet" href="js/styles/a11y-dark.min.css" type="text/css" />
<style type="text/css">
/* 1. Global Container */
.chat-panel {
@@ -76,7 +77,7 @@
border-color: #bbccdd;
color: #000;
}
-
+
.chat-turn.assistant legend {
background: #2c3e50;
color: #ffffff;
@@ -95,11 +96,61 @@
/* 5. Typography - All Chat Content is MONOSPACE */
.chat-body {
- white-space: pre-wrap;
line-height: 1.6;
font-size: 1.2rem; /* Larger font size */
font-family: 'Roboto Mono', 'Menlo', 'Consolas', monospace;
}
+
+ .chat-body.plain-text {
+ white-space: pre-wrap;
+ font-family: 'Roboto Mono', 'Menlo', 'Consolas', monospace;
+ }
+
+ .chat-body.markdown {
+ white-space: normal;
+ }
+
+ .chat-body.markdown,
+ .chat-body.markdown * {
+ font-family: 'Roboto Mono', 'Menlo', 'Consolas', monospace !important; /* Force markdown output and descendants to stay monospace, FTW! */
+ }
+
+ .chat-body.markdown.markdown-body {
+ max-width: 100%;
+ padding: 0;
+ }
+
+ .chat-body.markdown h1,
+ .chat-body.markdown h2,
+ .chat-body.markdown h3,
+ .chat-body.markdown h4,
+ .chat-body.markdown h5,
+ .chat-body.markdown h6,
+ .chat-body.markdown p,
+ .chat-body.markdown li,
+ .chat-body.markdown pre,
+ .chat-body.markdown code {
+ font-size: 1.2rem;
+ line-height: 1.6;
+ }
+
+ .chat-body pre {
+ background-color: #2c3e50;
+ border: 1px solid #dfe2e5;
+ border-radius: 4px;
+ padding: 2px;
+ overflow-x: auto;
+ font-family: 'Roboto Mono', 'Menlo', 'Consolas', monospace;
+ white-space: pre;
+ }
+
+ .chat-body code {
+ font-family: 'Roboto Mono', 'Menlo', 'Consolas', monospace;
+ font-size: 0.95rem;
+ background-color: rgba(27,31,35,0.05);
+ padding: 2px 4px;
+ border-radius: 4px;
+ }
/* 6. Composer Row (inside User fieldset) */
.composer {
@@ -319,6 +370,9 @@
</div>
</div>
+ <script src="js/highlight.min.js"></script>
+ <script src="js/marked.umd.js"></script>
+ <script src="js/index.umd.min.js"></script>
<script type="text/javascript">
const SYSTEM_PROMPT = 'You are a smart and helpful chatbot. If possible, use friendly emojies.';
const defaultApiHost = '';
@@ -357,6 +411,179 @@
composerMain: document.getElementById('composerMain')
};
+ if (typeof hljs !== 'undefined') {
+ hljs.configure({ ignoreUnescapedHTML: true });
+ }
+
+ const languageAlias = {
+ js: 'javascript',
+ jsx: 'javascript',
+ ts: 'typescript',
+ tsx: 'typescript',
+ sh: 'bash',
+ shell: 'bash',
+ bash: 'bash',
+ csharp: 'csharp',
+ 'c#': 'csharp',
+ 'c++': 'cpp',
+ py: 'python',
+ rb: 'ruby',
+ rs: 'rust',
+ md: 'markdown',
+ yml: 'yaml'
+ };
+
+ const languagePromises = {};
+
+ function normalizeLanguage(lang) {
+ if (!lang || typeof lang !== 'string') return '';
+ const key = lang.trim().toLowerCase();
+ return languageAlias[key] || key;
+ }
+
+ function ensureLanguage(lang) {
+ if (typeof hljs === 'undefined') return Promise.resolve(false);
+ const normalized = normalizeLanguage(lang);
+ if (!normalized) return Promise.resolve(false);
+ if (hljs.getLanguage(normalized)) return Promise.resolve(true);
+ if (languagePromises[normalized]) return languagePromises[normalized];
+ const loadScript = path => new Promise(resolve => {
+ const script = document.createElement('script');
+ script.src = path;
+ script.async = true;
+ script.onload = () => resolve(!!hljs.getLanguage(normalized));
+ script.onerror = () => {
+ console.warn('Failed to load highlight.js language file:', path);
+ resolve(false);
+ };
+ document.head.appendChild(script);
+ });
+ const base = (window.location && window.location.origin) ? window.location.origin : '';
+ const minSrc = `${base}/js/languages/${normalized}.min.js`;
+ const fullSrc = `${base}/js/languages/${normalized}.js`;
+ languagePromises[normalized] = loadScript(minSrc).then(success => {
+ if (success) return true;
+ return loadScript(fullSrc);
+ }).then(success => success || !!hljs.getLanguage(normalized));
+ return languagePromises[normalized];
+ }
+
+ function rehighlightCode(container) {
+ if (!container || typeof hljs === 'undefined') return;
+ const codeBlocks = Array.from(container.querySelectorAll('pre code'));
+ if (!codeBlocks.length) return;
+ const tasks = codeBlocks
+ .map(block => Array.from(block.classList).find(cls => cls.startsWith('language-')))
+ .map(match => match ? normalizeLanguage(match.replace(/^language-/, '')) : '')
+ .filter(Boolean)
+ .map(lang => ensureLanguage(lang));
+ Promise.all(tasks).then(() => {
+ codeBlocks.forEach(block => {
+ try {
+ hljs.highlightElement(block);
+ } catch (err) {
+ // ignore highlight failures
+ }
+ });
+ });
+ }
+
+ const markdownSupport = (() => {
+ if (typeof marked === 'undefined') {
+ return { enabled: false };
+ }
+ try {
+ if (window.markedHighlight && typeof window.markedHighlight.markedHighlight === 'function' && typeof hljs !== 'undefined') {
+ marked.use(window.markedHighlight.markedHighlight({
+ langPrefix: 'hljs language-',
+ highlight: (code, lang) => {
+ const language = normalizeLanguage(lang);
+ ensureLanguage(language);
+ if (language && hljs.getLanguage(language)) {
+ return hljs.highlight(code, { language }).value;
+ }
+ // kick off lazy load; will rehighlight after render
+ return escapeHTML(code);
+ }
+ }));
+ }
+ } catch (err) {
+ console.warn('Failed to initialize syntax highlighting', err);
+ }
+ marked.setOptions({
+ gfm: true,
+ breaks: true,
+ smartLists: true,
+ mangle: false,
+ headerIds: false
+ });
+ return { enabled: true };
+ })();
+
+ function escapeHTML(value) {
+ const div = document.createElement('div');
+ div.textContent = value || '';
+ return div.innerHTML;
+ }
+
+ function sanitizeHTML(html) {
+ if (!html) return '';
+ const template = document.createElement('template');
+ template.innerHTML = html;
+ const blockedTags = new Set(['script', 'style', 'iframe', 'object', 'embed', 'link', 'meta']);
+ const walker = document.createTreeWalker(template.content, NodeFilter.SHOW_ELEMENT, null);
+ const toRemove = [];
+ while (walker.nextNode()) {
+ const el = walker.currentNode;
+ if (!el || !el.tagName) continue;
+ const tag = el.tagName.toLowerCase();
+ if (blockedTags.has(tag)) {
+ toRemove.push(el);
+ continue;
+ }
+ for (const attr of Array.from(el.attributes)) {
+ const name = attr.name.toLowerCase();
+ const value = attr.value || '';
+ if (name.startsWith('on')) {
+ el.removeAttribute(attr.name);
+ continue;
+ }
+ if ((name === 'href' || name === 'src') && /^\s*javascript:/i.test(value)) {
+ el.removeAttribute(attr.name);
+ }
+ }
+ }
+ toRemove.forEach(node => node.remove());
+ return template.innerHTML;
+ }
+
+ function renderMarkdown(content) {
+ const source = typeof content === 'string' ? content : '';
+ if (!markdownSupport.enabled || typeof marked === 'undefined') {
+ return escapeHTML(source);
+ }
+ try {
+ return sanitizeHTML(marked.parse(source));
+ } catch (err) {
+ console.warn('Markdown rendering failed', err);
+ return escapeHTML(source);
+ }
+ }
+
+ function applyMessageContent(target, role, text) {
+ if (!target) return;
+ if (role === 'assistant') {
+ target.classList.add('markdown', 'markdown-body');
+ target.classList.remove('plain-text');
+ target.innerHTML = renderMarkdown(text);
+ rehighlightCode(target);
+ } else {
+ target.classList.add('plain-text');
+ target.classList.remove('markdown');
+ target.textContent = text || '';
+ }
+ }
+
function scrollToBottom(smooth = true) {
window.requestAnimationFrame(() => {
const behavior = smooth ? 'smooth' : 'auto';
@@ -399,7 +626,7 @@
const body = document.createElement('div');
body.className = 'chat-body';
- body.textContent = text;
+ applyMessageContent(body, role, text);
entry.appendChild(body);
dom.messages.appendChild(entry);
@@ -585,11 +812,11 @@
if (delta) {
if (!sawFirstToken && typeof onFirstToken === 'function') {
sawFirstToken = true;
- assistantNode.textContent = '';
+ applyMessageContent(assistantNode, 'assistant', '');
onFirstToken();
}
assistantText += delta;
- assistantNode.textContent = assistantText;
+ applyMessageContent(assistantNode, 'assistant', assistantText);
scrollToBottom(false);
}
} catch (err) {