diff --git a/assets/css/search-bar.css b/assets/css/search-bar.css index f2db11d41..1062d0aef 100644 --- a/assets/css/search-bar.css +++ b/assets/css/search-bar.css @@ -30,7 +30,7 @@ color: var(--searchAccentMain); position: relative; height: 46px; - padding: 8px 35px 8px 43px; + padding: 8px 135px 8px 43px; width: 100%; transition: var(--transition-all); } @@ -80,7 +80,8 @@ background-color: transparent; border: none; cursor: pointer; - right: 11px; + /* FIXME: I know this is wrong. Not sure what to do though */ + right: 100px; margin: 0; opacity: 0.5; padding: 5px 1px 5px 0; @@ -95,6 +96,31 @@ opacity: 0.7; } +.top-search .search-bar .search-type { + background-color: transparent; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + border-right: 1px solid transparent; + border-left: 1px solid var(--searchBarBorder); + border-top-right-radius: var(--borderRadius-base); + border-bottom-right-radius: var(--borderRadius-base); + color: var(--searchAccentMain); + position: absolute; + top: calc(50% - 23px); + right: 0; + height: 46px; + padding: 8px 8px 8px 16px; + transition: var(--transition-all); + z-index: 99; +} + +.top-search .search-bar .search-type:focus { + border: 1px solid var(--searchBarFocusColor); + border-top-right-radius: calc(var(--borderRadius-base) - 1px); + border-bottom-right-radius: calc(var(--borderRadius-base) - 1px); + box-shadow: 0px 4px 20px 0px var(--searchBarBorderColor) inset; +} + .top-search .search-settings button.icon-settings { display: flex; align-items: center; diff --git a/assets/js/autocomplete/suggestions.js b/assets/js/autocomplete/suggestions.js index e21777227..71fc04dbb 100644 --- a/assets/js/autocomplete/suggestions.js +++ b/assets/js/autocomplete/suggestions.js @@ -1,5 +1,6 @@ import { getSidebarNodes } from '../globals' -import { escapeRegexModifiers, escapeHtmlEntities, isBlank } from '../helpers' +import { isBlank } from '../helpers' +import { highlightMatches } from '../highlighter' /** * @typedef Suggestion @@ -285,27 +286,3 @@ function startsWith (text, subtext) { function tokenize (query) { return query.trim().split(/\s+/) } - -/** - * Returns an HTML string highlighting the individual tokens from the query string. - */ -function highlightMatches (text, query) { - // Sort terms length, so that the longest are highlighted first. - const terms = tokenize(query).sort((term1, term2) => term2.length - term1.length) - return highlightTerms(text, terms) -} - -function highlightTerms (text, terms) { - if (terms.length === 0) return text - - const [firstTerm, ...otherTerms] = terms - const match = text.match(new RegExp(`(.*)(${escapeRegexModifiers(firstTerm)})(.*)`, 'i')) - - if (match) { - const [, before, matching, after] = match - // Note: this has exponential complexity, but we expect just a few terms, so that's fine. - return highlightTerms(before, terms) + '' + escapeHtmlEntities(matching) + '' + highlightTerms(after, terms) - } else { - return highlightTerms(text, otherTerms) - } -} diff --git a/assets/js/globals.js b/assets/js/globals.js index 179ac6ef4..7a12c3ab7 100644 --- a/assets/js/globals.js +++ b/assets/js/globals.js @@ -14,3 +14,7 @@ export function getSidebarNodes () { export function getVersionNodes () { return window.versionNodes || [] } + +export function getSearchNodes () { + return window.searchNodes || [] +} diff --git a/assets/js/highlighter.js b/assets/js/highlighter.js new file mode 100644 index 000000000..feebb160d --- /dev/null +++ b/assets/js/highlighter.js @@ -0,0 +1,34 @@ +import { escapeRegexModifiers, escapeHtmlEntities } from './helpers' + +/** + * Returns an HTML string highlighting the individual tokens from the query string. + */ +export function highlightMatches (text, query, opts = {}) { + // Sort terms length, so that the longest are highlighted first. + if (typeof query === 'string') { + query = query.split(/\s+/) + } + const terms = query.sort((term1, term2) => term2.length - term1.length) + return highlightTerms(text, terms, opts) +} + +function highlightTerms (text, terms, opts) { + if (terms.length === 0) return text + + let flags = 'i' + + if (opts.multiline) { + flags = 'is' + } + + const [firstTerm, ...otherTerms] = terms + const match = text.match(new RegExp(`(.*)(${escapeRegexModifiers(firstTerm)})(.*)`, flags)) + + if (match) { + const [, before, matching, after] = match + // Note: this has exponential complexity, but we expect just a few terms, so that's fine. + return highlightTerms(before, terms, opts) + '' + escapeHtmlEntities(matching) + '' + highlightTerms(after, terms, opts) + } else { + return highlightTerms(text, otherTerms, opts) + } +} diff --git a/assets/js/search-bar.js b/assets/js/search-bar.js index 2e50e04e4..9c7821328 100644 --- a/assets/js/search-bar.js +++ b/assets/js/search-bar.js @@ -10,7 +10,7 @@ import { AUTOCOMPLETE_CONTAINER_SELECTOR, AUTOCOMPLETE_SUGGESTION_LIST_SELECTOR } from './autocomplete/autocomplete-list' -import { isEmbedded } from './globals' +import { isEmbedded, getSearchNodes, getVersionNodes } from './globals' import { isAppleOS, qs } from './helpers' const SEARCH_INPUT_SELECTOR = 'form.search-bar input' @@ -37,6 +37,12 @@ function initialize () { focusSearchInput() if (open) { showPreview(event.target) } else { hidePreview() } } + + if (window.navigator.onLine) { + enableRemoteSearch(null) + } else { + disableRemoteSearch(null) + } } /** @@ -137,6 +143,66 @@ function addEventListeners () { clearSearch() hideAutocomplete() }) + + window.addEventListener('online', enableRemoteSearch) + window.addEventListener('offline', disableRemoteSearch) +} + +function enableRemoteSearch (_event) { + Array.from(document.getElementsByClassName('online-only')).forEach(element => { + element.removeAttribute('disabled') + element.removeAttribute('title') + updateSearchTypeOptions(element) + }) +} + +function disableRemoteSearch (_event) { + Array.from(document.getElementsByClassName('online-only')).forEach(element => { + element.setAttribute('disabled', '') + element.setAttribute('title', 'Local searching only - browser is offline') + updateSearchTypeOptions(element) + }) +} + +function updateSearchTypeOptions (element) { + Array.from(element.getElementsByTagName('option')).forEach(option => { + if (option.value === 'related') { + if (shouldEnableRelatedSearch()) { + option.removeAttribute('disabled') + option.removeAttribute('title') + } else { + option.setAttribute('disabled', '') + option.setAttribute('title', 'No known related packages to search') + } + } + if (option.value === 'latest') { + if (shouldEnableLatestSearch()) { + option.removeAttribute('disabled') + option.removeAttribute('title') + } else { + option.setAttribute('disabled', '') + option.setAttribute('title', 'Already browsing latest version') + } + } + }) +} + +function shouldEnableRelatedSearch () { + return getSearchNodes().length > 1 +} + +function shouldEnableLatestSearch () { + const versionNodes = getVersionNodes() + + if (versionNodes.length > 0) { + const latest = versionNodes[0] + const searchNodes = getSearchNodes() + const match = searchNodes.some(node => `v${node.version}` === latest.version) + + return !match + } + + return false } function handleAutocompleteFormSubmission (event) { @@ -155,8 +221,18 @@ function handleAutocompleteFormSubmission (event) { anchor.setAttribute('href', autocompleteSuggestion.link) } else { const meta = document.querySelector('meta[name="exdoc:full-text-search-url"]') - const url = meta ? meta.getAttribute('content') : 'search.html?q=' - anchor.setAttribute('href', `${url}${encodeURIComponent(searchInput.value)}`) + const url = meta ? meta.getAttribute('content') : 'search.html' + + const params = new URLSearchParams() + params.set('q', searchInput.value) + + const searchType = getSearchType() + + if (searchType !== 'local') { + params.set('type', searchType) + } + + anchor.setAttribute('href', `${url}?${params.toString()}`) } anchor.click() @@ -167,6 +243,16 @@ function handleAutocompleteFormSubmission (event) { } } +function getSearchType () { + const searchTypes = Array.from(document.getElementsByClassName('search-type')) + + if (searchTypes.length > 0) { + return searchTypes[0].value + } + + return 'local' +} + function clearSearch () { const input = qs(SEARCH_INPUT_SELECTOR) input.value = '' diff --git a/assets/js/search-page.js b/assets/js/search-page.js index 7f647b4bd..79ec45604 100644 --- a/assets/js/search-page.js +++ b/assets/js/search-page.js @@ -4,6 +4,8 @@ import lunr from 'lunr' import { qs, escapeHtmlEntities, isBlank, getQueryParamByName, getProjectNameAndVersion } from './helpers' import { setSearchInputValue } from './search-bar' import searchResultsTemplate from './handlebars/templates/search-results.handlebars' +import { getSearchNodes } from './globals' +import { highlightMatches } from './highlighter' const EXCERPT_RADIUS = 80 const SEARCH_CONTAINER_SELECTOR = '#search' @@ -26,23 +28,29 @@ function initialize () { const pathname = window.location.pathname if (pathname.endsWith('/search.html') || pathname.endsWith('/search')) { const query = getQueryParamByName('q') - search(query) + const queryType = getQueryParamByName('type') + search(query, queryType) } } -async function search (value) { +async function search (value, queryType) { if (isBlank(value)) { renderResults({ value }) } else { setSearchInputValue(value) - const index = await getIndex() - try { - // We cannot match on atoms :foo because that would be considered - // a filter. So we escape all colons not preceded by a word. - const fixedValue = value.replaceAll(/(\B|\\):/g, '\\:') - const results = searchResultsToDecoratedSearchItems(index.search(fixedValue)) + let results = [] + const searchNodes = getSearchNodes() + + if (['related', 'latest'].includes(queryType) && searchNodes.length > 0) { + setSearchType(queryType) + + results = await remoteSearch(value, queryType, searchNodes) + } else { + results = await localSearch(value) + } + renderResults({ value, results }) } catch (error) { renderResults({ value, errorMessage: error.message }) @@ -50,6 +58,65 @@ async function search (value) { } } +async function localSearch (value) { + const index = await getIndex() + + // We cannot match on atoms :foo because that would be considered + // a filter. So we escape all colons not preceded by a word. + const fixedValue = value.replaceAll(/(\B|\\):/g, '\\:') + return searchResultsToDecoratedSearchItems(index.search(fixedValue)) +} + +async function remoteSearch (value, queryType, searchNodes) { + let filterNodes = searchNodes + + if (queryType === 'latest') { + filterNodes = searchNodes.slice(0, 1) + } + + const filters = filterNodes.map(node => `${node.name}-${node.version}`).join(',') + + const params = new URLSearchParams() + params.set('q', value) + params.set('query_by', 'title,doc') + params.set('filter_by', `package:=[${filters}]`) + + const response = await fetch(`https://search.hexdocs.pm/?${params.toString()}`) + const payload = await response.json() + + if (Array.isArray(payload.hits)) { + return payload.hits.map(result => { + const [packageName, packageVersion] = result.document.package.split('-') + + const doc = highlightMatches(result.document.doc, value, { multiline: true }) + const excerpts = [doc] + const metadata = {} + const ref = `https://hexdocs.pm/${packageName}/${packageVersion}/${result.document.ref}` + const title = result.document.title + const type = result.document.type + + return { + doc, + excerpts, + metadata, + ref, + title, + type + } + }) + } else { + return [] + } +} + +function setSearchType (value) { + const searchTypes = Array.from(document.getElementsByClassName('search-type')) + + searchTypes.forEach(element => { + element.value = value + }) +} + function renderResults ({ value, results, errorMessage }) { const searchContainer = qs(SEARCH_CONTAINER_SELECTOR) const resultsHtml = searchResultsTemplate({ value, results, errorMessage }) diff --git a/formatters/html/dist/html-6XHBGSGW.js b/formatters/html/dist/html-PCPGWS3R.js similarity index 57% rename from formatters/html/dist/html-6XHBGSGW.js rename to formatters/html/dist/html-PCPGWS3R.js index 2fe49fee7..95039b6cf 100644 --- a/formatters/html/dist/html-6XHBGSGW.js +++ b/formatters/html/dist/html-PCPGWS3R.js @@ -1,9 +1,9 @@ -(()=>{var Ps=Object.create;var Wn=Object.defineProperty;var Os=Object.getOwnPropertyDescriptor;var Is=Object.getOwnPropertyNames;var As=Object.getPrototypeOf,Cs=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Rs=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Is(e))!Cs.call(t,i)&&i!==n&&Wn(t,i,{get:()=>e[i],enumerable:!(r=Os(e,i))||r.enumerable});return t};var Y=(t,e,n)=>(n=t!=null?Ps(As(t)):{},Rs(e||!t||!t.__esModule?Wn(n,"default",{value:t,enumerable:!0}):n,t));var gr=L((lc,mr)=>{var pr="Expected a function",hr=NaN,Bs="[object Symbol]",Qs=/^\s+|\s+$/g,qs=/^[-+]0x[0-9a-f]+$/i,Fs=/^0b[01]+$/i,Vs=/^0o[0-7]+$/i,$s=parseInt,Us=typeof global=="object"&&global&&global.Object===Object&&global,js=typeof self=="object"&&self&&self.Object===Object&&self,Ws=Us||js||Function("return this")(),zs=Object.prototype,Gs=zs.toString,Ks=Math.max,Ys=Math.min,Bt=function(){return Ws.Date.now()};function Js(t,e,n){var r,i,s,o,a,l,u=0,c=!1,d=!1,h=!0;if(typeof t!="function")throw new TypeError(pr);e=fr(e)||0,Fe(n)&&(c=!!n.leading,d="maxWait"in n,s=d?Ks(fr(n.maxWait)||0,e):s,h="trailing"in n?!!n.trailing:h);function p(S){var R=r,U=i;return r=i=void 0,u=S,o=t.apply(U,R),o}function m(S){return u=S,a=setTimeout(w,e),c?p(S):o}function g(S){var R=S-l,U=S-u,ee=e-R;return d?Ys(ee,s-U):ee}function v(S){var R=S-l,U=S-u;return l===void 0||R>=e||R<0||d&&U>=s}function w(){var S=Bt();if(v(S))return x(S);a=setTimeout(w,g(S))}function x(S){return a=void 0,h&&r?p(S):(r=i=void 0,o)}function I(){a!==void 0&&clearTimeout(a),u=0,r=l=i=a=void 0}function q(){return a===void 0?o:x(Bt())}function $(){var S=Bt(),R=v(S);if(r=arguments,i=this,l=S,R){if(a===void 0)return m(l);if(d)return a=setTimeout(w,e),p(l)}return a===void 0&&(a=setTimeout(w,e)),o}return $.cancel=I,$.flush=q,$}function Xs(t,e,n){var r=!0,i=!0;if(typeof t!="function")throw new TypeError(pr);return Fe(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Js(t,e,{leading:r,maxWait:e,trailing:i})}function Fe(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function Zs(t){return!!t&&typeof t=="object"}function eo(t){return typeof t=="symbol"||Zs(t)&&Gs.call(t)==Bs}function fr(t){if(typeof t=="number")return t;if(eo(t))return hr;if(Fe(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Fe(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(Qs,"");var n=Fs.test(t);return n||Vs.test(t)?$s(t.slice(2),n?2:8):qs.test(t)?hr:+t}mr.exports=Xs});var F=L(D=>{"use strict";D.__esModule=!0;D.extend=Cr;D.indexOf=fo;D.escapeExpression=po;D.isEmpty=mo;D.createFrame=go;D.blockParams=vo;D.appendContextPath=yo;var lo={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},uo=/[&<>"'`=]/g,co=/[&<>"'`=]/;function ho(t){return lo[t]}function Cr(t){for(var e=1;e{"use strict";je.__esModule=!0;var Wt=["description","fileName","lineNumber","endLineNumber","message","name","number","stack"];function zt(t,e){var n=e&&e.loc,r=void 0,i=void 0,s=void 0,o=void 0;n&&(r=n.start.line,i=n.end.line,s=n.start.column,o=n.end.column,t+=" - "+r+":"+s);for(var a=Error.prototype.constructor.call(this,t),l=0;l{"use strict";We.__esModule=!0;var Gt=F();We.default=function(t){t.registerHelper("blockHelperMissing",function(e,n){var r=n.inverse,i=n.fn;if(e===!0)return i(this);if(e===!1||e==null)return r(this);if(Gt.isArray(e))return e.length>0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var s=Gt.createFrame(n.data);s.contextPath=Gt.appendContextPath(n.data.contextPath,n.name),n={data:s}}return i(e,n)})};Hr.exports=We.default});var Br=L((ze,Dr)=>{"use strict";ze.__esModule=!0;function wo(t){return t&&t.__esModule?t:{default:t}}var we=F(),bo=X(),Eo=wo(bo);ze.default=function(t){t.registerHelper("each",function(e,n){if(!n)throw new Eo.default("Must pass iterator to #each");var r=n.fn,i=n.inverse,s=0,o="",a=void 0,l=void 0;n.data&&n.ids&&(l=we.appendContextPath(n.data.contextPath,n.ids[0])+"."),we.isFunction(e)&&(e=e.call(this)),n.data&&(a=we.createFrame(n.data));function u(m,g,v){a&&(a.key=m,a.index=g,a.first=g===0,a.last=!!v,l&&(a.contextPath=l+m)),o=o+r(e[m],{data:a,blockParams:we.blockParams([e[m],m],[l+m,null])})}if(e&&typeof e=="object")if(we.isArray(e))for(var c=e.length;s{"use strict";Ge.__esModule=!0;function xo(t){return t&&t.__esModule?t:{default:t}}var ko=X(),So=xo(ko);Ge.default=function(t){t.registerHelper("helperMissing",function(){if(arguments.length!==1)throw new So.default('Missing helper: "'+arguments[arguments.length-1].name+'"')})};Qr.exports=Ge.default});var Ur=L((Ke,$r)=>{"use strict";Ke.__esModule=!0;function Lo(t){return t&&t.__esModule?t:{default:t}}var Fr=F(),To=X(),Vr=Lo(To);Ke.default=function(t){t.registerHelper("if",function(e,n){if(arguments.length!=2)throw new Vr.default("#if requires exactly one argument");return Fr.isFunction(e)&&(e=e.call(this)),!n.hash.includeZero&&!e||Fr.isEmpty(e)?n.inverse(this):n.fn(this)}),t.registerHelper("unless",function(e,n){if(arguments.length!=2)throw new Vr.default("#unless requires exactly one argument");return t.helpers.if.call(this,e,{fn:n.inverse,inverse:n.fn,hash:n.hash})})};$r.exports=Ke.default});var Wr=L((Ye,jr)=>{"use strict";Ye.__esModule=!0;Ye.default=function(t){t.registerHelper("log",function(){for(var e=[void 0],n=arguments[arguments.length-1],r=0;r{"use strict";Je.__esModule=!0;Je.default=function(t){t.registerHelper("lookup",function(e,n,r){return e&&r.lookupProperty(e,n)})};zr.exports=Je.default});var Yr=L((Xe,Kr)=>{"use strict";Xe.__esModule=!0;function _o(t){return t&&t.__esModule?t:{default:t}}var be=F(),Po=X(),Oo=_o(Po);Xe.default=function(t){t.registerHelper("with",function(e,n){if(arguments.length!=2)throw new Oo.default("#with requires exactly one argument");be.isFunction(e)&&(e=e.call(this));var r=n.fn;if(be.isEmpty(e))return n.inverse(this);var i=n.data;return n.data&&n.ids&&(i=be.createFrame(n.data),i.contextPath=be.appendContextPath(n.data.contextPath,n.ids[0])),r(e,{data:i,blockParams:be.blockParams([e],[i&&i.contextPath])})})};Kr.exports=Xe.default});var Kt=L(Ze=>{"use strict";Ze.__esModule=!0;Ze.registerDefaultHelpers=Uo;Ze.moveHelperToHooks=jo;function se(t){return t&&t.__esModule?t:{default:t}}var Io=Nr(),Ao=se(Io),Co=Br(),Ro=se(Co),Mo=qr(),Ho=se(Mo),No=Ur(),Do=se(No),Bo=Wr(),Qo=se(Bo),qo=Gr(),Fo=se(qo),Vo=Yr(),$o=se(Vo);function Uo(t){Ao.default(t),Ro.default(t),Ho.default(t),Do.default(t),Qo.default(t),Fo.default(t),$o.default(t)}function jo(t,e,n){t.helpers[e]&&(t.hooks[e]=t.helpers[e],n||delete t.helpers[e])}});var Xr=L((et,Jr)=>{"use strict";et.__esModule=!0;var Wo=F();et.default=function(t){t.registerDecorator("inline",function(e,n,r,i){var s=e;return n.partials||(n.partials={},s=function(o,a){var l=r.partials;r.partials=Wo.extend({},l,n.partials);var u=e(o,a);return r.partials=l,u}),n.partials[i.args[0]]=i.fn,s})};Jr.exports=et.default});var Zr=L(Yt=>{"use strict";Yt.__esModule=!0;Yt.registerDefaultDecorators=Yo;function zo(t){return t&&t.__esModule?t:{default:t}}var Go=Xr(),Ko=zo(Go);function Yo(t){Ko.default(t)}});var Jt=L((tt,ei)=>{"use strict";tt.__esModule=!0;var Jo=F(),fe={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(e){if(typeof e=="string"){var n=Jo.indexOf(fe.methodMap,e.toLowerCase());n>=0?e=n:e=parseInt(e,10)}return e},log:function(e){if(e=fe.lookupLevel(e),typeof console<"u"&&fe.lookupLevel(fe.level)<=e){var n=fe.methodMap[e];console[n]||(n="log");for(var r=arguments.length,i=Array(r>1?r-1:0),s=1;s{"use strict";Xt.__esModule=!0;Xt.createNewLookupObject=Zo;var Xo=F();function Zo(){for(var t=arguments.length,e=Array(t),n=0;n{"use strict";Ee.__esModule=!0;Ee.createProtoAccessControl=ra;Ee.resultIsAllowed=ia;Ee.resetLoggedProperties=oa;function ea(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var ni=ti(),ta=Jt(),na=ea(ta),nt=Object.create(null);function ra(t){var e=Object.create(null);e.constructor=!1,e.__defineGetter__=!1,e.__defineSetter__=!1,e.__lookupGetter__=!1;var n=Object.create(null);return n.__proto__=!1,{properties:{whitelist:ni.createNewLookupObject(n,t.allowedProtoProperties),defaultValue:t.allowProtoPropertiesByDefault},methods:{whitelist:ni.createNewLookupObject(e,t.allowedProtoMethods),defaultValue:t.allowProtoMethodsByDefault}}}function ia(t,e,n){return ri(typeof t=="function"?e.methods:e.properties,n)}function ri(t,e){return t.whitelist[e]!==void 0?t.whitelist[e]===!0:t.defaultValue!==void 0?t.defaultValue:(sa(e),!1)}function sa(t){nt[t]!==!0&&(nt[t]=!0,na.log("error",'Handlebars: Access has been denied to resolve the property "'+t+`" because it is not an "own property" of its parent. +(()=>{var Cs=Object.create;var Kn=Object.defineProperty;var Rs=Object.getOwnPropertyDescriptor;var Ms=Object.getOwnPropertyNames;var Ns=Object.getPrototypeOf,Hs=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ds=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ms(e))!Hs.call(t,i)&&i!==n&&Kn(t,i,{get:()=>e[i],enumerable:!(r=Rs(e,i))||r.enumerable});return t};var Y=(t,e,n)=>(n=t!=null?Cs(Ns(t)):{},Ds(e||!t||!t.__esModule?Kn(n,"default",{value:t,enumerable:!0}):n,t));var vr=L((yc,gr)=>{var mr="Expected a function",fr=NaN,$s="[object Symbol]",qs=/^\s+|\s+$/g,Us=/^[-+]0x[0-9a-f]+$/i,js=/^0b[01]+$/i,Ws=/^0o[0-7]+$/i,zs=parseInt,Gs=typeof global=="object"&&global&&global.Object===Object&&global,Ks=typeof self=="object"&&self&&self.Object===Object&&self,Ys=Gs||Ks||Function("return this")(),Js=Object.prototype,Xs=Js.toString,Zs=Math.max,eo=Math.min,Ft=function(){return Ys.Date.now()};function to(t,e,n){var r,i,s,o,a,l,u=0,c=!1,d=!1,h=!0;if(typeof t!="function")throw new TypeError(mr);e=pr(e)||0,Ue(n)&&(c=!!n.leading,d="maxWait"in n,s=d?Zs(pr(n.maxWait)||0,e):s,h="trailing"in n?!!n.trailing:h);function f(S){var R=r,U=i;return r=i=void 0,u=S,o=t.apply(U,R),o}function m(S){return u=S,a=setTimeout(w,e),c?f(S):o}function g(S){var R=S-l,U=S-u,ee=e-R;return d?eo(ee,s-U):ee}function v(S){var R=S-l,U=S-u;return l===void 0||R>=e||R<0||d&&U>=s}function w(){var S=Ft();if(v(S))return x(S);a=setTimeout(w,g(S))}function x(S){return a=void 0,h&&r?f(S):(r=i=void 0,o)}function A(){a!==void 0&&clearTimeout(a),u=0,r=l=i=a=void 0}function F(){return a===void 0?o:x(Ft())}function q(){var S=Ft(),R=v(S);if(r=arguments,i=this,l=S,R){if(a===void 0)return m(l);if(d)return a=setTimeout(w,e),f(l)}return a===void 0&&(a=setTimeout(w,e)),o}return q.cancel=A,q.flush=F,q}function no(t,e,n){var r=!0,i=!0;if(typeof t!="function")throw new TypeError(mr);return Ue(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),to(t,e,{leading:r,maxWait:e,trailing:i})}function Ue(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function ro(t){return!!t&&typeof t=="object"}function io(t){return typeof t=="symbol"||ro(t)&&Xs.call(t)==$s}function pr(t){if(typeof t=="number")return t;if(io(t))return fr;if(Ue(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Ue(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(qs,"");var n=js.test(t);return n||Ws.test(t)?zs(t.slice(2),n?2:8):Us.test(t)?fr:+t}gr.exports=no});var V=L(D=>{"use strict";D.__esModule=!0;D.extend=Rr;D.indexOf=vo;D.escapeExpression=yo;D.isEmpty=wo;D.createFrame=bo;D.blockParams=Eo;D.appendContextPath=xo;var fo={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},po=/[&<>"'`=]/g,mo=/[&<>"'`=]/;function go(t){return fo[t]}function Rr(t){for(var e=1;e{"use strict";Ge.__esModule=!0;var Gt=["description","fileName","lineNumber","endLineNumber","message","name","number","stack"];function Kt(t,e){var n=e&&e.loc,r=void 0,i=void 0,s=void 0,o=void 0;n&&(r=n.start.line,i=n.end.line,s=n.start.column,o=n.end.column,t+=" - "+r+":"+s);for(var a=Error.prototype.constructor.call(this,t),l=0;l{"use strict";Ke.__esModule=!0;var Yt=V();Ke.default=function(t){t.registerHelper("blockHelperMissing",function(e,n){var r=n.inverse,i=n.fn;if(e===!0)return i(this);if(e===!1||e==null)return r(this);if(Yt.isArray(e))return e.length>0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var s=Yt.createFrame(n.data);s.contextPath=Yt.appendContextPath(n.data.contextPath,n.name),n={data:s}}return i(e,n)})};Hr.exports=Ke.default});var Qr=L((Ye,Br)=>{"use strict";Ye.__esModule=!0;function ko(t){return t&&t.__esModule?t:{default:t}}var Ee=V(),So=X(),Lo=ko(So);Ye.default=function(t){t.registerHelper("each",function(e,n){if(!n)throw new Lo.default("Must pass iterator to #each");var r=n.fn,i=n.inverse,s=0,o="",a=void 0,l=void 0;n.data&&n.ids&&(l=Ee.appendContextPath(n.data.contextPath,n.ids[0])+"."),Ee.isFunction(e)&&(e=e.call(this)),n.data&&(a=Ee.createFrame(n.data));function u(m,g,v){a&&(a.key=m,a.index=g,a.first=g===0,a.last=!!v,l&&(a.contextPath=l+m)),o=o+r(e[m],{data:a,blockParams:Ee.blockParams([e[m],m],[l+m,null])})}if(e&&typeof e=="object")if(Ee.isArray(e))for(var c=e.length;s{"use strict";Je.__esModule=!0;function To(t){return t&&t.__esModule?t:{default:t}}var _o=X(),Po=To(_o);Je.default=function(t){t.registerHelper("helperMissing",function(){if(arguments.length!==1)throw new Po.default('Missing helper: "'+arguments[arguments.length-1].name+'"')})};Fr.exports=Je.default});var jr=L((Xe,Ur)=>{"use strict";Xe.__esModule=!0;function Oo(t){return t&&t.__esModule?t:{default:t}}var $r=V(),Ao=X(),qr=Oo(Ao);Xe.default=function(t){t.registerHelper("if",function(e,n){if(arguments.length!=2)throw new qr.default("#if requires exactly one argument");return $r.isFunction(e)&&(e=e.call(this)),!n.hash.includeZero&&!e||$r.isEmpty(e)?n.inverse(this):n.fn(this)}),t.registerHelper("unless",function(e,n){if(arguments.length!=2)throw new qr.default("#unless requires exactly one argument");return t.helpers.if.call(this,e,{fn:n.inverse,inverse:n.fn,hash:n.hash})})};Ur.exports=Xe.default});var zr=L((Ze,Wr)=>{"use strict";Ze.__esModule=!0;Ze.default=function(t){t.registerHelper("log",function(){for(var e=[void 0],n=arguments[arguments.length-1],r=0;r{"use strict";et.__esModule=!0;et.default=function(t){t.registerHelper("lookup",function(e,n,r){return e&&r.lookupProperty(e,n)})};Gr.exports=et.default});var Jr=L((tt,Yr)=>{"use strict";tt.__esModule=!0;function Io(t){return t&&t.__esModule?t:{default:t}}var xe=V(),Co=X(),Ro=Io(Co);tt.default=function(t){t.registerHelper("with",function(e,n){if(arguments.length!=2)throw new Ro.default("#with requires exactly one argument");xe.isFunction(e)&&(e=e.call(this));var r=n.fn;if(xe.isEmpty(e))return n.inverse(this);var i=n.data;return n.data&&n.ids&&(i=xe.createFrame(n.data),i.contextPath=xe.appendContextPath(n.data.contextPath,n.ids[0])),r(e,{data:i,blockParams:xe.blockParams([e],[i&&i.contextPath])})})};Yr.exports=tt.default});var Jt=L(nt=>{"use strict";nt.__esModule=!0;nt.registerDefaultHelpers=Go;nt.moveHelperToHooks=Ko;function se(t){return t&&t.__esModule?t:{default:t}}var Mo=Dr(),No=se(Mo),Ho=Qr(),Do=se(Ho),Bo=Vr(),Qo=se(Bo),Fo=jr(),Vo=se(Fo),$o=zr(),qo=se($o),Uo=Kr(),jo=se(Uo),Wo=Jr(),zo=se(Wo);function Go(t){No.default(t),Do.default(t),Qo.default(t),Vo.default(t),qo.default(t),jo.default(t),zo.default(t)}function Ko(t,e,n){t.helpers[e]&&(t.hooks[e]=t.helpers[e],n||delete t.helpers[e])}});var Zr=L((rt,Xr)=>{"use strict";rt.__esModule=!0;var Yo=V();rt.default=function(t){t.registerDecorator("inline",function(e,n,r,i){var s=e;return n.partials||(n.partials={},s=function(o,a){var l=r.partials;r.partials=Yo.extend({},l,n.partials);var u=e(o,a);return r.partials=l,u}),n.partials[i.args[0]]=i.fn,s})};Xr.exports=rt.default});var ei=L(Xt=>{"use strict";Xt.__esModule=!0;Xt.registerDefaultDecorators=ea;function Jo(t){return t&&t.__esModule?t:{default:t}}var Xo=Zr(),Zo=Jo(Xo);function ea(t){Zo.default(t)}});var Zt=L((it,ti)=>{"use strict";it.__esModule=!0;var ta=V(),pe={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(e){if(typeof e=="string"){var n=ta.indexOf(pe.methodMap,e.toLowerCase());n>=0?e=n:e=parseInt(e,10)}return e},log:function(e){if(e=pe.lookupLevel(e),typeof console<"u"&&pe.lookupLevel(pe.level)<=e){var n=pe.methodMap[e];console[n]||(n="log");for(var r=arguments.length,i=Array(r>1?r-1:0),s=1;s{"use strict";en.__esModule=!0;en.createNewLookupObject=ra;var na=V();function ra(){for(var t=arguments.length,e=Array(t),n=0;n{"use strict";ke.__esModule=!0;ke.createProtoAccessControl=aa;ke.resultIsAllowed=la;ke.resetLoggedProperties=ca;function ia(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var ri=ni(),sa=Zt(),oa=ia(sa),st=Object.create(null);function aa(t){var e=Object.create(null);e.constructor=!1,e.__defineGetter__=!1,e.__defineSetter__=!1,e.__lookupGetter__=!1;var n=Object.create(null);return n.__proto__=!1,{properties:{whitelist:ri.createNewLookupObject(n,t.allowedProtoProperties),defaultValue:t.allowProtoPropertiesByDefault},methods:{whitelist:ri.createNewLookupObject(e,t.allowedProtoMethods),defaultValue:t.allowProtoMethodsByDefault}}}function la(t,e,n){return ii(typeof t=="function"?e.methods:e.properties,n)}function ii(t,e){return t.whitelist[e]!==void 0?t.whitelist[e]===!0:t.defaultValue!==void 0?t.defaultValue:(ua(e),!1)}function ua(t){st[t]!==!0&&(st[t]=!0,oa.log("error",'Handlebars: Access has been denied to resolve the property "'+t+`" because it is not an "own property" of its parent. You can add a runtime option to disable the check or this warning: -See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details`))}function oa(){Object.keys(nt).forEach(function(t){delete nt[t]})}});var rn=L(j=>{"use strict";j.__esModule=!0;j.HandlebarsEnvironment=nn;function ii(t){return t&&t.__esModule?t:{default:t}}var oe=F(),aa=X(),en=ii(aa),la=Kt(),ua=Zr(),ca=Jt(),rt=ii(ca),da=Zt(),ha="4.7.7";j.VERSION=ha;var fa=8;j.COMPILER_REVISION=fa;var pa=7;j.LAST_COMPATIBLE_COMPILER_REVISION=pa;var ma={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};j.REVISION_CHANGES=ma;var tn="[object Object]";function nn(t,e,n){this.helpers=t||{},this.partials=e||{},this.decorators=n||{},la.registerDefaultHelpers(this),ua.registerDefaultDecorators(this)}nn.prototype={constructor:nn,logger:rt.default,log:rt.default.log,registerHelper:function(e,n){if(oe.toString.call(e)===tn){if(n)throw new en.default("Arg not supported with multiple helpers");oe.extend(this.helpers,e)}else this.helpers[e]=n},unregisterHelper:function(e){delete this.helpers[e]},registerPartial:function(e,n){if(oe.toString.call(e)===tn)oe.extend(this.partials,e);else{if(typeof n>"u")throw new en.default('Attempting to register a partial called "'+e+'" as undefined');this.partials[e]=n}},unregisterPartial:function(e){delete this.partials[e]},registerDecorator:function(e,n){if(oe.toString.call(e)===tn){if(n)throw new en.default("Arg not supported with multiple decorators");oe.extend(this.decorators,e)}else this.decorators[e]=n},unregisterDecorator:function(e){delete this.decorators[e]},resetLoggedPropertyAccesses:function(){da.resetLoggedProperties()}};var ga=rt.default.log;j.log=ga;j.createFrame=oe.createFrame;j.logger=rt.default});var oi=L((it,si)=>{"use strict";it.__esModule=!0;function sn(t){this.string=t}sn.prototype.toString=sn.prototype.toHTML=function(){return""+this.string};it.default=sn;si.exports=it.default});var ai=L(on=>{"use strict";on.__esModule=!0;on.wrapHelper=va;function va(t,e){if(typeof t!="function")return t;var n=function(){var i=arguments[arguments.length-1];return arguments[arguments.length-1]=e(i),t.apply(this,arguments)};return n}});var hi=L(Z=>{"use strict";Z.__esModule=!0;Z.checkRevision=ka;Z.template=Sa;Z.wrapProgram=st;Z.resolvePartial=La;Z.invokePartial=Ta;Z.noop=ci;function ya(t){return t&&t.__esModule?t:{default:t}}function wa(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var ba=F(),z=wa(ba),Ea=X(),G=ya(Ea),K=rn(),li=Kt(),xa=ai(),ui=Zt();function ka(t){var e=t&&t[0]||1,n=K.COMPILER_REVISION;if(!(e>=K.LAST_COMPATIBLE_COMPILER_REVISION&&e<=K.COMPILER_REVISION))if(e{"use strict";ot.__esModule=!0;ot.default=function(t){var e=typeof global<"u"?global:window,n=e.Handlebars;t.noConflict=function(){return e.Handlebars===t&&(e.Handlebars=n),t}};fi.exports=ot.default});var ae=L((at,yi)=>{"use strict";at.__esModule=!0;function ln(t){return t&&t.__esModule?t:{default:t}}function un(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}var Ia=rn(),mi=un(Ia),Aa=oi(),Ca=ln(Aa),Ra=X(),Ma=ln(Ra),Ha=F(),an=un(Ha),Na=hi(),gi=un(Na),Da=pi(),Ba=ln(Da);function vi(){var t=new mi.HandlebarsEnvironment;return an.extend(t,mi),t.SafeString=Ca.default,t.Exception=Ma.default,t.Utils=an,t.escapeExpression=an.escapeExpression,t.VM=gi,t.template=function(e){return gi.template(e,t)},t}var xe=vi();xe.create=vi;Ba.default(xe);xe.default=xe;at.default=xe;yi.exports=at.default});var zi=L((ji,Wi)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var c=t.utils.clone(n)||{};c.position=[a,u],c.index=s.length,s.push(new t.Token(r.slice(a,o),c))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?c+=2:a==l&&(n+=r[u+1]*i[c+1],u+=2,c+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c=s.str.charAt(0),d=s.str.charAt(1),h;d in s.node.edges?h=s.node.edges[d]:(h=new t.TokenSet,s.node.edges[d]=h),s.str.length==1&&(h.final=!0),i.push({node:h,editsRemaining:s.editsRemaining-1,str:c+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ji=="object"?Wi.exports=n():e.lunr=n()}(this,function(){return t})})()});var zn=new URLSearchParams(window.location.search),Gn=window.self!==window.parent,Pt=Gn&&zn.has("preview"),Ot=Gn&&zn.has("hint"),A=Pt||Ot;function Ae(){return window.sidebarNodes||{}}function Kn(){return window.versionNodes||[]}var f=document.querySelector.bind(document),M=document.querySelectorAll.bind(document);function Yn(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function Re(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function Me(){return document.getElementById("main").dataset.type}var Ce=["H1","H2","H3","H4","H5","H6"];function He(t=!1){let e=window.location.hash.replace(/^#/,"");if(!e)return t?document.getElementById("top-content"):null;let n=document.getElementById(e);if(!n)return null;if(n.matches(".detail"))return n;if(Ce.includes(n.tagName))return It(n);let r=Ms(n);return r||document.getElementById("top-content")}function Ms(t){let e=t.previousElementSibling;for(;e;){if(Ce.includes(e.tagName))return It(e);e=e.previousElementSibling}let n=t.parentNode;for(;n;){for(e=n.previousElementSibling;e;){if(Ce.includes(e.tagName))return It(e);e=e.previousElementSibling}n=n.parentNode}return null}function It(t){let e=document.createElement("div"),n=[t],r=t;for(;(r=r.nextSibling)&&!(Ce.includes(r.tagName)&&r.tagName<=t.tagName);)n.push(r);return e.append(...n),e}function Jn(t){return new URLSearchParams(window.location.search).get(t)}function At(t){return fetch(t).then(e=>e.ok).catch(()=>!1)}function he(t){return!t||t.trim()===""}function Xn(t,e){let n;return function(...i){clearTimeout(n),n=setTimeout(()=>{n=null,t(...i)},e)}}function Ne(){return document.head.querySelector("meta[name=project][content]").content}function De(){return document.documentElement.classList.contains("apple-os")}function E(t,e,n){let r=document.createElement(t);for(let i in e)e[i]!=null&&r.setAttribute(i,e[i]);return n&&r.replaceChildren(...n),r}if(Pt&&A){let t=He(!0);if(t){document.body.classList.add("preview"),document.getElementById("content").replaceChildren(...t.childNodes);let e=document.getElementsByTagName("a:not([target=_blank]");for(let n of e)n.setAttribute("target","_parent");window.scrollTo(0,0),document.body.style.position="fixed",setTimeout(Zn),window.addEventListener("resize",Zn)}}function Zn(){let t={type:"preview",contentHeight:document.getElementById("content").parentElement.offsetHeight};window.parent.postMessage(t,"*")}var ie={plain:"plain",function:"function",module:"module"},Hs=[{href:"typespecs.html#basic-types",hint:{kind:ie.plain,description:"Basic type"}},{href:"typespecs.html#literals",hint:{kind:ie.plain,description:"Literal"}},{href:"typespecs.html#built-in-types",hint:{kind:ie.plain,description:"Built-in type"}}],Be={cancelHintFetching:null};function er(t){if(nr(t))return!0;let e=/#.*\//;return t.includes("#")&&!e.test(t)?!1:t.includes(".html")}function tr(t){let e=nr(t);return e?Promise.resolve(e):Ns(t)}function nr(t){let e=Hs.find(n=>t.includes(n.href));return e?e.hint:null}function Ns(t){let e=t.replace(".html",".html?hint=true");return new Promise((n,r)=>{let i=document.createElement("iframe");i.setAttribute("src",e),i.style.display="none";function s(a){let{href:l,hint:u}=a.data;e===l&&(o(),n(u))}Be.cancelHintFetching=()=>{o(),r(new Error("cancelled"))};function o(){i.remove(),window.removeEventListener("message",s),Be.cancelHintFetching=null}window.addEventListener("message",s),document.body.appendChild(i)})}function rr(){Be.cancelHintFetching&&Be.cancelHintFetching()}function ir(t){let n=t.querySelector("h1").textContent,r=t.querySelector(".docstring > p"),i=r?r.innerHTML:"";return{kind:ie.function,title:n.trim(),description:i.trim()}}function sr(t){let n=t.querySelector("h1 > span").textContent,r=t.querySelector("#moduledoc p"),i=r?r.innerHTML:"";return{kind:ie.module,title:n.trim(),description:i.trim()}}if(Ot&&A){let t=He(),e=t?ir(t):["modules","tasks"].includes(Me())?sr(f(".content-inner")):null;if(e){let n={hint:{...e,version:Ne()},href:window.location.href};window.parent.postMessage(n,"*")}f(".content-inner")?.replaceChildren()}var Ct="ex_doc:settings",or="dark",Rt="system",Mt="dark",Ht="light";var Ds={tooltips:!0,theme:null,livebookUrl:null},Nt=class{constructor(){this._subscribers=[],this._settings=Ds,this._loadSettings()}get(){return this._settings}update(e){let n=this._settings;this._settings={...this._settings,...e},this._subscribers.forEach(r=>r(this._settings,n)),this._storeSettings()}getAndSubscribe(e){this._subscribers.push(e),e(this._settings)}_loadSettings(){try{let e=localStorage.getItem(Ct);if(e){let n=JSON.parse(e);this._settings={...this._settings,...n}}this._loadSettingsLegacy()}catch(e){console.error(`Failed to load settings: ${e}`)}}_storeSettings(){try{this._storeSettingsLegacy(),localStorage.setItem(Ct,JSON.stringify(this._settings))}catch(e){console.error(`Failed to persist settings: ${e}`)}}_loadSettingsLegacy(){localStorage.getItem("tooltipsDisabled")!==null&&(this._settings={...this._settings,tooltips:!1}),localStorage.getItem("night-mode")==="true"&&(this._settings={...this._settings,nightMode:!0}),this._settings.nightMode===!0&&(this._settings={...this._settings,theme:"dark"})}_storeSettingsLegacy(){this._settings.tooltips?localStorage.removeItem("tooltipsDisabled"):localStorage.setItem("tooltipsDisabled","true"),this._settings.nightMode!==null?localStorage.setItem("night-mode",this._settings.nightMode===!0?"true":"false"):localStorage.removeItem("night-mode"),this._settings.theme!==null?(localStorage.setItem("night-mode",this._settings.theme==="dark"?"true":"false"),this._settings.nightMode=this._settings.theme==="dark"):(delete this._settings.nightMode,localStorage.removeItem("night-mode"))}},H=new Nt;var ar=!1,Qe=null,J=null;function lr(t){ar||(ar=!0,J=document.getElementById("toast"),J?.addEventListener("click",()=>{clearTimeout(Qe),J.classList.remove("show")})),J&&(clearTimeout(Qe),J.innerText=t,J.classList.add("show"),Qe=setTimeout(()=>{J.classList.remove("show"),Qe=setTimeout(function(){J.innerText=""},1e3)},5e3))}var Dt=[Rt,Mt,Ht],ur=window.matchMedia("(prefers-color-scheme: dark)");H.getAndSubscribe(cr);ur.addEventListener("change",cr);function cr(){let t=qe(),e=t===Mt||t!==Ht&&ur.matches;document.body.classList.toggle(or,e)}function dr(){let t=Dt[Dt.indexOf(qe())+1]||Dt[0];H.update({theme:t}),lr(`Set theme to "${t}"`)}function qe(){return new URLSearchParams(window.location.search).get("theme")||H.get().theme||Rt}var Sr=Y(gr());var Qt="sidebar_state",qt="closed",vr="open",yr="sidebar_width";var Ve="sidebar-open",$e="sidebar-transition";var wr=!1;function br(){if(wr)return;wr=!0;let t=document.getElementById("sidebar-list-nav");if(!t)return;let e=Me(),n={extras:t.dataset.extras||"Pages",modules:"Modules",tasks:'Mix Tasks'};Object.entries(n).forEach(([r,i])=>{let s=Ae()[r];if(!s?.length)return;let o=`${r}-list-tab-button`,a=`${r}-tab-panel`,l=r===e,u=E("button",{id:o,role:"tab",tabindex:l?0:-1,"aria-selected":l||void 0,"aria-controls":a});u.innerHTML=i,u.addEventListener("keydown",ro),u.addEventListener("click",io),t.appendChild(E("li",{},[u]));let c=E("ul",{class:"full-list"});c.addEventListener("click",so);let d=E("div",{id:a,class:"sidebar-tabpanel",role:"tabpanel","aria-labelledby":o,hidden:l?void 0:""},[c]);document.getElementById("sidebar").appendChild(d);let h="",p,m;c.replaceChildren(...s.flatMap(g=>{let v=[],w=Array.isArray(g.headers),x=w?void 0:"no";return g.group!==h&&(v.push(E("li",{class:"group",translate:x},[g.group])),h=g.group,p=void 0),g.nested_context&&g.nested_context!==p?(p=g.nested_context,m!==p&&v.push(E("li",{class:"nesting-context",translate:"no","aria-hidden":!0},[p]))):m=g.title,v.push(E("li",{},[E("a",{href:`${g.id}.html`,translate:x},[g.nested_title||g.title]),...Vt(`node-${g.id}-headers`,w?to(g):no(g))])),v}))}),Ft(),requestAnimationFrame(Er),window.addEventListener("hashchange",Ft),window.addEventListener("exdoc:loaded",Ft)}function Vt(t,e){return e.length?[E("button",{"aria-label":"expand","aria-expanded":!1,"aria-controls":t}),E("ul",{id:t},e)]:[]}function to(t){return t.headers.map(({id:e,anchor:n})=>E("li",{},[E("a",{href:`${t.id}.html#${n}`},[e])]))}function no(t){let e=[];return t.sections?.length&&e.push(E("li",{},[E("a",{href:`${t.id}.html#content`},["Sections"]),...Vt(`${t.id}-sections-list`,t.sections.map(({id:n,anchor:r})=>E("li",{},[E("a",{href:`${t.id}.html#${r}`},[n])])))])),t.nodeGroups&&(e.push(E("li",{},[E("a",{href:`${t.id}.html#summary`},["Summary"])])),e.push(...t.nodeGroups.map(({key:n,name:r,nodes:i})=>E("li",{},[E("a",{href:`${t.id}.html#${n}`},[r]),...Vt(`node-${t.id}-group-${n}-list`,i.map(({anchor:s,title:o,id:a})=>E("li",{},[E("a",{href:`${t.id}.html#${s}`,title:o,translate:"no"},[a])])))])))),e}function $t(t){let e=document.getElementById("sidebar-list-nav").querySelector("[aria-selected]");e!==t&&(e&&(e.removeAttribute("aria-selected"),e.setAttribute("tabindex","-1"),document.getElementById(e.getAttribute("aria-controls")).setAttribute("hidden","hidden")),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),document.getElementById(t.getAttribute("aria-controls")).removeAttribute("hidden"))}function Er(){f("#sidebar [role=tabpanel]:not([hidden]) a[aria-selected]")?.scrollIntoView()}function Ft(){let t=document.getElementById("sidebar"),{pathname:e,hash:n}=window.location,r=e.split("/").pop().replace(/\.html$/,"")+".html",i=t.querySelector(`li a[href="${r+n}"]`)||t.querySelector(`li a[href="${r}"]`);if(!i)return;t.querySelectorAll(".full-list a[aria-selected]").forEach(o=>{o.removeAttribute("aria-selected")}),t.querySelectorAll(".full-list button[aria-expanded=true]").forEach(o=>{o.setAttribute("aria-expanded",!1)});let s=i.parentElement;for(;s;){if(s.tagName==="LI"){let o=s.firstChild;o.setAttribute("aria-selected",o.getAttribute("href")===r?"page":"true");let a=o.nextSibling;a?.tagName==="BUTTON"&&a.setAttribute("aria-expanded",!0)}else if(s.role==="tabpanel"){s.hasAttribute("hidden")&&$t(document.getElementById(s.getAttribute("aria-labelledby")));break}s=s.parentElement}}function ro(t){if(!["ArrowRight","ArrowLeft"].includes(t.key))return;let e=Array.from(M('#sidebar-list-nav [role="tab"]')),r=e.indexOf(t.currentTarget)+(t.key==="ArrowRight"?1:-1),i=e.at(r%e.length);$t(i),i.focus()}function io(t){$t(t.currentTarget),Er()}function so(t){let e=t.target;e.tagName==="BUTTON"&&e.setAttribute("aria-expanded",e.getAttribute("aria-expanded")==="false")}var ao=300,Lr=".sidebar-toggle",Tr=window.matchMedia(`screen and (max-width: ${768}px)`);if(!A){window.addEventListener("exdoc:loaded",xr);let t=document.getElementById("sidebar"),e=f(Lr);e.addEventListener("click",Ue),document.body.addEventListener("click",i=>{Tr.matches&&_r()&&!t.contains(i.target)&&!e.contains(i.target)&&Ue()});let n=window.innerWidth;window.addEventListener("resize",(0,Sr.default)(()=>{n!==window.innerWidth&&(n=window.innerWidth,xr())},100));let r=new ResizeObserver(([i])=>{if(!i)return;let s=i.contentRect.width;sessionStorage.setItem(yr,s),document.body.style.setProperty("--sidebarWidth",`${s}px`)});t.addEventListener("mousedown",()=>r.observe(t)),t.addEventListener("mouseup",()=>r.unobserve(t))}function xr(){let e=sessionStorage.getItem(Qt)!==qt&&!Tr.matches;Or(e)}function Ue(){let t=!_r();return sessionStorage.setItem(Qt,t?vr:qt),Ir(t)}function _r(){return document.body.classList.contains(Ve)}function Pr(){return document.body.classList.contains(Ve)&&!document.body.classList.contains($e)}function Or(t){t&&br(),document.body.classList.toggle(Ve,t),f(Lr).setAttribute("aria-expanded",t?"true":"false")}var kr;function Ir(t){return new Promise(e=>{document.body.classList.add($e),document.body.scrollTop,Or(t),clearTimeout(kr),kr=setTimeout(()=>{document.body.classList.remove($e),e()},ao)})}function Ar(){return Ir(!0)}var wi=Y(ae());var cn=Y(ae());cn.registerHelper("isArray",function(t,e){return Array.isArray(t)?e.fn(this):e.inverse(this)});cn.registerHelper("isNonEmptyArray",function(t,e){return Array.isArray(t)&&t.length>0?e.fn(this):e.inverse(this)});var bi=wi.template({1:function(t,e,n,r,i){var s,o,a=e??(t.nullContext||{}),l=t.hooks.helperMissing,u="function",c=t.escapeExpression,d=t.lookupProperty||function(h,p){if(Object.prototype.hasOwnProperty.call(h,p))return h[p]};return'