haveapi 0.29.9 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Rakefile +1 -0
  4. data/doc/client-examples.md +96 -0
  5. data/haveapi.gemspec +1 -1
  6. data/lib/haveapi/client_example.rb +47 -1
  7. data/lib/haveapi/client_examples/dynamic_helpers.rb +129 -0
  8. data/lib/haveapi/client_examples/go_client.rb +37 -0
  9. data/lib/haveapi/client_examples/js_async_client.rb +14 -0
  10. data/lib/haveapi/client_examples/js_client.rb +179 -135
  11. data/lib/haveapi/client_examples/python_async_client.rb +14 -0
  12. data/lib/haveapi/client_examples/python_client.rb +172 -0
  13. data/lib/haveapi/client_examples/rust_client.rb +59 -0
  14. data/lib/haveapi/client_examples/ts_async_client.rb +14 -0
  15. data/lib/haveapi/client_examples/ts_client.rb +14 -0
  16. data/lib/haveapi/documentation_clients.rb +126 -0
  17. data/lib/haveapi/documentation_context.rb +47 -0
  18. data/lib/haveapi/public/js/highlight-LICENSE +29 -0
  19. data/lib/haveapi/public/js/highlight.pack.js +2 -2
  20. data/lib/haveapi/public/js/highlighter.js +16 -6
  21. data/lib/haveapi/public/js/main.js +9 -1
  22. data/lib/haveapi/public/js/nojs-tabs.js +37 -3
  23. data/lib/haveapi/server.rb +34 -0
  24. data/lib/haveapi/version.rb +1 -1
  25. data/lib/haveapi/views/main_layout.erb +11 -0
  26. data/lib/haveapi/views/version_page/auth_body.erb +3 -3
  27. data/lib/haveapi/views/version_page/client_auth.erb +2 -2
  28. data/lib/haveapi/views/version_page/client_example.erb +2 -11
  29. data/lib/haveapi/views/version_page/client_init.erb +2 -2
  30. data/lib/haveapi/views/version_page/client_result.erb +5 -0
  31. data/lib/haveapi/views/version_page/resource_body.erb +3 -7
  32. data/lib/haveapi/views/version_page.erb +13 -9
  33. data/spec/client_examples/assets/highlighter_test.cjs +26 -0
  34. data/spec/client_examples/assets/tabs_test.cjs +54 -0
  35. data/spec/client_examples/context_spec.rb +68 -0
  36. data/spec/client_examples/dynamic_acceptance.md +83 -0
  37. data/spec/client_examples/dynamic_acceptance.rb +151 -0
  38. data/spec/client_examples/dynamic_acceptance_spec.rb +76 -0
  39. data/spec/client_examples/dynamic_fixture.rb +36 -0
  40. data/spec/client_examples/dynamic_js_spec.rb +195 -0
  41. data/spec/client_examples/dynamic_metadata_spec.rb +52 -0
  42. data/spec/client_examples/dynamic_mounted_paths_spec.rb +65 -0
  43. data/spec/client_examples/dynamic_python_spec.rb +123 -0
  44. data/spec/client_examples/go_spec.rb +57 -0
  45. data/spec/client_examples/profiles_spec.rb +95 -0
  46. data/spec/client_examples/rust_client_spec.rb +75 -0
  47. data/spec/client_examples/syntax_spec.rb +2 -1
  48. data/spec/documentation/auth_filtering_spec.rb +12 -0
  49. data/spec/documentation/client_examples_spec.rb +82 -0
  50. data/spec/packaging_spec.rb +13 -4
  51. data/test_support/dynamic_documentation_api.rb +171 -0
  52. data/test_support/dynamic_protocol_spec.rb +133 -0
  53. data/test_support/dynamic_python_login_spec.rb +75 -0
  54. metadata +34 -4
  55. data/lib/haveapi/client_examples/fs_client.rb +0 -119
@@ -0,0 +1,126 @@
1
+ require 'json'
2
+ require 'haveapi/documentation_context'
3
+
4
+ module HaveAPI
5
+ class ClientExample
6
+ class Profile
7
+ attr_reader :language, :package_name, :package_version, :adapter
8
+
9
+ def initialize(language:, package_name:, package_version:, adapter:)
10
+ @language = language
11
+ @package_name = package_name.dup.freeze
12
+ @package_version = package_version.dup.freeze
13
+ @adapter = adapter.freeze
14
+ freeze
15
+ end
16
+ end
17
+
18
+ class Profiles
19
+ class Invalid < ArgumentError; end
20
+
21
+ KEYS = {
22
+ go: %i[import_path module_version description_path generator_version],
23
+ rust: %i[snapshot_path generator_config_path generator_version]
24
+ }.freeze
25
+
26
+ def initialize
27
+ @versions = {}
28
+ @rust_versions = {}
29
+ end
30
+
31
+ def register(version, **languages)
32
+ raise Invalid, 'Documentation client profiles are already mounted' if @mounted
33
+ raise Invalid, 'Unknown documentation client language' unless (languages.keys - KEYS.keys).empty?
34
+
35
+ selected = @versions[version.to_s] ||= {}
36
+ languages.each do |language, config|
37
+ next if config.nil?
38
+ raise Invalid, 'Duplicate documentation client profile' if selected.has_key?(language)
39
+
40
+ selected[language] = load_profile(language, config, version.to_s)
41
+ end
42
+ end
43
+
44
+ def mount(versions)
45
+ unknown = @versions.keys - Array(versions).map(&:to_s)
46
+ raise Invalid, 'Documentation client profile selects an unavailable API version' unless unknown.empty?
47
+ unless @rust_versions.all? { |version, saved| version == saved }
48
+ raise Invalid, 'Documentation Rust snapshot API version mismatch'
49
+ end
50
+
51
+ @versions.each_value(&:freeze)
52
+ @versions.freeze
53
+ @mounted = true
54
+ end
55
+
56
+ def for_version(version)
57
+ @versions.fetch(version.to_s, {}).dup.freeze
58
+ end
59
+
60
+ private
61
+
62
+ def validate_config(language, config)
63
+ unless config.is_a?(Hash) && config.keys.sort == KEYS.fetch(language).sort &&
64
+ config.values.all? { |value| value.is_a?(String) && !value.strip.empty? }
65
+ raise Invalid, 'Invalid documentation client profile fields'
66
+ end
67
+ return if config.fetch(:generator_version).match?(/\A\d+\.\d+\.\d+(?:[-+][\w.-]+)?\z/)
68
+
69
+ raise Invalid, 'Invalid documentation generator version'
70
+ end
71
+
72
+ def local_file(path)
73
+ raise Invalid, 'Documentation profiles require absolute local files' unless path.start_with?('/') && File.file?(path)
74
+
75
+ path
76
+ end
77
+
78
+ def load_profile(language, config, version)
79
+ validate_config(language, config)
80
+ language == :go ? load_go(config) : load_rust(config, version)
81
+ rescue LoadError
82
+ raise Invalid, 'Configured documentation client generator is not installed'
83
+ rescue JSON::ParserError, SystemCallError
84
+ raise Invalid, 'Cannot read configured documentation client data'
85
+ rescue Invalid
86
+ raise
87
+ rescue StandardError
88
+ raise Invalid, 'Configured documentation client schema or configuration is invalid'
89
+ end
90
+
91
+ def load_go(config)
92
+ name = config.fetch(:import_path)
93
+ version = config.fetch(:module_version)
94
+ unless name.match?(%r{\A[a-zA-Z0-9][a-zA-Z0-9._~/-]*\z}) &&
95
+ name.split('/').none? { |part| part.empty? || %w[. ..].include?(part) } &&
96
+ version.match?(/\Av\d+\.\d+\.\d+(?:[-+][\w.-]+)?\z/)
97
+ raise Invalid, 'Invalid Go documentation client package'
98
+ end
99
+
100
+ require 'haveapi/go_client/documentation'
101
+ unless config.fetch(:generator_version) == HaveAPI::GoClient::VERSION
102
+ raise Invalid, 'Documentation Go generator version mismatch'
103
+ end
104
+
105
+ description = JSON.parse(File.read(local_file(config.fetch(:description_path))))
106
+ adapter = HaveAPI::GoClient::Documentation.new(description:, import_path: name, module_version: version)
107
+ Profile.new(language: :go, package_name: name, package_version: version, adapter:)
108
+ end
109
+
110
+ def load_rust(config, api_version)
111
+ require 'haveapi/rust_client/documentation'
112
+ unless config.fetch(:generator_version) == HaveAPI::RustClient::VERSION
113
+ raise Invalid, 'Documentation Rust generator version mismatch'
114
+ end
115
+
116
+ snapshot = JSON.parse(File.read(local_file(config.fetch(:snapshot_path))))
117
+ @rust_versions[api_version] = snapshot.fetch('api_version').to_s
118
+ generator_config = Tomlrb.load_file(local_file(config.fetch(:generator_config_path)))
119
+ name = generator_config.fetch('crate_name')
120
+ version = generator_config.fetch('crate_version')
121
+ adapter = HaveAPI::RustClient::Documentation.new(snapshot:, config: generator_config)
122
+ Profile.new(language: :rust, package_name: name, package_version: version, adapter:)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,47 @@
1
+ require 'haveapi/client_example'
2
+
3
+ module HaveAPI
4
+ class ClientExample
5
+ # A request-local snapshot: never freeze or retain the server's shared help.
6
+ class Context
7
+ FIELDS = %i[version host base_url version_url description resource_path resource action_name action sample profile].freeze
8
+ attr_reader(*FIELDS)
9
+
10
+ def initialize(version:, host:, base_url:, version_url:, description:,
11
+ resource_path: [], resource: nil, action_name: nil, action: nil,
12
+ sample: nil, profile: nil)
13
+ @version = version.to_s.dup.freeze
14
+ @host = host.to_s.dup.freeze
15
+ @base_url = base_url.to_s.dup.freeze
16
+ @version_url = version_url.to_s.dup.freeze
17
+ @description = copy(description)
18
+ @resource_path = copy(resource_path.map(&:to_s))
19
+ @resource = copy(resource)
20
+ @action_name = action_name.nil? ? nil : action_name.to_s.dup.freeze
21
+ @action = copy(action)
22
+ @sample = copy(sample)
23
+ @profile = profile
24
+ freeze
25
+ end
26
+
27
+ def with(**changes)
28
+ self.class.new(**FIELDS.to_h { |field| [field, public_send(field)] }, **changes)
29
+ end
30
+
31
+ private
32
+
33
+ def copy(value)
34
+ case value
35
+ when Hash
36
+ value.to_h { |key, item| [copy(key), copy(item)] }.freeze
37
+ when Array
38
+ value.map { |item| copy(item) }.freeze
39
+ when String
40
+ value.dup.freeze
41
+ else
42
+ value
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2006, Ivan Sagalaev.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,2 +1,2 @@
1
- /*! highlight.js v9.8.0 | BSD3 License | git.io/hljslicense */
2
- !function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset<r[0].offset?e:r:"start"===r[0].event?e:r:e.length?e:r}function o(e){function r(e){return" "+e.nodeName+'="'+n(e.value)+'"'}l+="<"+t(e)+w.map.call(e.attributes,r).join("")+">"}function u(e){l+="</"+t(e)+">"}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='<span class="'+a,o=t?"":C;return i+=e+'">',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"<br>":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="</span>",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&amp;","<":"&lt;",">":"&gt;"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\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|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|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)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",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 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",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/</,r:0,c:[{cN:"attr",b:e,r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("<!--","-->",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{name:"style"},c:[t],starts:{e:"</style>",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{name:"script"},c:[t],starts:{e:"</script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b:/</,e:/(\/\w+|\w+\/)>/,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",w="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",u=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+w+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(u).concat(d)}});
1
+ /*! highlight.js 11.12.0 | BSD-3-Clause | See highlight-LICENSE */
2
+ var hljs=(()=>{var z=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}};var Qe=z((Yt,qe)=>{function Pe(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw new Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw new Error("set is read-only")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(n=>{let t=e[n],s=typeof t;(s==="object"||s==="function")&&!Object.isFrozen(t)&&Pe(t)}),e}var ge=class{constructor(n){n.data===void 0&&(n.data={}),this.data=n.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function Ue(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function ee(e,...n){let t=Object.create(null);for(let s in e)t[s]=e[s];return n.forEach(function(s){for(let u in s)t[u]=s[u]}),t}var $n="</span>",Ce=e=>!!e.scope,Fn=(e,{prefix:n})=>{if(e.startsWith("language:"))return e.replace("language:","language-");if(e.includes(".")){let t=e.split(".");return["".concat(n).concat(t.shift()),...t.map((s,u)=>"".concat(s).concat("_".repeat(u+1)))].join(" ")}return"".concat(n).concat(e)},Ne=class{constructor(n,t){this.buffer="",this.classPrefix=t.classPrefix,n.walk(this)}addText(n){this.buffer+=Ue(n)}openNode(n){if(!Ce(n))return;let t=Fn(n.scope,{prefix:this.classPrefix});this.span(t)}closeNode(n){Ce(n)&&(this.buffer+=$n)}value(){return this.buffer}span(n){this.buffer+='<span class="'.concat(n,'">')}},ve=(e={})=>{let n={children:[]};return Object.assign(n,e),n},Ae=class e{constructor(){this.rootNode=ve(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(n){this.top.children.push(n)}openNode(n){let t=ve({scope:n});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(n){return this.constructor._walk(n,this.rootNode)}static _walk(n,t){return typeof t=="string"?n.addText(t):t.children&&(n.openNode(t),t.children.forEach(s=>this._walk(n,s)),n.closeNode(t)),n}static _collapse(n){typeof n!="string"&&n.children&&(n.children.every(t=>typeof t=="string")?n.children=[n.children.join("")]:n.children.forEach(t=>{e._collapse(t)}))}},Te=class extends Ae{constructor(n){super(),this.options=n}addText(n){n!==""&&this.add(n)}startScope(n){this.openNode(n)}endScope(){this.closeNode()}__addSublanguage(n,t){let s=n.root;t&&(s.scope="language:".concat(t)),this.add(s)}toHTML(){return new Ne(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function re(e){return e?typeof e=="string"?e:e.source:null}function $e(e){return se("(?=",e,")")}function Hn(e){return se("(?:",e,")*")}function zn(e){return se("(?:",e,")?")}function se(...e){return e.map(t=>re(t)).join("")}function Gn(e){let n=e[e.length-1];return typeof n=="object"&&n.constructor===Object?(e.splice(e.length-1,1),n):{}}function Ee(...e){return"("+(Gn(e).capture?"":"?:")+e.map(s=>re(s)).join("|")+")"}function Fe(e){return new RegExp(e.toString()+"|").exec("").length-1}function Kn(e,n){let t=e&&e.exec(n);return t&&t.index===0}var Zn=new RegExp(Ee(/\[(?:[^\\\]]|\\.)*\]/,/\(\?<(?![=!])[^>]+>/,/\(\?'[^']+'/,/\(\??/,/\\([1-9][0-9]*)/,/\\./));function Re(e,{joinWith:n}){let t=0;return e.map(s=>{t+=1;let u=t,b=re(s),r="";for(;b.length>0;){let a=Zn.exec(b);if(!a){r+=b;break}r+=b.substring(0,a.index),b=b.substring(a.index+a[0].length),a[0][0]==="\\"&&a[1]?r+="\\"+String(Number(a[1])+u):(r+=a[0],(a[0]==="("||/^\(\?[<']/.test(a[0]))&&t++)}return r}).map(s=>"(".concat(s,")")).join(n)}var Wn=/\b\B/,He="[a-zA-Z]\\w*",Oe="[a-zA-Z_]\\w*",ze="\\b\\d+(\\.\\d+)?",Ge="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Ke="\\b(0b[01]+)",Xn="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Yn=(e={})=>{let n=/^#![ ]*\//;return e.binary&&(e.begin=se(n,/.*\b/,e.binary,/\b.*/)),ee({scope:"meta",begin:n,end:/$/,relevance:0,"on:begin":(t,s)=>{t.index!==0&&s.ignoreMatch()}},e)},ce={begin:"\\\\[\\s\\S]",relevance:0},qn={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[ce]},Qn={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[ce]},Jn={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/},be=function(e,n,t={}){let s=ee({scope:"comment",begin:e,end:n,contains:[]},t);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});let u=Ee("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:se(/[ ]+/,"(",u,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s},Vn=be("//","$"),jn=be("/\\*","\\*/"),et=be("#","$"),nt={scope:"number",begin:ze,relevance:0},tt={scope:"number",begin:Ge,relevance:0},st={scope:"number",begin:Ke,relevance:0},at={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[ce,{begin:/\[/,end:/\]/,relevance:0,contains:[ce]}]},it={scope:"title",begin:He,relevance:0},rt={scope:"title",begin:Oe,relevance:0},ct={begin:"\\.\\s*"+Oe,relevance:0},ot=function(e){return Object.assign(e,{"on:begin":(n,t)=>{t.data._beginMatch=n[1]},"on:end":(n,t)=>{t.data._beginMatch!==n[1]&&t.ignoreMatch()}})},ue=Object.freeze({__proto__:null,APOS_STRING_MODE:qn,BACKSLASH_ESCAPE:ce,BINARY_NUMBER_MODE:st,BINARY_NUMBER_RE:Ke,COMMENT:be,C_BLOCK_COMMENT_MODE:jn,C_LINE_COMMENT_MODE:Vn,C_NUMBER_MODE:tt,C_NUMBER_RE:Ge,END_SAME_AS_BEGIN:ot,HASH_COMMENT_MODE:et,IDENT_RE:He,MATCH_NOTHING_RE:Wn,METHOD_GUARD:ct,NUMBER_MODE:nt,NUMBER_RE:ze,PHRASAL_WORDS_MODE:Jn,QUOTE_STRING_MODE:Qn,REGEXP_MODE:at,RE_STARTERS_RE:Xn,SHEBANG:Yn,TITLE_MODE:it,UNDERSCORE_IDENT_RE:Oe,UNDERSCORE_TITLE_MODE:rt});function lt(e,n){e.input[e.index-1]==="."&&n.ignoreMatch()}function ut(e,n){e.className!==void 0&&(e.scope=e.className,delete e.className)}function gt(e,n){n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=lt,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function dt(e,n){Array.isArray(e.illegal)&&(e.illegal=Ee(...e.illegal))}function Et(e,n){if(e.match){if(e.begin||e.end)throw new Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function bt(e,n){e.relevance===void 0&&(e.relevance=1)}var _t=(e,n)=>{if(!e.beforeMatch)return;if(e.starts)throw new Error("beforeMatch cannot be used with starts");let t=Object.assign({},e);Object.keys(e).forEach(s=>{delete e[s]}),e.keywords=t.keywords,e.begin=se(t.beforeMatch,$e(t.begin)),e.starts={relevance:0,contains:[Object.assign(t,{endsParent:!0})]},e.relevance=0,delete t.beforeMatch},ft=["of","and","for","in","not","or","if","then","parent","list","value"],pt="keyword";function Ze(e,n,t=pt){let s=Object.create(null);return typeof e=="string"?u(t,e.split(" ")):Array.isArray(e)?u(t,e):Object.keys(e).forEach(function(b){Object.assign(s,Ze(e[b],n,b))}),s;function u(b,r){n&&(r=r.map(a=>a.toLowerCase())),r.forEach(function(a){let c=a.split("|");s[c[0]]=[b,ht(c[0],c[1])]})}}function ht(e,n){return n?Number(n):St(e)?0:1}function St(e){return ft.includes(e.toLowerCase())}var Le={},te=e=>{console.error(e)},De=(e,...n)=>{console.log("WARN: ".concat(e),...n)},ae=(e,n)=>{Le["".concat(e,"/").concat(n)]||(console.log("Deprecated as of ".concat(e,". ").concat(n)),Le["".concat(e,"/").concat(n)]=!0)},de=new Error;function We(e,n,{key:t}){let s=0,u=e[t],b={},r={};for(let a=1;a<=n.length;a++)r[a+s]=u[a],b[a+s]=!0,s+=Fe(n[a-1]);e[t]=r,e[t]._emit=b,e[t]._multi=!0}function Nt(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw te("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),de;if(typeof e.beginScope!="object"||e.beginScope===null)throw te("beginScope must be object"),de;We(e,e.begin,{key:"beginScope"}),e.begin=Re(e.begin,{joinWith:""})}}function At(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw te("skip, excludeEnd, returnEnd not compatible with endScope: {}"),de;if(typeof e.endScope!="object"||e.endScope===null)throw te("endScope must be object"),de;We(e,e.end,{key:"endScope"}),e.end=Re(e.end,{joinWith:""})}}function Tt(e){e.scope&&typeof e.scope=="object"&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function mt(e){Tt(e),typeof e.beginScope=="string"&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope=="string"&&(e.endScope={_wrap:e.endScope}),Nt(e),At(e)}function Rt(e){function n(r,a){return new RegExp(re(r),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(a?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(a,c){c.position=this.position++,this.matchIndexes[this.matchAt]=c,this.regexes.push([c,a]),this.matchAt+=Fe(a)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let a=this.regexes.map(c=>c[1]);this.matcherRe=n(Re(a,{joinWith:"|"}),!0),this.lastIndex=0}exec(a){this.matcherRe.lastIndex=this.lastIndex;let c=this.matcherRe.exec(a);if(!c)return null;let E=c.findIndex((m,S)=>S>0&&m!==void 0),_=this.matchIndexes[E];return c.splice(0,E),Object.assign(c,_)}}class s{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(a){if(this.multiRegexes[a])return this.multiRegexes[a];let c=new t;return this.rules.slice(a).forEach(([E,_])=>c.addRule(E,_)),c.compile(),this.multiRegexes[a]=c,c}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(a,c){this.rules.push([a,c]),c.type==="begin"&&this.count++}exec(a){let c=this.getMatcher(this.regexIndex);c.lastIndex=this.lastIndex;let E=c.exec(a);if(this.resumingScanAtSamePosition()&&!(E&&E.index===this.lastIndex)){let _=this.getMatcher(0);_.lastIndex=this.lastIndex+1,E=_.exec(a)}return E&&(this.regexIndex+=E.position+1,this.regexIndex===this.count&&this.considerAll()),E}}function u(r){let a=new s;return r.contains.forEach(c=>a.addRule(c.begin,{rule:c,type:"begin"})),r.terminatorEnd&&a.addRule(r.terminatorEnd,{type:"end"}),r.illegal&&a.addRule(r.illegal,{type:"illegal"}),a}function b(r,a){let c=r;if(r.isCompiled)return c;[ut,Et,mt,_t].forEach(_=>_(r,a)),e.compilerExtensions.forEach(_=>_(r,a)),r.__beforeBegin=null,[gt,dt,bt].forEach(_=>_(r,a)),r.isCompiled=!0;let E=null;return typeof r.keywords=="object"&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords),E=r.keywords.$pattern,delete r.keywords.$pattern),E=E||/\w+/,r.keywords&&(r.keywords=Ze(r.keywords,e.case_insensitive)),c.keywordPatternRe=n(E,!0),a&&(r.begin||(r.begin=/\B|\b/),c.beginRe=n(c.begin),!r.end&&!r.endsWithParent&&(r.end=/\B|\b/),r.end&&(c.endRe=n(c.end)),c.terminatorEnd=re(c.end)||"",r.endsWithParent&&a.terminatorEnd&&(c.terminatorEnd+=(r.end?"|":"")+a.terminatorEnd)),r.illegal&&(c.illegalRe=n(r.illegal)),r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map(function(_){return Ot(_==="self"?r:_)})),r.contains.forEach(function(_){b(_,c)}),r.starts&&b(r.starts,a),c.matcher=u(c),c}if(e.compilerExtensions||(e.compilerExtensions=[]),e.contains&&e.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=ee(e.classNameAliases||{}),b(e)}function Xe(e){return e?e.endsWithParent||Xe(e.starts):!1}function Ot(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(n){return ee(e,{variants:null},n)})),e.cachedVariants?e.cachedVariants:Xe(e)?ee(e,{starts:e.starts?ee(e.starts):null}):Object.isFrozen(e)?ee(e):e}var yt="11.12.0",me=class extends Error{constructor(n,t){super(n),this.name="HTMLInjectionError",this.html=t}},Se=Ue,ke=ee,Be=Symbol("nomatch"),Mt=7,Ye=function(e){let n=Object.create(null),t=Object.create(null),s=[],u=!0,b="Could not find the language '{}', did you forget to load/include a language module?",r={disableAutodetect:!0,name:"Plain text",contains:[]},a={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:Te};function c(i){return a.noHighlightRe.test(i)}function E(i){let g=i.className+" ";g+=i.parentNode?i.parentNode.className:"";let l=a.languageDetectRe.exec(g);if(l){let p=w(l[1]);return p||(De(b.replace("{}",l[1])),De("Falling back to no-highlight mode for this block.",i)),p?l[1]:"no-highlight"}return g.split(/\s+/).find(p=>c(p)||w(p))}function _(i,g,l){let p="",A="";typeof g=="object"?(p=i,l=g.ignoreIllegals,A=g.language):(ae("10.7.0","highlight(lang, code, ...args) has been deprecated."),ae("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),A=i,p=g),l===void 0&&(l=!0);let I={code:p,language:A};L("before:highlight",I);let P=I.result?I.result:m(I.language,I.code,l);return P.code=I.code,L("after:highlight",P),P}function m(i,g,l,p){let A=Object.create(null);function I(o,d){return o.keywords[d]}function P(){if(!f.keywords){k.addText(R);return}let o=0;f.keywordPatternRe.lastIndex=0;let d=f.keywordPatternRe.exec(R),h="";for(;d;){h+=R.substring(o,d.index);let T=Y.case_insensitive?d[0].toLowerCase():d[0],U=I(f,T);if(U){let[Q,Pn]=U;if(k.addText(h),h="",A[T]=(A[T]||0)+1,A[T]<=Mt&&(le+=Pn),Q.startsWith("_"))h+=d[0];else{let Un=Y.classNameAliases[Q]||Q;X(d[0],Un)}}else h+=d[0];o=f.keywordPatternRe.lastIndex,d=f.keywordPatternRe.exec(R)}h+=R.substring(o),k.addText(h)}function W(){if(R==="")return;let o=null;if(typeof f.subLanguage=="string"){if(!n[f.subLanguage]){k.addText(R);return}o=m(f.subLanguage,R,!0,xe[f.subLanguage]),xe[f.subLanguage]=o._top}else o=y(R,f.subLanguage.length?f.subLanguage:null);f.relevance>0&&(le+=o.relevance),k.__addSublanguage(o._emitter,o.language)}function H(){f.subLanguage!=null?W():P(),R=""}function X(o,d){o!==""&&(k.startScope(d),k.addText(o),k.endScope())}function ye(o,d){let h=1,T=d.length-1;for(;h<=T;){if(!o._emit[h]){h++;continue}let U=Y.classNameAliases[o[h]]||o[h],Q=d[h];U?X(Q,U):(R=Q,P(),R=""),h++}}function Me(o,d){return o.scope&&typeof o.scope=="string"&&k.openNode(Y.classNameAliases[o.scope]||o.scope),o.beginScope&&(o.beginScope._wrap?(X(R,Y.classNameAliases[o.beginScope._wrap]||o.beginScope._wrap),R=""):o.beginScope._multi&&(ye(o.beginScope,d),R="")),f=Object.create(o,{parent:{value:f}}),f}function Ie(o,d,h){let T=Kn(o.endRe,h);if(T){if(o["on:end"]){let U=new ge(o);o["on:end"](d,U),U.isMatchIgnored&&(T=!1)}if(T){for(;o.endsParent&&o.parent;)o=o.parent;return o}}if(o.endsWithParent)return Ie(o.parent,d,h)}function vn(o){return f.matcher.regexIndex===0?(R+=o[0],1):(he=!0,0)}function Ln(o){let d=o[0],h=o.rule,T=new ge(h),U=[h.__beforeBegin,h["on:begin"]];for(let Q of U)if(Q&&(Q(o,T),T.isMatchIgnored))return vn(d);return h.skip?R+=d:(h.excludeBegin&&(R+=d),H(),!h.returnBegin&&!h.excludeBegin&&(R=d)),Me(h,o),h.returnBegin?0:d.length}function Dn(o){let d=o[0],h=g.substring(o.index),T=Ie(f,o,h);if(!T)return Be;let U=f;f.endScope&&f.endScope._wrap?(H(),X(d,f.endScope._wrap)):f.endScope&&f.endScope._multi?(H(),ye(f.endScope,o)):U.skip?R+=d:(U.returnEnd||U.excludeEnd||(R+=d),H(),U.excludeEnd&&(R=d));do f.scope&&k.closeNode(),!f.skip&&!f.subLanguage&&(le+=f.relevance),f=f.parent;while(f!==T.parent);return T.starts&&Me(T.starts,o),U.returnEnd?0:d.length}function kn(){let o=[];for(let d=f;d!==Y;d=d.parent)d.scope&&o.unshift(d.scope);o.forEach(d=>k.openNode(d))}let oe={};function we(o,d){let h=d&&d[0];if(R+=o,h==null)return H(),0;if(oe.type==="begin"&&d.type==="end"&&oe.index===d.index&&h===""){if(R+=g.slice(d.index,d.index+1),!u){let T=new Error("0 width match regex (".concat(i,")"));throw T.languageName=i,T.badRule=oe.rule,T}return 1}if(oe=d,d.type==="begin")return Ln(d);if(d.type==="illegal"&&!l){let T=new Error('Illegal lexeme "'+h+'" for mode "'+(f.scope||"<unnamed>")+'"');throw T.mode=f,T}else if(d.type==="end"){let T=Dn(d);if(T!==Be)return T}if(d.type==="illegal"&&h==="")return d.index===g.length||(R+="\n"),1;if(pe>1e5&&pe>d.index*3)throw new Error("potential infinite loop, way more iterations than matches");return R+=h,h.length}let Y=w(i);if(!Y)throw te(b.replace("{}",i)),new Error('Unknown language: "'+i+'"');let Bn=Rt(Y),fe="",f=p||Bn,xe={},k=new a.__emitter(a);kn();let R="",le=0,ne=0,pe=0,he=!1;try{if(Y.__emitTokens)Y.__emitTokens(g,k);else{for(f.matcher.considerAll();;){pe++,he?he=!1:f.matcher.considerAll(),f.matcher.lastIndex=ne;let o=f.matcher.exec(g);if(!o)break;let d=g.substring(ne,o.index),h=we(d,o);ne=o.index+h}we(g.substring(ne))}return k.finalize(),fe=k.toHTML(),{language:i,value:fe,relevance:le,illegal:!1,_emitter:k,_top:f}}catch(o){if(o.message&&o.message.includes("Illegal"))return{language:i,value:Se(g),illegal:!0,relevance:0,_illegalBy:{message:o.message,index:ne,context:g.slice(ne-100,ne+100),mode:o.mode,resultSoFar:fe},_emitter:k};if(u)return{language:i,value:Se(g),illegal:!1,relevance:0,errorRaised:o,_emitter:k,_top:f};throw o}}function S(i){let g={value:Se(i),illegal:!1,relevance:0,_top:r,_emitter:new a.__emitter(a)};return g._emitter.addText(i),g}function y(i,g){g=g||a.languages||Object.keys(n);let l=S(i),p=g.filter(w).filter(K).map(H=>m(H,i,!1));p.unshift(l);let A=p.sort((H,X)=>{if(H.relevance!==X.relevance)return X.relevance-H.relevance;if(H.language&&X.language){if(w(H.language).supersetOf===X.language)return 1;if(w(X.language).supersetOf===H.language)return-1}return 0}),[I,P]=A,W=I;return W.secondBest=P,W}function O(i,g,l){let p=g&&t[g]||l;i.classList.add("hljs"),i.classList.add("language-".concat(p))}function N(i){let g=null,l=E(i);if(c(l))return;if(L("before:highlightElement",{el:i,language:l}),i.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",i);return}if(i.children.length>0&&(a.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(i)),a.throwUnescapedHTML))throw new me("One of your code blocks includes unescaped HTML.",i.innerHTML);g=i;let p=g.textContent,A=l?_(p,{language:l,ignoreIllegals:!0}):y(p);i.innerHTML=A.value,i.dataset.highlighted="yes",O(i,l,A.language),i.result={language:A.language,re:A.relevance,relevance:A.relevance},A.secondBest&&(i.secondBest={language:A.secondBest.language,relevance:A.secondBest.relevance}),L("after:highlightElement",{el:i,result:A,text:p})}function C(i){a=ke(a,i)}let $=()=>{v(),ae("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function x(){v(),ae("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let F=!1;function v(){function i(){v()}if(document.readyState==="loading"){F||window.addEventListener("DOMContentLoaded",i,!1),F=!0;return}document.querySelectorAll(a.cssSelector).forEach(N)}function B(i,g){let l=null;try{l=g(e)}catch(p){if(te("Language definition for '{}' could not be registered.".replace("{}",i)),u)te(p);else throw p;l=r}l.name||(l.name=i),n[i]=l,l.rawDefinition=g.bind(null,e),l.aliases&&Z(l.aliases,{languageName:i})}function M(i){delete n[i];for(let g of Object.keys(t))t[g]===i&&delete t[g]}function q(){return Object.keys(n)}function w(i){return i=(i||"").toLowerCase(),n[i]||n[t[i]]}function Z(i,{languageName:g}){typeof i=="string"&&(i=[i]),i.forEach(l=>{t[l.toLowerCase()]=g})}function K(i){let g=w(i);return g&&!g.disableAutodetect}function J(i){i["before:highlightBlock"]&&!i["before:highlightElement"]&&(i["before:highlightElement"]=g=>{i["before:highlightBlock"](Object.assign({block:g.el},g))}),i["after:highlightBlock"]&&!i["after:highlightElement"]&&(i["after:highlightElement"]=g=>{i["after:highlightBlock"](Object.assign({block:g.el},g))})}function V(i){J(i),s.push(i)}function j(i){let g=s.indexOf(i);g!==-1&&s.splice(g,1)}function L(i,g){let l=i;s.forEach(function(p){p[l]&&p[l](g)})}function D(i){return ae("10.7.0","highlightBlock will be removed entirely in v12.0"),ae("10.7.0","Please use highlightElement now."),N(i)}Object.assign(e,{highlight:_,highlightAuto:y,highlightAll:v,highlightElement:N,highlightBlock:D,configure:C,initHighlighting:$,initHighlightingOnLoad:x,registerLanguage:B,unregisterLanguage:M,listLanguages:q,getLanguage:w,registerAliases:Z,autoDetection:K,inherit:ke,addPlugin:V,removePlugin:j}),e.debugMode=function(){u=!1},e.safeMode=function(){u=!0},e.versionString=yt,e.regex={concat:se,lookahead:$e,either:Ee,optional:zn,anyNumberOfTimes:Hn};for(let i in ue)typeof ue[i]=="object"&&Pe(ue[i]);return Object.assign(e,ue),e},ie=Ye({});ie.newInstance=()=>Ye({});qe.exports=ie;ie.HighlightJS=ie;ie.default=ie});var Ve=z((qt,Je)=>{function It(e){let n=e.regex,t={},s={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},s]});let u={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},b=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),r={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},a={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,u]};u.contains.push(a);let c={match:/\\"/},E={className:"string",begin:/'/,end:/'/},_={match:/\\'/},m={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},S=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],y=e.SHEBANG({binary:"(".concat(S.join("|"),")"),relevance:10}),O={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},N=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],C=["true","false"],$={match:/(\/[a-z._-]+)+/},x=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],F=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],v=["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"],B=["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"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:N,literal:C,built_in:[...x,...F,"set","shopt",...v,...B]},contains:[y,e.SHEBANG(),O,m,b,r,$,a,c,E,_,t]}}Je.exports=It});var en=z((Qt,je)=>{function wt(e){let n=e.regex,t="HTTP/([32]|1\\.[01])",s=/[A-Za-z][A-Za-z0-9-]*/,u={className:"attribute",begin:n.concat("^",s,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},b=[u,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+t+" \\d{3})",end:/$/,contains:[{className:"meta",begin:t},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:b}},{begin:"(?=^[A-Z]+ (.*?) "+t+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:t},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:b}},e.inherit(u,{relevance:0})]}}je.exports=wt});var tn=z((Jt,nn)=>{function xt(e){let n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s=/[\p{L}0-9._:-]+/u,u={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},b={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},r=e.inherit(b,{begin:/\(/,end:/\)/}),a=e.inherit(e.APOS_STRING_MODE,{className:"string"}),c=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),E={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:s,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[u]},{begin:/'/,end:/'/,contains:[u]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,relevance:10,contains:[b,c,a,r,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,contains:[b,r,c,a]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},u,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[c]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[E],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:"css"}},{className:"tag",begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[E],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:"javascript"}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:n.concat(/</,n.lookahead(n.concat(t,n.either(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:E}]},{className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}nn.exports=xt});var an=z((Vt,sn)=>{function Ct(e){let n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,s=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),u=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),b=n.concat(/[A-Z]+/,t),r={scope:"variable",match:"\\$+"+s},a={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},c={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},E=e.inherit(e.APOS_STRING_MODE,{illegal:null}),_=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(c)}),m={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(c),"on:begin":(L,D)=>{D.data._beginMatch=L[1]||L[2]},"on:end":(L,D)=>{D.data._beginMatch!==L[1]&&D.ignoreMatch()}},S=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),y="[ \n]",O={scope:"string",variants:[_,E,m,S]},N={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},C=["false","null","true"],$=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],x=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],v={keyword:$,literal:(L=>{let D=[];return L.forEach(i=>{D.push(i),i.toLowerCase()===i?D.push(i.toUpperCase()):D.push(i.toLowerCase())}),D})(C),built_in:x},B=L=>L.map(D=>D.replace(/\|\d+$/,"")),M={variants:[{match:[/new/,n.concat(y,"+"),n.concat("(?!",B(x).join("\\b|"),"\\b)"),u],scope:{1:"keyword",4:"title.class"}}]},q=n.concat(s,"\\b(?!\\()"),w={variants:[{match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),q],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[u,n.concat(/::/,n.lookahead(/(?!class\b)/)),q],scope:{1:"title.class",3:"variable.constant"}},{match:[u,n.concat("::",n.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[u,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},Z={scope:"attr",match:n.concat(s,n.lookahead(":"),n.lookahead(/(?!::)/))},K={relevance:0,begin:/\(/,end:/\)/,keywords:v,contains:[Z,r,w,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,O,N,M]},J={relevance:0,match:[/\b/,n.concat("(?!fn\\b|function\\b|",B($).join("\\b|"),"|",B(x).join("\\b|"),"\\b)"),s,n.concat(y,"*"),n.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[K]};K.contains.push(J);let V=[Z,w,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,O,N,M],j={begin:n.concat(/#\[\s*\\?/,n.either(u,b)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:C,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:C,keyword:["new","array"]},contains:["self",...V]},...V,{scope:"meta",variants:[{match:u},{match:b}]}]};return{case_insensitive:!1,keywords:v,contains:[j,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},a,{scope:"variable.language",match:/\$this\b/},r,J,w,{match:[/const/,/\s/,s],scope:{1:"keyword",3:"variable.constant"}},M,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:v,contains:["self",j,r,w,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,O,N]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},O,N]}}sn.exports=Ct});var cn=z((jt,rn)=>{var vt="([-+]?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)|NaN|[-+]?Infinity",Lt={scope:"number",match:vt,relevance:0};function Dt(e){let n={className:"attr",begin:/(("(\\.|[^\\"\r\n])*")|('(\\.|[^\\'\r\n])*'))(?=\s*:)/,relevance:1.01},t={match:/[{}[\],:]/,className:"punctuation",relevance:0},s=["true","false","null"],u={scope:"literal",beginKeywords:s.join(" ")};return{name:"JSON",aliases:["jsonc","json5"],keywords:{literal:s},contains:[n,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,u,Lt,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}rn.exports=Dt});var En=z((es,dn)=>{var on="[A-Za-z$_][0-9A-Za-z$_]*",kt=["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"],Bt=["true","false","null","undefined","NaN","Infinity"],ln=["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"],un=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],gn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Pt=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","self","global"],Ut=[].concat(gn,ln,un);function $t(e){let n=e.regex,t=(l,{after:p})=>{let A="</"+l[0].slice(1);return l.input.indexOf(A,p)!==-1},s=on,u={begin:"<>",end:"</>"},b=/<[A-Za-z0-9\\._:-]+\s*\/>/,r={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(l,p)=>{let A=l[0].length+l.index,I=l.input[A];if(I==="<"||I===","){p.ignoreMatch();return}I===">"&&(t(l,{after:A})||p.ignoreMatch());let P,W=l.input.substring(A);if(P=W.match(/^\s*=/)){p.ignoreMatch();return}if((P=W.match(/^\s+extends\s+/))&&P.index===0){p.ignoreMatch();return}}},a={$pattern:on,keyword:kt,literal:Bt,built_in:Ut,"variable.language":Pt},c="[0-9](_?[0-9])*",E="\\.(".concat(c,")"),_="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:"(\\b(".concat(_,")((").concat(E,")|\\.)?|(").concat(E,"))")+"[eE][+-]?(".concat(c,")\\b")},{begin:"\\b(".concat(_,")\\b((").concat(E,")\\b|\\.)?|(").concat(E,")\\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},S={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},y={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"xml"}},O={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"css"}},N={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"graphql"}},C={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,S]},x={className:"comment",variants:[e.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:s+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},F=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,y,O,N,C,{match:/\$\d+/},m];S.contains=F.concat({begin:/\{/,end:/\}/,keywords:a,contains:["self"].concat(F)});let v=[].concat(x,S.contains),B=v.concat([{begin:/(\s*)\(/,end:/\)/,keywords:a,contains:["self"].concat(v)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:B},q={variants:[{match:[/class/,/\s+/,s,/\s+/,/extends/,/\s+/,n.concat(s,"(",n.concat(/\./,s),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,s],scope:{1:"keyword",3:"title.class"}}]},w={relevance:0,match:n.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:{_:[...ln,...un]}},Z={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},K={variants:[{match:[/function/,/\s+/,s,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},J={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function V(l){return n.concat("(?!",l.join("|"),")")}let j={match:n.concat(/\b/,V([...gn,"super","import","await"].map(l=>"".concat(l,"\\s*\\("))),s,n.lookahead(/\s*\(/)),className:"title.function",relevance:0},L={begin:n.concat(/\./,n.lookahead(n.concat(s,/(?![0-9A-Za-z$_(])/))),end:s,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},D={match:[/get|set/,/\s+/,s,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},i="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",g={match:[/const|var|let/,/\s+/,s,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(i)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:a,exports:{PARAMS_CONTAINS:B,CLASS_REFERENCE:w},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),Z,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,y,O,N,C,x,{match:/\$\d+/},m,w,{scope:"attr",match:s+n.lookahead(":"),relevance:0},g,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[x,e.REGEXP_MODE,{className:"function",begin:i,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:B}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:u.begin,end:u.end},{match:b},{begin:r.begin,"on:begin":r.isTrulyOpeningTag,end:r.end}],subLanguage:"xml",contains:[{begin:r.begin,end:r.end,skip:!0,contains:["self"]}]}]},K,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,e.inherit(e.TITLE_MODE,{begin:s,className:"title.function"})]},{match:/\.\.\./,relevance:0},L,{match:"\\$"+s,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},j,J,q,D,{match:/\$[(.]/}]}}dn.exports=$t});var _n=z((ns,bn)=>{function Ft(e){let n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),u=n.concat(s,/(::\w+)*/),r={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},a={className:"doctag",begin:"@[A-Za-z]+"},c={begin:"#<",end:">"},E=[e.COMMENT("#","$",{contains:[a]}),e.COMMENT("^=begin","^=end",{contains:[a],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],_={className:"subst",begin:/#\{/,end:/\}/,keywords:r},m={className:"string",contains:[e.BACKSLASH_ESCAPE,_],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?</,end:/>/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,_]})]}]},S="[1-9](_?[0-9])*|0",y="[0-9](_?[0-9])*",O={className:"number",relevance:0,variants:[{begin:"\\b(".concat(S,")(\\.(").concat(y,"))?([eE][+-]?(").concat(y,")|r)?i?\\b")},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},N={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:r}]},M=[m,{variants:[{match:[/class\s+/,u,/\s+<\s+/,u]},{match:[/\b(class|module)\s+/,u]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,u],scope:{2:"title.class"},keywords:r},{relevance:0,match:[u,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:s,scope:"title.class"},{match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[N]},{begin:"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[m,{begin:t}],relevance:0},O,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,_],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(c,E),relevance:0}].concat(c,E);_.contains=M,N.contains=M;let K=[{begin:/^\s*=>/,starts:{end:"$",contains:M}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:r,contains:M}}];return E.unshift(c),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(K).concat(E).concat(M)}}bn.exports=Ft});var pn=z((ts,fn)=>{function Ht(e){let b={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:b,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:/-?\b0[bB](_?[01])*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:b,illegal:/["']/}]}]}}fn.exports=Ht});var Sn=z((ss,hn)=>{function zt(e){let n=e.regex,t=/(r#)?/,s=n.concat(t,e.UNDERSCORE_IDENT_RE),u=n.concat(t,e.IDENT_RE),b={scope:"title.function.invoke",relevance:0,begin:n.concat(/\b/,/(?!(?:let|for|while|if|else|match)\b)/,u,n.lookahead(/\s*\(/))},r="([ui](8|16|32|64|128|size)|f(16|32|64|128))?",a=["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","raw","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],c=["true","false","Some","None","Ok","Err"],E=["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!"],_=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f16","f32","f64","f128","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:_,keyword:a,literal:c,built_in:E},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{scope:"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})/}]}]},{scope:"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:[/\bsafe/,/\s+/,/extern/],scope:{1:"keyword",3:"keyword"}},{begin:[/fn/,/\s+/,s],scope:{1:"keyword",3:"title.function"}},{scope:"meta",begin:"#!?\\[",end:"\\]",contains:[{scope:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{begin:[/let/,/\s+/,/(?:mut\s+)?/,s],scope:{1:"keyword",3:"keyword",4:"variable"}},{begin:[/for/,/\s+/,s,/\s+/,/in/],scope:{1:"keyword",3:"variable",5:"keyword"}},{begin:[/type/,/\s+/,s],scope:{1:"keyword",3:"title.class"}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,s],scope:{1:"keyword",3:"title.class"}},{begin:e.IDENT_RE+"::",keywords:{keyword:"Self",built_in:E,type:_}},{scope:"punctuation",begin:"->"},b]}}hn.exports=zt});var An=z((as,Nn)=>{function Gt(e){let n=e.regex,t=new RegExp("[\\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","lazy","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],a={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s,built_in:["__import__","abs","aiter","all","anext","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozendict","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","sentinel","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"]},c={className:"meta",begin:/^(>>>|\.\.\.) /},E={className:"subst",begin:/\{/,end:/\}/,keywords:a,illegal:/#/},_={begin:/\{\{/,relevance:0},m={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,c],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,c],relevance:10},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,c,_,E]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,c,_,E]},{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:/([fFtT][rR]|[rR][fFtT]|[fFtT])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,_,E]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,_,E]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},S="[0-9](_?[0-9])*",y="(\\b(".concat(S,"))?\\.(").concat(S,")|\\b(").concat(S,")\\."),O="\\b|".concat(s.join("|")),N={className:"number",relevance:0,variants:[{begin:"(\\b(".concat(S,")|(").concat(y,"))[eE][+-]?(").concat(S,")[jJ]?(?=").concat(O,")")},{begin:"(".concat(y,")[jJ]?")},{begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=".concat(O,")")},{begin:"\\b0[bB](_?[01])+[lL]?(?=".concat(O,")")},{begin:"\\b0[oO](_?[0-7])+[lL]?(?=".concat(O,")")},{begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=".concat(O,")")},{begin:"\\b(".concat(S,")[jJ](?=").concat(O,")")}]},C={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:a,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},$={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:["self",c,N,m,e.HASH_COMMENT_MODE]}]};return E.contains=[m,N,c],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:a,illegal:/(<\/|\?)|=>/,contains:[c,N,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},m,C,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[$]},{variants:[{match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[N,$,m]}]}}Nn.exports=Gt});var xn=z((is,wn)=>{var _e="[A-Za-z$_][0-9A-Za-z$_]*",Tn=["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"],mn=["true","false","null","undefined","NaN","Infinity"],Rn=["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"],On=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],yn=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Mn=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","self","global"],In=[].concat(yn,Rn,On);function Kt(e){let n=e.regex,t=(l,{after:p})=>{let A="</"+l[0].slice(1);return l.input.indexOf(A,p)!==-1},s=_e,u={begin:"<>",end:"</>"},b=/<[A-Za-z0-9\\._:-]+\s*\/>/,r={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(l,p)=>{let A=l[0].length+l.index,I=l.input[A];if(I==="<"||I===","){p.ignoreMatch();return}I===">"&&(t(l,{after:A})||p.ignoreMatch());let P,W=l.input.substring(A);if(P=W.match(/^\s*=/)){p.ignoreMatch();return}if((P=W.match(/^\s+extends\s+/))&&P.index===0){p.ignoreMatch();return}}},a={$pattern:_e,keyword:Tn,literal:mn,built_in:In,"variable.language":Mn},c="[0-9](_?[0-9])*",E="\\.(".concat(c,")"),_="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",m={className:"number",variants:[{begin:"(\\b(".concat(_,")((").concat(E,")|\\.)?|(").concat(E,"))")+"[eE][+-]?(".concat(c,")\\b")},{begin:"\\b(".concat(_,")\\b((").concat(E,")\\b|\\.)?|(").concat(E,")\\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},S={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},y={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"xml"}},O={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"css"}},N={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,S],subLanguage:"graphql"}},C={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,S]},x={className:"comment",variants:[e.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:s+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},F=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,y,O,N,C,{match:/\$\d+/},m];S.contains=F.concat({begin:/\{/,end:/\}/,keywords:a,contains:["self"].concat(F)});let v=[].concat(x,S.contains),B=v.concat([{begin:/(\s*)\(/,end:/\)/,keywords:a,contains:["self"].concat(v)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:B},q={variants:[{match:[/class/,/\s+/,s,/\s+/,/extends/,/\s+/,n.concat(s,"(",n.concat(/\./,s),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,s],scope:{1:"keyword",3:"title.class"}}]},w={relevance:0,match:n.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:{_:[...Rn,...On]}},Z={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},K={variants:[{match:[/function/,/\s+/,s,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},J={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function V(l){return n.concat("(?!",l.join("|"),")")}let j={match:n.concat(/\b/,V([...yn,"super","import","await"].map(l=>"".concat(l,"\\s*\\("))),s,n.lookahead(/\s*\(/)),className:"title.function",relevance:0},L={begin:n.concat(/\./,n.lookahead(n.concat(s,/(?![0-9A-Za-z$_(])/))),end:s,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},D={match:[/get|set/,/\s+/,s,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},i="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",g={match:[/const|var|let/,/\s+/,s,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(i)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:a,exports:{PARAMS_CONTAINS:B,CLASS_REFERENCE:w},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),Z,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,y,O,N,C,x,{match:/\$\d+/},m,w,{scope:"attr",match:s+n.lookahead(":"),relevance:0},g,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[x,e.REGEXP_MODE,{className:"function",begin:i,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:B}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:u.begin,end:u.end},{match:b},{begin:r.begin,"on:begin":r.isTrulyOpeningTag,end:r.end}],subLanguage:"xml",contains:[{begin:r.begin,end:r.end,skip:!0,contains:["self"]}]}]},K,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,e.inherit(e.TITLE_MODE,{begin:s,className:"title.function"})]},{match:/\.\.\./,relevance:0},L,{match:"\\$"+s,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},j,J,q,D,{match:/\$[(.]/}]}}function Zt(e){let n=e.regex,t=Kt(e),s=_e,u=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],b={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},r={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:u},contains:[t.exports.CLASS_REFERENCE]},a={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},c=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],E={$pattern:_e,keyword:Tn.concat(c),literal:mn,built_in:In.concat(u),"variable.language":Mn},_={className:"meta",begin:"@"+s},m=(N,C,$)=>{let x=N.contains.findIndex(F=>F.label===C);if(x===-1)throw new Error("can not find mode to replace");N.contains.splice(x,1,$)};Object.assign(t.keywords,E),t.exports.PARAMS_CONTAINS.push(_);let S=t.contains.find(N=>N.scope==="attr"),y=Object.assign({},S,{match:n.concat(s,n.lookahead(/\s*\?:/))});t.exports.PARAMS_CONTAINS.push([t.exports.CLASS_REFERENCE,S,y]),t.contains=t.contains.concat([_,b,r,y]),m(t,"shebang",e.SHEBANG()),m(t,"use_strict",a);let O=t.contains.find(N=>N.label==="func.def");return O.relevance=0,Object.assign(t,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),t}wn.exports=Zt});var Wt=z((rs,Cn)=>{var G=Qe();G.registerLanguage("bash",Ve());G.registerLanguage("http",en());G.registerLanguage("xml",tn());G.registerLanguage("php",an());G.registerLanguage("json",cn());G.registerLanguage("javascript",En());G.registerLanguage("ruby",_n());G.registerLanguage("go",pn());G.registerLanguage("rust",Sn());G.registerLanguage("python",An());G.registerLanguage("typescript",xn());Cn.exports=G});return Wt();})();
@@ -1,9 +1,19 @@
1
1
  importScripts('highlight.pack.js');
2
2
 
3
- onmessage = function (e) {
4
- if (e.data.language)
5
- postMessage(hljs.highlight(e.data.language, e.data.code).value);
6
-
7
- else
8
- postMessage(hljs.highlightAuto(e.data.code).value);
3
+ function plainText(source) {
4
+ return source.replace(/[&<>"']/g, function (value) {
5
+ return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[value];
6
+ });
9
7
  }
8
+
9
+ onmessage = function (e) {
10
+ var source = String(e.data.code || '');
11
+ var language = e.data.language;
12
+ try {
13
+ postMessage(language && hljs.getLanguage(language)
14
+ ? hljs.highlight(source, { language: language, ignoreIllegals: true }).value
15
+ : plainText(source));
16
+ } catch (error) {
17
+ postMessage(plainText(source));
18
+ }
19
+ };
@@ -19,13 +19,21 @@ $(document).ready(function () {
19
19
 
20
20
  worker.onmessage = function (e) {
21
21
  currentElement.innerHTML = e.data;
22
+ currentElement.classList.add('hljs');
22
23
  highlightNext();
23
24
  };
25
+ worker.onerror = function () {
26
+ worker.terminate();
27
+ // The server's escaped source remains readable if the worker fails.
28
+ };
24
29
 
25
30
  highlightNext();
26
31
 
27
32
  } else {
28
- hljs.initHighlighting();
33
+ document.querySelectorAll('pre code').forEach(function (element) {
34
+ if (hljs.getLanguage(element.classList.item(0)))
35
+ hljs.highlightElement(element);
36
+ });
29
37
  }
30
38
  });
31
39
 
@@ -3,7 +3,9 @@
3
3
  this.opts = opts;
4
4
 
5
5
  var ul = this.createElement(document.createElement('UL'));
6
+ ul.setAttribute('role', 'tablist');
6
7
  var tabNum = opts.tabs.children.length;
8
+ if (!tabNum) return;
7
9
 
8
10
  for (var i = 0; i < tabNum; i++) {
9
11
  var tab = opts.tabs.children[i];
@@ -50,6 +52,11 @@
50
52
  var a_text = document.createTextNode(this.getTitle(tab));
51
53
 
52
54
  a.href = '#' + tab.id;
55
+ a.id = 'tab-button-' + tab.id;
56
+ a.setAttribute('role', 'tab');
57
+ a.setAttribute('aria-controls', tab.id);
58
+ tab.setAttribute('role', 'tabpanel');
59
+ tab.setAttribute('aria-labelledby', a.id);
53
60
 
54
61
  var that = this;
55
62
 
@@ -59,6 +66,18 @@
59
66
  if (history.pushState)
60
67
  e.preventDefault();
61
68
  });
69
+ a.addEventListener('keydown', function (e) {
70
+ var links = Array.prototype.slice.call(that.opts.tabBar.querySelectorAll('[role="tab"]'));
71
+ var index = links.indexOf(a);
72
+ if (e.key === 'ArrowRight') index = (index + 1) % links.length;
73
+ else if (e.key === 'ArrowLeft') index = (index + links.length - 1) % links.length;
74
+ else if (e.key === 'Home') index = 0;
75
+ else if (e.key === 'End') index = links.length - 1;
76
+ else return;
77
+ e.preventDefault();
78
+ links[index].focus();
79
+ that.switchTab(that.opts.tabs.children[index]);
80
+ });
62
81
 
63
82
  a.appendChild(a_text);
64
83
  li.appendChild(a);
@@ -80,7 +99,7 @@
80
99
 
81
100
  if (typeof s === 'string' || s instanceof String) {
82
101
  var el = tab.querySelector(s);
83
- var ret = el.innerHTML;
102
+ var ret = el.textContent;
84
103
 
85
104
  if (this.opts.removeHeading === undefined || this.opts.removeHeading)
86
105
  el.parentElement.removeChild(el);
@@ -167,7 +186,7 @@
167
186
  this.activate([targetTab, targetTab.tabAnchor]);
168
187
 
169
188
  // afterChange
170
- if (this.opts.beforeChange !== undefined)
189
+ if (this.opts.afterChange !== undefined)
171
190
  this.opts.afterChange(targetTab, activeTab);
172
191
  };
173
192
 
@@ -177,6 +196,13 @@
177
196
  for (var i = 0; i < len; i++) {
178
197
  elems[i].classList.remove(this.opts.hiddenClass);
179
198
  elems[i].classList.add(this.opts.activeClass);
199
+ var link = elems[i].querySelector('[role="tab"]');
200
+ if (link) {
201
+ link.setAttribute('aria-selected', 'true');
202
+ link.setAttribute('tabindex', '0');
203
+ } else if (elems[i].getAttribute('role') === 'tabpanel') {
204
+ elems[i].setAttribute('aria-hidden', 'false');
205
+ }
180
206
  }
181
207
  };
182
208
 
@@ -185,7 +211,15 @@
185
211
 
186
212
  for (var i = 0; i < len; i++) {
187
213
  elems[i].classList.remove(this.opts.activeClass);
188
- elems[i].classList.add(this.opts.hiddenClass);
214
+ if (elems[i].getAttribute('role') === 'tabpanel')
215
+ elems[i].classList.add(this.opts.hiddenClass);
216
+ var link = elems[i].querySelector('[role="tab"]');
217
+ if (link) {
218
+ link.setAttribute('aria-selected', 'false');
219
+ link.setAttribute('tabindex', '-1');
220
+ } else if (elems[i].getAttribute('role') === 'tabpanel') {
221
+ elems[i].setAttribute('aria-hidden', 'true');
222
+ }
189
223
  }
190
224
  };
191
225