From 7ff8f07f096834cdd9908f15042098a3c5985337 Mon Sep 17 00:00:00 2001 From: <> Date: Mon, 20 Nov 2023 22:12:17 +0000 Subject: [PATCH] Deployed ebc8d21 with MkDocs version: 1.5.3 --- 404.html | 6 +-- about/glossary/components/index.html | 6 +-- about/glossary/terms/index.html | 6 +-- about/what-is-it/index.html | 6 +-- about/why-use-ovos/index.html | 6 +-- ...a5ca32a6.min.js => bundle.6981e6db.min.js} | 2 +- assets/stylesheets/main.0ab26e37.min.css | 1 + assets/stylesheets/main.382dd0b9.min.css | 1 - getting-started/docker/cli/index.html | 6 +-- getting-started/docker/composition/index.html | 6 +-- getting-started/docker/debug/index.html | 6 +-- getting-started/docker/images/index.html | 6 +-- getting-started/docker/index.html | 6 +-- .../docker/installation/basic/index.html | 6 +-- .../installation/configuration/index.html | 6 +-- .../docker/installation/gui/index.html | 6 +-- .../installation/requirements/index.html | 14 ++--- .../docker/installation/skills/index.html | 10 ++-- .../docker/plugins/microphone/index.html | 6 +-- .../docker/plugins/phal/index.html | 6 +-- getting-started/docker/plugins/stt/index.html | 6 +-- getting-started/docker/plugins/tts/index.html | 6 +-- .../docker/prerequisites/cpu/index.html | 6 +-- .../docker/prerequisites/engine/index.html | 6 +-- .../docker/prerequisites/sound/index.html | 6 +-- .../docker/security/hardening/index.html | 6 +-- .../docker/security/hivemind/index.html | 6 +-- getting-started/docker/update/index.html | 6 +-- index.html | 6 +-- search/search_index.json | 2 +- sitemap.xml | 50 +++++++++--------- sitemap.xml.gz | Bin 434 -> 433 bytes 32 files changed, 112 insertions(+), 112 deletions(-) rename assets/javascripts/{bundle.a5ca32a6.min.js => bundle.6981e6db.min.js} (53%) create mode 100644 assets/stylesheets/main.0ab26e37.min.css delete mode 100644 assets/stylesheets/main.382dd0b9.min.css diff --git a/404.html b/404.html index 8ba100e..9a8cfb9 100644 --- a/404.html +++ b/404.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -1679,7 +1679,7 @@

Cookie consent

- + diff --git a/about/glossary/components/index.html b/about/glossary/components/index.html index 218a2f2..05c6fd9 100644 --- a/about/glossary/components/index.html +++ b/about/glossary/components/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2342,7 +2342,7 @@

Cookie consent

- + diff --git a/about/glossary/terms/index.html b/about/glossary/terms/index.html index beb2586..8fbdfb8 100644 --- a/about/glossary/terms/index.html +++ b/about/glossary/terms/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2259,7 +2259,7 @@

Cookie consent

- + diff --git a/about/what-is-it/index.html b/about/what-is-it/index.html index ece51be..3e69d5f 100644 --- a/about/what-is-it/index.html +++ b/about/what-is-it/index.html @@ -23,7 +23,7 @@ - + @@ -31,7 +31,7 @@ - + @@ -1858,7 +1858,7 @@

Cookie consent

- + diff --git a/about/why-use-ovos/index.html b/about/why-use-ovos/index.html index f14dcb0..c99e932 100644 --- a/about/why-use-ovos/index.html +++ b/about/why-use-ovos/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2043,7 +2043,7 @@

Cookie consent

- + diff --git a/assets/javascripts/bundle.a5ca32a6.min.js b/assets/javascripts/bundle.6981e6db.min.js similarity index 53% rename from assets/javascripts/bundle.a5ca32a6.min.js rename to assets/javascripts/bundle.6981e6db.min.js index f01811f..a806e52 100644 --- a/assets/javascripts/bundle.a5ca32a6.min.js +++ b/assets/javascripts/bundle.6981e6db.min.js @@ -1,3 +1,3 @@ "use strict";(()=>{var Hi=Object.create;var Or=Object.defineProperty;var $i=Object.getOwnPropertyDescriptor;var Ri=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Pi=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty,po=Object.prototype.propertyIsEnumerable;var co=(e,t,r)=>t in e?Or(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,j=(e,t)=>{for(var r in t||(t={}))Mr.call(t,r)&&co(e,r,t[r]);if(Dt)for(var r of Dt(t))po.call(t,r)&&co(e,r,t[r]);return e};var lo=(e,t)=>{var r={};for(var o in e)Mr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&po.call(e,o)&&(r[o]=e[o]);return r};var Lr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ii=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ri(t))!Mr.call(e,n)&&n!==r&&Or(e,n,{get:()=>t[n],enumerable:!(o=$i(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Hi(Pi(e)):{},Ii(t||!e||!e.__esModule?Or(r,"default",{value:e,enumerable:!0}):r,e));var fo=Lr((_r,mo)=>{(function(e,t){typeof _r=="object"&&typeof mo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(_r,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var et=C.type,H=C.tagName;return!!(H==="INPUT"&&a[et]&&!C.readOnly||H==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(s(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function h(C){s(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){s(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),U())}function U(){document.addEventListener("mousemove",X),document.addEventListener("mousedown",X),document.addEventListener("mouseup",X),document.addEventListener("pointermove",X),document.addEventListener("pointerdown",X),document.addEventListener("pointerup",X),document.addEventListener("touchmove",X),document.addEventListener("touchstart",X),document.addEventListener("touchend",X)}function Y(){document.removeEventListener("mousemove",X),document.removeEventListener("mousedown",X),document.removeEventListener("mouseup",X),document.removeEventListener("pointermove",X),document.removeEventListener("pointerdown",X),document.removeEventListener("pointerup",X),document.removeEventListener("touchmove",X),document.removeEventListener("touchstart",X),document.removeEventListener("touchend",X)}function X(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,Y())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),U(),r.addEventListener("focus",h,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var eo=Lr((It,Zr)=>{(function(t,r){typeof It=="object"&&typeof Zr=="object"?Zr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return ki}});var a=i(279),s=i.n(a),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(_){return!1}}var h=function(_){var L=f()(_);return u("cut"),L},v=h;function b(q){var _=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[_?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(F,"px"),L.setAttribute("readonly",""),L.value=q,L}var U=function(_,L){var F=b(_);L.container.appendChild(F);var V=f()(F);return u("copy"),F.remove(),V},Y=function(_){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof _=="string"?F=U(_,L):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?F=U(_.value,L):(F=f()(_),u("copy")),F},X=Y;function C(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(L){return typeof L}:C=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},C(q)}var et=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=_.action,F=L===void 0?"copy":L,V=_.container,G=_.target,Ie=_.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&C(G)==="object"&&G.nodeType===1){if(F==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Ie)return X(Ie,{container:V});if(G)return F==="cut"?v(G):X(G,{container:V})},H=et;function B(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?B=function(L){return typeof L}:B=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},B(q)}function ce(q,_){if(!(q instanceof _))throw new TypeError("Cannot call a class as a function")}function ue(q,_){for(var L=0;L<_.length;L++){var F=_[L];F.enumerable=F.enumerable||!1,F.configurable=!0,"value"in F&&(F.writable=!0),Object.defineProperty(q,F.key,F)}}function we(q,_,L){return _&&ue(q.prototype,_),L&&ue(q,L),q}function Ye(q,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");q.prototype=Object.create(_&&_.prototype,{constructor:{value:q,writable:!0,configurable:!0}}),_&&Tr(q,_)}function Tr(q,_){return Tr=Object.setPrototypeOf||function(F,V){return F.__proto__=V,F},Tr(q,_)}function Mi(q){var _=Ai();return function(){var F=Nt(q),V;if(_){var G=Nt(this).constructor;V=Reflect.construct(F,arguments,G)}else V=F.apply(this,arguments);return Li(this,V)}}function Li(q,_){return _&&(B(_)==="object"||typeof _=="function")?_:_i(q)}function _i(q){if(q===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return q}function Ai(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(q){return!1}}function Nt(q){return Nt=Object.setPrototypeOf?Object.getPrototypeOf:function(L){return L.__proto__||Object.getPrototypeOf(L)},Nt(q)}function Sr(q,_){var L="data-clipboard-".concat(q);if(_.hasAttribute(L))return _.getAttribute(L)}var Ci=function(q){Ye(L,q);var _=Mi(L);function L(F,V){var G;return ce(this,L),G=_.call(this),G.resolveOptions(V),G.listenClick(F),G}return we(L,[{key:"resolveOptions",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=B(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var G=this;this.listener=p()(V,"click",function(Ie){return G.onClick(Ie)})}},{key:"onClick",value:function(V){var G=V.delegateTarget||V.currentTarget,Ie=this.action(G)||"copy",Ut=H({action:Ie,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Ut?"success":"error",{action:Ie,text:Ut,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return Sr("action",V)}},{key:"defaultTarget",value:function(V){var G=Sr("target",V);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(V){return Sr("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return X(V,G)}},{key:"cut",value:function(V){return v(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof V=="string"?[V]:V,Ie=!!document.queryCommandSupported;return G.forEach(function(Ut){Ie=Ie&&!!document.queryCommandSupported(Ut)}),Ie}}]),L}(s()),ki=Ci},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,h,v){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return s(b,f,u,h,v)}))}function p(l,f,u,h){return function(v){v.delegateTarget=a(v.target,f),v.delegateTarget&&h.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function c(u,h,v){if(!u&&!h&&!v)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(v))throw new TypeError("Third argument must be a Function");if(a.node(u))return p(u,h,v);if(a.nodeList(u))return l(u,h,v);if(a.string(u))return f(u,h,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,h,v){return u.addEventListener(h,v),{destroy:function(){u.removeEventListener(h,v)}}}function l(u,h,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(h,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(h,v)})}}}function f(u,h,v){return s(document.body,u,h,v)}o.exports=c},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),a=c.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function p(){c.off(i,p),a.apply(s,arguments)}return p._=a,this.on(i,p,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=s.length;for(c;c{"use strict";var za=/["'&<>]/;Xn.exports=qa;function qa(e){var t=""+e,r=za.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function Q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{c(o[u](h))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof ct?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function bo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Te=="function"?Te(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,c){a=e[i](a),n(s,c,a.done,a.value)})}}function n(i,a,s,c){Promise.resolve(c).then(function(p){i({value:p,done:s})},a)}}function k(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var qt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: `+r.map(function(o,n){return n+1+") "+o.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Be(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var De=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=Te(a),c=s.next();!c.done;c=s.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof qt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Te(f),h=u.next();!h.done;h=u.next()){var v=h.value;try{vo(v)}catch(b){i=i!=null?i:[],b instanceof qt?i=Q(Q([],K(i)),K(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new qt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)vo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Be(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Be(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Cr=De.EMPTY;function Kt(e){return e instanceof De||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function vo(e){k(e)?e():e.unsubscribe()}var Fe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Cr:(this.currentObservers=null,s.push(r),new De(function(){o.currentObservers=null,Be(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new D;return r.source=this,r},t.create=function(r,o){return new Oo(r,o)},t}(D);var Oo=function(e){me(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Cr},t}(w);var _t={now:function(){return(_t.delegate||Date).now()},delegate:void 0};var At=function(e){me(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=_t);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Bt);var _o=function(e){me(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Gt);var Se=new _o(Lo);var M=new D(function(e){return e.complete()});function Jt(e){return e&&k(e.schedule)}function Fr(e){return e[e.length-1]}function tt(e){return k(Fr(e))?e.pop():void 0}function Re(e){return Jt(Fr(e))?e.pop():void 0}function Xt(e,t){return typeof Fr(e)=="number"?e.pop():t}var gt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Zt(e){return k(e==null?void 0:e.then)}function er(e){return k(e[bt])}function tr(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function rr(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function qi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var or=qi();function nr(e){return k(e==null?void 0:e[or])}function ir(e){return ho(this,arguments,function(){var r,o,n,i;return zt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,ct(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,ct(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ct(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function ar(e){return k(e==null?void 0:e.getReader)}function P(e){if(e instanceof D)return e;if(e!=null){if(er(e))return Ki(e);if(gt(e))return Qi(e);if(Zt(e))return Yi(e);if(tr(e))return Ao(e);if(nr(e))return Bi(e);if(ar(e))return Gi(e)}throw rr(e)}function Ki(e){return new D(function(t){var r=e[bt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Qi(e){return new D(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?y(function(n,i){return e(n,i,o)}):de,he(1),r?je(t):Ko(function(){return new cr}))}}function Vr(e){return e<=0?function(){return M}:g(function(t,r){var o=[];t.subscribe(x(r,function(n){o.push(n),e=2,!0))}function be(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new w}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(p){var l,f,u,h=0,v=!1,b=!1,U=function(){f==null||f.unsubscribe(),f=void 0},Y=function(){U(),l=u=void 0,v=b=!1},X=function(){var C=l;Y(),C==null||C.unsubscribe()};return g(function(C,et){h++,!b&&!v&&U();var H=u=u!=null?u:r();et.add(function(){h--,h===0&&!b&&!v&&(f=qr(X,c))}),H.subscribe(et),!l&&h>0&&(l=new lt({next:function(B){return H.next(B)},error:function(B){b=!0,U(),f=qr(Y,n,B),H.error(B)},complete:function(){v=!0,U(),f=qr(Y,a),H.complete()}}),P(C).subscribe(l))})(p)}}function qr(e,t){for(var r=[],o=2;oe.next(document)),e}function R(e,t=document){return Array.from(t.querySelectorAll(e))}function I(e,t=document){let r=le(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function le(e,t=document){return t.querySelector(e)||void 0}function Ue(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var da=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(Ee(1),z(void 0),m(()=>Ue()||document.body),ee(1));function Et(e){return da.pipe(m(t=>e.contains(t)),te())}function mr(e,t){return S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ee(t):de,z(!1))}function ze(e){return{x:e.offsetLeft,y:e.offsetTop}}function Jo(e){return S(d(window,"load"),d(window,"resize")).pipe(He(0,Se),m(()=>ze(e)),z(ze(e)))}function fr(e){return{x:e.scrollLeft,y:e.scrollTop}}function it(e){return S(d(e,"scroll"),d(window,"resize")).pipe(He(0,Se),m(()=>fr(e)),z(fr(e)))}function Xo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Xo(e,r)}function O(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Xo(o,n);return o}function ur(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=O("script",{src:e});return $(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(E(()=>jr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),he(1))))}var Zo=new w,ha=$(()=>typeof ResizeObserver=="undefined"?wt("https://openvoiceos.github.io/ovos-docker/assets/external/unpkg.com/resize-observer-polyfill/dist/ResizeObserver.js"):W(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Zo.next(t)})),E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function ve(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ce(e){return ha.pipe(T(t=>t.observe(e)),E(t=>Zo.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>ve(e)))),z(ve(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function dr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var en=new w,ba=$(()=>W(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function St(e){return ba.pipe(T(t=>t.observe(e)),E(t=>en.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return it(e).pipe(m(({y:r})=>{let o=ve(e),n=Tt(e);return r>=n.height-o.height-t}),te())}var hr={drawer:I("[data-md-toggle=drawer]"),search:I("[data-md-toggle=search]")};function rn(e){return hr[e].checked}function Ze(e,t){hr[e].checked!==t&&hr[e].click()}function qe(e){let t=hr[e];return d(t,"change").pipe(m(()=>t.checked),z(t.checked))}function va(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function ga(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(z(!1))}function on(){let e=d(window,"keydown").pipe(y(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),y(({mode:t,type:r})=>{if(t==="global"){let o=Ue();if(typeof o!="undefined")return!va(o,r)}return!0}),be());return ga().pipe(E(t=>t?M:e))}function ge(){return new URL(location.href)}function ft(e,t=!1){if(J("navigation.instant")&&!t){let r=O("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new w}function an(){return location.hash.slice(1)}function br(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Br(e){return S(d(window,"hashchange"),e).pipe(m(an),z(an()),y(t=>t.length>0),ee(1))}function sn(e){return Br(e).pipe(m(t=>le(`[id="${t}"]`)),y(t=>typeof t!="undefined"))}function Rt(e){let t=matchMedia(e);return pr(r=>t.addListener(()=>r(t.matches))).pipe(z(t.matches))}function cn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(z(e.matches))}function Gr(e,t){return e.pipe(E(r=>r?t():M))}function vr(e,t){return new D(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{t.progress$.next(n.loaded/n.total*100)}),t.progress$.next(5)),o.send()})}function Ke(e,t){return vr(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),ee(1))}function pn(e,t){let r=new DOMParser;return vr(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),ee(1))}function ln(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function mn(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(ln),z(ln()))}function fn(){return{width:innerWidth,height:innerHeight}}function un(){return d(window,"resize",{passive:!0}).pipe(m(fn),z(fn()))}function dn(){return Z([mn(),un()]).pipe(m(([e,t])=>({offset:e,size:t})),ee(1))}function gr(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=Z([o,r]).pipe(m(()=>ze(e)));return Z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:c,y:p}])=>({offset:{x:a.x-c,y:a.y-p+i},size:s})))}function xa(e){return d(e,"message",t=>t.data)}function ya(e){let t=new w;return t.subscribe(r=>e.postMessage(r)),t}function hn(e,t=new Worker(e)){let r=xa(t),o=ya(t),n=new w;n.subscribe(o);let i=o.pipe(oe(),se(!0));return n.pipe(oe(),Ne(r.pipe(N(i))),be())}var Ea=I("#__config"),Ot=JSON.parse(Ea.textContent);Ot.base=`${new URL(Ot.base,ge())}`;function xe(){return Ot}function J(e){return Ot.features.includes(e)}function _e(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function ke(e,t=document){return I(`[data-md-component=${e}]`,t)}function pe(e,t=document){return R(`[data-md-component=${e}]`,t)}function wa(e){let t=I(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>I(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function bn(e){if(!J("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=I(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return $(()=>{let t=new w;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),wa(e).pipe(T(r=>t.next(r)),A(()=>t.complete()),m(r=>j({ref:e},r)))})}function Ta(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function vn(e,t){let r=new w;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ta(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))}function Pt(e,t){return t==="inline"?O("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"})):O("div",{class:"md-tooltip",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"}))}function gn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function xn(e){return O("button",{class:"md-code__button",title:_e("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function yn(){return O("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function En(){return O("nav",{class:"md-code__nav"})}function Jr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,O("del",null,p)," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);J("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:s}=xe();return O("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),r>0&&O("h1",null,e.title),r<=0&&O("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=s?c in s?`md-tag-icon md-tag--${s[c]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&O("p",{class:"md-search-result__terms"},_e("search.result.term.missing"),": ",...n)))}function wn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreJr(l,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},O("div",null,c.length>0&&c.length===1?_e("search.result.more.one"):_e("search.result.more.other",c.length))),...c.map(l=>Jr(l,1)))]:[]];return O("li",{class:"md-search-result__item"},p)}function Tn(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ur(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Sn(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function Sa(e){let t=xe(),r=new URL(`../${e.version}/`,t.base);return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function On(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":_e("select.version")},t.title),O("ul",{class:"md-version__list"},e.map(Sa)))}var Oa=0;function Ma(e,t){document.body.append(e);let{width:r}=ve(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=dr(t),n=typeof o!="undefined"?it(o):W({x:0,y:0}),i=S(Et(t),mr(t)).pipe(te());return Z([i,n]).pipe(m(([a,s])=>{let{x:c,y:p}=ze(t),l=ve(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:c-s.x+l.width/2-r/2,y:p-s.y+l.height+8}}}))}function Qe(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${Oa++}`,o=Pt(r,"inline"),n=I(".md-typeset",o);return n.innerHTML=t,$(()=>{let i=new w;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(y(({active:a})=>a)),i.pipe(Ee(250),y(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(He(16,Se)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ma(o,e).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))}).pipe(Ge(ae))}function La(e,t){let r=$(()=>Z([Jo(e),it(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ve(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return Et(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),he(+!o||1/0))))}function Mn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return $(()=>{let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),St(e).pipe(N(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(y(({active:s})=>s)),i.pipe(Ee(250),y(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(He(16,Se)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(N(a),y(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(N(a),ie(i)).subscribe(([s,{active:c}])=>{var p;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(c){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ue())==null||p.blur()}}),r.pipe(N(a),y(s=>s===o),Xe(125)).subscribe(()=>e.focus()),La(e,t).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function _a(e){let t=xe();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(typeof t.annotate!="undefined"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return R(r.join(", "),e)}function Aa(e){let t=[];for(let r of _a(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,c]=a;if(typeof c=="undefined"){let p=i.splitText(a.index);i=p.splitText(s.length),t.push(p)}else{i.textContent=s,t.push(i);break}}}}return t}function Ln(e,t){t.append(...Array.from(e.childNodes))}function xr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Aa(t)){let[,c]=s.textContent.match(/\((\d+)\)/);le(`:scope > li:nth-child(${c})`,e)&&(a.set(c,gn(c,i)),s.replaceWith(a.get(c)))}return a.size===0?M:$(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=[];for(let[l,f]of a)p.push([I(".md-typeset",f),I(`:scope > li:nth-child(${l})`,e)]);return o.pipe(N(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Ln(f,u):Ln(u,f)}),S(...[...a].map(([,l])=>Mn(l,t,{target$:r}))).pipe(A(()=>s.complete()),be())})}function _n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return _n(t)}}function An(e,t){return $(()=>{let r=_n(e);return typeof r!="undefined"?xr(r,e,t):M})}var kn=Vt(eo());var Ca=0,Cn=S(d(window,"keydown").pipe(m(()=>!0)),S(d(window,"keyup"),d(window,"contextmenu")).pipe(m(()=>!1))).pipe(z(!1),ee(1));function Hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Hn(t)}}function ka(e){return Ce(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),ne("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=$(()=>{let n=new w,i=n.pipe(Vr(1));n.subscribe(({scrollable:u})=>{u&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=Ca++,s=[],c=e.closest("pre");c.id=`__code_${a}`;let p=[],l=e.closest(".highlight");if(l instanceof HTMLElement){let u=Hn(l);if(typeof u!="undefined"&&(l.classList.contains("annotate")||J("content.code.annotate"))){let h=xr(u,e,t);p.push(Ce(l).pipe(N(i),m(({width:v,height:b})=>v&&b),te(),E(v=>v?h:M)))}}let f=R(":scope > span[id]",e);if(f.length&&(e.classList.add("md-code__content"),e.closest(".select")||J("content.code.select")&&!e.closest(".no-select"))){let u=+f[0].id.split("-").pop(),h=yn();s.push(h),J("content.tooltips")&&p.push(Qe(h));let v=d(h,"click").pipe(Ht(H=>!H,!1),T(()=>h.blur()),be());v.subscribe(H=>{h.classList.toggle("md-code__button--active",H)});let b=fe(f).pipe(re(H=>mr(H).pipe(m(B=>[H,B]))));v.pipe(E(H=>H?b:M)).subscribe(([H,B])=>{let ce=le(".hll.select",H);if(ce&&!B)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&B){let ue=document.createElement("span");ue.className="hll select",ue.append(...Array.from(H.childNodes).slice(1)),H.append(ue)}});let U=fe(f).pipe(re(H=>d(H,"mousedown").pipe(T(B=>B.preventDefault()),m(()=>H)))),Y=v.pipe(E(H=>H?U:M),ie(Cn),m(([H,B])=>{var ue;let ce=f.indexOf(H)+u;if(B===!1)return[ce,ce];{let we=R(".hll",e).map(Ye=>f.indexOf(Ye.parentElement)+u);return(ue=window.getSelection())==null||ue.removeAllRanges(),[Math.min(ce,...we),Math.max(ce,...we)]}})),X=Br(M).pipe(y(H=>H.startsWith(`__codelineno-${a}-`)));X.subscribe(H=>{let[,,B]=H.split("-"),ce=B.split(":").map(we=>+we-u+1);ce.length===1&&ce.push(ce[0]);for(let we of R(".hll:not(.select)",e))we.replaceWith(...Array.from(we.childNodes));let ue=f.slice(ce[0]-1,ce[1]);for(let we of ue){let Ye=document.createElement("span");Ye.className="hll",Ye.append(...Array.from(we.childNodes).slice(1)),we.append(Ye)}}),X.pipe(he(1),Oe(ae)).subscribe(H=>{if(H.includes(":")){let B=document.getElementById(H.split(":")[0]);B&&setTimeout(()=>{let ce=B,ue=-(48+16);for(;ce!==document.body;)ue+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:ue})},1)}});let et=fe(R('a[href^="#__codelineno"]',l)).pipe(re(H=>d(H,"click").pipe(T(B=>B.preventDefault()),m(()=>H)))).pipe(N(i),ie(Cn),m(([H,B])=>{let ue=+I(`[id="${H.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(B===!1)return[ue,ue];{let we=R(".hll",e).map(Ye=>+Ye.parentElement.id.split("-").pop());return[Math.min(ue,...we),Math.max(ue,...we)]}}));S(Y,et).subscribe(H=>{let B=`#__codelineno-${a}-`;H[0]===H[1]?B+=H[0]:B+=`${H[0]}:${H[1]}`,history.replaceState({},"",B),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+B,oldURL:window.location.href}))})}if(kn.default.isSupported()&&(e.closest(".copy")||J("content.code.copy")&&!e.closest(".no-copy"))){let u=xn(c.id);s.push(u),J("content.tooltips")&&p.push(Qe(u))}if(s.length){let u=En();u.append(...s),c.insertBefore(u,e)}return ka(e).pipe(T(u=>n.next(u)),A(()=>n.complete()),m(u=>j({ref:e},u)),Ne(...p))});return J("content.lazy")?St(e).pipe(y(n=>n),he(1),E(()=>o)):o}function Ha(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),y(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(y(n=>n||!o),T(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Rn(e,t){return $(()=>{let r=new w;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Ha(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}var Pn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var to,Ra=0;function Pa(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://openvoiceos.github.io/ovos-docker/assets/external/unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):W(void 0)}function In(e){return e.classList.remove("mermaid"),to||(to=Pa().pipe(T(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Pn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),ee(1))),to.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${Ra++}`,r=O("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})}),to.pipe(m(()=>({ref:e})))}var Fn=O("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(Sn(e)),W({ref:e})}function Ia(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>I(`label[for="${r.id}"]`))))).pipe(z(I(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=I(".tabbed-labels",e),n=R(":scope > input",e),i=Xr("prev");e.append(i);let a=Xr("next");return e.append(a),$(()=>{let s=new w,c=s.pipe(oe(),se(!0));Z([s,Ce(e)]).pipe(N(c),He(1,Se)).subscribe({next([{active:p},l]){let f=ze(p),{width:u}=ve(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=fr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Z([it(o),Ce(o)]).pipe(N(c)).subscribe(([p,l])=>{let f=Tt(o);i.hidden=p.x<16,a.hidden=p.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(N(c)).subscribe(p=>{let{width:l}=ve(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(N(c),y(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=I(`label[for="${p.id}"]`);l.replaceChildren(O("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(N(c),y(f=>!(f.metaKey||f.ctrlKey)),T(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return J("content.tabs.link")&&s.pipe(Le(1),ie(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of R("[data-tabs]"))for(let b of R(":scope > input",v)){let U=I(`label[for="${b.id}"]`);if(U!==p&&U.innerText.trim()===f){U.setAttribute("data-md-switching",""),b.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(N(c)).subscribe(()=>{for(let p of R("audio, video",e))p.pause()}),Ia(n).pipe(T(p=>s.next(p)),A(()=>s.complete()),m(p=>j({ref:e},p)))}).pipe(Ge(ae))}function Nn(e,{viewport$:t,target$:r,print$:o}){return S(...R(".annotate:not(.highlight)",e).map(n=>An(n,{target$:r,print$:o})),...R("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...R("pre.mermaid",e).map(n=>In(n)),...R("table:not([class])",e).map(n=>jn(n)),...R("details",e).map(n=>Rn(n,{target$:r,print$:o})),...R("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...R("[title]",e).filter(()=>J("content.tooltips")).map(n=>Qe(n)))}function Fa(e,{alert$:t}){return t.pipe(E(r=>S(W(!0),W(!1).pipe(Xe(2e3))).pipe(m(o=>({message:r,active:o})))))}function Un(e,t){let r=I(".md-typeset",e);return $(()=>{let o=new w;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Fa(e,t).pipe(T(n=>o.next(n)),A(()=>o.complete()),m(n=>j({ref:e},n)))})}function ja({viewport$:e}){if(!J("header.autohide"))return W(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Pe(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),te()),o=qe("search");return Z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),te(),E(n=>n?r:W(!1)),z(!1))}function Dn(e,t){return $(()=>Z([Ce(e),ja(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),te((r,o)=>r.height===o.height&&r.hidden===o.hidden),ee(1))}function Vn(e,{header$:t,main$:r}){return $(()=>{let o=new w,n=o.pipe(oe(),se(!0));o.pipe(ne("active"),nt(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=fe(R("[title]",e)).pipe(y(()=>J("content.tooltips")),re(a=>Qe(a)));return r.subscribe(o),t.pipe(N(n),m(a=>j({ref:e},a)),Ne(i.pipe(N(n))))})}function Wa(e,{viewport$:t,header$:r}){return gr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ve(e);return{active:o>=n}}),ne("active"))}function zn(e,t){return $(()=>{let r=new w;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=le(".md-content h1");return typeof o=="undefined"?M:Wa(o,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))})}function qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),te()),n=o.pipe(E(()=>Ce(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return Z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,a-c,i)-Math.max(0,p+c-s)),{offset:a-i,height:p,active:a-i<=c})),te((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Na(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return W(...e).pipe(re(r=>d(r,"change").pipe(m(()=>r))),z(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{media:r.getAttribute("data-md-color-media"),scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),ee(1))}function Kn(e){let t=R("input",e),r=O("meta",{name:"theme-color"});document.head.appendChild(r);let o=O("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Rt("(prefers-color-scheme: light)");return $(()=>{let i=new w;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=c.getAttribute("data-md-color-scheme"),a.color.primary=c.getAttribute("data-md-color-primary"),a.color.accent=c.getAttribute("data-md-color-accent")}for(let[s,c]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,c);for(let s=0;s{let a=ke("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(Oe(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Na(t).pipe(N(n.pipe(Le(1))),mt(),T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))})}function Qn(e,{progress$:t}){return $(()=>{let r=new w;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(T(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var ro=Vt(eo());function Ua(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r}function Yn({alert$:e}){ro.default.isSupported()&&new D(t=>{new ro.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ua(I(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(T(t=>{t.trigger.focus()}),m(()=>_e("clipboard.copied"))).subscribe(e)}function Da(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function yr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return W(t);{let r=xe();return pn(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Da(R("loc",o).map(n=>n.textContent))),Me(()=>M),je([]),T(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function Bn(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.includes(`${o}`)?(e.preventDefault(),W(new URL(r.href))):M}function Gn(e){let t=le("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of R(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let a=o.getAttribute(i);if(a===null)continue;let s=new URL(a,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${s}`),n=c.outerHTML;break}r.set(n,o)}return r}function Jn({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return M;let n=yr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=d(document.body,"click").pipe(ie(n),E(([l,f])=>Bn(l,f)),be());J("navigation.instant.prefetch")&&S(d(document.body,"mousemove"),d(document.body,"focusin")).pipe(ie(n),E(([l,f])=>Bn(l,f)),Ee(25),Dr(({href:l})=>l),lr(l=>{let f=document.createElement("link");return f.rel="prefetch",f.href=l.toString(),document.head.appendChild(f),d(f,"load").pipe(m(()=>f),he(1))})).subscribe(l=>l.remove()),i.pipe(he(1)).subscribe(()=>{let l=le("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ie(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let a=e.pipe(z(ge()),ne("pathname"),Le(1),E(l=>vr(l,{progress$:r}).pipe(Me(()=>(ft(l,!0),M))))),s=new DOMParser,c=a.pipe(E(l=>l.text()),E(l=>{let f=s.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...J("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let U=le(b),Y=le(b,f);typeof U!="undefined"&&typeof Y!="undefined"&&U.replaceWith(Y)}let u=Gn(document.head),h=Gn(f.head);for(let[b,U]of h)U.getAttribute("rel")==="stylesheet"||U.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(U));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=ke("container");return Ve(R("script",v)).pipe(E(b=>{let U=f.createElement("script");if(b.src){for(let Y of b.getAttributeNames())U.setAttribute(Y,b.getAttribute(Y));return b.replaceWith(U),new D(Y=>{U.onload=()=>Y.complete()})}else return U.textContent=b.textContent,b.replaceWith(U),M}),oe(),se(f))}),be());return d(window,"popstate").pipe(m(ge)).subscribe(e),e.pipe(z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual")}),e.pipe(zr(i),z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ie(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):br(l.hash)}),t.pipe(ne("offset"),Ee(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var ei=Vt(Zn());function ti(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ei.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ft(e){return e.type===1}function Er(e){return e.type===3}function ri(e,t){let r=hn(e);return S(W(location.protocol!=="file:"),qe("search")).pipe(We(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:J("search.suggest")}}})),r}function oi({document$:e}){let t=xe(),r=Ke(new URL("../versions.json",t.base)).pipe(Me(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>d(document.body,"click").pipe(y(i=>!i.metaKey&&!i.ctrlKey),ie(o),E(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let c=s.href;return!i.target.closest(".md-version")&&n.get(c)===a?M:(i.preventDefault(),W(c))}}return M}),E(i=>{let{version:a}=n.get(i);return yr(new URL(i)).pipe(m(s=>{let p=ge().href.replace(t.base,"");return s.includes(p.split("#")[0])?new URL(`../${a}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ft(n,!0)),Z([r,o]).subscribe(([n,i])=>{I(".md-header__topic").appendChild(On(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let c of s)for(let p of n.aliases)if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of pe("outdated"))s.hidden=!1})}function Qa(e,{worker$:t}){let{searchParams:r}=ge();r.has("q")&&(Ze("search",!0),e.value=r.get("q"),e.focus(),qe("search").pipe(We(i=>!i)).subscribe(()=>{let i=ge();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Et(e),n=S(t.pipe(We(Ft)),d(e,"keyup"),o).pipe(m(()=>e.value),te());return Z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),ee(1))}function ni(e,{worker$:t}){let r=new w,o=r.pipe(oe(),se(!0));Z([t.pipe(We(Ft)),r],(i,a)=>a).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&Ze("search",i)}),d(e.form,"reset").pipe(N(o)).subscribe(()=>e.focus());let n=I("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),Qa(e,{worker$:t}).pipe(T(i=>r.next(i)),A(()=>r.complete()),m(i=>j({ref:e},i)),ee(1))}function ii(e,{worker$:t,query$:r}){let o=new w,n=tn(e.parentElement).pipe(y(Boolean)),i=e.parentElement,a=I(":scope > :first-child",e),s=I(":scope > :last-child",e);qe("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ie(r),Kr(t.pipe(We(Ft)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?_e("search.result.none"):_e("search.result.placeholder");break;case 1:a.textContent=_e("search.result.one");break;default:let u=ur(l.length);a.textContent=_e("search.result.other",u)}});let c=o.pipe(T(()=>s.innerHTML=""),E(({items:l})=>S(W(...l.slice(0,10)),W(...l.slice(10)).pipe(Pe(4),Yr(n),E(([f])=>f)))),m(wn),be());return c.subscribe(l=>s.appendChild(l)),c.pipe(re(l=>{let f=le("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(N(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(y(Er),m(({data:l})=>l)).pipe(T(l=>o.next(l)),A(()=>o.complete()),m(l=>j({ref:e},l)))}function Ya(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ge();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ai(e,t){let r=new w,o=r.pipe(oe(),se(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(N(o)).subscribe(n=>n.preventDefault()),Ya(e,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))}function si(e,{worker$:t,keyboard$:r}){let o=new w,n=ke("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(Oe(ae),m(()=>n.value),te());return o.pipe(nt(i),m(([{suggest:s},c])=>{let p=c.split(/([\s-]+)/);if(s!=null&&s.length&&p[p.length-1]){let l=s[s.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(y(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(y(Er),m(({data:s})=>s)).pipe(T(s=>o.next(s)),A(()=>o.complete()),m(()=>({ref:e})))}function ci(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ri(o.search,t),i=ke("search-query",e),a=ke("search-result",e);d(e,"click").pipe(y(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ze("search",!1)),r.pipe(y(({mode:c})=>c==="search")).subscribe(c=>{let p=Ue();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of R(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ze("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...R(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ue()&&i.focus()}}),r.pipe(y(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let s=ni(i,{worker$:n});return S(s,ii(a,{worker$:n,query$:s})).pipe(Ne(...pe("search-share",e).map(c=>ai(c,{query$:s})),...pe("search-suggest",e).map(c=>si(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Je}}function pi(e,{index$:t,location$:r}){return Z([t,r.pipe(z(ge()),y(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ti(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let c=s.textContent,p=o(c);p.length>c.length&&n.set(s,p)}for(let[s,c]of n){let{childNodes:p}=O("span",null,c);s.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ba(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return Z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),te((i,a)=>i.height===a.height&&i.locked===a.locked))}function oo(e,o){var n=o,{header$:t}=n,r=lo(n,["header$"]);let i=I(".md-sidebar__scrollwrap",e),{y:a}=ze(i);return $(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=s.pipe(He(0,Se));return p.pipe(ie(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(We()).subscribe(()=>{for(let l of R(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2})}}}),fe(R("label[tabindex]",e)).pipe(re(l=>d(l,"click").pipe(Oe(ae),m(()=>l),N(c)))).subscribe(l=>{let f=I(`[id="${l.htmlFor}"]`);I(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Ba(e,r).pipe(T(l=>s.next(l)),A(()=>s.complete()),m(l=>j({ref:e},l)))})}function li(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return kt(Ke(`${r}/releases/latest`).pipe(Me(()=>M),m(o=>({version:o.tag_name})),je({})),Ke(r).pipe(Me(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),je({}))).pipe(m(([o,n])=>j(j({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ke(r).pipe(m(o=>({repositories:o.public_repos})),je({}))}}function mi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ke(r).pipe(Me(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),je({}))}function fi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return li(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return mi(r,o)}return M}var Ga;function Ja(e){return Ga||(Ga=$(()=>{let t=__md_get("__source",sessionStorage);if(t)return W(t);if(pe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return fi(e.href).pipe(T(o=>__md_set("__source",o,sessionStorage)))}).pipe(Me(()=>M),y(t=>Object.keys(t).length>0),m(t=>({facts:t})),ee(1)))}function ui(e){let t=I(":scope > :last-child",e);return $(()=>{let r=new w;return r.subscribe(({facts:o})=>{t.appendChild(Tn(o)),t.classList.add("md-source__repository--active")}),Ja(e).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Xa(e,{viewport$:t,header$:r}){return Ce(document.body).pipe(E(()=>gr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function di(e,t){return $(()=>{let r=new w;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(J("navigation.tabs.sticky")?W({hidden:!1}):Xa(e,t)).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Za(e,{viewport$:t,header$:r}){let o=new Map,n=R("[href^=\\#]",e);for(let s of n){let c=decodeURIComponent(s.hash.substring(1)),p=le(`[id="${c}"]`);typeof p!="undefined"&&o.set(s,p)}let i=r.pipe(ne("height"),m(({height:s})=>{let c=ke("main"),p=I(":scope > :first-child",c);return s+.8*(p.offsetTop-c.offsetTop)}),be());return Ce(document.body).pipe(ne("height"),E(s=>$(()=>{let c=[];return W([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),nt(i),E(([c,p])=>t.pipe(Ht(([l,f],{offset:{y:u},size:h})=>{let v=u+h.height>=Math.floor(s.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),te((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,c])=>({prev:s.map(([p])=>p),next:c.map(([p])=>p)})),z({prev:[],next:[]}),Pe(2,1),m(([s,c])=>s.prev.length{let i=new w,a=i.pipe(oe(),se(!0));if(i.subscribe(({prev:s,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===s.length-1)}),J("toc.follow")){let s=S(t.pipe(Ee(1),m(()=>{})),t.pipe(Ee(250),m(()=>"smooth")));i.pipe(y(({prev:c})=>c.length>0),nt(o.pipe(Oe(ae))),ie(s)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=dr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2,behavior:p})}}})}return J("navigation.tracking")&&t.pipe(N(a),ne("offset"),Ee(250),Le(1),N(n.pipe(Le(1))),mt({delay:250}),ie(i)).subscribe(([,{prev:s}])=>{let c=ge(),p=s[s.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Za(e,{viewport$:t,header$:r}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function es(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Pe(2,1),m(([a,s])=>a>s&&s>0),te()),i=r.pipe(m(({active:a})=>a));return Z([i,n]).pipe(m(([a,s])=>!(a&&s)),te(),N(o.pipe(Le(1))),se(!0),mt({delay:250}),m(a=>({hidden:a})))}function bi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(N(a),ne("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),es(e,{viewport$:t,main$:o,target$:n}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))}function vi({document$:e}){e.pipe(E(()=>R(".md-ellipsis")),re(t=>St(t).pipe(N(e.pipe(Le(1))),y(r=>r),m(()=>t),he(1))),y(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Qe(o).pipe(N(e.pipe(Le(1))),A(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(E(()=>R(".md-status")),re(t=>Qe(t))).subscribe()}function gi({document$:e,tablet$:t}){e.pipe(E(()=>R(".md-toggle--indeterminate")),T(r=>{r.indeterminate=!0,r.checked=!1}),re(r=>d(r,"change").pipe(Qr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ie(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function ts(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function xi({document$:e}){e.pipe(E(()=>R("[data-md-scrollfix]")),T(t=>t.removeAttribute("data-md-scrollfix")),y(ts),re(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function yi({viewport$:e,tablet$:t}){Z([qe("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>W(r).pipe(Xe(r?400:100))),ie(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function rs(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",no.base)}`).pipe(m(()=>__index),ee(1)):Ke(new URL("search/search_index.json",no.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var st=Go(),Wt=nn(),Mt=sn(Wt),io=on(),$e=dn(),wr=Rt("(min-width: 960px)"),wi=Rt("(min-width: 1220px)"),Ti=cn(),no=xe(),Si=document.forms.namedItem("search")?rs():Je,ao=new w;Yn({alert$:ao});var so=new w;J("navigation.instant")&&Jn({location$:Wt,viewport$:$e,progress$:so}).subscribe(st);var Ei;((Ei=no.version)==null?void 0:Ei.provider)==="mike"&&oi({document$:st});S(Wt,Mt).pipe(Xe(125)).subscribe(()=>{Ze("drawer",!1),Ze("search",!1)});io.pipe(y(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=le("link[rel=prev]");typeof t!="undefined"&&ft(t);break;case"n":case".":let r=le("link[rel=next]");typeof r!="undefined"&&ft(r);break;case"Enter":let o=Ue();o instanceof HTMLLabelElement&&o.click()}});vi({document$:st});gi({document$:st,tablet$:wr});xi({document$:st});yi({viewport$:$e,tablet$:wr});var at=Dn(ke("header"),{viewport$:$e}),jt=st.pipe(m(()=>ke("main")),E(e=>qn(e,{viewport$:$e,header$:at})),ee(1)),os=S(...pe("consent").map(e=>vn(e,{target$:Mt})),...pe("dialog").map(e=>Un(e,{alert$:ao})),...pe("header").map(e=>Vn(e,{viewport$:$e,header$:at,main$:jt})),...pe("palette").map(e=>Kn(e)),...pe("progress").map(e=>Qn(e,{progress$:so})),...pe("search").map(e=>ci(e,{index$:Si,keyboard$:io})),...pe("source").map(e=>ui(e))),ns=$(()=>S(...pe("announce").map(e=>bn(e)),...pe("content").map(e=>Nn(e,{viewport$:$e,target$:Mt,print$:Ti})),...pe("content").map(e=>J("search.highlight")?pi(e,{index$:Si,location$:Wt}):M),...pe("header-title").map(e=>zn(e,{viewport$:$e,header$:at})),...pe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Gr(wi,()=>oo(e,{viewport$:$e,header$:at,main$:jt})):Gr(wr,()=>oo(e,{viewport$:$e,header$:at,main$:jt}))),...pe("tabs").map(e=>di(e,{viewport$:$e,header$:at})),...pe("toc").map(e=>hi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})),...pe("top").map(e=>bi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})))),Oi=st.pipe(E(()=>ns),Ne(os),ee(1));Oi.subscribe();window.document$=st;window.location$=Wt;window.target$=Mt;window.keyboard$=io;window.viewport$=$e;window.tablet$=wr;window.screen$=wi;window.print$=Ti;window.alert$=ao;window.progress$=so;window.component$=Oi;})(); + `):"",this.name="UnsubscriptionError",this.errors=r}});function Be(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var De=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=Te(a),c=s.next();!c.done;c=s.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof qt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Te(f),h=u.next();!h.done;h=u.next()){var v=h.value;try{vo(v)}catch(b){i=i!=null?i:[],b instanceof qt?i=Q(Q([],K(i)),K(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new qt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)vo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Be(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Be(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Cr=De.EMPTY;function Kt(e){return e instanceof De||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function vo(e){k(e)?e():e.unsubscribe()}var Fe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Cr:(this.currentObservers=null,s.push(r),new De(function(){o.currentObservers=null,Be(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new D;return r.source=this,r},t.create=function(r,o){return new Oo(r,o)},t}(D);var Oo=function(e){me(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Cr},t}(w);var _t={now:function(){return(_t.delegate||Date).now()},delegate:void 0};var At=function(e){me(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=_t);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Bt);var _o=function(e){me(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Gt);var Se=new _o(Lo);var M=new D(function(e){return e.complete()});function Jt(e){return e&&k(e.schedule)}function Fr(e){return e[e.length-1]}function tt(e){return k(Fr(e))?e.pop():void 0}function Re(e){return Jt(Fr(e))?e.pop():void 0}function Xt(e,t){return typeof Fr(e)=="number"?e.pop():t}var gt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Zt(e){return k(e==null?void 0:e.then)}function er(e){return k(e[bt])}function tr(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function rr(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function qi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var or=qi();function nr(e){return k(e==null?void 0:e[or])}function ir(e){return ho(this,arguments,function(){var r,o,n,i;return zt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,ct(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,ct(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ct(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function ar(e){return k(e==null?void 0:e.getReader)}function P(e){if(e instanceof D)return e;if(e!=null){if(er(e))return Ki(e);if(gt(e))return Qi(e);if(Zt(e))return Yi(e);if(tr(e))return Ao(e);if(nr(e))return Bi(e);if(ar(e))return Gi(e)}throw rr(e)}function Ki(e){return new D(function(t){var r=e[bt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Qi(e){return new D(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?y(function(n,i){return e(n,i,o)}):de,he(1),r?je(t):Ko(function(){return new cr}))}}function Vr(e){return e<=0?function(){return M}:g(function(t,r){var o=[];t.subscribe(x(r,function(n){o.push(n),e=2,!0))}function be(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new w}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(p){var l,f,u,h=0,v=!1,b=!1,U=function(){f==null||f.unsubscribe(),f=void 0},Y=function(){U(),l=u=void 0,v=b=!1},X=function(){var C=l;Y(),C==null||C.unsubscribe()};return g(function(C,et){h++,!b&&!v&&U();var H=u=u!=null?u:r();et.add(function(){h--,h===0&&!b&&!v&&(f=qr(X,c))}),H.subscribe(et),!l&&h>0&&(l=new lt({next:function(B){return H.next(B)},error:function(B){b=!0,U(),f=qr(Y,n,B),H.error(B)},complete:function(){v=!0,U(),f=qr(Y,a),H.complete()}}),P(C).subscribe(l))})(p)}}function qr(e,t){for(var r=[],o=2;oe.next(document)),e}function R(e,t=document){return Array.from(t.querySelectorAll(e))}function I(e,t=document){let r=le(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function le(e,t=document){return t.querySelector(e)||void 0}function Ue(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var da=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(Ee(1),z(void 0),m(()=>Ue()||document.body),ee(1));function Et(e){return da.pipe(m(t=>e.contains(t)),te())}function mr(e,t){return S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ee(t):de,z(!1))}function ze(e){return{x:e.offsetLeft,y:e.offsetTop}}function Jo(e){return S(d(window,"load"),d(window,"resize")).pipe(He(0,Se),m(()=>ze(e)),z(ze(e)))}function fr(e){return{x:e.scrollLeft,y:e.scrollTop}}function it(e){return S(d(e,"scroll"),d(window,"resize")).pipe(He(0,Se),m(()=>fr(e)),z(fr(e)))}function Xo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Xo(e,r)}function O(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Xo(o,n);return o}function ur(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=O("script",{src:e});return $(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(E(()=>jr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),he(1))))}var Zo=new w,ha=$(()=>typeof ResizeObserver=="undefined"?wt("https://openvoiceos.github.io/ovos-docker/assets/external/unpkg.com/resize-observer-polyfill/dist/ResizeObserver.js"):W(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Zo.next(t)})),E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function ve(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ce(e){return ha.pipe(T(t=>t.observe(e)),E(t=>Zo.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>ve(e)))),z(ve(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function dr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var en=new w,ba=$(()=>W(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function St(e){return ba.pipe(T(t=>t.observe(e)),E(t=>en.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return it(e).pipe(m(({y:r})=>{let o=ve(e),n=Tt(e);return r>=n.height-o.height-t}),te())}var hr={drawer:I("[data-md-toggle=drawer]"),search:I("[data-md-toggle=search]")};function rn(e){return hr[e].checked}function Ze(e,t){hr[e].checked!==t&&hr[e].click()}function qe(e){let t=hr[e];return d(t,"change").pipe(m(()=>t.checked),z(t.checked))}function va(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function ga(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(z(!1))}function on(){let e=d(window,"keydown").pipe(y(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),y(({mode:t,type:r})=>{if(t==="global"){let o=Ue();if(typeof o!="undefined")return!va(o,r)}return!0}),be());return ga().pipe(E(t=>t?M:e))}function ge(){return new URL(location.href)}function ft(e,t=!1){if(J("navigation.instant")&&!t){let r=O("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new w}function an(){return location.hash.slice(1)}function br(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Br(e){return S(d(window,"hashchange"),e).pipe(m(an),z(an()),y(t=>t.length>0),ee(1))}function sn(e){return Br(e).pipe(m(t=>le(`[id="${t}"]`)),y(t=>typeof t!="undefined"))}function Rt(e){let t=matchMedia(e);return pr(r=>t.addListener(()=>r(t.matches))).pipe(z(t.matches))}function cn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(z(e.matches))}function Gr(e,t){return e.pipe(E(r=>r?t():M))}function vr(e,t){return new D(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let i=Number(o.getResponseHeader("Content-Length"))||0;t.progress$.next(n.loaded/i*100)}}),t.progress$.next(5)),o.send()})}function Ke(e,t){return vr(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),ee(1))}function pn(e,t){let r=new DOMParser;return vr(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),ee(1))}function ln(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function mn(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(ln),z(ln()))}function fn(){return{width:innerWidth,height:innerHeight}}function un(){return d(window,"resize",{passive:!0}).pipe(m(fn),z(fn()))}function dn(){return Z([mn(),un()]).pipe(m(([e,t])=>({offset:e,size:t})),ee(1))}function gr(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=Z([o,r]).pipe(m(()=>ze(e)));return Z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:c,y:p}])=>({offset:{x:a.x-c,y:a.y-p+i},size:s})))}function xa(e){return d(e,"message",t=>t.data)}function ya(e){let t=new w;return t.subscribe(r=>e.postMessage(r)),t}function hn(e,t=new Worker(e)){let r=xa(t),o=ya(t),n=new w;n.subscribe(o);let i=o.pipe(oe(),se(!0));return n.pipe(oe(),Ne(r.pipe(N(i))),be())}var Ea=I("#__config"),Ot=JSON.parse(Ea.textContent);Ot.base=`${new URL(Ot.base,ge())}`;function xe(){return Ot}function J(e){return Ot.features.includes(e)}function _e(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function ke(e,t=document){return I(`[data-md-component=${e}]`,t)}function pe(e,t=document){return R(`[data-md-component=${e}]`,t)}function wa(e){let t=I(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>I(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function bn(e){if(!J("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=I(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return $(()=>{let t=new w;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),wa(e).pipe(T(r=>t.next(r)),A(()=>t.complete()),m(r=>j({ref:e},r)))})}function Ta(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function vn(e,t){let r=new w;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ta(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))}function Pt(e,t){return t==="inline"?O("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"})):O("div",{class:"md-tooltip",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"}))}function gn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function xn(e){return O("button",{class:"md-code__button",title:_e("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function yn(){return O("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function En(){return O("nav",{class:"md-code__nav"})}function Jr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,O("del",null,p)," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);J("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:s}=xe();return O("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),r>0&&O("h1",null,e.title),r<=0&&O("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=s?c in s?`md-tag-icon md-tag--${s[c]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&O("p",{class:"md-search-result__terms"},_e("search.result.term.missing"),": ",...n)))}function wn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreJr(l,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},O("div",null,c.length>0&&c.length===1?_e("search.result.more.one"):_e("search.result.more.other",c.length))),...c.map(l=>Jr(l,1)))]:[]];return O("li",{class:"md-search-result__item"},p)}function Tn(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ur(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Sn(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function Sa(e){let t=xe(),r=new URL(`../${e.version}/`,t.base);return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function On(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":_e("select.version")},t.title),O("ul",{class:"md-version__list"},e.map(Sa)))}var Oa=0;function Ma(e,t){document.body.append(e);let{width:r}=ve(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=dr(t),n=typeof o!="undefined"?it(o):W({x:0,y:0}),i=S(Et(t),mr(t)).pipe(te());return Z([i,n]).pipe(m(([a,s])=>{let{x:c,y:p}=ze(t),l=ve(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:c-s.x+l.width/2-r/2,y:p-s.y+l.height+8}}}))}function Qe(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${Oa++}`,o=Pt(r,"inline"),n=I(".md-typeset",o);return n.innerHTML=t,$(()=>{let i=new w;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(y(({active:a})=>a)),i.pipe(Ee(250),y(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(He(16,Se)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ma(o,e).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))}).pipe(Ge(ae))}function La(e,t){let r=$(()=>Z([Jo(e),it(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ve(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return Et(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),he(+!o||1/0))))}function Mn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return $(()=>{let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),St(e).pipe(N(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(y(({active:s})=>s)),i.pipe(Ee(250),y(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(He(16,Se)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(N(a),y(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(N(a),ie(i)).subscribe(([s,{active:c}])=>{var p;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(c){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ue())==null||p.blur()}}),r.pipe(N(a),y(s=>s===o),Xe(125)).subscribe(()=>e.focus()),La(e,t).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function _a(e){let t=xe();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(typeof t.annotate!="undefined"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return R(r.join(", "),e)}function Aa(e){let t=[];for(let r of _a(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,c]=a;if(typeof c=="undefined"){let p=i.splitText(a.index);i=p.splitText(s.length),t.push(p)}else{i.textContent=s,t.push(i);break}}}}return t}function Ln(e,t){t.append(...Array.from(e.childNodes))}function xr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Aa(t)){let[,c]=s.textContent.match(/\((\d+)\)/);le(`:scope > li:nth-child(${c})`,e)&&(a.set(c,gn(c,i)),s.replaceWith(a.get(c)))}return a.size===0?M:$(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=[];for(let[l,f]of a)p.push([I(".md-typeset",f),I(`:scope > li:nth-child(${l})`,e)]);return o.pipe(N(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Ln(f,u):Ln(u,f)}),S(...[...a].map(([,l])=>Mn(l,t,{target$:r}))).pipe(A(()=>s.complete()),be())})}function _n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return _n(t)}}function An(e,t){return $(()=>{let r=_n(e);return typeof r!="undefined"?xr(r,e,t):M})}var kn=Vt(eo());var Ca=0,Cn=S(d(window,"keydown").pipe(m(()=>!0)),S(d(window,"keyup"),d(window,"contextmenu")).pipe(m(()=>!1))).pipe(z(!1),ee(1));function Hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Hn(t)}}function ka(e){return Ce(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),ne("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=$(()=>{let n=new w,i=n.pipe(Vr(1));n.subscribe(({scrollable:u})=>{u&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=Ca++,s=[],c=e.closest("pre");c.id=`__code_${a}`;let p=[],l=e.closest(".highlight");if(l instanceof HTMLElement){let u=Hn(l);if(typeof u!="undefined"&&(l.classList.contains("annotate")||J("content.code.annotate"))){let h=xr(u,e,t);p.push(Ce(l).pipe(N(i),m(({width:v,height:b})=>v&&b),te(),E(v=>v?h:M)))}}let f=R(":scope > span[id]",e);if(f.length&&(e.classList.add("md-code__content"),e.closest(".select")||J("content.code.select")&&!e.closest(".no-select"))){let u=+f[0].id.split("-").pop(),h=yn();s.push(h),J("content.tooltips")&&p.push(Qe(h));let v=d(h,"click").pipe(Ht(H=>!H,!1),T(()=>h.blur()),be());v.subscribe(H=>{h.classList.toggle("md-code__button--active",H)});let b=fe(f).pipe(re(H=>mr(H).pipe(m(B=>[H,B]))));v.pipe(E(H=>H?b:M)).subscribe(([H,B])=>{let ce=le(".hll.select",H);if(ce&&!B)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&B){let ue=document.createElement("span");ue.className="hll select",ue.append(...Array.from(H.childNodes).slice(1)),H.append(ue)}});let U=fe(f).pipe(re(H=>d(H,"mousedown").pipe(T(B=>B.preventDefault()),m(()=>H)))),Y=v.pipe(E(H=>H?U:M),ie(Cn),m(([H,B])=>{var ue;let ce=f.indexOf(H)+u;if(B===!1)return[ce,ce];{let we=R(".hll",e).map(Ye=>f.indexOf(Ye.parentElement)+u);return(ue=window.getSelection())==null||ue.removeAllRanges(),[Math.min(ce,...we),Math.max(ce,...we)]}})),X=Br(M).pipe(y(H=>H.startsWith(`__codelineno-${a}-`)));X.subscribe(H=>{let[,,B]=H.split("-"),ce=B.split(":").map(we=>+we-u+1);ce.length===1&&ce.push(ce[0]);for(let we of R(".hll:not(.select)",e))we.replaceWith(...Array.from(we.childNodes));let ue=f.slice(ce[0]-1,ce[1]);for(let we of ue){let Ye=document.createElement("span");Ye.className="hll",Ye.append(...Array.from(we.childNodes).slice(1)),we.append(Ye)}}),X.pipe(he(1),Oe(ae)).subscribe(H=>{if(H.includes(":")){let B=document.getElementById(H.split(":")[0]);B&&setTimeout(()=>{let ce=B,ue=-64;for(;ce!==document.body;)ue+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:ue})},1)}});let et=fe(R('a[href^="#__codelineno"]',l)).pipe(re(H=>d(H,"click").pipe(T(B=>B.preventDefault()),m(()=>H)))).pipe(N(i),ie(Cn),m(([H,B])=>{let ue=+I(`[id="${H.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(B===!1)return[ue,ue];{let we=R(".hll",e).map(Ye=>+Ye.parentElement.id.split("-").pop());return[Math.min(ue,...we),Math.max(ue,...we)]}}));S(Y,et).subscribe(H=>{let B=`#__codelineno-${a}-`;H[0]===H[1]?B+=H[0]:B+=`${H[0]}:${H[1]}`,history.replaceState({},"",B),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+B,oldURL:window.location.href}))})}if(kn.default.isSupported()&&(e.closest(".copy")||J("content.code.copy")&&!e.closest(".no-copy"))){let u=xn(c.id);s.push(u),J("content.tooltips")&&p.push(Qe(u))}if(s.length){let u=En();u.append(...s),c.insertBefore(u,e)}return ka(e).pipe(T(u=>n.next(u)),A(()=>n.complete()),m(u=>j({ref:e},u)),Ne(...p))});return J("content.lazy")?St(e).pipe(y(n=>n),he(1),E(()=>o)):o}function Ha(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),y(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(y(n=>n||!o),T(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Rn(e,t){return $(()=>{let r=new w;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Ha(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}var Pn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var to,Ra=0;function Pa(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://openvoiceos.github.io/ovos-docker/assets/external/unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):W(void 0)}function In(e){return e.classList.remove("mermaid"),to||(to=Pa().pipe(T(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Pn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),ee(1))),to.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${Ra++}`,r=O("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})}),to.pipe(m(()=>({ref:e})))}var Fn=O("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(Sn(e)),W({ref:e})}function Ia(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>I(`label[for="${r.id}"]`))))).pipe(z(I(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=I(".tabbed-labels",e),n=R(":scope > input",e),i=Xr("prev");e.append(i);let a=Xr("next");return e.append(a),$(()=>{let s=new w,c=s.pipe(oe(),se(!0));Z([s,Ce(e)]).pipe(N(c),He(1,Se)).subscribe({next([{active:p},l]){let f=ze(p),{width:u}=ve(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=fr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Z([it(o),Ce(o)]).pipe(N(c)).subscribe(([p,l])=>{let f=Tt(o);i.hidden=p.x<16,a.hidden=p.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(N(c)).subscribe(p=>{let{width:l}=ve(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(N(c),y(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=I(`label[for="${p.id}"]`);l.replaceChildren(O("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(N(c),y(f=>!(f.metaKey||f.ctrlKey)),T(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return J("content.tabs.link")&&s.pipe(Le(1),ie(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of R("[data-tabs]"))for(let b of R(":scope > input",v)){let U=I(`label[for="${b.id}"]`);if(U!==p&&U.innerText.trim()===f){U.setAttribute("data-md-switching",""),b.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(N(c)).subscribe(()=>{for(let p of R("audio, video",e))p.pause()}),Ia(n).pipe(T(p=>s.next(p)),A(()=>s.complete()),m(p=>j({ref:e},p)))}).pipe(Ge(ae))}function Nn(e,{viewport$:t,target$:r,print$:o}){return S(...R(".annotate:not(.highlight)",e).map(n=>An(n,{target$:r,print$:o})),...R("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...R("pre.mermaid",e).map(n=>In(n)),...R("table:not([class])",e).map(n=>jn(n)),...R("details",e).map(n=>Rn(n,{target$:r,print$:o})),...R("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...R("[title]",e).filter(()=>J("content.tooltips")).map(n=>Qe(n)))}function Fa(e,{alert$:t}){return t.pipe(E(r=>S(W(!0),W(!1).pipe(Xe(2e3))).pipe(m(o=>({message:r,active:o})))))}function Un(e,t){let r=I(".md-typeset",e);return $(()=>{let o=new w;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Fa(e,t).pipe(T(n=>o.next(n)),A(()=>o.complete()),m(n=>j({ref:e},n)))})}function ja({viewport$:e}){if(!J("header.autohide"))return W(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Pe(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),te()),o=qe("search");return Z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),te(),E(n=>n?r:W(!1)),z(!1))}function Dn(e,t){return $(()=>Z([Ce(e),ja(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),te((r,o)=>r.height===o.height&&r.hidden===o.hidden),ee(1))}function Vn(e,{header$:t,main$:r}){return $(()=>{let o=new w,n=o.pipe(oe(),se(!0));o.pipe(ne("active"),nt(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=fe(R("[title]",e)).pipe(y(()=>J("content.tooltips")),re(a=>Qe(a)));return r.subscribe(o),t.pipe(N(n),m(a=>j({ref:e},a)),Ne(i.pipe(N(n))))})}function Wa(e,{viewport$:t,header$:r}){return gr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ve(e);return{active:o>=n}}),ne("active"))}function zn(e,t){return $(()=>{let r=new w;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=le(".md-content h1");return typeof o=="undefined"?M:Wa(o,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))})}function qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),te()),n=o.pipe(E(()=>Ce(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return Z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,a-c,i)-Math.max(0,p+c-s)),{offset:a-i,height:p,active:a-i<=c})),te((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Na(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return W(...e).pipe(re(r=>d(r,"change").pipe(m(()=>r))),z(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{media:r.getAttribute("data-md-color-media"),scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),ee(1))}function Kn(e){let t=R("input",e),r=O("meta",{name:"theme-color"});document.head.appendChild(r);let o=O("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Rt("(prefers-color-scheme: light)");return $(()=>{let i=new w;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=c.getAttribute("data-md-color-scheme"),a.color.primary=c.getAttribute("data-md-color-primary"),a.color.accent=c.getAttribute("data-md-color-accent")}for(let[s,c]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,c);for(let s=0;s{let a=ke("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(Oe(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Na(t).pipe(N(n.pipe(Le(1))),mt(),T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))})}function Qn(e,{progress$:t}){return $(()=>{let r=new w;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(T(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var ro=Vt(eo());function Ua(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Yn({alert$:e}){ro.default.isSupported()&&new D(t=>{new ro.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ua(I(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(T(t=>{t.trigger.focus()}),m(()=>_e("clipboard.copied"))).subscribe(e)}function Da(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function yr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return W(t);{let r=xe();return pn(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Da(R("loc",o).map(n=>n.textContent))),Me(()=>M),je([]),T(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function Bn(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.includes(`${o}`)?(e.preventDefault(),W(new URL(r.href))):M}function Gn(e){let t=le("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of R(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let a=o.getAttribute(i);if(a===null)continue;let s=new URL(a,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${s}`),n=c.outerHTML;break}r.set(n,o)}return r}function Jn({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return M;let n=yr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=d(document.body,"click").pipe(ie(n),E(([l,f])=>Bn(l,f)),be());J("navigation.instant.prefetch")&&S(d(document.body,"mousemove"),d(document.body,"focusin")).pipe(ie(n),E(([l,f])=>Bn(l,f)),Ee(25),Dr(({href:l})=>l),lr(l=>{let f=document.createElement("link");return f.rel="prefetch",f.href=l.toString(),document.head.appendChild(f),d(f,"load").pipe(m(()=>f),he(1))})).subscribe(l=>l.remove()),i.pipe(he(1)).subscribe(()=>{let l=le("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ie(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let a=e.pipe(z(ge()),ne("pathname"),Le(1),E(l=>vr(l,{progress$:r}).pipe(Me(()=>(ft(l,!0),M))))),s=new DOMParser,c=a.pipe(E(l=>l.text()),E(l=>{let f=s.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...J("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let U=le(b),Y=le(b,f);typeof U!="undefined"&&typeof Y!="undefined"&&U.replaceWith(Y)}let u=Gn(document.head),h=Gn(f.head);for(let[b,U]of h)U.getAttribute("rel")==="stylesheet"||U.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(U));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=ke("container");return Ve(R("script",v)).pipe(E(b=>{let U=f.createElement("script");if(b.src){for(let Y of b.getAttributeNames())U.setAttribute(Y,b.getAttribute(Y));return b.replaceWith(U),new D(Y=>{U.onload=()=>Y.complete()})}else return U.textContent=b.textContent,b.replaceWith(U),M}),oe(),se(f))}),be());return d(window,"popstate").pipe(m(ge)).subscribe(e),e.pipe(z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual")}),e.pipe(zr(i),z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ie(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):br(l.hash)}),t.pipe(ne("offset"),Ee(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var ei=Vt(Zn());function ti(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ei.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ft(e){return e.type===1}function Er(e){return e.type===3}function ri(e,t){let r=hn(e);return S(W(location.protocol!=="file:"),qe("search")).pipe(We(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:J("search.suggest")}}})),r}function oi({document$:e}){let t=xe(),r=Ke(new URL("../versions.json",t.base)).pipe(Me(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>d(document.body,"click").pipe(y(i=>!i.metaKey&&!i.ctrlKey),ie(o),E(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let c=s.href;return!i.target.closest(".md-version")&&n.get(c)===a?M:(i.preventDefault(),W(c))}}return M}),E(i=>{let{version:a}=n.get(i);return yr(new URL(i)).pipe(m(s=>{let p=ge().href.replace(t.base,"");return s.includes(p.split("#")[0])?new URL(`../${a}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ft(n,!0)),Z([r,o]).subscribe(([n,i])=>{I(".md-header__topic").appendChild(On(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let c of s)for(let p of n.aliases.concat(n.version))if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of pe("outdated"))s.hidden=!1})}function Qa(e,{worker$:t}){let{searchParams:r}=ge();r.has("q")&&(Ze("search",!0),e.value=r.get("q"),e.focus(),qe("search").pipe(We(i=>!i)).subscribe(()=>{let i=ge();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Et(e),n=S(t.pipe(We(Ft)),d(e,"keyup"),o).pipe(m(()=>e.value),te());return Z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),ee(1))}function ni(e,{worker$:t}){let r=new w,o=r.pipe(oe(),se(!0));Z([t.pipe(We(Ft)),r],(i,a)=>a).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&Ze("search",i)}),d(e.form,"reset").pipe(N(o)).subscribe(()=>e.focus());let n=I("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),Qa(e,{worker$:t}).pipe(T(i=>r.next(i)),A(()=>r.complete()),m(i=>j({ref:e},i)),ee(1))}function ii(e,{worker$:t,query$:r}){let o=new w,n=tn(e.parentElement).pipe(y(Boolean)),i=e.parentElement,a=I(":scope > :first-child",e),s=I(":scope > :last-child",e);qe("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ie(r),Kr(t.pipe(We(Ft)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?_e("search.result.none"):_e("search.result.placeholder");break;case 1:a.textContent=_e("search.result.one");break;default:let u=ur(l.length);a.textContent=_e("search.result.other",u)}});let c=o.pipe(T(()=>s.innerHTML=""),E(({items:l})=>S(W(...l.slice(0,10)),W(...l.slice(10)).pipe(Pe(4),Yr(n),E(([f])=>f)))),m(wn),be());return c.subscribe(l=>s.appendChild(l)),c.pipe(re(l=>{let f=le("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(N(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(y(Er),m(({data:l})=>l)).pipe(T(l=>o.next(l)),A(()=>o.complete()),m(l=>j({ref:e},l)))}function Ya(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ge();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ai(e,t){let r=new w,o=r.pipe(oe(),se(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(N(o)).subscribe(n=>n.preventDefault()),Ya(e,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))}function si(e,{worker$:t,keyboard$:r}){let o=new w,n=ke("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(Oe(ae),m(()=>n.value),te());return o.pipe(nt(i),m(([{suggest:s},c])=>{let p=c.split(/([\s-]+)/);if(s!=null&&s.length&&p[p.length-1]){let l=s[s.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(y(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(y(Er),m(({data:s})=>s)).pipe(T(s=>o.next(s)),A(()=>o.complete()),m(()=>({ref:e})))}function ci(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ri(o.search,t),i=ke("search-query",e),a=ke("search-result",e);d(e,"click").pipe(y(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ze("search",!1)),r.pipe(y(({mode:c})=>c==="search")).subscribe(c=>{let p=Ue();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of R(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ze("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...R(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ue()&&i.focus()}}),r.pipe(y(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let s=ni(i,{worker$:n});return S(s,ii(a,{worker$:n,query$:s})).pipe(Ne(...pe("search-share",e).map(c=>ai(c,{query$:s})),...pe("search-suggest",e).map(c=>si(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Je}}function pi(e,{index$:t,location$:r}){return Z([t,r.pipe(z(ge()),y(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ti(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let c=s.textContent,p=o(c);p.length>c.length&&n.set(s,p)}for(let[s,c]of n){let{childNodes:p}=O("span",null,c);s.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ba(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return Z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),te((i,a)=>i.height===a.height&&i.locked===a.locked))}function oo(e,o){var n=o,{header$:t}=n,r=lo(n,["header$"]);let i=I(".md-sidebar__scrollwrap",e),{y:a}=ze(i);return $(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=s.pipe(He(0,Se));return p.pipe(ie(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(We()).subscribe(()=>{for(let l of R(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2})}}}),fe(R("label[tabindex]",e)).pipe(re(l=>d(l,"click").pipe(Oe(ae),m(()=>l),N(c)))).subscribe(l=>{let f=I(`[id="${l.htmlFor}"]`);I(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Ba(e,r).pipe(T(l=>s.next(l)),A(()=>s.complete()),m(l=>j({ref:e},l)))})}function li(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return kt(Ke(`${r}/releases/latest`).pipe(Me(()=>M),m(o=>({version:o.tag_name})),je({})),Ke(r).pipe(Me(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),je({}))).pipe(m(([o,n])=>j(j({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ke(r).pipe(m(o=>({repositories:o.public_repos})),je({}))}}function mi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ke(r).pipe(Me(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),je({}))}function fi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return li(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return mi(r,o)}return M}var Ga;function Ja(e){return Ga||(Ga=$(()=>{let t=__md_get("__source",sessionStorage);if(t)return W(t);if(pe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return fi(e.href).pipe(T(o=>__md_set("__source",o,sessionStorage)))}).pipe(Me(()=>M),y(t=>Object.keys(t).length>0),m(t=>({facts:t})),ee(1)))}function ui(e){let t=I(":scope > :last-child",e);return $(()=>{let r=new w;return r.subscribe(({facts:o})=>{t.appendChild(Tn(o)),t.classList.add("md-source__repository--active")}),Ja(e).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Xa(e,{viewport$:t,header$:r}){return Ce(document.body).pipe(E(()=>gr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function di(e,t){return $(()=>{let r=new w;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(J("navigation.tabs.sticky")?W({hidden:!1}):Xa(e,t)).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Za(e,{viewport$:t,header$:r}){let o=new Map,n=R("[href^=\\#]",e);for(let s of n){let c=decodeURIComponent(s.hash.substring(1)),p=le(`[id="${c}"]`);typeof p!="undefined"&&o.set(s,p)}let i=r.pipe(ne("height"),m(({height:s})=>{let c=ke("main"),p=I(":scope > :first-child",c);return s+.8*(p.offsetTop-c.offsetTop)}),be());return Ce(document.body).pipe(ne("height"),E(s=>$(()=>{let c=[];return W([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),nt(i),E(([c,p])=>t.pipe(Ht(([l,f],{offset:{y:u},size:h})=>{let v=u+h.height>=Math.floor(s.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),te((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,c])=>({prev:s.map(([p])=>p),next:c.map(([p])=>p)})),z({prev:[],next:[]}),Pe(2,1),m(([s,c])=>s.prev.length{let i=new w,a=i.pipe(oe(),se(!0));if(i.subscribe(({prev:s,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===s.length-1)}),J("toc.follow")){let s=S(t.pipe(Ee(1),m(()=>{})),t.pipe(Ee(250),m(()=>"smooth")));i.pipe(y(({prev:c})=>c.length>0),nt(o.pipe(Oe(ae))),ie(s)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=dr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2,behavior:p})}}})}return J("navigation.tracking")&&t.pipe(N(a),ne("offset"),Ee(250),Le(1),N(n.pipe(Le(1))),mt({delay:250}),ie(i)).subscribe(([,{prev:s}])=>{let c=ge(),p=s[s.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Za(e,{viewport$:t,header$:r}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function es(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Pe(2,1),m(([a,s])=>a>s&&s>0),te()),i=r.pipe(m(({active:a})=>a));return Z([i,n]).pipe(m(([a,s])=>!(a&&s)),te(),N(o.pipe(Le(1))),se(!0),mt({delay:250}),m(a=>({hidden:a})))}function bi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(N(a),ne("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),es(e,{viewport$:t,main$:o,target$:n}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))}function vi({document$:e}){e.pipe(E(()=>R(".md-ellipsis")),re(t=>St(t).pipe(N(e.pipe(Le(1))),y(r=>r),m(()=>t),he(1))),y(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Qe(o).pipe(N(e.pipe(Le(1))),A(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(E(()=>R(".md-status")),re(t=>Qe(t))).subscribe()}function gi({document$:e,tablet$:t}){e.pipe(E(()=>R(".md-toggle--indeterminate")),T(r=>{r.indeterminate=!0,r.checked=!1}),re(r=>d(r,"change").pipe(Qr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ie(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function ts(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function xi({document$:e}){e.pipe(E(()=>R("[data-md-scrollfix]")),T(t=>t.removeAttribute("data-md-scrollfix")),y(ts),re(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function yi({viewport$:e,tablet$:t}){Z([qe("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>W(r).pipe(Xe(r?400:100))),ie(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function rs(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",no.base)}`).pipe(m(()=>__index),ee(1)):Ke(new URL("search/search_index.json",no.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var st=Go(),Wt=nn(),Mt=sn(Wt),io=on(),$e=dn(),wr=Rt("(min-width: 960px)"),wi=Rt("(min-width: 1220px)"),Ti=cn(),no=xe(),Si=document.forms.namedItem("search")?rs():Je,ao=new w;Yn({alert$:ao});var so=new w;J("navigation.instant")&&Jn({location$:Wt,viewport$:$e,progress$:so}).subscribe(st);var Ei;((Ei=no.version)==null?void 0:Ei.provider)==="mike"&&oi({document$:st});S(Wt,Mt).pipe(Xe(125)).subscribe(()=>{Ze("drawer",!1),Ze("search",!1)});io.pipe(y(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=le("link[rel=prev]");typeof t!="undefined"&&ft(t);break;case"n":case".":let r=le("link[rel=next]");typeof r!="undefined"&&ft(r);break;case"Enter":let o=Ue();o instanceof HTMLLabelElement&&o.click()}});vi({document$:st});gi({document$:st,tablet$:wr});xi({document$:st});yi({viewport$:$e,tablet$:wr});var at=Dn(ke("header"),{viewport$:$e}),jt=st.pipe(m(()=>ke("main")),E(e=>qn(e,{viewport$:$e,header$:at})),ee(1)),os=S(...pe("consent").map(e=>vn(e,{target$:Mt})),...pe("dialog").map(e=>Un(e,{alert$:ao})),...pe("header").map(e=>Vn(e,{viewport$:$e,header$:at,main$:jt})),...pe("palette").map(e=>Kn(e)),...pe("progress").map(e=>Qn(e,{progress$:so})),...pe("search").map(e=>ci(e,{index$:Si,keyboard$:io})),...pe("source").map(e=>ui(e))),ns=$(()=>S(...pe("announce").map(e=>bn(e)),...pe("content").map(e=>Nn(e,{viewport$:$e,target$:Mt,print$:Ti})),...pe("content").map(e=>J("search.highlight")?pi(e,{index$:Si,location$:Wt}):M),...pe("header-title").map(e=>zn(e,{viewport$:$e,header$:at})),...pe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Gr(wi,()=>oo(e,{viewport$:$e,header$:at,main$:jt})):Gr(wr,()=>oo(e,{viewport$:$e,header$:at,main$:jt}))),...pe("tabs").map(e=>di(e,{viewport$:$e,header$:at})),...pe("toc").map(e=>hi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})),...pe("top").map(e=>bi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})))),Oi=st.pipe(E(()=>ns),Ne(os),ee(1));Oi.subscribe();window.document$=st;window.location$=Wt;window.target$=Mt;window.keyboard$=io;window.viewport$=$e;window.tablet$=wr;window.screen$=wi;window.print$=Ti;window.alert$=ao;window.progress$=so;window.component$=Oi;})(); diff --git a/assets/stylesheets/main.0ab26e37.min.css b/assets/stylesheets/main.0ab26e37.min.css new file mode 100644 index 0000000..1250d9b --- /dev/null +++ b/assets/stylesheets/main.0ab26e37.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{display:block;font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:block}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.382dd0b9.min.css b/assets/stylesheets/main.382dd0b9.min.css deleted file mode 100644 index 5812f02..0000000 --- a/assets/stylesheets/main.382dd0b9.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{display:block;font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:block}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/getting-started/docker/cli/index.html b/getting-started/docker/cli/index.html index a97a6e3..aa95d0c 100644 --- a/getting-started/docker/cli/index.html +++ b/getting-started/docker/cli/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2126,7 +2126,7 @@

Cookie consent

- + diff --git a/getting-started/docker/composition/index.html b/getting-started/docker/composition/index.html index fad1e9c..d3eb0d5 100644 --- a/getting-started/docker/composition/index.html +++ b/getting-started/docker/composition/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2291,7 +2291,7 @@

Cookie consent

- + diff --git a/getting-started/docker/debug/index.html b/getting-started/docker/debug/index.html index ff14aa0..d515911 100644 --- a/getting-started/docker/debug/index.html +++ b/getting-started/docker/debug/index.html @@ -23,7 +23,7 @@ - + @@ -31,7 +31,7 @@ - + @@ -2232,7 +2232,7 @@

Cookie consent

- + diff --git a/getting-started/docker/images/index.html b/getting-started/docker/images/index.html index c714e78..95f79ce 100644 --- a/getting-started/docker/images/index.html +++ b/getting-started/docker/images/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2226,7 +2226,7 @@

Cookie consent

- + diff --git a/getting-started/docker/index.html b/getting-started/docker/index.html index 47e3285..335de5d 100644 --- a/getting-started/docker/index.html +++ b/getting-started/docker/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1957,7 +1957,7 @@

Cookie consent

- + diff --git a/getting-started/docker/installation/basic/index.html b/getting-started/docker/installation/basic/index.html index 21d0107..a5c606c 100644 --- a/getting-started/docker/installation/basic/index.html +++ b/getting-started/docker/installation/basic/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2117,7 +2117,7 @@

Cookie consent

- + diff --git a/getting-started/docker/installation/configuration/index.html b/getting-started/docker/installation/configuration/index.html index 66f09dc..e1c08fb 100644 --- a/getting-started/docker/installation/configuration/index.html +++ b/getting-started/docker/installation/configuration/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2072,7 +2072,7 @@

Cookie consent

- + diff --git a/getting-started/docker/installation/gui/index.html b/getting-started/docker/installation/gui/index.html index f536f9d..89e1e4a 100644 --- a/getting-started/docker/installation/gui/index.html +++ b/getting-started/docker/installation/gui/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2159,7 +2159,7 @@

Cookie consent

- + diff --git a/getting-started/docker/installation/requirements/index.html b/getting-started/docker/installation/requirements/index.html index 2b21fae..04c3fcb 100644 --- a/getting-started/docker/installation/requirements/index.html +++ b/getting-started/docker/installation/requirements/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1725,13 +1725,13 @@

Get the ovos-docker sources -
git clone https://github.com/OpenVoiceOS/ovos-docker.git
+
git clone https://github.com/OpenVoiceOS/ovos-docker.git ~/ovos-docker
 mkdir -p ~/ovos/{config,share,tmp} ~/hivemind/{config,share}
 chown ${USER}:${USER} -R ~/ovos ~/hivemind
 cd ~/ovos-docker/compose
 

Enable user manager

-

Because some containers require /run/user/1000 to be mounted, systemd should be instruct to log the user during the boot process and mak/run/user/1000 directory available before the containers start.

+

Because some containers require /run/user/1000 to be mounted, systemd should be instructed to log the user during the boot process and make /run/user/1000 directory available before the containers start.

@@ -1747,7 +1747,7 @@

Enable user managerSet the environment file

.env file is a strong requirement

-

Please make sure to read and understand this section as if you don't the deployment migth fail.

+

Please make sure to read and understand this section as if you don't then the deployment migth fail.

The composer requires an environment file in order to deploy the services and volumes with the correct settings for your setup.

@@ -1814,7 +1814,7 @@

Set the environment file - November 13, 2023 + November 20, 2023 @@ -2122,7 +2122,7 @@

Cookie consent

- + diff --git a/getting-started/docker/installation/skills/index.html b/getting-started/docker/installation/skills/index.html index 86e1dc5..6cfb511 100644 --- a/getting-started/docker/installation/skills/index.html +++ b/getting-started/docker/installation/skills/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1741,7 +1741,7 @@

As part of ovos_core contai

The main advantage of this method is the simplicity but the downside will be more Python dependencies (libraries) within the ovos_core container, potential conflicts across them, a lack of isolation and a slower start of the container.

The second method is to leverage the ovos-workshop component by running a skill as standalone, it means the skill will not be part of ovos_core container but it will be running inside its own container.

-

The main advantage is that each skill are isolated which provide more flexibility about Python dependencies (libraries), packages. It is easier to update and more secure but the downside will be that more system resources will be consumed and a container image has to be built for each skill.

+

The main advantage is that each skill is isolated which provide more flexibility about Python dependencies (libraries), packages. It is easier to update and more secure but the downside will be that more system resources will be consumed and a container image has to be built for each skill.

Podman users 💪

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

@@ -1868,7 +1868,7 @@

Containers status - October 23, 2023 + November 20, 2023 @@ -2176,7 +2176,7 @@

Cookie consent

- + diff --git a/getting-started/docker/plugins/microphone/index.html b/getting-started/docker/plugins/microphone/index.html index 5da506d..2025239 100644 --- a/getting-started/docker/plugins/microphone/index.html +++ b/getting-started/docker/plugins/microphone/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2060,7 +2060,7 @@

Cookie consent

- + diff --git a/getting-started/docker/plugins/phal/index.html b/getting-started/docker/plugins/phal/index.html index e320b95..afd0a96 100644 --- a/getting-started/docker/plugins/phal/index.html +++ b/getting-started/docker/plugins/phal/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1975,7 +1975,7 @@

Cookie consent

- + diff --git a/getting-started/docker/plugins/stt/index.html b/getting-started/docker/plugins/stt/index.html index 85d06d3..25e040b 100644 --- a/getting-started/docker/plugins/stt/index.html +++ b/getting-started/docker/plugins/stt/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1970,7 +1970,7 @@

Cookie consent

- + diff --git a/getting-started/docker/plugins/tts/index.html b/getting-started/docker/plugins/tts/index.html index a45e072..9d181aa 100644 --- a/getting-started/docker/plugins/tts/index.html +++ b/getting-started/docker/plugins/tts/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1972,7 +1972,7 @@

Cookie consent

- + diff --git a/getting-started/docker/prerequisites/cpu/index.html b/getting-started/docker/prerequisites/cpu/index.html index 8dd3478..f7b7b42 100644 --- a/getting-started/docker/prerequisites/cpu/index.html +++ b/getting-started/docker/prerequisites/cpu/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1955,7 +1955,7 @@

Cookie consent

- + diff --git a/getting-started/docker/prerequisites/engine/index.html b/getting-started/docker/prerequisites/engine/index.html index 05325bc..445165f 100644 --- a/getting-started/docker/prerequisites/engine/index.html +++ b/getting-started/docker/prerequisites/engine/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2146,7 +2146,7 @@

Cookie consent

- + diff --git a/getting-started/docker/prerequisites/sound/index.html b/getting-started/docker/prerequisites/sound/index.html index b898a99..bb0db9a 100644 --- a/getting-started/docker/prerequisites/sound/index.html +++ b/getting-started/docker/prerequisites/sound/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2181,7 +2181,7 @@

Cookie consent

- + diff --git a/getting-started/docker/security/hardening/index.html b/getting-started/docker/security/hardening/index.html index ac95cb1..b575be0 100644 --- a/getting-started/docker/security/hardening/index.html +++ b/getting-started/docker/security/hardening/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2177,7 +2177,7 @@

Cookie consent

- + diff --git a/getting-started/docker/security/hivemind/index.html b/getting-started/docker/security/hivemind/index.html index 6268616..e3c4de7 100644 --- a/getting-started/docker/security/hivemind/index.html +++ b/getting-started/docker/security/hivemind/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -2131,7 +2131,7 @@

Cookie consent

- + diff --git a/getting-started/docker/update/index.html b/getting-started/docker/update/index.html index 17b2112..5f085b3 100644 --- a/getting-started/docker/update/index.html +++ b/getting-started/docker/update/index.html @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -1954,7 +1954,7 @@

Cookie consent

- + diff --git a/index.html b/index.html index 3ce4f9e..69686b2 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + @@ -1827,7 +1827,7 @@

Cookie consent

- + diff --git a/search/search_index.json b/search/search_index.json index 5e781a6..60abae1 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Getting started","text":""},{"location":"#getting-started","title":"Getting started","text":"

Want to give Open Voice OS a try? Open Voice OS is an open source software that runs where you want it to, whether it\u2019s on your own hardware or one of the dedicated Mark 1 or Mark II.

  • Docker

    arm64 x86_64

    Use container engine such as Docker or Podman and their composer to run a complete, secure, isolated and \"easy to update\" instance of Open Voice OS!

    Getting started with Docker

"},{"location":"about/what-is-it/","title":"What is it?","text":""},{"location":"about/what-is-it/#what-is-open-voice-os","title":"What is Open Voice OS?","text":"

Open Voice OS is a free and open source personal assistant and smart speaker that offers a powerful and flexible alternative to proprietary solutions like Amazon\u2122 Alexa\u2122, Google Assistant\u2122, Microsoft Cortana\u2122 or Apple's Siri\u2122.

At the same time, it is also an open virtual assistant platform that enables developers and organizations to create custom voice-controlled applications. With its cutting-edge technology and user-friendly design, Open Voice OS is revolutionizing the way we interact with technology.

The platform provides a comprehensive suite of features that makes it easy to deploy voice-based applications for a wide range of use cases, including home automation, entertainment, education, and more. With natural language processing, multi-device compatibility, a customizable UI, robust APIs, and a focus on privacy and security, Open Voice OS delivers a highly responsive and accurate experience for users.

Open Voice OS is the perfect choice for anyone who wants a personal assistant and smart speaker that gives them complete control over their data and the ability to customize their experience.

In addition to its voice capabilities, Open Voice OS also features a touch-screen GUI made using QT and the KDE frameworks, providing an intuitive and user-friendly interface. And with its open source nature, anyone with technical skills can contribute to the platform and help shape its future.

"},{"location":"about/why-use-ovos/","title":"Why use OVOS?","text":""},{"location":"about/why-use-ovos/#why-use-ovos","title":"Why use OVOS?","text":"

Whether you prefer voice commands or a more traditional touch interface, Open Voice OS has you covered, and the option to run the platform fully offline gives you complete control over your data and ensures that your information is never shared with third parties.

With its powerful and flexible features, Open Voice OS is the ideal choice for anyone who wants a voice-controlled virtual assistant and smart speaker that offers complete control and customization. Whether you\u2019re a software developer, data scientist, or just someone with a passion for technology, be sure to check out Open Voice OS today!

"},{"location":"about/why-use-ovos/#multi-device-compatibility","title":"Multi-device compatibility","text":"

Open Voice OS can be integrated with a wide range of devices making it easy for you to access and control your virtual assistant no matter where you are.

  • Smart speakers
  • Smartphones
  • System on a chip (SoC)
  • Laptops
  • Televisions
"},{"location":"about/why-use-ovos/#customizable-ui","title":"Customizable UI","text":"

With its easy-to-use GUI interface, Open Voice OS allows developers to create custom interfaces that match their specific brand and style. Whether you\u2019re a business looking to integrate voice control into your product offerings, or a home user who wants a unique interface that matches your personal style, Open Voice OS has you covered.

"},{"location":"about/why-use-ovos/#robust-modular","title":"Robust & Modular","text":"

Open Voice OS leverages the power of skills and plugins to create a robust and modular virtual assistant platform, offering unparalleled customization and extension capabilities.

"},{"location":"about/why-use-ovos/#fully-offline","title":"Fully offline","text":"

Open Voice OS can run without the use of any online Text-To-Speech (TTS) or Speech-To-Text (STT) services, so you don\u2019t have to rely on anyone keeping their servers up or recording your requests.

"},{"location":"about/why-use-ovos/#privacy-and-security","title":"Privacy and security","text":"

Open Voice OS is designed with privacy and security in mind. Whether you\u2019re concerned about the security of your personal information or the privacy of your voice commands, Open Voice OS provides peace of mind.

"},{"location":"about/glossary/components/","title":"Components","text":""},{"location":"about/glossary/components/#components","title":"Components","text":"

Open Voice OS is very modular which means instead of a big monolith block of code, multiple projects exist around the OVOS ecosystem with each of them having their own role to play in order to deliver the best and fastest experience.

"},{"location":"about/glossary/components/#ovos-audio","title":"ovos-audio","text":"

The audio service is responsible for loading Text-To-Speech and audio plugins.

All audio playback (sounds played on the speakers) is handled by this service by leveraging the sound server/service from the system where its running.

"},{"location":"about/glossary/components/#ovos-common-play","title":"ovos-common-play","text":"

OVOS Common Play (OCP) is a full-fledged voice media player packaged as an audio plugin.

OCP handles the whole voice integration and playback functionality, it also integrates with external players via Media Player Remote Interfacing Specification (MPRIS).

"},{"location":"about/glossary/components/#ovos-config","title":"ovos-config","text":"

Helper package to interact with OVOS configuration. A small tool is included to quickly show, get or set config values.

"},{"location":"about/glossary/components/#ovos-core","title":"ovos-core","text":"

The skills service is responsible for loading skills and intent parsers, all user queries are handled by the skills service.

This is the brains of the device. Without it, you would have some cool software that does not work together. It controls the skills service and directs intents to the right skill.

"},{"location":"about/glossary/components/#ovos-classifiers","title":"ovos-classifiers","text":"

Base implementations for Natural language processing (NPL) tasks, from baseline heuristics to classic machine learning models that run everywhere.

"},{"location":"about/glossary/components/#ovos-gui","title":"ovos-gui","text":"

OVOS uses the standard Mycroft GUI framework, you can find the official documentation here.

The GUI is an open source visual and display framework running on top of KDE Plasma Technology and built using Kirigami a lightweight user interface framework for convergent applications which are empowered by QT.

Component dependency

This component depends on ovos-gui-messagebus.

"},{"location":"about/glossary/components/#ovos-gui-messagebus","title":"ovos-gui-messagebus","text":"

GUI messagebus service, manages GUI state and implements the GUI protocol.

The GUI service provides a websocket for gui clients to connect to, it is responsible for implementing the gui protocol under ovos-core.

GUI clients (the application that actually draws the GUI) connect to this service.

"},{"location":"about/glossary/components/#ovos-listener","title":"ovos-listener","text":"

The listener (also known as speech) is responsible for loading STT, VAD and wake word plugins. Speech is transcribed into text (intent) and forwarded to the core service.

The newest listener that OVOS uses is ovos-dinkum-listener. It is a version of the listener from the Mycroft Dinkum software for the Mark 2 modified for use with OVOS.

"},{"location":"about/glossary/components/#ovos-messagebus","title":"ovos-messagebus","text":"

The message bus service provides a websocket where all internal events travel, you can think of the bus service as Open Voice OS's nervous system.

Internal usage only

The bus is considered as an internal and private websocket, external clients should not connect directly to it. Please check HiveMind for more information. For more detail please go to the System Hardening section

"},{"location":"about/glossary/components/#ovos-phal","title":"ovos-phal","text":"

Plugin based Hardware Abstraction Layer is a wrapper for software system level abstraction, where based on the environment either through known configuration or via fingerprinting, only specific plugins load to interface with the system and specific hardware.

A PHAL plugin can provide anything from hardware integrations (ReSpeaker, Mark1, Mark2, etc...) or system integrations (Network-Manager, OVOS Shell, etc...).

Any number of plugins providing functionality can be loaded and validated at runtime, plugins can be system integrations to handle things like reboot and shutdown, or hardware drivers such as Mycroft Mark2 plugin.

PHAL admin variant

In addition of the initial PHAL service, PHAL admin is running as root or as a priviledged user. This variant allows PHAL admin to perform actions which require more privileges such as reboot for example.

"},{"location":"about/glossary/components/#ovos-plugin-manager","title":"ovos-plugin-manager","text":"

OPM is the OVOS Plugin Manager, this base package provides arbitrary plugins to the OVOS ecosystem. OPM plugins import their base classes from OPM making them portable and independent of ovos-core, plugins can be used in a standalone projects.

By using OPM you can ensure a standard interface to plugins and easily make them configurable in your project.

"},{"location":"about/glossary/components/#ovos-shell","title":"ovos-shell","text":"

OVOS Shell is the Open Voice OS client implementation of the ovos-gui library, basically it represents the OVOS graphical layer on top of Mycroft GUI.

Component dependency

This component depends on ovos-gui.

"},{"location":"about/glossary/components/#ovos-utils","title":"ovos-utils","text":"

Just a collection of simple utilities and functions for use across the components from the OVOS ecosystem.

"},{"location":"about/glossary/components/#ovos-workshop","title":"ovos-workshop","text":"

Workshop contains skill base classes and supporting tools to build skills and applications for Open Voice OS systems.

"},{"location":"about/glossary/components/#padacioso","title":"padacioso","text":"

A lightweight, dead-simple intent parser which aim to replace the current intent parser; Padatious.

"},{"location":"about/glossary/terms/","title":"Terms","text":""},{"location":"about/glossary/terms/#glossary","title":"Glossary","text":"

Use our Glossary to learn more about the specialist terms that we use in natural language processing generally, and more specifically with Open Voice OS software.

"},{"location":"about/glossary/terms/#fallback","title":"Fallback","text":"

A skill that is designated to be a 'catch-all' when Open Voice OS cannot interpret the intent from an utterance.

"},{"location":"about/glossary/terms/#hivemind","title":"HiveMind","text":"

HiveMind is a community-developed superset or extension of Open Voice OS the open-source voice operating system.

With HiveMind, you can extend an instance of Open Voice OS to as many devices as you want, including devices that can't ordinarily run Open Voice OS!

HiveMind could be considered as an external Open Voice OS component leaving its \"own\" life under its \"own\" lifecycle.

"},{"location":"about/glossary/terms/#hotword","title":"Hotword","text":"

See wake word.

"},{"location":"about/glossary/terms/#intent","title":"Intent","text":"

When a user speaks an utterance to Open Voice OS, Open Voice OS tries to interpret the intent of the utterance, and match the intent with a skill.

"},{"location":"about/glossary/terms/#playback","title":"Playback","text":"

Playback is the audio output going through the speakers, for example when asking What's the temperature?, OVOS will speaks to you using the playback capability.

"},{"location":"about/glossary/terms/#plugin","title":"Plugin","text":"

A plugin allows you to install \"small bricks\" of functionnalities using OVOS Plugin Manager in order to make your voice assistant more capable.

Open Voice OS uses many plugins in many different areas:

  • Wake word plugin
  • VAD plugins
  • Microphone plugins
  • PHAL plugins
  • TTS plugins
  • STT plugins
  • etc...
"},{"location":"about/glossary/terms/#skill","title":"Skill","text":"

When Open Voice OS hears the wake word, then an utterance, Open Voice OS will try to find a skill that matches the utterance. The skill might fetch some data, or play some audio, or speak, or display some information.

If Open Voice OS can't find a skill that matches the utterance, he will tell you he doesn't understand and fallback (when configured).

"},{"location":"about/glossary/terms/#speech-to-text-stt","title":"Speech-To-Text (STT)","text":"

Speech-To-Text is what converts your voice into a text which becomes a commands that OVOS recognizes, then converts to an intent that is used to activate skills.

Several options are available each with different attributes and supported languages. Some can be run on device, others need an internet connection to work.

"},{"location":"about/glossary/terms/#text-to-speech-tts","title":"Text-To-Speech (TTS)","text":"

Text-To-Speech is responsible for converting text into audio for playback (verbal response from OVOS).

Several options are available each with different attributes and supported languages. Some can be run on device, others need an internet connection to work.

"},{"location":"about/glossary/terms/#utterance","title":"Utterance","text":"

An utterance is how you interact with Open Voice OS. An utterance is a command or question - like What's the weather like in Kansas City? or Tell me about the Pembroke Welsh Corgi.

"},{"location":"about/glossary/terms/#vad","title":"VAD","text":"

Voice Activity Detection is used by the listener to determine when a user stopped speaking, this indicates the voice command is ready to be executed.

"},{"location":"about/glossary/terms/#wake-word","title":"Wake Word","text":"

The wake word is the phrase or word you use to (wake up) tell Open Voice OS you're about to issue a command.

"},{"location":"getting-started/docker/","title":"Docker or Podman","text":""},{"location":"getting-started/docker/#docker-or-podman","title":"Docker or Podman","text":"

Before going further, here are quick and simple definitions of what a container is and what a composer is, these definitions are important and must be well understood before starting.

Two engines, same definition

Both of the definitions described below are valid for either Docker or Podman.

"},{"location":"getting-started/docker/#container-definition","title":"Container definition","text":"

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A container image is a lightweight, standalone, executable package of software that includes everything needed to run an application.

Initial source

"},{"location":"getting-started/docker/#composer-definition","title":"Composer definition","text":"

A composer is a tool for defining and running multi-container container applications. With Compose, you use a YAML file to configure your application\u2019s services. Then, with a single command, you create and start all the services from your configuration.

Initial source

"},{"location":"getting-started/docker/cli/","title":"OVOS command line","text":""},{"location":"getting-started/docker/cli/#open-voice-os-command-line","title":"Open Voice OS command line","text":"

The command line allows you to send a message (but not only) directly to the message bus by using the ovos-cli-client command from the ovo_cli container.

Skill interactions

The command line doesn't support any action related to skills other than :skills as this setup is running inside containers. Please read the skill section to manage skills.

"},{"location":"getting-started/docker/cli/#ovos-cli-client","title":"ovos-cli-client","text":"

ovos-cli-client is deprecated

Please read https://github.com/OpenVoiceOS/ovos-cli-client/issues/14 for more information.

Interact directly with the ncurses OVOS client interface.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-cli-client\n
podman exec --interactive --tty ovos_cli ovos-cli-client\n
"},{"location":"getting-started/docker/cli/#ovos-config","title":"ovos-config","text":"

To display or manage the current configuration, the ovos-config command could be used.

read-write access to the configuration

The ovos_cli container is the only one having read-write access to the mycroft.conf configuration file.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-config show\n
podman exec --interactive --tty ovos_cli ovos-config show\n

vim as default editor

vim and nano editors are available within the ovos-cli image, vim has been set as default.

"},{"location":"getting-started/docker/cli/#ovos-speak","title":"ovos-speak","text":"

An easy way to make Open Voice OS speaks is to run the ovos-speak command.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-speak \"hello world\"\n
podman exec --interactive --tty ovos_cli ovos-speak \"hello world\"\n
"},{"location":"getting-started/docker/cli/#mana","title":"mana","text":"

Neon Mana (Messagebus Application for Neon AI) provides tools for interacting with the message bus.

DockerPodman
docker exec --interactive --tty ovos_cli mana --help\n
podman exec --interactive --tty ovos_cli mana --help\n
"},{"location":"getting-started/docker/composition/","title":"Composition","text":""},{"location":"getting-started/docker/composition/#composition-and-environment-files","title":"Composition and environment files","text":"

The easiest and quickest way to deploy Open Voice OS containers is to use a composer such as docker composer or podman-compose.

"},{"location":"getting-started/docker/composition/#composition-files","title":"Composition files","text":"

Composition files provide an easy way to provision the stack (services and volumes) with the required options and configuration for each of the services.

Compose file Platforms Description docker-compose.yml Install core components (except the GUI) docker-compose.gui.yml Install GUI components docker-compose.skills.yml Install pre-defined skills docker-compose.hivemind.yml Install HiveMind components docker-compose.macos.yml Install core components (except the GUI) docker-compose.windows.yml Install core components (except the GUI) docker-compose.raspberrypi.yml Add GPIO support to ovos_core component docker-compose.raspberrypi.gui.yml Add /dev/vchiq to ovos_gui component"},{"location":"getting-started/docker/composition/#environment-files","title":"Environment files","text":"

A Docker or Podman environment file contains lines about environment variables that are usable by the Docker or Podman command line. It is a convenient way to pass many environment variables to a single command.

Environment file Platforms Description .env Set of variables used by the composition files .env-raspberrypi Add GPIO_GID variable

Some variables might need to be tuned to match your setup such as the TZ, XDG_RUNTIME_DIR, etc...

Variable Default Platforms Description DISPLAY :0 Display used by X or Wayland GPIO_GID 997 gpio group ID on Raspberry Pi HIVEMIND_CONFIG_FOLDER ~/hivemind/config HiveMind configuration directory HIVEMIND_SHARE_FOLDER ~/hivemind/share HiveMind shared directory HIVEMIND_USER hivemind User running in the container INPUT_GID 102 input group ID OVOS_CONFIG_FOLDER ~/ovos/config OVOS configureation directory OVOS_SHARE_FOLDER ~/ovos/share OVOS shared directory OVOS_USER ovos User running in the container PULL_POLICY always Policy to pull Docker images RENDER_GID 106 render group ID TMP_FOLDER ~/ovos/tmp OVOS temporary directory TZ America/Montreal Timezone to set in the container VERSION alpha Container image tag to pull VIDEO_GID 44 video group ID XDG_RUNTIME_DIR /run/user/1000 Path to XDG runtime directory

Do not change OVOS_USER or HIVEMIND_USER

The OVOS_USER and HIVEMIND_USER variables should not be changed except if you build your own container images which a different one.

"},{"location":"getting-started/docker/composition/#how-to-get-the-gid","title":"How to get the GID?","text":"

The getent command could be used in order to get the GID of gpio and render groups.

Raspberry PiLinux
getent group gpio\ngetent group render\ngetent group video\ngetent group input\n
getent group render    \ngetent group video\ngetent group input\n
"},{"location":"getting-started/docker/composition/#how-to-get-the-uid","title":"How to get the UID?","text":"

The XDG_RUNTIME_DIR variables requires a UID, this UID is the unique ID of the current user which will run the docker compose or podman-compose command.

LinuxWindows WSL2
echo $UID\n
echo $UID\n

XDG Base Directory

Mac OS doesn't leverage XDG_RUNTIME_DIR variable as there is no support of XDG Base Directory on Mac OS.

"},{"location":"getting-started/docker/debug/","title":"Debugging","text":""},{"location":"getting-started/docker/debug/#debugging","title":"Debugging","text":""},{"location":"getting-started/docker/debug/#enable-debug-mode","title":"Enable debug mode","text":"

First thing's first, enable the Open Voice OS's debug mode in ~/ovos/config/mycroft.conf to get more verbosity from the logs.

Restart containers

All containers will have to be restarted to receive the configuration change.

~/ovos/config/mycroft.conf
{\n  \"debug\": true,\n  \"log_level\": \"DEBUG\"\n}\n

Note

The commands below don't have to be executed in the same order as they are presented, free free to run them in the order you want!

"},{"location":"getting-started/docker/debug/#all-containers-logs","title":"All containers logs","text":"

Access all the container logs at the same time, run the following command (make sure it matches the docker compose or podman-compose command you run to deploy the stack).

DockerPodman
docker compose --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --env-file .env logs --follow --tail 200\n
podman-compose --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --env-file .env logs --follow --tail 200\n
"},{"location":"getting-started/docker/debug/#specific-contaienr-logs","title":"Specific contaienr logs","text":"

Access the logs of a specific container.

DockerPodman
docker logs --follow --tail 200 ovos_audio\n
podman logs --follow --tail 200 ovos_audio\n
"},{"location":"getting-started/docker/debug/#run-command-in-a-container","title":"Run command in a container","text":"

Execute a command inside a container without going into it.

DockerPodman
docker exec --tty --interactive ovos_audio pactl info\n
podman exec --tty --interactive ovos_audio pactl info\n
"},{"location":"getting-started/docker/debug/#connect-inside-a-container","title":"Connect inside a container","text":"

Go inside a container and run multiple commands (where sh is the available shell in there).

DockerPodman
docker exec --tty --interactive ovos_audio sh\n
podman exec --tty --interactive ovos_audio sh\n
"},{"location":"getting-started/docker/debug/#configuration-syntax-check","title":"Configuration syntax check","text":"

Make sure the mycroft.conf configuration file is JSON valid by using the jq command.

jq command

In order to use the jq command, the package should be installed on your operating system.

cat ~/ovos/config/mycroft.conf | jq\n

If the configuration file is not valid JSON, jq will return something like this:

parse error: Expected another key-value pair at line 81, column 3\n
"},{"location":"getting-started/docker/debug/#dockerpodman-consumption","title":"Docker/Podman consumption","text":"

Get the CPU, memory and I/O consumption per container.

DockerPodman
docker stats --all --no-trunc\n
podman stats --all --no-trunc\n
"},{"location":"getting-started/docker/debug/#dockerpodman-volume-usage","title":"Docker/Podman volume usage","text":"

Get the disk usage per volumes.

DockerPodman
docker system df\n
podman system df\n
"},{"location":"getting-started/docker/images/","title":"Images and volumes","text":""},{"location":"getting-started/docker/images/#images","title":"Images","text":"

Pre-build images

Open Voice OS provides pre-build images available on Docker Hub. These images are referenced by default within the docker-compose.*.yml files.

Open Voice OS is a sofisticated piece of software which has several components. These components have been split into containers to provide a better isolation and a microservices approach.

"},{"location":"getting-started/docker/images/#supported-cpu-architectures","title":"Supported CPU architectures","text":"

Container images could be used for different CPU architectures using the multi-platform images feature.

CPU architecture Description amd64 Such as AMD and Intel processors aarch64 Such as Raspberry Pi 64-bit SoC armv7l Such as Raspberry Pi 32-bit SoC (not supported because of onnxruntime1)"},{"location":"getting-started/docker/images/#containers","title":"Containers","text":"

The list below is not exhaustive and doesn't mention anything about skill containers, but it is a fair list of the main components currently supported in ovos-docker.

Container Description ovos_messagebus Read more about ovos-messagebus ovos_phal Read more about ovos-phal ovos_phal_admin Read more about ovos-phal admin variant ovos_audio Read more about ovos-audio ovos_listener Read more about ovos-listener ovos_core Read more about ovos-core ovos_cli Read more about ovos-cli ovos_gui_websocket Read more about ovos-gui-messagebus ovos_gui Read more about ovos-gui hivemind_listener Read more about hivemind-listener hivemind_cli Read more about hivemind-cli"},{"location":"getting-started/docker/images/#tags","title":"Tags","text":"

Container image tags allows you to deploy a specific version of Open Voice OS, it could be an untested version based on nigthly build or a stable version.

Image tag Description alpha Nightly build based on alpha releases from PyPi 0.0.8a Nightly build based on alpha releases from PyPi stable Build at every new stable release 0.0.8 Build at every new stable release

Stable release

As Open Voice OS doesn't have a stable release for version 0.0.8 which has been designed to work with containers, there is no stable or 0.0.8 tags available yet.

"},{"location":"getting-started/docker/images/#volumes","title":"Volumes","text":"

To allow data persistence, Docker or Podman volumes are required, they will prevent downloading the requirements everytime the containers are re-created.

Volume Description ovos_gui_file Share QML files from skills between the GUI message bus and the GUI client ovos_listener_records Wake words and utterances recorded samples ovos_models Models downloaded by precise-lite wake word plugin ovos_nltk Punkt Python package required by NLTK ovos_tts_cache .wav and .pho files acting as cache from TTS transcription ovos_vosk Models downloaded by VOSK during the initial boot

ovos_listener_records allows you to store samples of wake words and utterances which could help you to build or improve models.

Enable samples recording

By default the recording features are disabled, \"record_wake_words\": true and \"save_utterances\": true will have to be added to the listener section of mycroft.conf to enable these capabilities.

~/ovos/config/mycroft.conf
{\n\"listener\": {\n    \"record_wake_words\": true,\n    \"save_utterances\": true\n  }\n}\n

But first thing's first you need to have Open Voice OS's containers up and running. Follow the guide.

  1. https://github.com/microsoft/onnxruntime/issues/15337 \u21a9

"},{"location":"getting-started/docker/update/","title":"Update Open Voice OS","text":""},{"location":"getting-started/docker/update/#update-open-voice-os","title":"Update Open Voice OS","text":"

Exact same command

In order to update the deployed stack (services and volumes), you must use the exact same command that has been used during the initial stack deployment.

The easiest and quickest way to update an Open Voice OS stack already deployed by docker compose or podman-compose is; of course to use docker compose or podman-compose as well.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml  up --detach\n

Because the pull_policy option of each service is set to always, everytime that a new image is uploaded with the same tag docker compose or podman-compose will pull-it and re-create the container based on this new image.

Change the version

If you want to change the image's tag to deploy, update the .env file with the right one. The alpha tag images are rebuilt every nights with the latest commits from the dev branch.

"},{"location":"getting-started/docker/installation/basic/","title":"Core components","text":""},{"location":"getting-started/docker/installation/basic/#install-open-voice-os","title":"Install Open Voice OS","text":"

This section covers the installation of the core components only.

Only core components

Keep following the documentation if you want to install some pre-selected skills, HiveMind or even the GUI.

"},{"location":"getting-started/docker/installation/basic/#deploy-the-stack","title":"Deploy the stack","text":"

Before running the docker compose or podman-compose commands, please read this section first.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml up --detach\n

Depending your Internet speed, your Wi-Fi or Ethernet connection speed and your hardware (I/O), the whole process could take several minutes.

Hardware Time Raspberry Pi 3B+ with USB drive ~20 minutes Raspberry Pi 4B with USB drive ~3 minutes MacBook Air i7 Early 2015 with SSD ~2.5 minutes AMD Ryzen 7 5800 with NVMe drive ~45 seconds

Resources overhead

To reduce the potential ressources overhead due to the image downloads and extractions, the --parallel x option could be added to the command in order to process the images by batch of x (where x is an integer).

"},{"location":"getting-started/docker/installation/basic/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED      STATUS                PORTS     NAMES\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED      STATUS                PORTS     NAMES\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
"},{"location":"getting-started/docker/installation/configuration/","title":"Configuration","text":""},{"location":"getting-started/docker/installation/configuration/#open-voice-os-configuration","title":"Open Voice OS configuration","text":"

~/ovos/config/mycroft.conf configuration file is mounted into each containers as a read-only volume.

First I configure then I deploy

Before deploying the services and volumes, it is recommended to set the OVOS's configuration to make sure the services initial start has the correct settings such as the lang for example.

"},{"location":"getting-started/docker/installation/configuration/#initial-configuration","title":"Initial configuration","text":"

This configuration is very basic, it instructs the Open Voice OS instance to run in English as main language.

~/ovos/config/mycroft.conf
{\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  }\n}\n
"},{"location":"getting-started/docker/installation/configuration/#configure-the-logging","title":"Configure the logging","text":"

By default, the Open Voice OS services will write their logs into a file under ~/.local directory, these files are not rotated or compressed which could lead to a disk space issue.

The solution is to add these lines into the ~/ovos/config/mycroft.conf file (create the file if it does not exist), this will tell the services to redirect their logs to the container stdout.

~/ovos/config/mycroft.conf
{\n  \"logs\": {\n    \"path\": \"stdout\"\n  },\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  }\n}\n

Services already deployed

If the services have been already deployed and the ~/ovos/config/mycroft.conf has changed, then you will have to restart the containers impacted by the change(s).

"},{"location":"getting-started/docker/installation/gui/","title":"GUI","text":""},{"location":"getting-started/docker/installation/gui/#install-the-open-voice-os-gui","title":"Install the Open Voice OS GUI","text":"

Linux only

The GUI is currently only available on Linux operating system, not on Mac OS or Windows.

The Open Voice OS GUI supports two types of system execution:

  • Using X or Wayland display servers
  • Using EGLFS which doesn't require any display server which is perfect for headless installation

When using EGLFS, the DISPLAY variable from the .env composition environment file must be removed or commented as if present the X or Wayland display servers will be tried first and result in an ovos_gui container in error.

Hardware accelerated on Raspberry Pi 4 and 5 only

Raspberry Pi 4 and 5 will leverage the GPU hardware acceleration which will provide a smoother experience.

If not running on a Raspberry Pi 4 or 5 then the CPU might be used to render the GUI which will result in a high CPU consumption and a poor exprience.

"},{"location":"getting-started/docker/installation/gui/#configuration","title":"Configuration","text":"

The ovos-gui-messagebus component must be configured in order to receive the QML files from the skill containers. Because of these file transfers, the ovos-message-bus component must be configured to allow bigger payload.

~/ovos/config/mycroft.conf
{\n  \"logs\": {\n    \"path\": \"stdout\"\n  },\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  },\n  \"gui\": {\n    \"extension\": \"ovos-gui-plugin-shell-companion\",\n    \"idle_display_skill\": \"skill-ovos-homescreen.openvoiceos\",\n    \"generic\": {\n      \"homescreen_supported\": true\n    },\n    \"gui_file_host_path\": \"/home/ovos/.cache/gui_files\"\n  },\n  \"websocket\": {\n    \"max_msg_size\": 100\n  }\n}\n
"},{"location":"getting-started/docker/installation/gui/#xhost-and-display-servers","title":"xhost and display servers","text":"

Tip

You can skip this section if your are using EGLFS and go to GUI services deployment.

In order to allow only the ovos_gui container to access to the X or Wayland display server, you will have to allow the container (based on its hostname) to connect to the display session.

export DISPLAY=\":0\"\nxhost +local:ovos_gui\n

This command is not permanent, when your operating system will reboot you will have to run the command again. To make it permanent systemd should be leveraged as a user service.

Raspberry PiLinux
mkdir -p ~/.config/systemd/user\n
mkdir -p ~/.config/systemd/user\n

Create the xhost.service unit file into the ~/.config/systemd/user directory.

~/.config/systemd/user/xhost.service
[Unit]\nDescription=Allow ovos_gui container to use X from user session\n\n[Service]\nType=oneshot\nEnvironment=\"DISPLAY=:0\"\nExecStart=/usr/bin/xhost +local:ovos_gui\nExecStop=/usr/bin/xhost -local:ovos_gui\nRemainAfterExit=yes\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=default.target\n

Enable and start the new xhost.service systemd service.

Raspberry PiLinux
systemctl --user enable xhost.service\nsystemctl --user start xhost.service\n
systemctl --user enable xhost.service\nsystemctl --user start xhost.service\n

The xhost command is part of the x11-xserver-utils package on Debian based distributions such as Raspberry Pi OS.

"},{"location":"getting-started/docker/installation/gui/#gui-services-deployment","title":"GUI services deployment","text":"

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinux
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --file docker-compose.gui.yml --file docker-compose.raspberrypi.gui.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml --file docker-compose.gui.yml up --detach\n
"},{"location":"getting-started/docker/installation/requirements/","title":"Requirements","text":""},{"location":"getting-started/docker/installation/requirements/#final-steps-before-the-run","title":"Final steps before the run","text":"

Before going further, please make sure to refer to this section as the following commands could defer depending your setup.

"},{"location":"getting-started/docker/installation/requirements/#get-the-ovos-docker-sources","title":"Get the ovos-docker sources","text":"

The ~/hivemind directory is only required if you plan to use HiveMind.

All
git clone https://github.com/OpenVoiceOS/ovos-docker.git\nmkdir -p ~/ovos/{config,share,tmp} ~/hivemind/{config,share}\nchown ${USER}:${USER} -R ~/ovos ~/hivemind\ncd ~/ovos-docker/compose\n
"},{"location":"getting-started/docker/installation/requirements/#enable-user-manager","title":"Enable user manager","text":"

Because some containers require /run/user/1000 to be mounted, systemd should be instruct to log the user during the boot process and mak/run/user/1000 directory available before the containers start.

Raspberry PiLinux
sudo loginctl enable-linger $USER\n
sudo loginctl enable-linger $USER\n
"},{"location":"getting-started/docker/installation/requirements/#set-the-environment-file","title":"Set the environment file","text":"

.env file is a strong requirement

Please make sure to read and understand this section as if you don't the deployment migth fail.

The composer requires an environment file in order to deploy the services and volumes with the correct settings for your setup.

alpha version by default

As mentioned in this section, the current default VERSION (tag) is alpha.

The example files start with a . (dot) which means they are hidden, use the ls -a command to list all the files included the hidden ones.

Below is an example of .env for Linux (not Raspberry Pi), please read this section for more details about what these variables do.

.env
DISPLAY=:0\nHIVEMIND_CONFIG_FOLDER=~/hivemind/config\nHIVEMIND_SHARE_FOLDER=~/hivemind/share\nHIVEMIND_USER=hivemind\nINPUT_GID=102\nOVOS_CONFIG_FOLDER=~/ovos/config\nOVOS_SHARE_FOLDER=~/ovos/share\nOVOS_USER=ovos\nPULL_POLICY=always\nTMP_FOLDER=~/ovos/tmp\nTZ=America/Montreal\nVERSION=alpha\nVIDEO_GID=44\nXDG_RUNTIME_DIR=/run/user/1000\n
Raspberry PiLinuxMac OSWindows WSL2
cp .env-raspberrypi .env\n
cp .env.example .env\n
cp .env.example .env\n
cp .env.example .env\n

Examples are provided, please make sure to select the right one and to set the proper values.

"},{"location":"getting-started/docker/installation/skills/","title":"Skills","text":""},{"location":"getting-started/docker/installation/skills/#howto-install-skills","title":"Howto install skills?","text":"

Two different methods are supported by ovos-docker to install Open Voice OS's skills, each of them having pros and cons .

Slow hardware

When running Open Voice OS on slow hardware such as Raspberry Pi 3B+, it is recommended to install skills using the \"As part of ovos_core container\" method in order to reduce the memory consumption.

"},{"location":"getting-started/docker/installation/skills/#as-part-of-ovos_core-container","title":"As part of ovos_core container","text":"

The first method is to use a skills.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

When ovos_core container starts, it will look for a skills.list file and install the skills defined in there.

Skill requirements

The skill has to be compatible with the pip install method which requires a setup.py file.

skills.list
ovos-skill-stop # Latest skill version on PyPi\novos-skill-volume==0.0.1 # Specific skill version on PyPi\ngit+https://github.com/OpenVoiceOS/skill-ovos-wikipedia.git@fix/whatever # Specific skill's branch on GitHub\n

If the ovos_core container is wiped for any reasons (like an update), the skill(s) will be automatically reprovisioned.

Not only for skills

skills.list file could be used as well to install extra Python librairies, e.g., SoCo, RPi.GPIO. Just make sure to avoid empty lines.

The main advantage of this method is the simplicity but the downside will be more Python dependencies (libraries) within the ovos_core container, potential conflicts across them, a lack of isolation and a slower start of the container.

"},{"location":"getting-started/docker/installation/skills/#as-standalone-container-recommended","title":"As standalone container (recommended)","text":"

The second method is to leverage the ovos-workshop component by running a skill as standalone, it means the skill will not be part of ovos_core container but it will be running inside its own container.

The main advantage is that each skill are isolated which provide more flexibility about Python dependencies (libraries), packages. It is easier to update and more secure but the downside will be that more system resources will be consumed and a container image has to be built for each skill.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml up --detach\n

Depending your Internet speed, your Wi-Fi or Ethernet connection speed and your hardware (I/O), the whole process could take several minutes.

Hardware Time Raspberry Pi 3B+ with USB drive ~12 minutes Raspberry Pi 4B with USB drive ~48 seconds MacBook Air i7 Early 2015 with SSD ~50 seconds AMD Ryzen 7 5800 with NVMe drive ~15 seconds

Resources overhead

To reduce the potential ressources overhead due to the image downloads and extractions, the --parallel x option could be added to the command in order to process the images by batch of x (where x is an integer).

If the ovos_core container is restarted or even deleted, the skill containers will automatically register again to it.

"},{"location":"getting-started/docker/installation/skills/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS                 PORTS     NAMES\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS                 PORTS     NAMES\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
"},{"location":"getting-started/docker/plugins/microphone/","title":"Microphone","text":""},{"location":"getting-started/docker/plugins/microphone/#microphone-plugins","title":"Microphone plugins","text":"

A microhpone plugin allows you to use a specific sound protocol in order to get voice samples from your microphone. Depending the operating system you are running on, you will have to choose the correct plugin.

Note

The microhpone plugins are handled by the ovos_listener container.

The ovos_listener container comes with few pre-installed microphone plugins such as:

  • ovos-microphone-plugin-alsa is using pyalsaaudio Python library (default)
  • ovos-microphone-plugin-sounddevice is using sounddevice Python library

If the existing microphone plugins are not enough then you can install yours by following the same principle as for the STT plugins by adding a listener.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_listener container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/listener.list
ovos-microphone-plugin-pyaudio==0.2.0a1 # Specific plugin version on PyPi\novos-microphone-plugin-arecord # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-microphone-plugin-socket.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_listener container must be restarted if a change occurs in the listener.list file.

DockerPodman
docker restart ovos_listener\n
podman restart ovos_listener\n
"},{"location":"getting-started/docker/plugins/microphone/#which-plugin-to-choose","title":"Which plugin to choose?","text":"

Here are the two main plugins to use per platform.

Plugin Platforms ovos-microphone-plugin-alsa ovos-microphone-plugin-sounddevice

Choose the correct plugin

If a wrong plugin is used, the listener will not be able to hear you which means that you will not be able to interact with your Open Voice OS instance.

"},{"location":"getting-started/docker/plugins/phal/","title":"PHAL","text":""},{"location":"getting-started/docker/plugins/phal/#phal-plugins","title":"PHAL plugins","text":"

The Plugin based Hardware Abstraction Layer plugins allow you to interact with system components such as Wi-Fi, GPIO, NetworkManager, etc... but not only.

Note

The PHAL plugins are handled by the ovos_phal and ovos_phal_admin containers.

ovos_phal_admin is a privileged container

The ovos_phal_admin purpose is to run plugins that require accesses to some devices, files or services.

Plugins installed in this container have to be enabled into ~/ovos/config/mycroft.conf in order to get loaded, this acts as an extra layer of security.

The ovos_phal container comes with few pre-installed PHAL plugins such as:

  • ovos-PHAL-plugin-alsa controls system volume with ALSA
  • ovos-PHAL-plugin-system handles bus events to interact with the operating system

If the existing PHAL plugins are not enough then you can install yours by following the same principle as for the STT plugins by adding a phal.list or phal_admin.list files within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_phal or ovos_phal_admin containers start, they will look for these files and install the skpluginsills defined in there.

~/ovos/config/phal.list or ~/ovos/config/phal_admin.list
ovos-phal-plugin-ipgeo==0.0.1 # Specific plugin version on PyPi\novos-PHAL-plugin-pulse # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-PHAL-plugin-homeassistant.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_phal or ovos_phal_admin containers must be restarted if a change occurs in the phal.list or phal_admin.lis files.

DockerPodman
docker restart ovos_phal ovos_phal_admin\n
podman restart ovos_phal ovos_phal_admin\n
"},{"location":"getting-started/docker/plugins/stt/","title":"Speech-To-Text","text":""},{"location":"getting-started/docker/plugins/stt/#speech-to-text-plugins","title":"Speech-To-Text plugins","text":"

The Speech-To-Text plugins allow you to connect Open Voice OS with different STT servers, it could be FasterWhisper, VOSK, Google Translate, Deepgram, etc... Each of these STT providers will have different languages support, precision and performances.

Note

The Speech-To-Text plugins are handled by the ovos_listener container.

The ovos_listener container comes with few pre-installed STT plugins such as:

  • ovos-stt-plugin-server allows you to reach an external STT service
  • ovos-stt-plugin-vosk is an offline STT service

If the existing STT plugins are not enough then you can install yours by following the same principle as for the microphone plugins by adding a listener.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_listener container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/listener.list
ovos-stt-plugin-vosk==0.2.0a1 # Specific plugin version on PyPi\novos-stt-plugin-server # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-stt-plugin-chromium.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_listener container must be restarted if a change occurs in the listener.list file.

DockerPodman
docker restart ovos_listener\n
podman restart ovos_listener\n
"},{"location":"getting-started/docker/plugins/tts/","title":"Text-To-Speech","text":""},{"location":"getting-started/docker/plugins/tts/#text-to-speech-plugins","title":"Text-To-Speech plugins","text":"

The Text-To-Speech plugins allow you to connect Open Voice OS with different TTS servers, it could be Piper, Coqui, Amazon Polly, Mimic, etc... Each of these TTS providers will have different voices and languages.

Note

The Text-To-Speech plugins are handled by the ovos_audio container.

The ovos_audio container comes with few pre-installed TTS plugins such as:

  • ovos-tts-plugin-mimic is the original Mycroft AI TTS with the iconic Alan Pope's voice
  • ovos-tts-plugin-mimic2 is the cloud based version hosted on Mycroft AI infrastructure
  • ovos-tts-plugin-mimic3-server is the latest Mycroft AI TTS engine
  • ovos-tts-plugin-server allows you to reach an external TTS service

If the existing TTS plugins are not enough then you can install yours by following the same principle as for the skills by adding an audio.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_audio container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/audio.list
ovos-tts-plugin-marytts==0.0.1a1 # Specific plugin version on PyPi\nneon-tts-plugin-mozilla-remote # Latest plugin version on PyPi\ngit+https://github.com/NeonGeckoCom/neon-tts-plugin-polly.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_audio container must be restarted if a change occurs in the audio.list file.

DockerPodman
docker restart ovos_audio\n
podman restart ovos_audio\n
"},{"location":"getting-started/docker/prerequisites/cpu/","title":"CPU instructions","text":""},{"location":"getting-started/docker/prerequisites/cpu/#cpu-instructions","title":"CPU instructions","text":"

In order to run TensorFlow used by few Open Voice OS components, the CPU must support AVX (Advanced Vector Extensions) instruction set for x86 processors or SIMD (Single Instruction, Multiple Data) instruction set for ARM processors.

LinuxMac OS
grep -E -i --color \"avx|simd\" /proc/cpuinfo\n
sysctl -a | grep -E -i --color \"avx|simd\"\n

If the command does not return an output then your CPU doesn't meet the requirements for TensorFlow.

AVX or SIMD instruction set missing

Because the instruction set is missing does not mean that Open Voice OS can't run on your hardware, it simply means that Precise wake word engine or anything else using TensorFlow will not run on it.

"},{"location":"getting-started/docker/prerequisites/engine/","title":"Container engine","text":""},{"location":"getting-started/docker/prerequisites/engine/#container-engine","title":"Container engine","text":""},{"location":"getting-started/docker/prerequisites/engine/#installation","title":"Installation","text":"

As we are leveraging containers, a container engine such as Docker or Podman is required (only one of them should be installed), as well as their composer.

If you are not familiar with what a container engine or a composer are then please refer to this section first as these fundamentals must be understood.

"},{"location":"getting-started/docker/prerequisites/engine/#versions","title":"Versions","text":"

When running on Linux, please make sure to not use Docker Desktop but prefer Docker Engine as it is a better choice in our case. Docker Desktop runs a virtual machine which doesn't have access to the same devices as the host has, due to this limitation the /dev/snd device will not be usable and this will prevent the usage of speakers and microphone.

docker-compose versus docker compose

As mentioned by Docker, from July 2023 Compose V1 (docker-compose) will not received updates anymore which makes it deprecated and replaced by Compose V2 (docker compose) directly embedded into the docker command line.

Either you choose to install Docker or Podman and their composer on Linux, Mac OS or Windows, please refer to the official documentation1.

Minimum required versions

In order to get the latest features supported by ovos-docker, please make sure to install a recent version of Docker (>= 24.x.x) or Podman (>= 4.3.x) for your operating system.

"},{"location":"getting-started/docker/prerequisites/engine/#dont-be-root-be-a-user","title":"Don't be root, be a user","text":"

You should not run docker command as root user or using the sudo command, if so then you will get some error messages such as Permission denied and some containers could restart in a loop.

To allow a simple user to execute the docker command, make sure to add the user to the docker group.

Linux
sudo usermod -a -G docker $USER\n

Once added to the docker group you will have to logout from the current session (graphical or SSH) in order to get the group added to your user once you reconnect.

Once reconnected, run the following command to ensure the docker has been appened to your $USER.

Linux
id\nuid=1000(foobar) gid=1000(foobar) groups=1000(foobar),973(docker)\n

The GID could differ compare to your setup.

"},{"location":"getting-started/docker/prerequisites/engine/#validation","title":"Validation","text":"DockerPodman
docker system info\ndocker container list\n
podman system info\npodman container list\n
  1. Docker official documentation or Podman official documentation.\u00a0\u21a9

"},{"location":"getting-started/docker/prerequisites/sound/","title":"Sound system","text":""},{"location":"getting-started/docker/prerequisites/sound/#sound-system","title":"Sound system","text":"

PulseAudio is a requirement and has to be up and running on the host (not inside the containers) to expose a socket (for communication) and a cookie (for authentication) to allow the containers to have access to the microphone (input device) and speakers (output device).

On modern Linux distribution, PipeWire now handles the sound stack on the system.

Sound server auto-detection

ovos-docker supports both native PulseAudio and PipeWire, the containers will automatically detect which sound server is running on the operating system.

"},{"location":"getting-started/docker/prerequisites/sound/#mac-os-and-windows","title":"Mac OS and Windows","text":"

If you are running an operating system other Linux such as Mac OS or Windows, then PulseAudio will have to be installed to act as a gateway between the containers and the OS.

Mac OSWindows WSL2
brew install pulseaudio\nbrew services stop pulseaudio\nsed -i \"\" \"s/#load-module module-native-protocol-tcp/load-module module-native-protocol-tcp/g\" $(brew ls pulseaudio | grep default.pa$)\nbrew services start pulseaudio\n
sudo apt install pulseaudio\n
"},{"location":"getting-started/docker/prerequisites/sound/#permissions","title":"Permissions","text":"

The user running the containers must be part of the audio system group (depending the Linux distribution).

PulseAudio files permissions

Check the permissions for ~/.config/pulse/ and /run/user/1000/pulse directories, they should belong to the user running the stack (where 1000 is your user ID), not to root user.

If you are running on Mac OS, there is no /run/user/1000/ directory.

"},{"location":"getting-started/docker/prerequisites/sound/#validation","title":"Validation","text":"

pactl is a PulseAudio command shipped with the pulseaudio-utils package and pw-cli is a PipeWire command shipped with pipewire-utils or pipewire-bin depending your distribution.

These commands provide information about the status of PulseAudio or PipeWire.

PulseAudioPipeWire
pactl info\n
pw-cli info\n
"},{"location":"getting-started/docker/prerequisites/sound/#list-microphones","title":"List microphones","text":"

At least one of the sources (microphones/audio input) returned, should match the Default Source line from the pactl info command or the Audio/Source line from the wpctl status command.

PulseAudioPipeWire
pactl list sources short\n
wpctl status | grep Audio/Source\n
"},{"location":"getting-started/docker/prerequisites/sound/#list-speakers","title":"List speakers","text":"

At least one of the sinks (speakers/audio output) returned, should match the Default Sink line from the pactl info command or the Audio/Sink line from the wpctl status command.

PulseAudioPipeWire
pactl list sinks short\n
wpctl status | grep Audio/Sink\n
"},{"location":"getting-started/docker/security/hardening/","title":"System hardening","text":""},{"location":"getting-started/docker/security/hardening/#basic-ovos-hardening","title":"Basic OVOS hardening","text":"

In order to secure your Open Voice OS instance, few more steps are required and few concepts must be understood.

"},{"location":"getting-started/docker/security/hardening/#apparmor","title":"AppArmor","text":"

AppArmor and SELinux are examples of Mandatory Access Control (MAC) systems. These systems differ from other security controls which are generally called Discretionary Access Control (DAC) systems in that, generally, the user can't change their operation.

AppArmor packages

AppArmor must be installed on your system before going further. Please refer to your Linux distribution documentation to install it.

"},{"location":"getting-started/docker/security/hardening/#enable-apparmor","title":"Enable AppArmor","text":"Raspberry Pi OSDebian & Ubuntu /boot/cmdline.txt
apparmor=1 security=apparmor\n
/etc/default/grub.d/apparmor.cfg
apparmor=1 security=apparmor\n

System must be rebooted to instruct the kernel to load AppArmor during the boot sequence. Once rebooted, check the AppArmor status using the aa-status command.

Raspberry Pi OSDebian & Ubuntu
sudo aa-status\n
sudo aa-status\n
"},{"location":"getting-started/docker/security/hardening/#apparmor-docker-profile","title":"AppArmor Docker profile","text":"

AppArmor and Podman support1

AppArmor support for Podman is not yet fully functional.

Docker applies the docker-default AppArmor profile to new containers. In Docker 1.13 and later this profile is created in tmpfs and then loaded into the kernel.

The container engine should now be aware of apparmor as an available security option.

docker system info | grep -i apparmor\n

All the containers except ovos_phal_admin should now be confined with the docker-default AppArmor profile.

docker container list --quiet --all --filter \"name=ovos\" | xargs docker inspect --format \"{{ .Name }}: AppArmorProfile={{ .AppArmorProfile }}\"\n/ovos_skill_volume: AppArmorProfile=docker-default\n/ovos_skill_wikipedia: AppArmorProfile=docker-default\n/ovos_skill_fallback_unknown: AppArmorProfile=docker-default\n/ovos_skill_alerts: AppArmorProfile=docker-default\n/ovos_skill_hello_world: AppArmorProfile=docker-default\n/ovos_skill_weather: AppArmorProfile=docker-default\n/ovos_skill_stop: AppArmorProfile=docker-default\n/ovos_skill_date_time: AppArmorProfile=docker-default\n/ovos_skill_personal: AppArmorProfile=docker-default\n/ovos_listener: AppArmorProfile=docker-default\n/ovos_audio: AppArmorProfile=docker-default\n/ovos_core: AppArmorProfile=docker-default\n/ovos_phal: AppArmorProfile=docker-default\n/ovos_phal_admin: AppArmorProfile=unconfined\n/ovos_messagebus: AppArmorProfile=docker-default\n/ovos_cli: AppArmorProfile=docker-default\n

ovos_phal_admin container is not confined

The ovos_phal_admin container is not confined as it runs as a privileged container.

"},{"location":"getting-started/docker/security/hardening/#message-bus","title":"Message bus","text":"

By default, the message bus is listening on address 0.0.0.0 and port 8181 because the ovos_messagebus is created using the --network host option. This could be a security issue as an external device could connect to the message bus and send and/or read messages.

Why using --network host?

Some Open Voice OS skills such as Home Assistant or Sonos require access to your private network in order to communicate with your IoT devices.

To prevent potential security issues, it is recommended to use a firewall the port 8181.

iptables will be demonstrated as an example but if firewalld or ufw services are used, then make sure to be compliant with your distribution.

Linux
sudo iptables -A INPUT -p tcp -s localhost --dport 8181 -j ACCEPT\nsudo iptables iptables -A INPUT -p tcp --dport 8181 -j DROP\n

This will allow connections to port 8181 only from localhost (internal).

Keep your ports closed

Keep in mind to firewall any other ports which should not be exposed outside of the host by using the same IPTables method.

If you really need to connect an external application to the message bus, we recommend to use HiveMind to ensure a proper security exposure.

  1. Enable rootless AppArmor for Podman \u21a9

"},{"location":"getting-started/docker/security/hivemind/","title":"HiveMind","text":""},{"location":"getting-started/docker/security/hivemind/#hivemind-to-the-rescue","title":"HiveMind to the rescue","text":""},{"location":"getting-started/docker/security/hivemind/#what-is-hivemind","title":"What is HiveMind?","text":"

HiveMind is a community-developed superset or extension of Open Voice OS, the open-source voice operating system.

With HiveMind, you can extend one (or more, but usually just one!) instance of Open Voice OS to as many devices as you want, including devices that can't ordinarily run Open Voice OS!

Official documentation

What it means, is that HiveMind allows external connections to the message bus by using a secured protocol.

Fulfill the requirements first

Before going further, please make sure that all the requirements are fulfilled.

A composition file is available in order to deploy hivemind_listener and hivemind_cli services.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n

For more information about how to authenticate with the HiveMind listener, please read the HiveMind-core repository documentation.

Once the HiveMind containers are up and running, the HiveMind command line allows you to add client, to list them, to delete them, etc...

DockerPodman
docker exec --interactive --tty hivemind_cli hivemind-core --help\n
podman exec --interactive --tty hivemind_cli hivemind-core --help\n

Port 5678 must be open

In order to to reach the HiveMind listener, the port 5678 has to be open on the host. Please make sure your firewall allows the connection to this port or the clients will not be able to connect to it.

"},{"location":"getting-started/docker/security/hivemind/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                 PORTS     NAMES\n4e2d45799de8   smartgic/hivemind-cli:alpha                  \"sleep infinity\"         16 minutes ago   Up 16 minutes                    hivemind_cli\n612a9ea32405   smartgic/hivemind-listener:alpha             \"hivemind-core listen\"   16 minutes ago   Up 16 minutes                    hivemind_listener\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago     Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago     Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago     Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                 PORTS     NAMES\n4e2d45799de8   smartgic/hivemind-cli:alpha                  \"sleep infinity\"         16 minutes ago   Up 16 minutes                    hivemind_cli\n612a9ea32405   smartgic/hivemind-listener:alpha             \"hivemind-core listen\"   16 minutes ago   Up 16 minutes                    hivemind_listener\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago     Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago     Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago     Up 8 hours                       ovos_cli\n
"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Getting started","text":""},{"location":"#getting-started","title":"Getting started","text":"

Want to give Open Voice OS a try? Open Voice OS is an open source software that runs where you want it to, whether it\u2019s on your own hardware or one of the dedicated Mark 1 or Mark II.

  • Docker

    arm64 x86_64

    Use container engine such as Docker or Podman and their composer to run a complete, secure, isolated and \"easy to update\" instance of Open Voice OS!

    Getting started with Docker

"},{"location":"about/what-is-it/","title":"What is it?","text":""},{"location":"about/what-is-it/#what-is-open-voice-os","title":"What is Open Voice OS?","text":"

Open Voice OS is a free and open source personal assistant and smart speaker that offers a powerful and flexible alternative to proprietary solutions like Amazon\u2122 Alexa\u2122, Google Assistant\u2122, Microsoft Cortana\u2122 or Apple's Siri\u2122.

At the same time, it is also an open virtual assistant platform that enables developers and organizations to create custom voice-controlled applications. With its cutting-edge technology and user-friendly design, Open Voice OS is revolutionizing the way we interact with technology.

The platform provides a comprehensive suite of features that makes it easy to deploy voice-based applications for a wide range of use cases, including home automation, entertainment, education, and more. With natural language processing, multi-device compatibility, a customizable UI, robust APIs, and a focus on privacy and security, Open Voice OS delivers a highly responsive and accurate experience for users.

Open Voice OS is the perfect choice for anyone who wants a personal assistant and smart speaker that gives them complete control over their data and the ability to customize their experience.

In addition to its voice capabilities, Open Voice OS also features a touch-screen GUI made using QT and the KDE frameworks, providing an intuitive and user-friendly interface. And with its open source nature, anyone with technical skills can contribute to the platform and help shape its future.

"},{"location":"about/why-use-ovos/","title":"Why use OVOS?","text":""},{"location":"about/why-use-ovos/#why-use-ovos","title":"Why use OVOS?","text":"

Whether you prefer voice commands or a more traditional touch interface, Open Voice OS has you covered, and the option to run the platform fully offline gives you complete control over your data and ensures that your information is never shared with third parties.

With its powerful and flexible features, Open Voice OS is the ideal choice for anyone who wants a voice-controlled virtual assistant and smart speaker that offers complete control and customization. Whether you\u2019re a software developer, data scientist, or just someone with a passion for technology, be sure to check out Open Voice OS today!

"},{"location":"about/why-use-ovos/#multi-device-compatibility","title":"Multi-device compatibility","text":"

Open Voice OS can be integrated with a wide range of devices making it easy for you to access and control your virtual assistant no matter where you are.

  • Smart speakers
  • Smartphones
  • System on a chip (SoC)
  • Laptops
  • Televisions
"},{"location":"about/why-use-ovos/#customizable-ui","title":"Customizable UI","text":"

With its easy-to-use GUI interface, Open Voice OS allows developers to create custom interfaces that match their specific brand and style. Whether you\u2019re a business looking to integrate voice control into your product offerings, or a home user who wants a unique interface that matches your personal style, Open Voice OS has you covered.

"},{"location":"about/why-use-ovos/#robust-modular","title":"Robust & Modular","text":"

Open Voice OS leverages the power of skills and plugins to create a robust and modular virtual assistant platform, offering unparalleled customization and extension capabilities.

"},{"location":"about/why-use-ovos/#fully-offline","title":"Fully offline","text":"

Open Voice OS can run without the use of any online Text-To-Speech (TTS) or Speech-To-Text (STT) services, so you don\u2019t have to rely on anyone keeping their servers up or recording your requests.

"},{"location":"about/why-use-ovos/#privacy-and-security","title":"Privacy and security","text":"

Open Voice OS is designed with privacy and security in mind. Whether you\u2019re concerned about the security of your personal information or the privacy of your voice commands, Open Voice OS provides peace of mind.

"},{"location":"about/glossary/components/","title":"Components","text":""},{"location":"about/glossary/components/#components","title":"Components","text":"

Open Voice OS is very modular which means instead of a big monolith block of code, multiple projects exist around the OVOS ecosystem with each of them having their own role to play in order to deliver the best and fastest experience.

"},{"location":"about/glossary/components/#ovos-audio","title":"ovos-audio","text":"

The audio service is responsible for loading Text-To-Speech and audio plugins.

All audio playback (sounds played on the speakers) is handled by this service by leveraging the sound server/service from the system where its running.

"},{"location":"about/glossary/components/#ovos-common-play","title":"ovos-common-play","text":"

OVOS Common Play (OCP) is a full-fledged voice media player packaged as an audio plugin.

OCP handles the whole voice integration and playback functionality, it also integrates with external players via Media Player Remote Interfacing Specification (MPRIS).

"},{"location":"about/glossary/components/#ovos-config","title":"ovos-config","text":"

Helper package to interact with OVOS configuration. A small tool is included to quickly show, get or set config values.

"},{"location":"about/glossary/components/#ovos-core","title":"ovos-core","text":"

The skills service is responsible for loading skills and intent parsers, all user queries are handled by the skills service.

This is the brains of the device. Without it, you would have some cool software that does not work together. It controls the skills service and directs intents to the right skill.

"},{"location":"about/glossary/components/#ovos-classifiers","title":"ovos-classifiers","text":"

Base implementations for Natural language processing (NPL) tasks, from baseline heuristics to classic machine learning models that run everywhere.

"},{"location":"about/glossary/components/#ovos-gui","title":"ovos-gui","text":"

OVOS uses the standard Mycroft GUI framework, you can find the official documentation here.

The GUI is an open source visual and display framework running on top of KDE Plasma Technology and built using Kirigami a lightweight user interface framework for convergent applications which are empowered by QT.

Component dependency

This component depends on ovos-gui-messagebus.

"},{"location":"about/glossary/components/#ovos-gui-messagebus","title":"ovos-gui-messagebus","text":"

GUI messagebus service, manages GUI state and implements the GUI protocol.

The GUI service provides a websocket for gui clients to connect to, it is responsible for implementing the gui protocol under ovos-core.

GUI clients (the application that actually draws the GUI) connect to this service.

"},{"location":"about/glossary/components/#ovos-listener","title":"ovos-listener","text":"

The listener (also known as speech) is responsible for loading STT, VAD and wake word plugins. Speech is transcribed into text (intent) and forwarded to the core service.

The newest listener that OVOS uses is ovos-dinkum-listener. It is a version of the listener from the Mycroft Dinkum software for the Mark 2 modified for use with OVOS.

"},{"location":"about/glossary/components/#ovos-messagebus","title":"ovos-messagebus","text":"

The message bus service provides a websocket where all internal events travel, you can think of the bus service as Open Voice OS's nervous system.

Internal usage only

The bus is considered as an internal and private websocket, external clients should not connect directly to it. Please check HiveMind for more information. For more detail please go to the System Hardening section

"},{"location":"about/glossary/components/#ovos-phal","title":"ovos-phal","text":"

Plugin based Hardware Abstraction Layer is a wrapper for software system level abstraction, where based on the environment either through known configuration or via fingerprinting, only specific plugins load to interface with the system and specific hardware.

A PHAL plugin can provide anything from hardware integrations (ReSpeaker, Mark1, Mark2, etc...) or system integrations (Network-Manager, OVOS Shell, etc...).

Any number of plugins providing functionality can be loaded and validated at runtime, plugins can be system integrations to handle things like reboot and shutdown, or hardware drivers such as Mycroft Mark2 plugin.

PHAL admin variant

In addition of the initial PHAL service, PHAL admin is running as root or as a priviledged user. This variant allows PHAL admin to perform actions which require more privileges such as reboot for example.

"},{"location":"about/glossary/components/#ovos-plugin-manager","title":"ovos-plugin-manager","text":"

OPM is the OVOS Plugin Manager, this base package provides arbitrary plugins to the OVOS ecosystem. OPM plugins import their base classes from OPM making them portable and independent of ovos-core, plugins can be used in a standalone projects.

By using OPM you can ensure a standard interface to plugins and easily make them configurable in your project.

"},{"location":"about/glossary/components/#ovos-shell","title":"ovos-shell","text":"

OVOS Shell is the Open Voice OS client implementation of the ovos-gui library, basically it represents the OVOS graphical layer on top of Mycroft GUI.

Component dependency

This component depends on ovos-gui.

"},{"location":"about/glossary/components/#ovos-utils","title":"ovos-utils","text":"

Just a collection of simple utilities and functions for use across the components from the OVOS ecosystem.

"},{"location":"about/glossary/components/#ovos-workshop","title":"ovos-workshop","text":"

Workshop contains skill base classes and supporting tools to build skills and applications for Open Voice OS systems.

"},{"location":"about/glossary/components/#padacioso","title":"padacioso","text":"

A lightweight, dead-simple intent parser which aim to replace the current intent parser; Padatious.

"},{"location":"about/glossary/terms/","title":"Terms","text":""},{"location":"about/glossary/terms/#glossary","title":"Glossary","text":"

Use our Glossary to learn more about the specialist terms that we use in natural language processing generally, and more specifically with Open Voice OS software.

"},{"location":"about/glossary/terms/#fallback","title":"Fallback","text":"

A skill that is designated to be a 'catch-all' when Open Voice OS cannot interpret the intent from an utterance.

"},{"location":"about/glossary/terms/#hivemind","title":"HiveMind","text":"

HiveMind is a community-developed superset or extension of Open Voice OS the open-source voice operating system.

With HiveMind, you can extend an instance of Open Voice OS to as many devices as you want, including devices that can't ordinarily run Open Voice OS!

HiveMind could be considered as an external Open Voice OS component leaving its \"own\" life under its \"own\" lifecycle.

"},{"location":"about/glossary/terms/#hotword","title":"Hotword","text":"

See wake word.

"},{"location":"about/glossary/terms/#intent","title":"Intent","text":"

When a user speaks an utterance to Open Voice OS, Open Voice OS tries to interpret the intent of the utterance, and match the intent with a skill.

"},{"location":"about/glossary/terms/#playback","title":"Playback","text":"

Playback is the audio output going through the speakers, for example when asking What's the temperature?, OVOS will speaks to you using the playback capability.

"},{"location":"about/glossary/terms/#plugin","title":"Plugin","text":"

A plugin allows you to install \"small bricks\" of functionnalities using OVOS Plugin Manager in order to make your voice assistant more capable.

Open Voice OS uses many plugins in many different areas:

  • Wake word plugin
  • VAD plugins
  • Microphone plugins
  • PHAL plugins
  • TTS plugins
  • STT plugins
  • etc...
"},{"location":"about/glossary/terms/#skill","title":"Skill","text":"

When Open Voice OS hears the wake word, then an utterance, Open Voice OS will try to find a skill that matches the utterance. The skill might fetch some data, or play some audio, or speak, or display some information.

If Open Voice OS can't find a skill that matches the utterance, he will tell you he doesn't understand and fallback (when configured).

"},{"location":"about/glossary/terms/#speech-to-text-stt","title":"Speech-To-Text (STT)","text":"

Speech-To-Text is what converts your voice into a text which becomes a commands that OVOS recognizes, then converts to an intent that is used to activate skills.

Several options are available each with different attributes and supported languages. Some can be run on device, others need an internet connection to work.

"},{"location":"about/glossary/terms/#text-to-speech-tts","title":"Text-To-Speech (TTS)","text":"

Text-To-Speech is responsible for converting text into audio for playback (verbal response from OVOS).

Several options are available each with different attributes and supported languages. Some can be run on device, others need an internet connection to work.

"},{"location":"about/glossary/terms/#utterance","title":"Utterance","text":"

An utterance is how you interact with Open Voice OS. An utterance is a command or question - like What's the weather like in Kansas City? or Tell me about the Pembroke Welsh Corgi.

"},{"location":"about/glossary/terms/#vad","title":"VAD","text":"

Voice Activity Detection is used by the listener to determine when a user stopped speaking, this indicates the voice command is ready to be executed.

"},{"location":"about/glossary/terms/#wake-word","title":"Wake Word","text":"

The wake word is the phrase or word you use to (wake up) tell Open Voice OS you're about to issue a command.

"},{"location":"getting-started/docker/","title":"Docker or Podman","text":""},{"location":"getting-started/docker/#docker-or-podman","title":"Docker or Podman","text":"

Before going further, here are quick and simple definitions of what a container is and what a composer is, these definitions are important and must be well understood before starting.

Two engines, same definition

Both of the definitions described below are valid for either Docker or Podman.

"},{"location":"getting-started/docker/#container-definition","title":"Container definition","text":"

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A container image is a lightweight, standalone, executable package of software that includes everything needed to run an application.

Initial source

"},{"location":"getting-started/docker/#composer-definition","title":"Composer definition","text":"

A composer is a tool for defining and running multi-container container applications. With Compose, you use a YAML file to configure your application\u2019s services. Then, with a single command, you create and start all the services from your configuration.

Initial source

"},{"location":"getting-started/docker/cli/","title":"OVOS command line","text":""},{"location":"getting-started/docker/cli/#open-voice-os-command-line","title":"Open Voice OS command line","text":"

The command line allows you to send a message (but not only) directly to the message bus by using the ovos-cli-client command from the ovo_cli container.

Skill interactions

The command line doesn't support any action related to skills other than :skills as this setup is running inside containers. Please read the skill section to manage skills.

"},{"location":"getting-started/docker/cli/#ovos-cli-client","title":"ovos-cli-client","text":"

ovos-cli-client is deprecated

Please read https://github.com/OpenVoiceOS/ovos-cli-client/issues/14 for more information.

Interact directly with the ncurses OVOS client interface.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-cli-client\n
podman exec --interactive --tty ovos_cli ovos-cli-client\n
"},{"location":"getting-started/docker/cli/#ovos-config","title":"ovos-config","text":"

To display or manage the current configuration, the ovos-config command could be used.

read-write access to the configuration

The ovos_cli container is the only one having read-write access to the mycroft.conf configuration file.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-config show\n
podman exec --interactive --tty ovos_cli ovos-config show\n

vim as default editor

vim and nano editors are available within the ovos-cli image, vim has been set as default.

"},{"location":"getting-started/docker/cli/#ovos-speak","title":"ovos-speak","text":"

An easy way to make Open Voice OS speaks is to run the ovos-speak command.

DockerPodman
docker exec --interactive --tty ovos_cli ovos-speak \"hello world\"\n
podman exec --interactive --tty ovos_cli ovos-speak \"hello world\"\n
"},{"location":"getting-started/docker/cli/#mana","title":"mana","text":"

Neon Mana (Messagebus Application for Neon AI) provides tools for interacting with the message bus.

DockerPodman
docker exec --interactive --tty ovos_cli mana --help\n
podman exec --interactive --tty ovos_cli mana --help\n
"},{"location":"getting-started/docker/composition/","title":"Composition","text":""},{"location":"getting-started/docker/composition/#composition-and-environment-files","title":"Composition and environment files","text":"

The easiest and quickest way to deploy Open Voice OS containers is to use a composer such as docker composer or podman-compose.

"},{"location":"getting-started/docker/composition/#composition-files","title":"Composition files","text":"

Composition files provide an easy way to provision the stack (services and volumes) with the required options and configuration for each of the services.

Compose file Platforms Description docker-compose.yml Install core components (except the GUI) docker-compose.gui.yml Install GUI components docker-compose.skills.yml Install pre-defined skills docker-compose.hivemind.yml Install HiveMind components docker-compose.macos.yml Install core components (except the GUI) docker-compose.windows.yml Install core components (except the GUI) docker-compose.raspberrypi.yml Add GPIO support to ovos_core component docker-compose.raspberrypi.gui.yml Add /dev/vchiq to ovos_gui component"},{"location":"getting-started/docker/composition/#environment-files","title":"Environment files","text":"

A Docker or Podman environment file contains lines about environment variables that are usable by the Docker or Podman command line. It is a convenient way to pass many environment variables to a single command.

Environment file Platforms Description .env Set of variables used by the composition files .env-raspberrypi Add GPIO_GID variable

Some variables might need to be tuned to match your setup such as the TZ, XDG_RUNTIME_DIR, etc...

Variable Default Platforms Description DISPLAY :0 Display used by X or Wayland GPIO_GID 997 gpio group ID on Raspberry Pi HIVEMIND_CONFIG_FOLDER ~/hivemind/config HiveMind configuration directory HIVEMIND_SHARE_FOLDER ~/hivemind/share HiveMind shared directory HIVEMIND_USER hivemind User running in the container INPUT_GID 102 input group ID OVOS_CONFIG_FOLDER ~/ovos/config OVOS configureation directory OVOS_SHARE_FOLDER ~/ovos/share OVOS shared directory OVOS_USER ovos User running in the container PULL_POLICY always Policy to pull Docker images RENDER_GID 106 render group ID TMP_FOLDER ~/ovos/tmp OVOS temporary directory TZ America/Montreal Timezone to set in the container VERSION alpha Container image tag to pull VIDEO_GID 44 video group ID XDG_RUNTIME_DIR /run/user/1000 Path to XDG runtime directory

Do not change OVOS_USER or HIVEMIND_USER

The OVOS_USER and HIVEMIND_USER variables should not be changed except if you build your own container images which a different one.

"},{"location":"getting-started/docker/composition/#how-to-get-the-gid","title":"How to get the GID?","text":"

The getent command could be used in order to get the GID of gpio and render groups.

Raspberry PiLinux
getent group gpio\ngetent group render\ngetent group video\ngetent group input\n
getent group render    \ngetent group video\ngetent group input\n
"},{"location":"getting-started/docker/composition/#how-to-get-the-uid","title":"How to get the UID?","text":"

The XDG_RUNTIME_DIR variables requires a UID, this UID is the unique ID of the current user which will run the docker compose or podman-compose command.

LinuxWindows WSL2
echo $UID\n
echo $UID\n

XDG Base Directory

Mac OS doesn't leverage XDG_RUNTIME_DIR variable as there is no support of XDG Base Directory on Mac OS.

"},{"location":"getting-started/docker/debug/","title":"Debugging","text":""},{"location":"getting-started/docker/debug/#debugging","title":"Debugging","text":""},{"location":"getting-started/docker/debug/#enable-debug-mode","title":"Enable debug mode","text":"

First thing's first, enable the Open Voice OS's debug mode in ~/ovos/config/mycroft.conf to get more verbosity from the logs.

Restart containers

All containers will have to be restarted to receive the configuration change.

~/ovos/config/mycroft.conf
{\n  \"debug\": true,\n  \"log_level\": \"DEBUG\"\n}\n

Note

The commands below don't have to be executed in the same order as they are presented, free free to run them in the order you want!

"},{"location":"getting-started/docker/debug/#all-containers-logs","title":"All containers logs","text":"

Access all the container logs at the same time, run the following command (make sure it matches the docker compose or podman-compose command you run to deploy the stack).

DockerPodman
docker compose --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --env-file .env logs --follow --tail 200\n
podman-compose --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --env-file .env logs --follow --tail 200\n
"},{"location":"getting-started/docker/debug/#specific-contaienr-logs","title":"Specific contaienr logs","text":"

Access the logs of a specific container.

DockerPodman
docker logs --follow --tail 200 ovos_audio\n
podman logs --follow --tail 200 ovos_audio\n
"},{"location":"getting-started/docker/debug/#run-command-in-a-container","title":"Run command in a container","text":"

Execute a command inside a container without going into it.

DockerPodman
docker exec --tty --interactive ovos_audio pactl info\n
podman exec --tty --interactive ovos_audio pactl info\n
"},{"location":"getting-started/docker/debug/#connect-inside-a-container","title":"Connect inside a container","text":"

Go inside a container and run multiple commands (where sh is the available shell in there).

DockerPodman
docker exec --tty --interactive ovos_audio sh\n
podman exec --tty --interactive ovos_audio sh\n
"},{"location":"getting-started/docker/debug/#configuration-syntax-check","title":"Configuration syntax check","text":"

Make sure the mycroft.conf configuration file is JSON valid by using the jq command.

jq command

In order to use the jq command, the package should be installed on your operating system.

cat ~/ovos/config/mycroft.conf | jq\n

If the configuration file is not valid JSON, jq will return something like this:

parse error: Expected another key-value pair at line 81, column 3\n
"},{"location":"getting-started/docker/debug/#dockerpodman-consumption","title":"Docker/Podman consumption","text":"

Get the CPU, memory and I/O consumption per container.

DockerPodman
docker stats --all --no-trunc\n
podman stats --all --no-trunc\n
"},{"location":"getting-started/docker/debug/#dockerpodman-volume-usage","title":"Docker/Podman volume usage","text":"

Get the disk usage per volumes.

DockerPodman
docker system df\n
podman system df\n
"},{"location":"getting-started/docker/images/","title":"Images and volumes","text":""},{"location":"getting-started/docker/images/#images","title":"Images","text":"

Pre-build images

Open Voice OS provides pre-build images available on Docker Hub. These images are referenced by default within the docker-compose.*.yml files.

Open Voice OS is a sofisticated piece of software which has several components. These components have been split into containers to provide a better isolation and a microservices approach.

"},{"location":"getting-started/docker/images/#supported-cpu-architectures","title":"Supported CPU architectures","text":"

Container images could be used for different CPU architectures using the multi-platform images feature.

CPU architecture Description amd64 Such as AMD and Intel processors aarch64 Such as Raspberry Pi 64-bit SoC armv7l Such as Raspberry Pi 32-bit SoC (not supported because of onnxruntime1)"},{"location":"getting-started/docker/images/#containers","title":"Containers","text":"

The list below is not exhaustive and doesn't mention anything about skill containers, but it is a fair list of the main components currently supported in ovos-docker.

Container Description ovos_messagebus Read more about ovos-messagebus ovos_phal Read more about ovos-phal ovos_phal_admin Read more about ovos-phal admin variant ovos_audio Read more about ovos-audio ovos_listener Read more about ovos-listener ovos_core Read more about ovos-core ovos_cli Read more about ovos-cli ovos_gui_websocket Read more about ovos-gui-messagebus ovos_gui Read more about ovos-gui hivemind_listener Read more about hivemind-listener hivemind_cli Read more about hivemind-cli"},{"location":"getting-started/docker/images/#tags","title":"Tags","text":"

Container image tags allows you to deploy a specific version of Open Voice OS, it could be an untested version based on nigthly build or a stable version.

Image tag Description alpha Nightly build based on alpha releases from PyPi 0.0.8a Nightly build based on alpha releases from PyPi stable Build at every new stable release 0.0.8 Build at every new stable release

Stable release

As Open Voice OS doesn't have a stable release for version 0.0.8 which has been designed to work with containers, there is no stable or 0.0.8 tags available yet.

"},{"location":"getting-started/docker/images/#volumes","title":"Volumes","text":"

To allow data persistence, Docker or Podman volumes are required, they will prevent downloading the requirements everytime the containers are re-created.

Volume Description ovos_gui_file Share QML files from skills between the GUI message bus and the GUI client ovos_listener_records Wake words and utterances recorded samples ovos_models Models downloaded by precise-lite wake word plugin ovos_nltk Punkt Python package required by NLTK ovos_tts_cache .wav and .pho files acting as cache from TTS transcription ovos_vosk Models downloaded by VOSK during the initial boot

ovos_listener_records allows you to store samples of wake words and utterances which could help you to build or improve models.

Enable samples recording

By default the recording features are disabled, \"record_wake_words\": true and \"save_utterances\": true will have to be added to the listener section of mycroft.conf to enable these capabilities.

~/ovos/config/mycroft.conf
{\n\"listener\": {\n    \"record_wake_words\": true,\n    \"save_utterances\": true\n  }\n}\n

But first thing's first you need to have Open Voice OS's containers up and running. Follow the guide.

  1. https://github.com/microsoft/onnxruntime/issues/15337 \u21a9

"},{"location":"getting-started/docker/update/","title":"Update Open Voice OS","text":""},{"location":"getting-started/docker/update/#update-open-voice-os","title":"Update Open Voice OS","text":"

Exact same command

In order to update the deployed stack (services and volumes), you must use the exact same command that has been used during the initial stack deployment.

The easiest and quickest way to update an Open Voice OS stack already deployed by docker compose or podman-compose is; of course to use docker compose or podman-compose as well.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml  up --detach\n

Because the pull_policy option of each service is set to always, everytime that a new image is uploaded with the same tag docker compose or podman-compose will pull-it and re-create the container based on this new image.

Change the version

If you want to change the image's tag to deploy, update the .env file with the right one. The alpha tag images are rebuilt every nights with the latest commits from the dev branch.

"},{"location":"getting-started/docker/installation/basic/","title":"Core components","text":""},{"location":"getting-started/docker/installation/basic/#install-open-voice-os","title":"Install Open Voice OS","text":"

This section covers the installation of the core components only.

Only core components

Keep following the documentation if you want to install some pre-selected skills, HiveMind or even the GUI.

"},{"location":"getting-started/docker/installation/basic/#deploy-the-stack","title":"Deploy the stack","text":"

Before running the docker compose or podman-compose commands, please read this section first.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml up --detach\n

Depending your Internet speed, your Wi-Fi or Ethernet connection speed and your hardware (I/O), the whole process could take several minutes.

Hardware Time Raspberry Pi 3B+ with USB drive ~20 minutes Raspberry Pi 4B with USB drive ~3 minutes MacBook Air i7 Early 2015 with SSD ~2.5 minutes AMD Ryzen 7 5800 with NVMe drive ~45 seconds

Resources overhead

To reduce the potential ressources overhead due to the image downloads and extractions, the --parallel x option could be added to the command in order to process the images by batch of x (where x is an integer).

"},{"location":"getting-started/docker/installation/basic/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED      STATUS                PORTS     NAMES\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED      STATUS                PORTS     NAMES\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
"},{"location":"getting-started/docker/installation/configuration/","title":"Configuration","text":""},{"location":"getting-started/docker/installation/configuration/#open-voice-os-configuration","title":"Open Voice OS configuration","text":"

~/ovos/config/mycroft.conf configuration file is mounted into each containers as a read-only volume.

First I configure then I deploy

Before deploying the services and volumes, it is recommended to set the OVOS's configuration to make sure the services initial start has the correct settings such as the lang for example.

"},{"location":"getting-started/docker/installation/configuration/#initial-configuration","title":"Initial configuration","text":"

This configuration is very basic, it instructs the Open Voice OS instance to run in English as main language.

~/ovos/config/mycroft.conf
{\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  }\n}\n
"},{"location":"getting-started/docker/installation/configuration/#configure-the-logging","title":"Configure the logging","text":"

By default, the Open Voice OS services will write their logs into a file under ~/.local directory, these files are not rotated or compressed which could lead to a disk space issue.

The solution is to add these lines into the ~/ovos/config/mycroft.conf file (create the file if it does not exist), this will tell the services to redirect their logs to the container stdout.

~/ovos/config/mycroft.conf
{\n  \"logs\": {\n    \"path\": \"stdout\"\n  },\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  }\n}\n

Services already deployed

If the services have been already deployed and the ~/ovos/config/mycroft.conf has changed, then you will have to restart the containers impacted by the change(s).

"},{"location":"getting-started/docker/installation/gui/","title":"GUI","text":""},{"location":"getting-started/docker/installation/gui/#install-the-open-voice-os-gui","title":"Install the Open Voice OS GUI","text":"

Linux only

The GUI is currently only available on Linux operating system, not on Mac OS or Windows.

The Open Voice OS GUI supports two types of system execution:

  • Using X or Wayland display servers
  • Using EGLFS which doesn't require any display server which is perfect for headless installation

When using EGLFS, the DISPLAY variable from the .env composition environment file must be removed or commented as if present the X or Wayland display servers will be tried first and result in an ovos_gui container in error.

Hardware accelerated on Raspberry Pi 4 and 5 only

Raspberry Pi 4 and 5 will leverage the GPU hardware acceleration which will provide a smoother experience.

If not running on a Raspberry Pi 4 or 5 then the CPU might be used to render the GUI which will result in a high CPU consumption and a poor exprience.

"},{"location":"getting-started/docker/installation/gui/#configuration","title":"Configuration","text":"

The ovos-gui-messagebus component must be configured in order to receive the QML files from the skill containers. Because of these file transfers, the ovos-message-bus component must be configured to allow bigger payload.

~/ovos/config/mycroft.conf
{\n  \"logs\": {\n    \"path\": \"stdout\"\n  },\n  \"play_wav_cmdline\": \"aplay %1\",\n  \"lang\": \"en-us\",\n  \"listener\": {\n    \"VAD\": {\n      \"module\": \"ovos-vad-plugin-silero\"\n    }\n  },\n  \"gui\": {\n    \"extension\": \"ovos-gui-plugin-shell-companion\",\n    \"idle_display_skill\": \"skill-ovos-homescreen.openvoiceos\",\n    \"generic\": {\n      \"homescreen_supported\": true\n    },\n    \"gui_file_host_path\": \"/home/ovos/.cache/gui_files\"\n  },\n  \"websocket\": {\n    \"max_msg_size\": 100\n  }\n}\n
"},{"location":"getting-started/docker/installation/gui/#xhost-and-display-servers","title":"xhost and display servers","text":"

Tip

You can skip this section if your are using EGLFS and go to GUI services deployment.

In order to allow only the ovos_gui container to access to the X or Wayland display server, you will have to allow the container (based on its hostname) to connect to the display session.

export DISPLAY=\":0\"\nxhost +local:ovos_gui\n

This command is not permanent, when your operating system will reboot you will have to run the command again. To make it permanent systemd should be leveraged as a user service.

Raspberry PiLinux
mkdir -p ~/.config/systemd/user\n
mkdir -p ~/.config/systemd/user\n

Create the xhost.service unit file into the ~/.config/systemd/user directory.

~/.config/systemd/user/xhost.service
[Unit]\nDescription=Allow ovos_gui container to use X from user session\n\n[Service]\nType=oneshot\nEnvironment=\"DISPLAY=:0\"\nExecStart=/usr/bin/xhost +local:ovos_gui\nExecStop=/usr/bin/xhost -local:ovos_gui\nRemainAfterExit=yes\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=default.target\n

Enable and start the new xhost.service systemd service.

Raspberry PiLinux
systemctl --user enable xhost.service\nsystemctl --user start xhost.service\n
systemctl --user enable xhost.service\nsystemctl --user start xhost.service\n

The xhost command is part of the x11-xserver-utils package on Debian based distributions such as Raspberry Pi OS.

"},{"location":"getting-started/docker/installation/gui/#gui-services-deployment","title":"GUI services deployment","text":"

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinux
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --file docker-compose.gui.yml --file docker-compose.raspberrypi.gui.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml --file docker-compose.gui.yml up --detach\n
"},{"location":"getting-started/docker/installation/requirements/","title":"Requirements","text":""},{"location":"getting-started/docker/installation/requirements/#final-steps-before-the-run","title":"Final steps before the run","text":"

Before going further, please make sure to refer to this section as the following commands could defer depending your setup.

"},{"location":"getting-started/docker/installation/requirements/#get-the-ovos-docker-sources","title":"Get the ovos-docker sources","text":"

The ~/hivemind directory is only required if you plan to use HiveMind.

All
git clone https://github.com/OpenVoiceOS/ovos-docker.git ~/ovos-docker\nmkdir -p ~/ovos/{config,share,tmp} ~/hivemind/{config,share}\nchown ${USER}:${USER} -R ~/ovos ~/hivemind\ncd ~/ovos-docker/compose\n
"},{"location":"getting-started/docker/installation/requirements/#enable-user-manager","title":"Enable user manager","text":"

Because some containers require /run/user/1000 to be mounted, systemd should be instructed to log the user during the boot process and make /run/user/1000 directory available before the containers start.

Raspberry PiLinux
sudo loginctl enable-linger $USER\n
sudo loginctl enable-linger $USER\n
"},{"location":"getting-started/docker/installation/requirements/#set-the-environment-file","title":"Set the environment file","text":"

.env file is a strong requirement

Please make sure to read and understand this section as if you don't then the deployment migth fail.

The composer requires an environment file in order to deploy the services and volumes with the correct settings for your setup.

alpha version by default

As mentioned in this section, the current default VERSION (tag) is alpha.

The example files start with a . (dot) which means they are hidden, use the ls -a command to list all the files included the hidden ones.

Below is an example of .env for Linux (not Raspberry Pi), please read this section for more details about what these variables do.

.env
DISPLAY=:0\nHIVEMIND_CONFIG_FOLDER=~/hivemind/config\nHIVEMIND_SHARE_FOLDER=~/hivemind/share\nHIVEMIND_USER=hivemind\nINPUT_GID=102\nOVOS_CONFIG_FOLDER=~/ovos/config\nOVOS_SHARE_FOLDER=~/ovos/share\nOVOS_USER=ovos\nPULL_POLICY=always\nTMP_FOLDER=~/ovos/tmp\nTZ=America/Montreal\nVERSION=alpha\nVIDEO_GID=44\nXDG_RUNTIME_DIR=/run/user/1000\n
Raspberry PiLinuxMac OSWindows WSL2
cp .env-raspberrypi .env\n
cp .env.example .env\n
cp .env.example .env\n
cp .env.example .env\n

Examples are provided, please make sure to select the right one and to set the proper values.

"},{"location":"getting-started/docker/installation/skills/","title":"Skills","text":""},{"location":"getting-started/docker/installation/skills/#howto-install-skills","title":"Howto install skills?","text":"

Two different methods are supported by ovos-docker to install Open Voice OS's skills, each of them having pros and cons .

Slow hardware

When running Open Voice OS on slow hardware such as Raspberry Pi 3B+, it is recommended to install skills using the \"As part of ovos_core container\" method in order to reduce the memory consumption.

"},{"location":"getting-started/docker/installation/skills/#as-part-of-ovos_core-container","title":"As part of ovos_core container","text":"

The first method is to use a skills.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

When ovos_core container starts, it will look for a skills.list file and install the skills defined in there.

Skill requirements

The skill has to be compatible with the pip install method which requires a setup.py file.

skills.list
ovos-skill-stop # Latest skill version on PyPi\novos-skill-volume==0.0.1 # Specific skill version on PyPi\ngit+https://github.com/OpenVoiceOS/skill-ovos-wikipedia.git@fix/whatever # Specific skill's branch on GitHub\n

If the ovos_core container is wiped for any reasons (like an update), the skill(s) will be automatically reprovisioned.

Not only for skills

skills.list file could be used as well to install extra Python librairies, e.g., SoCo, RPi.GPIO. Just make sure to avoid empty lines.

The main advantage of this method is the simplicity but the downside will be more Python dependencies (libraries) within the ovos_core container, potential conflicts across them, a lack of isolation and a slower start of the container.

"},{"location":"getting-started/docker/installation/skills/#as-standalone-container-recommended","title":"As standalone container (recommended)","text":"

The second method is to leverage the ovos-workshop component by running a skill as standalone, it means the skill will not be part of ovos_core container but it will be running inside its own container.

The main advantage is that each skill is isolated which provide more flexibility about Python dependencies (libraries), packages. It is easier to update and more secure but the downside will be that more system resources will be consumed and a container image has to be built for each skill.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml up --detach\n

Depending your Internet speed, your Wi-Fi or Ethernet connection speed and your hardware (I/O), the whole process could take several minutes.

Hardware Time Raspberry Pi 3B+ with USB drive ~12 minutes Raspberry Pi 4B with USB drive ~48 seconds MacBook Air i7 Early 2015 with SSD ~50 seconds AMD Ryzen 7 5800 with NVMe drive ~15 seconds

Resources overhead

To reduce the potential ressources overhead due to the image downloads and extractions, the --parallel x option could be added to the command in order to process the images by batch of x (where x is an integer).

If the ovos_core container is restarted or even deleted, the skill containers will automatically register again to it.

"},{"location":"getting-started/docker/installation/skills/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS                 PORTS     NAMES\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS                 PORTS     NAMES\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   18 hours ago   Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   18 hours ago   Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago   Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago   Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago   Up 8 hours                       ovos_cli\n
"},{"location":"getting-started/docker/plugins/microphone/","title":"Microphone","text":""},{"location":"getting-started/docker/plugins/microphone/#microphone-plugins","title":"Microphone plugins","text":"

A microhpone plugin allows you to use a specific sound protocol in order to get voice samples from your microphone. Depending the operating system you are running on, you will have to choose the correct plugin.

Note

The microhpone plugins are handled by the ovos_listener container.

The ovos_listener container comes with few pre-installed microphone plugins such as:

  • ovos-microphone-plugin-alsa is using pyalsaaudio Python library (default)
  • ovos-microphone-plugin-sounddevice is using sounddevice Python library

If the existing microphone plugins are not enough then you can install yours by following the same principle as for the STT plugins by adding a listener.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_listener container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/listener.list
ovos-microphone-plugin-pyaudio==0.2.0a1 # Specific plugin version on PyPi\novos-microphone-plugin-arecord # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-microphone-plugin-socket.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_listener container must be restarted if a change occurs in the listener.list file.

DockerPodman
docker restart ovos_listener\n
podman restart ovos_listener\n
"},{"location":"getting-started/docker/plugins/microphone/#which-plugin-to-choose","title":"Which plugin to choose?","text":"

Here are the two main plugins to use per platform.

Plugin Platforms ovos-microphone-plugin-alsa ovos-microphone-plugin-sounddevice

Choose the correct plugin

If a wrong plugin is used, the listener will not be able to hear you which means that you will not be able to interact with your Open Voice OS instance.

"},{"location":"getting-started/docker/plugins/phal/","title":"PHAL","text":""},{"location":"getting-started/docker/plugins/phal/#phal-plugins","title":"PHAL plugins","text":"

The Plugin based Hardware Abstraction Layer plugins allow you to interact with system components such as Wi-Fi, GPIO, NetworkManager, etc... but not only.

Note

The PHAL plugins are handled by the ovos_phal and ovos_phal_admin containers.

ovos_phal_admin is a privileged container

The ovos_phal_admin purpose is to run plugins that require accesses to some devices, files or services.

Plugins installed in this container have to be enabled into ~/ovos/config/mycroft.conf in order to get loaded, this acts as an extra layer of security.

The ovos_phal container comes with few pre-installed PHAL plugins such as:

  • ovos-PHAL-plugin-alsa controls system volume with ALSA
  • ovos-PHAL-plugin-system handles bus events to interact with the operating system

If the existing PHAL plugins are not enough then you can install yours by following the same principle as for the STT plugins by adding a phal.list or phal_admin.list files within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_phal or ovos_phal_admin containers start, they will look for these files and install the skpluginsills defined in there.

~/ovos/config/phal.list or ~/ovos/config/phal_admin.list
ovos-phal-plugin-ipgeo==0.0.1 # Specific plugin version on PyPi\novos-PHAL-plugin-pulse # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-PHAL-plugin-homeassistant.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_phal or ovos_phal_admin containers must be restarted if a change occurs in the phal.list or phal_admin.lis files.

DockerPodman
docker restart ovos_phal ovos_phal_admin\n
podman restart ovos_phal ovos_phal_admin\n
"},{"location":"getting-started/docker/plugins/stt/","title":"Speech-To-Text","text":""},{"location":"getting-started/docker/plugins/stt/#speech-to-text-plugins","title":"Speech-To-Text plugins","text":"

The Speech-To-Text plugins allow you to connect Open Voice OS with different STT servers, it could be FasterWhisper, VOSK, Google Translate, Deepgram, etc... Each of these STT providers will have different languages support, precision and performances.

Note

The Speech-To-Text plugins are handled by the ovos_listener container.

The ovos_listener container comes with few pre-installed STT plugins such as:

  • ovos-stt-plugin-server allows you to reach an external STT service
  • ovos-stt-plugin-vosk is an offline STT service

If the existing STT plugins are not enough then you can install yours by following the same principle as for the microphone plugins by adding a listener.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_listener container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/listener.list
ovos-stt-plugin-vosk==0.2.0a1 # Specific plugin version on PyPi\novos-stt-plugin-server # Latest plugin version on PyPi\ngit+https://github.com/OpenVoiceOS/ovos-stt-plugin-chromium.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_listener container must be restarted if a change occurs in the listener.list file.

DockerPodman
docker restart ovos_listener\n
podman restart ovos_listener\n
"},{"location":"getting-started/docker/plugins/tts/","title":"Text-To-Speech","text":""},{"location":"getting-started/docker/plugins/tts/#text-to-speech-plugins","title":"Text-To-Speech plugins","text":"

The Text-To-Speech plugins allow you to connect Open Voice OS with different TTS servers, it could be Piper, Coqui, Amazon Polly, Mimic, etc... Each of these TTS providers will have different voices and languages.

Note

The Text-To-Speech plugins are handled by the ovos_audio container.

The ovos_audio container comes with few pre-installed TTS plugins such as:

  • ovos-tts-plugin-mimic is the original Mycroft AI TTS with the iconic Alan Pope's voice
  • ovos-tts-plugin-mimic2 is the cloud based version hosted on Mycroft AI infrastructure
  • ovos-tts-plugin-mimic3-server is the latest Mycroft AI TTS engine
  • ovos-tts-plugin-server allows you to reach an external TTS service

If the existing TTS plugins are not enough then you can install yours by following the same principle as for the skills by adding an audio.list file within the ~/ovos/config/ directory, this file acts as a Python requirements.txt file.

Plugins requirements

These plugins have to be compatible with the pip install method which requires a setup.py file.

When the ovos_audio container starts, it will look for this file and install the plugins defined in there.

~/ovos/config/audio.list
ovos-tts-plugin-marytts==0.0.1a1 # Specific plugin version on PyPi\nneon-tts-plugin-mozilla-remote # Latest plugin version on PyPi\ngit+https://github.com/NeonGeckoCom/neon-tts-plugin-polly.git@fix/whatever # Specific branch of a plugin on GitHub\n

The ovos_audio container must be restarted if a change occurs in the audio.list file.

DockerPodman
docker restart ovos_audio\n
podman restart ovos_audio\n
"},{"location":"getting-started/docker/prerequisites/cpu/","title":"CPU instructions","text":""},{"location":"getting-started/docker/prerequisites/cpu/#cpu-instructions","title":"CPU instructions","text":"

In order to run TensorFlow used by few Open Voice OS components, the CPU must support AVX (Advanced Vector Extensions) instruction set for x86 processors or SIMD (Single Instruction, Multiple Data) instruction set for ARM processors.

LinuxMac OS
grep -E -i --color \"avx|simd\" /proc/cpuinfo\n
sysctl -a | grep -E -i --color \"avx|simd\"\n

If the command does not return an output then your CPU doesn't meet the requirements for TensorFlow.

AVX or SIMD instruction set missing

Because the instruction set is missing does not mean that Open Voice OS can't run on your hardware, it simply means that Precise wake word engine or anything else using TensorFlow will not run on it.

"},{"location":"getting-started/docker/prerequisites/engine/","title":"Container engine","text":""},{"location":"getting-started/docker/prerequisites/engine/#container-engine","title":"Container engine","text":""},{"location":"getting-started/docker/prerequisites/engine/#installation","title":"Installation","text":"

As we are leveraging containers, a container engine such as Docker or Podman is required (only one of them should be installed), as well as their composer.

If you are not familiar with what a container engine or a composer are then please refer to this section first as these fundamentals must be understood.

"},{"location":"getting-started/docker/prerequisites/engine/#versions","title":"Versions","text":"

When running on Linux, please make sure to not use Docker Desktop but prefer Docker Engine as it is a better choice in our case. Docker Desktop runs a virtual machine which doesn't have access to the same devices as the host has, due to this limitation the /dev/snd device will not be usable and this will prevent the usage of speakers and microphone.

docker-compose versus docker compose

As mentioned by Docker, from July 2023 Compose V1 (docker-compose) will not received updates anymore which makes it deprecated and replaced by Compose V2 (docker compose) directly embedded into the docker command line.

Either you choose to install Docker or Podman and their composer on Linux, Mac OS or Windows, please refer to the official documentation1.

Minimum required versions

In order to get the latest features supported by ovos-docker, please make sure to install a recent version of Docker (>= 24.x.x) or Podman (>= 4.3.x) for your operating system.

"},{"location":"getting-started/docker/prerequisites/engine/#dont-be-root-be-a-user","title":"Don't be root, be a user","text":"

You should not run docker command as root user or using the sudo command, if so then you will get some error messages such as Permission denied and some containers could restart in a loop.

To allow a simple user to execute the docker command, make sure to add the user to the docker group.

Linux
sudo usermod -a -G docker $USER\n

Once added to the docker group you will have to logout from the current session (graphical or SSH) in order to get the group added to your user once you reconnect.

Once reconnected, run the following command to ensure the docker has been appened to your $USER.

Linux
id\nuid=1000(foobar) gid=1000(foobar) groups=1000(foobar),973(docker)\n

The GID could differ compare to your setup.

"},{"location":"getting-started/docker/prerequisites/engine/#validation","title":"Validation","text":"DockerPodman
docker system info\ndocker container list\n
podman system info\npodman container list\n
  1. Docker official documentation or Podman official documentation.\u00a0\u21a9

"},{"location":"getting-started/docker/prerequisites/sound/","title":"Sound system","text":""},{"location":"getting-started/docker/prerequisites/sound/#sound-system","title":"Sound system","text":"

PulseAudio is a requirement and has to be up and running on the host (not inside the containers) to expose a socket (for communication) and a cookie (for authentication) to allow the containers to have access to the microphone (input device) and speakers (output device).

On modern Linux distribution, PipeWire now handles the sound stack on the system.

Sound server auto-detection

ovos-docker supports both native PulseAudio and PipeWire, the containers will automatically detect which sound server is running on the operating system.

"},{"location":"getting-started/docker/prerequisites/sound/#mac-os-and-windows","title":"Mac OS and Windows","text":"

If you are running an operating system other Linux such as Mac OS or Windows, then PulseAudio will have to be installed to act as a gateway between the containers and the OS.

Mac OSWindows WSL2
brew install pulseaudio\nbrew services stop pulseaudio\nsed -i \"\" \"s/#load-module module-native-protocol-tcp/load-module module-native-protocol-tcp/g\" $(brew ls pulseaudio | grep default.pa$)\nbrew services start pulseaudio\n
sudo apt install pulseaudio\n
"},{"location":"getting-started/docker/prerequisites/sound/#permissions","title":"Permissions","text":"

The user running the containers must be part of the audio system group (depending the Linux distribution).

PulseAudio files permissions

Check the permissions for ~/.config/pulse/ and /run/user/1000/pulse directories, they should belong to the user running the stack (where 1000 is your user ID), not to root user.

If you are running on Mac OS, there is no /run/user/1000/ directory.

"},{"location":"getting-started/docker/prerequisites/sound/#validation","title":"Validation","text":"

pactl is a PulseAudio command shipped with the pulseaudio-utils package and pw-cli is a PipeWire command shipped with pipewire-utils or pipewire-bin depending your distribution.

These commands provide information about the status of PulseAudio or PipeWire.

PulseAudioPipeWire
pactl info\n
pw-cli info\n
"},{"location":"getting-started/docker/prerequisites/sound/#list-microphones","title":"List microphones","text":"

At least one of the sources (microphones/audio input) returned, should match the Default Source line from the pactl info command or the Audio/Source line from the wpctl status command.

PulseAudioPipeWire
pactl list sources short\n
wpctl status | grep Audio/Source\n
"},{"location":"getting-started/docker/prerequisites/sound/#list-speakers","title":"List speakers","text":"

At least one of the sinks (speakers/audio output) returned, should match the Default Sink line from the pactl info command or the Audio/Sink line from the wpctl status command.

PulseAudioPipeWire
pactl list sinks short\n
wpctl status | grep Audio/Sink\n
"},{"location":"getting-started/docker/security/hardening/","title":"System hardening","text":""},{"location":"getting-started/docker/security/hardening/#basic-ovos-hardening","title":"Basic OVOS hardening","text":"

In order to secure your Open Voice OS instance, few more steps are required and few concepts must be understood.

"},{"location":"getting-started/docker/security/hardening/#apparmor","title":"AppArmor","text":"

AppArmor and SELinux are examples of Mandatory Access Control (MAC) systems. These systems differ from other security controls which are generally called Discretionary Access Control (DAC) systems in that, generally, the user can't change their operation.

AppArmor packages

AppArmor must be installed on your system before going further. Please refer to your Linux distribution documentation to install it.

"},{"location":"getting-started/docker/security/hardening/#enable-apparmor","title":"Enable AppArmor","text":"Raspberry Pi OSDebian & Ubuntu /boot/cmdline.txt
apparmor=1 security=apparmor\n
/etc/default/grub.d/apparmor.cfg
apparmor=1 security=apparmor\n

System must be rebooted to instruct the kernel to load AppArmor during the boot sequence. Once rebooted, check the AppArmor status using the aa-status command.

Raspberry Pi OSDebian & Ubuntu
sudo aa-status\n
sudo aa-status\n
"},{"location":"getting-started/docker/security/hardening/#apparmor-docker-profile","title":"AppArmor Docker profile","text":"

AppArmor and Podman support1

AppArmor support for Podman is not yet fully functional.

Docker applies the docker-default AppArmor profile to new containers. In Docker 1.13 and later this profile is created in tmpfs and then loaded into the kernel.

The container engine should now be aware of apparmor as an available security option.

docker system info | grep -i apparmor\n

All the containers except ovos_phal_admin should now be confined with the docker-default AppArmor profile.

docker container list --quiet --all --filter \"name=ovos\" | xargs docker inspect --format \"{{ .Name }}: AppArmorProfile={{ .AppArmorProfile }}\"\n/ovos_skill_volume: AppArmorProfile=docker-default\n/ovos_skill_wikipedia: AppArmorProfile=docker-default\n/ovos_skill_fallback_unknown: AppArmorProfile=docker-default\n/ovos_skill_alerts: AppArmorProfile=docker-default\n/ovos_skill_hello_world: AppArmorProfile=docker-default\n/ovos_skill_weather: AppArmorProfile=docker-default\n/ovos_skill_stop: AppArmorProfile=docker-default\n/ovos_skill_date_time: AppArmorProfile=docker-default\n/ovos_skill_personal: AppArmorProfile=docker-default\n/ovos_listener: AppArmorProfile=docker-default\n/ovos_audio: AppArmorProfile=docker-default\n/ovos_core: AppArmorProfile=docker-default\n/ovos_phal: AppArmorProfile=docker-default\n/ovos_phal_admin: AppArmorProfile=unconfined\n/ovos_messagebus: AppArmorProfile=docker-default\n/ovos_cli: AppArmorProfile=docker-default\n

ovos_phal_admin container is not confined

The ovos_phal_admin container is not confined as it runs as a privileged container.

"},{"location":"getting-started/docker/security/hardening/#message-bus","title":"Message bus","text":"

By default, the message bus is listening on address 0.0.0.0 and port 8181 because the ovos_messagebus is created using the --network host option. This could be a security issue as an external device could connect to the message bus and send and/or read messages.

Why using --network host?

Some Open Voice OS skills such as Home Assistant or Sonos require access to your private network in order to communicate with your IoT devices.

To prevent potential security issues, it is recommended to use a firewall the port 8181.

iptables will be demonstrated as an example but if firewalld or ufw services are used, then make sure to be compliant with your distribution.

Linux
sudo iptables -A INPUT -p tcp -s localhost --dport 8181 -j ACCEPT\nsudo iptables iptables -A INPUT -p tcp --dport 8181 -j DROP\n

This will allow connections to port 8181 only from localhost (internal).

Keep your ports closed

Keep in mind to firewall any other ports which should not be exposed outside of the host by using the same IPTables method.

If you really need to connect an external application to the message bus, we recommend to use HiveMind to ensure a proper security exposure.

  1. Enable rootless AppArmor for Podman \u21a9

"},{"location":"getting-started/docker/security/hivemind/","title":"HiveMind","text":""},{"location":"getting-started/docker/security/hivemind/#hivemind-to-the-rescue","title":"HiveMind to the rescue","text":""},{"location":"getting-started/docker/security/hivemind/#what-is-hivemind","title":"What is HiveMind?","text":"

HiveMind is a community-developed superset or extension of Open Voice OS, the open-source voice operating system.

With HiveMind, you can extend one (or more, but usually just one!) instance of Open Voice OS to as many devices as you want, including devices that can't ordinarily run Open Voice OS!

Official documentation

What it means, is that HiveMind allows external connections to the message bus by using a secured protocol.

Fulfill the requirements first

Before going further, please make sure that all the requirements are fulfilled.

A composition file is available in order to deploy hivemind_listener and hivemind_cli services.

Podman users

If you are running Podman instead of Docker, replace docker compose with podmand-compose.

Raspberry PiLinuxMac OSWindows WSL2
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.raspberrypi.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n
docker compose --project-name ovos --file docker-compose.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n
docker compose --project-name ovos --file docker-compose.macos.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml --env-file .env up --detach\n
docker compose --project-name ovos --file docker-compose.windows.yml --file docker-compose.skills.yml --file docker-compose.hivemind.yml up --detach\n

For more information about how to authenticate with the HiveMind listener, please read the HiveMind-core repository documentation.

Once the HiveMind containers are up and running, the HiveMind command line allows you to add client, to list them, to delete them, etc...

DockerPodman
docker exec --interactive --tty hivemind_cli hivemind-core --help\n
podman exec --interactive --tty hivemind_cli hivemind-core --help\n

Port 5678 must be open

In order to to reach the HiveMind listener, the port 5678 has to be open on the host. Please make sure your firewall allows the connection to this port or the clients will not be able to connect to it.

"},{"location":"getting-started/docker/security/hivemind/#containers-status","title":"Containers status","text":"

At this point of the installation, here are the containers that should be up and running.

DockerPodman
docker container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                 PORTS     NAMES\n4e2d45799de8   smartgic/hivemind-cli:alpha                  \"sleep infinity\"         16 minutes ago   Up 16 minutes                    hivemind_cli\n612a9ea32405   smartgic/hivemind-listener:alpha             \"hivemind-core listen\"   16 minutes ago   Up 16 minutes                    hivemind_listener\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago     Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago     Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago     Up 8 hours                       ovos_cli\n
podman container list --all --filter 'name=ovos'\nCONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                 PORTS     NAMES\n4e2d45799de8   smartgic/hivemind-cli:alpha                  \"sleep infinity\"         16 minutes ago   Up 16 minutes                    hivemind_cli\n612a9ea32405   smartgic/hivemind-listener:alpha             \"hivemind-core listen\"   16 minutes ago   Up 16 minutes                    hivemind_listener\n1446b87d7a32   smartgic/ovos-skill-volume:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_volume\n7ad46a871661   smartgic/ovos-skill-wikipedia:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_wikipedia\nb43b8cf31a43   smartgic/ovos-skill-fallback-unknown:alpha   \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_fallback_unknown\nf27d3fceecec   smartgic/ovos-skill-alerts:alpha             \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_alerts\n30b70c9e72ef   smartgic/ovos-skill-hello-world:alpha        \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_hello_world\nf42175c6d7b8   smartgic/ovos-skill-weather:alpha            \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_weather\n0ae42a59fb0b   smartgic/ovos-skill-stop:alpha               \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_stop\n5760fb22deb9   smartgic/ovos-skill-date-time:alpha          \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_date_time\n73f4d4b0a091   smartgic/ovos-skill-personal:alpha           \"ovos-skill-launcher\u2026\"   19 hours ago     Up 8 hours                       ovos_skill_personal\n219eb6254d32   smartgic/ovos-listener-dinkum:alpha          \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_listener\n31f5d5e7a1ec   smartgic/ovos-audio:alpha                    \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_audio\n05e94905b867   smartgic/ovos-core:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_core\nd256c2e7b6f3   smartgic/ovos-phal:alpha                     \"/bin/bash /usr/loca\u2026\"   19 hours ago     Up 8 hours                       ovos_phal\na4db13a597a4   smartgic/ovos-phal-admin:alpha               \"/bin/bash /usr/loca\u2026\"   25 hours ago     Up 8 hours                       ovos_phal_admin\nd157740c9965   smartgic/ovos-messagebus:alpha               \"/bin/bash -c ovos-m\u2026\"   25 hours ago     Up 8 hours (healthy)             ovos_messagebus\n6e3536dcfae5   smartgic/ovos-cli:alpha                      \"sleep infinity\"         25 hours ago     Up 8 hours                       ovos_cli\n
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 07c59f1..2dccfa9 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,127 +2,127 @@ https://openvoiceos.github.io/ovos-docker/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/about/what-is-it/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/about/why-use-ovos/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/about/glossary/components/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/about/glossary/terms/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/cli/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/composition/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/debug/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/images/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/update/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/installation/basic/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/installation/configuration/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/installation/gui/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/installation/requirements/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/installation/skills/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/plugins/microphone/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/plugins/phal/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/plugins/stt/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/plugins/tts/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/prerequisites/cpu/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/prerequisites/engine/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/prerequisites/sound/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/security/hardening/ - 2023-11-17 + 2023-11-20 daily https://openvoiceos.github.io/ovos-docker/getting-started/docker/security/hivemind/ - 2023-11-17 + 2023-11-20 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 496d220a3eeb442e69ee131d56dd7643e7aeb9b9..70784076a63def8b641393d847667ac48025cf95 100644 GIT binary patch delta 359 zcmV-t0hs=>1F-{tABzYGzu8-50{?SqbY*Q}a4vXlYyjPtL5|xn3`O^IioknWNxEqZ z$Fu7R+5;#OMyMoOpQFz$yP zBufsHKMmi$eo-HX=lN->B{0aYi4&iOMI?XL`g*;Ni~`YrWFDz_&30)QtlxurKYkkK zr(IiXg158#ngZE*&B84WWk?r73&f*GS?YO2(sUtKj_fNGJ?T~d__$$-bP%`_t=BXE+%<+De!%E2E%RA50N)t`j@ePvuMs#MPC;q3R$7_Ac5(gYp%( zg3{hvu|Vu)KLI)-r2?Q6 F002bItEK<| delta 359 zcmV-t0hs==1F{2uABzYG>&sSU0{?SqbY*Q}a4vXlYyjPtO^(|z42Ab|ioknW$#l^l zIG$Zk&>ldMI5IJks1d28xqao#phy=53KS?HYh#;!rr!seggia{h+%hz!bs^j9LD{y zgJj8J^2g!(x3B8c@H9V6wFCy)HF4tOu!!U@T3;@gkx?Ljn#>~=uh}l`g7te)@5j%> z{IF|lP4IShTT>uAuUWXIp$zFvXn}b2C`&z!NSe;X%8`A6q9?uT?;kfTk=*>afBc{h z2X*+^B=501nO#is@Lb?^b_TAc5(gYp%( zg3{hvu|Vu)