diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..9171294 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,33 @@ +name: Deploy +on: + workflow_dispatch: {} + push: + branches: + - gh-pages +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - run: npm ci + - name: Build + run: npm run docs:build + - uses: actions/configure-pages@v2 + - uses: actions/upload-pages-artifact@v1 + with: + path: docs/v2/.vitepress/dist + - name: Deploy + id: deployment + uses: actions/deploy-pages@v1 \ No newline at end of file diff --git a/css/style.css b/css/style.css index 0364188..c859f43 100644 --- a/css/style.css +++ b/css/style.css @@ -1,3 +1,6 @@ +html { + scroll-behavior: smooth; +} .ui.horizontal.divider { margin: 3rem 0 2rem; } @@ -14,16 +17,16 @@ padding: 1em 0em; .masthead .ui.menu .ui.button { margin-left: 0.5em; } -.masthead h1.ui.header { +.masthead h2.ui.header { margin-top: 3em; font-size: 7em; } -.masthead h2 { +.masthead h1 { font-size: 1.3em; font-weight: normal; -margin: 0.5em 0 5em 0; +margin: 0.5em 0 2em 0; } -.masthead h2 a { +.masthead h1 a { color: #fff; font-weight: bold; } diff --git a/docs/v2/.vitepress/cache/deps/@theme_index.js b/docs/v2/.vitepress/cache/deps/@theme_index.js new file mode 100644 index 0000000..965498a --- /dev/null +++ b/docs/v2/.vitepress/cache/deps/@theme_index.js @@ -0,0 +1,41 @@ +// node_modules/vitepress/dist/client/theme-default/index.js +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/fonts.css"; + +// node_modules/vitepress/dist/client/theme-default/without-fonts.js +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/vars.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/base.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/utils.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css"; +import "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css"; +import VPBadge from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue"; +import Layout from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/Layout.vue"; +import { default as default2 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue"; +import { default as default3 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue"; +import { default as default4 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue"; +import { default as default5 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue"; +import { default as default6 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue"; +import { default as default7 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue"; +import { default as default8 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue"; +import { default as default9 } from "/home/aero/Documents/ua-parser-js/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue"; +var theme = { + Layout, + enhanceApp: ({ app }) => { + app.component("Badge", VPBadge); + } +}; +var without_fonts_default = theme; +export { + default5 as VPDocAsideSponsors, + default3 as VPHomeFeatures, + default2 as VPHomeHero, + default4 as VPHomeSponsors, + default9 as VPTeamMembers, + default6 as VPTeamPage, + default8 as VPTeamPageSection, + default7 as VPTeamPageTitle, + without_fonts_default as default +}; +//# sourceMappingURL=@theme_index.js.map diff --git a/docs/v2/.vitepress/cache/deps/@theme_index.js.map b/docs/v2/.vitepress/cache/deps/@theme_index.js.map new file mode 100644 index 0000000..643d1bb --- /dev/null +++ b/docs/v2/.vitepress/cache/deps/@theme_index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/vitepress/dist/client/theme-default/index.js", "../../../../../node_modules/vitepress/dist/client/theme-default/without-fonts.js"], + "sourcesContent": ["import './styles/fonts.css';\nexport * from './without-fonts';\nexport { default as default } from './without-fonts';\n", "import './styles/vars.css';\nimport './styles/base.css';\nimport './styles/utils.css';\nimport './styles/components/custom-block.css';\nimport './styles/components/vp-code.css';\nimport './styles/components/vp-code-group.css';\nimport './styles/components/vp-doc.css';\nimport './styles/components/vp-sponsor.css';\nimport VPBadge from './components/VPBadge.vue';\nimport Layout from './Layout.vue';\n// Note: if we add more optional components here, i.e. components that are not\n// used in the theme by default unless the user imports them, make sure to update\n// the `lazyDefaultThemeComponentsRE` regex in src/node/build/bundle.ts.\nexport { default as VPHomeHero } from './components/VPHomeHero.vue';\nexport { default as VPHomeFeatures } from './components/VPHomeFeatures.vue';\nexport { default as VPHomeSponsors } from './components/VPHomeSponsors.vue';\nexport { default as VPDocAsideSponsors } from './components/VPDocAsideSponsors.vue';\nexport { default as VPTeamPage } from './components/VPTeamPage.vue';\nexport { default as VPTeamPageTitle } from './components/VPTeamPageTitle.vue';\nexport { default as VPTeamPageSection } from './components/VPTeamPageSection.vue';\nexport { default as VPTeamMembers } from './components/VPTeamMembers.vue';\nconst theme = {\n Layout,\n enhanceApp: ({ app }) => {\n app.component('Badge', VPBadge);\n }\n};\nexport default theme;\n"], + "mappings": ";AAAA,OAAO;;;ACAP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO,aAAa;AACpB,OAAO,YAAY;AAInB,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAqC;AAC9C,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAkC;AAC3C,SAAoB,WAAXA,gBAAoC;AAC7C,SAAoB,WAAXA,gBAAgC;AACzC,IAAM,QAAQ;AAAA,EACV;AAAA,EACA,YAAY,CAAC,EAAE,IAAI,MAAM;AACrB,QAAI,UAAU,SAAS,OAAO;AAAA,EAClC;AACJ;AACA,IAAO,wBAAQ;", + "names": ["default"] +} diff --git a/docs/v2/.vitepress/cache/deps/_metadata.json b/docs/v2/.vitepress/cache/deps/_metadata.json new file mode 100644 index 0000000..7de46dd --- /dev/null +++ b/docs/v2/.vitepress/cache/deps/_metadata.json @@ -0,0 +1,19 @@ +{ + "hash": "b292d9d1", + "browserHash": "b5e14559", + "optimized": { + "vue": { + "src": "../../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js", + "file": "vue.js", + "fileHash": "f4149b17", + "needsInterop": false + }, + "@theme/index": { + "src": "../../../../../node_modules/vitepress/dist/client/theme-default/index.js", + "file": "@theme_index.js", + "fileHash": "fdc9780f", + "needsInterop": false + } + }, + "chunks": {} +} \ No newline at end of file diff --git a/docs/v2/.vitepress/cache/deps/package.json b/docs/v2/.vitepress/cache/deps/package.json new file mode 100644 index 0000000..7c34deb --- /dev/null +++ b/docs/v2/.vitepress/cache/deps/package.json @@ -0,0 +1 @@ +{"type":"module"} \ No newline at end of file diff --git a/docs/v2/.vitepress/cache/deps/vue.js b/docs/v2/.vitepress/cache/deps/vue.js new file mode 100644 index 0000000..1708501 --- /dev/null +++ b/docs/v2/.vitepress/cache/deps/vue.js @@ -0,0 +1,9516 @@ +// node_modules/@vue/shared/dist/shared.esm-bundler.js +function makeMap(str, expectsLowerCase) { + const map2 = /* @__PURE__ */ Object.create(null); + const list = str.split(","); + for (let i = 0; i < list.length; i++) { + map2[list[i]] = true; + } + return expectsLowerCase ? (val) => !!map2[val.toLowerCase()] : (val) => !!map2[val]; +} +var GLOBALS_WHITE_LISTED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"; +var isGloballyWhitelisted = makeMap(GLOBALS_WHITE_LISTED); +function normalizeStyle(value) { + if (isArray(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString(value)) { + return value; + } else if (isObject(value)) { + return value; + } +} +var listDelimiterRE = /;(?![^(]*\))/g; +var propertyDelimiterRE = /:([^]+)/; +var styleCommentRE = /\/\*.*?\*\//gs; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString(value)) { + res = value; + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) + return null; + let { class: klass, style } = props; + if (klass && !isString(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; +var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; +var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; +var isHTMLTag = makeMap(HTML_TAGS); +var isSVGTag = makeMap(SVG_TAGS); +var isVoidTag = makeMap(VOID_TAGS); +var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +var isSpecialBooleanAttr = makeMap(specialBooleanAttrs); +var isBooleanAttr = makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +var isKnownHtmlAttr = makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`); +var isKnownSvgAttr = makeMap(`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`); +function looseCompareArrays(a, b) { + if (a.length !== b.length) + return false; + let equal = true; + for (let i = 0; equal && i < a.length; i++) { + equal = looseEqual(a[i], b[i]); + } + return equal; +} +function looseEqual(a, b) { + if (a === b) + return true; + let aValidType = isDate(a); + let bValidType = isDate(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol(a); + bValidType = isSymbol(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray(a); + bValidType = isArray(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject(a); + bValidType = isObject(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; + } + } + } + return String(a) === String(b); +} +function looseIndexOf(arr, val) { + return arr.findIndex((item) => looseEqual(item, val)); +} +var toDisplayString = (val) => { + return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val); +}; +var replacer = (_key, val) => { + if (val && val.__v_isRef) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => { + entries[`${key} =>`] = val2; + return entries; + }, {}) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()] + }; + } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { + return String(val); + } + return val; +}; +var EMPTY_OBJ = true ? Object.freeze({}) : {}; +var EMPTY_ARR = true ? Object.freeze([]) : []; +var NOOP = () => { +}; +var NO = () => false; +var onRE = /^on[^a-z]/; +var isOn = (key) => onRE.test(key); +var isModelListener = (key) => key.startsWith("onUpdate:"); +var extend = Object.assign; +var remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var hasOwn = (val, key) => hasOwnProperty.call(val, key); +var isArray = Array.isArray; +var isMap = (val) => toTypeString(val) === "[object Map]"; +var isSet = (val) => toTypeString(val) === "[object Set]"; +var isDate = (val) => toTypeString(val) === "[object Date]"; +var isRegExp = (val) => toTypeString(val) === "[object RegExp]"; +var isFunction = (val) => typeof val === "function"; +var isString = (val) => typeof val === "string"; +var isSymbol = (val) => typeof val === "symbol"; +var isObject = (val) => val !== null && typeof val === "object"; +var isPromise = (val) => { + return isObject(val) && isFunction(val.then) && isFunction(val.catch); +}; +var objectToString = Object.prototype.toString; +var toTypeString = (value) => objectToString.call(value); +var toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +var isPlainObject = (val) => toTypeString(val) === "[object Object]"; +var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +var isReservedProp = makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +var isBuiltInDirective = makeMap("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"); +var cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +var camelizeRE = /-(\w)/g; +var camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +var hyphenateRE = /\B([A-Z])/g; +var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase()); +var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1)); +var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``); +var hasChanged = (value, oldValue) => !Object.is(value, oldValue); +var invokeArrayFns = (fns, arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](arg); + } +}; +var def = (obj, key, value) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + value + }); +}; +var looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +var toNumber = (val) => { + const n = isString(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +var _globalThis; +var getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; + +// node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js +function warn(msg, ...args) { + console.warn(`[Vue warn] ${msg}`, ...args); +} +var activeEffectScope; +var EffectScope = class { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1; + } + } + get active() { + return this._active; + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } else if (true) { + warn(`cannot run an inactive effect scope.`); + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } + } +}; +function effectScope(detached) { + return new EffectScope(detached); +} +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } else if (true) { + warn(`onScopeDispose() is called when there is no active effect scope to be associated with.`); + } +} +var createDep = (effects) => { + const dep = new Set(effects); + dep.w = 0; + dep.n = 0; + return dep; +}; +var wasTracked = (dep) => (dep.w & trackOpBit) > 0; +var newTracked = (dep) => (dep.n & trackOpBit) > 0; +var initDepMarkers = ({ deps }) => { + if (deps.length) { + for (let i = 0; i < deps.length; i++) { + deps[i].w |= trackOpBit; + } + } +}; +var finalizeDepMarkers = (effect2) => { + const { deps } = effect2; + if (deps.length) { + let ptr = 0; + for (let i = 0; i < deps.length; i++) { + const dep = deps[i]; + if (wasTracked(dep) && !newTracked(dep)) { + dep.delete(effect2); + } else { + deps[ptr++] = dep; + } + dep.w &= ~trackOpBit; + dep.n &= ~trackOpBit; + } + deps.length = ptr; + } +}; +var targetMap = /* @__PURE__ */ new WeakMap(); +var effectTrackDepth = 0; +var trackOpBit = 1; +var maxMarkerBits = 30; +var activeEffect; +var ITERATE_KEY = Symbol(true ? "iterate" : ""); +var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : ""); +var ReactiveEffect = class { + constructor(fn, scheduler = null, scope) { + this.fn = fn; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this.parent = void 0; + recordEffectScope(this, scope); + } + run() { + if (!this.active) { + return this.fn(); + } + let parent = activeEffect; + let lastShouldTrack = shouldTrack; + while (parent) { + if (parent === this) { + return; + } + parent = parent.parent; + } + try { + this.parent = activeEffect; + activeEffect = this; + shouldTrack = true; + trackOpBit = 1 << ++effectTrackDepth; + if (effectTrackDepth <= maxMarkerBits) { + initDepMarkers(this); + } else { + cleanupEffect(this); + } + return this.fn(); + } finally { + if (effectTrackDepth <= maxMarkerBits) { + finalizeDepMarkers(this); + } + trackOpBit = 1 << --effectTrackDepth; + activeEffect = this.parent; + shouldTrack = lastShouldTrack; + this.parent = void 0; + if (this.deferStop) { + this.stop(); + } + } + } + stop() { + if (activeEffect === this) { + this.deferStop = true; + } else if (this.active) { + cleanupEffect(this); + if (this.onStop) { + this.onStop(); + } + this.active = false; + } + } +}; +function cleanupEffect(effect2) { + const { deps } = effect2; + if (deps.length) { + for (let i = 0; i < deps.length; i++) { + deps[i].delete(effect2); + } + deps.length = 0; + } +} +function effect(fn, options) { + if (fn.effect) { + fn = fn.effect.fn; + } + const _effect = new ReactiveEffect(fn); + if (options) { + extend(_effect, options); + if (options.scope) + recordEffectScope(_effect, options.scope); + } + if (!options || !options.lazy) { + _effect.run(); + } + const runner = _effect.run.bind(_effect); + runner.effect = _effect; + return runner; +} +function stop(runner) { + runner.effect.stop(); +} +var shouldTrack = true; +var trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep()); + } + const eventInfo = true ? { effect: activeEffect, target, type, key } : void 0; + trackEffects(dep, eventInfo); + } +} +function trackEffects(dep, debuggerEventExtraInfo) { + let shouldTrack2 = false; + if (effectTrackDepth <= maxMarkerBits) { + if (!newTracked(dep)) { + dep.n |= trackOpBit; + shouldTrack2 = !wasTracked(dep); + } + } else { + shouldTrack2 = !dep.has(activeEffect); + } + if (shouldTrack2) { + dep.add(activeEffect); + activeEffect.deps.push(dep); + if (activeEffect.onTrack) { + activeEffect.onTrack(Object.assign({ effect: activeEffect }, debuggerEventExtraInfo)); + } + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray(target)) { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); + } + break; + case "delete": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + } + break; + } + } + const eventInfo = true ? { target, type, key, newValue, oldValue, oldTarget } : void 0; + if (deps.length === 1) { + if (deps[0]) { + if (true) { + triggerEffects(deps[0], eventInfo); + } else { + triggerEffects(deps[0]); + } + } + } else { + const effects = []; + for (const dep of deps) { + if (dep) { + effects.push(...dep); + } + } + if (true) { + triggerEffects(createDep(effects), eventInfo); + } else { + triggerEffects(createDep(effects)); + } + } +} +function triggerEffects(dep, debuggerEventExtraInfo) { + const effects = isArray(dep) ? dep : [...dep]; + for (const effect2 of effects) { + if (effect2.computed) { + triggerEffect(effect2, debuggerEventExtraInfo); + } + } + for (const effect2 of effects) { + if (!effect2.computed) { + triggerEffect(effect2, debuggerEventExtraInfo); + } + } +} +function triggerEffect(effect2, debuggerEventExtraInfo) { + if (effect2 !== activeEffect || effect2.allowRecurse) { + if (effect2.onTrigger) { + effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + if (effect2.scheduler) { + effect2.scheduler(); + } else { + effect2.run(); + } + } +} +function getDepFromReactive(object, key) { + var _a2; + return (_a2 = targetMap.get(object)) === null || _a2 === void 0 ? void 0 : _a2.get(key); +} +var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); +var builtInSymbols = new Set( + Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +var get$1 = createGetter(); +var shallowGet = createGetter(false, true); +var readonlyGet = createGetter(true); +var shallowReadonlyGet = createGetter(true, true); +var arrayInstrumentations = createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i = 0, l = this.length; i < l; i++) { + track(arr, "get", i + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + const res = toRaw(this)[key].apply(this, args); + resetTracking(); + return res; + }; + }); + return instrumentations; +} +function hasOwnProperty2(key) { + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +function createGetter(isReadonly2 = false, shallow = false) { + return function get2(target, key, receiver) { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return shallow; + } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { + return target; + } + const targetIsArray = isArray(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + if (key === "hasOwnProperty") { + return hasOwnProperty2; + } + } + const res = Reflect.get(target, key, receiver); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (shallow) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + }; +} +var set$1 = createSetter(); +var shallowSet = createSetter(true); +function createSetter(shallow = false) { + return function set2(target, key, value, receiver) { + let oldValue = target[key]; + if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) { + return false; + } + if (!shallow) { + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray(target) && isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } + } + const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set(target, key, value, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + } + return result; + }; +} +function deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + const oldValue = target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function has$1(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; +} +function ownKeys(target) { + track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY); + return Reflect.ownKeys(target); +} +var mutableHandlers = { + get: get$1, + set: set$1, + deleteProperty, + has: has$1, + ownKeys +}; +var readonlyHandlers = { + get: readonlyGet, + set(target, key) { + if (true) { + warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target); + } + return true; + }, + deleteProperty(target, key) { + if (true) { + warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target); + } + return true; + } +}; +var shallowReactiveHandlers = extend({}, mutableHandlers, { + get: shallowGet, + set: shallowSet +}); +var shallowReadonlyHandlers = extend({}, readonlyHandlers, { + get: shallowReadonlyGet +}); +var toShallow = (value) => value; +var getProto = (v) => Reflect.getPrototypeOf(v); +function get(target, key, isReadonly2 = false, isShallow3 = false) { + target = target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (key !== rawKey) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } +} +function has(key, isReadonly2 = false) { + const target = this[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (key !== rawKey) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); +} +function size(target, isReadonly2 = false) { + target = target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); +} +function add(value) { + value = toRaw(value); + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; +} +function set(key, value) { + value = toRaw(value); + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + return this; +} +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (true) { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2 ? get2.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0, oldTarget); + } + return result; +} +function createForEach(isReadonly2, isShallow3) { + return function forEach(callback, thisArg) { + const observed = this; + const target = observed[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + }; +} +function createIterableMethod(method, isReadonly2, isShallow3) { + return function(...args) { + const target = this[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + if (true) { + const key = args[0] ? `on key "${args[0]}" ` : ``; + console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this)); + } + return type === "delete" ? false : this; + }; +} +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get(this, key); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get(this, key, false, true); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get(this, key, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod( + "add" + /* TriggerOpTypes.ADD */ + ), + set: createReadonlyMethod( + "set" + /* TriggerOpTypes.SET */ + ), + delete: createReadonlyMethod( + "delete" + /* TriggerOpTypes.DELETE */ + ), + clear: createReadonlyMethod( + "clear" + /* TriggerOpTypes.CLEAR */ + ), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod( + "add" + /* TriggerOpTypes.ADD */ + ), + set: createReadonlyMethod( + "set" + /* TriggerOpTypes.SET */ + ), + delete: createReadonlyMethod( + "delete" + /* TriggerOpTypes.DELETE */ + ), + clear: createReadonlyMethod( + "clear" + /* TriggerOpTypes.CLEAR */ + ), + forEach: createForEach(true, true) + }; + const iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod(method, false, false); + readonlyInstrumentations2[method] = createIterableMethod(method, true, false); + shallowInstrumentations2[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); + }; +} +var mutableCollectionHandlers = { + get: createInstrumentationGetter(false, false) +}; +var shallowCollectionHandlers = { + get: createInstrumentationGetter(false, true) +}; +var readonlyCollectionHandlers = { + get: createInstrumentationGetter(true, false) +}; +var shallowReadonlyCollectionHandlers = { + get: createInstrumentationGetter(true, true) +}; +function checkIdentityKeys(target, has2, key) { + const rawKey = toRaw(key); + if (rawKey !== key && has2.call(target, rawKey)) { + const type = toRawType(target); + console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`); + } +} +var reactiveMap = /* @__PURE__ */ new WeakMap(); +var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +var readonlyMap = /* @__PURE__ */ new WeakMap(); +var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value[ + "__v_skip" + /* ReactiveFlags.SKIP */ + ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); +} +function shallowReactive(target) { + return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap); +} +function readonly(target) { + return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); +} +function shallowReadonly(target) { + return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject(target)) { + if (true) { + console.warn(`value cannot be made reactive: ${String(target)}`); + } + return target; + } + if (target[ + "__v_raw" + /* ReactiveFlags.RAW */ + ] && !(isReadonly2 && target[ + "__v_isReactive" + /* ReactiveFlags.IS_REACTIVE */ + ])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]); + } + return !!(value && value[ + "__v_isReactive" + /* ReactiveFlags.IS_REACTIVE */ + ]); +} +function isReadonly(value) { + return !!(value && value[ + "__v_isReadonly" + /* ReactiveFlags.IS_READONLY */ + ]); +} +function isShallow(value) { + return !!(value && value[ + "__v_isShallow" + /* ReactiveFlags.IS_SHALLOW */ + ]); +} +function isProxy(value) { + return isReactive(value) || isReadonly(value); +} +function toRaw(observed) { + const raw = observed && observed[ + "__v_raw" + /* ReactiveFlags.RAW */ + ]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + def(value, "__v_skip", true); + return value; +} +var toReactive = (value) => isObject(value) ? reactive(value) : value; +var toReadonly = (value) => isObject(value) ? readonly(value) : value; +function trackRefValue(ref2) { + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + if (true) { + trackEffects(ref2.dep || (ref2.dep = createDep()), { + target: ref2, + type: "get", + key: "value" + }); + } else { + trackEffects(ref2.dep || (ref2.dep = createDep())); + } + } +} +function triggerRefValue(ref2, newVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + if (true) { + triggerEffects(dep, { + target: ref2, + type: "set", + key: "value", + newValue: newVal + }); + } else { + triggerEffects(dep); + } + } +} +function isRef(r) { + return !!(r && r.__v_isRef === true); +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +var RefImpl = class { + constructor(value, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value : toRaw(value); + this._value = __v_isShallow ? value : toReactive(value); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive(newVal); + triggerRefValue(this, newVal); + } + } +}; +function triggerRef(ref2) { + triggerRefValue(ref2, true ? ref2.value : void 0); +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +var shallowUnwrapHandlers = { + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +var CustomRefImpl = class { + constructor(factory) { + this.dep = void 0; + this.__v_isRef = true; + const { get: get2, set: set2 } = factory(() => trackRefValue(this), () => triggerRefValue(this)); + this._get = get2; + this._set = set2; + } + get value() { + return this._get(); + } + set value(newVal) { + this._set(newVal); + } +}; +function customRef(factory) { + return new CustomRefImpl(factory); +} +function toRefs(object) { + if (!isProxy(object)) { + console.warn(`toRefs() expects a reactive object but received a plain one.`); + } + const ret = isArray(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = toRef(object, key); + } + return ret; +} +var ObjectRefImpl = class { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this.__v_isRef = true; + } + get value() { + const val = this._object[this._key]; + return val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +}; +function toRef(object, key, defaultValue) { + const val = object[key]; + return isRef(val) ? val : new ObjectRefImpl(object, key, defaultValue); +} +var _a$1; +var ComputedRefImpl = class { + constructor(getter, _setter, isReadonly2, isSSR) { + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this[_a$1] = false; + this._dirty = true; + this.effect = new ReactiveEffect(getter, () => { + if (!this._dirty) { + this._dirty = true; + triggerRefValue(this); + } + }); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this[ + "__v_isReadonly" + /* ReactiveFlags.IS_READONLY */ + ] = isReadonly2; + } + get value() { + const self2 = toRaw(this); + trackRefValue(self2); + if (self2._dirty || !self2._cacheable) { + self2._dirty = false; + self2._value = self2.effect.run(); + } + return self2._value; + } + set value(newValue) { + this._setter(newValue); + } +}; +_a$1 = "__v_isReadonly"; +function computed(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = true ? () => { + console.warn("Write operation failed: computed value is readonly"); + } : NOOP; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + if (debugOptions && !isSSR) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + return cRef; +} +var _a; +var tick = Promise.resolve(); +_a = "__v_isReadonly"; + +// node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +var stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +function popWarningContext() { + stack.pop(); +} +function warn2(msg, ...args) { + if (false) + return; + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling(appWarnHandler, instance, 11, [ + msg + args.join(""), + instance && instance.proxy, + trace.map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`).join("\n"), + trace + ]); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function assertNumber(val, type) { + if (false) + return; + if (val === void 0) { + return; + } else if (typeof val !== "number") { + warn2(`${type} is not a valid number - got ${JSON.stringify(val)}.`); + } else if (isNaN(val)) { + warn2(`${type} is NaN - the duration expression might be incorrect.`); + } +} +var ErrorTypeStrings = { + [ + "sp" + /* LifecycleHooks.SERVER_PREFETCH */ + ]: "serverPrefetch hook", + [ + "bc" + /* LifecycleHooks.BEFORE_CREATE */ + ]: "beforeCreate hook", + [ + "c" + /* LifecycleHooks.CREATED */ + ]: "created hook", + [ + "bm" + /* LifecycleHooks.BEFORE_MOUNT */ + ]: "beforeMount hook", + [ + "m" + /* LifecycleHooks.MOUNTED */ + ]: "mounted hook", + [ + "bu" + /* LifecycleHooks.BEFORE_UPDATE */ + ]: "beforeUpdate hook", + [ + "u" + /* LifecycleHooks.UPDATED */ + ]: "updated", + [ + "bum" + /* LifecycleHooks.BEFORE_UNMOUNT */ + ]: "beforeUnmount hook", + [ + "um" + /* LifecycleHooks.UNMOUNTED */ + ]: "unmounted hook", + [ + "a" + /* LifecycleHooks.ACTIVATED */ + ]: "activated hook", + [ + "da" + /* LifecycleHooks.DEACTIVATED */ + ]: "deactivated hook", + [ + "ec" + /* LifecycleHooks.ERROR_CAPTURED */ + ]: "errorCaptured hook", + [ + "rtc" + /* LifecycleHooks.RENDER_TRACKED */ + ]: "renderTracked hook", + [ + "rtg" + /* LifecycleHooks.RENDER_TRIGGERED */ + ]: "renderTriggered hook", + [ + 0 + /* ErrorCodes.SETUP_FUNCTION */ + ]: "setup function", + [ + 1 + /* ErrorCodes.RENDER_FUNCTION */ + ]: "render function", + [ + 2 + /* ErrorCodes.WATCH_GETTER */ + ]: "watcher getter", + [ + 3 + /* ErrorCodes.WATCH_CALLBACK */ + ]: "watcher callback", + [ + 4 + /* ErrorCodes.WATCH_CLEANUP */ + ]: "watcher cleanup function", + [ + 5 + /* ErrorCodes.NATIVE_EVENT_HANDLER */ + ]: "native event handler", + [ + 6 + /* ErrorCodes.COMPONENT_EVENT_HANDLER */ + ]: "component event handler", + [ + 7 + /* ErrorCodes.VNODE_HOOK */ + ]: "vnode hook", + [ + 8 + /* ErrorCodes.DIRECTIVE_HOOK */ + ]: "directive hook", + [ + 9 + /* ErrorCodes.TRANSITION_HOOK */ + ]: "transition hook", + [ + 10 + /* ErrorCodes.APP_ERROR_HANDLER */ + ]: "app errorHandler", + [ + 11 + /* ErrorCodes.APP_WARN_HANDLER */ + ]: "app warnHandler", + [ + 12 + /* ErrorCodes.FUNCTION_REF */ + ]: "ref function", + [ + 13 + /* ErrorCodes.ASYNC_COMPONENT_LOADER */ + ]: "async component loader", + [ + 14 + /* ErrorCodes.SCHEDULER */ + ]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core" +}; +function callWithErrorHandling(fn, instance, type, args) { + let res; + try { + res = args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } + return res; +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = true ? ErrorTypeStrings[type] : type; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + callWithErrorHandling(appErrorHandler, null, 10, [err, exposedInstance, errorInfo]); + return; + } + } + logError(err, type, contextVNode, throwInDev); +} +function logError(err, type, contextVNode, throwInDev = true) { + if (true) { + const info = ErrorTypeStrings[type]; + if (contextVNode) { + pushWarningContext(contextVNode); + } + warn2(`Unhandled error${info ? ` during execution of ${info}` : ``}`); + if (contextVNode) { + popWarningContext(); + } + if (throwInDev) { + throw err; + } else { + console.error(err); + } + } else { + console.error(err); + } +} +var isFlushing = false; +var isFlushPending = false; +var queue = []; +var flushIndex = 0; +var pendingPostFlushCbs = []; +var activePostFlushCbs = null; +var postFlushIndex = 0; +var resolvedPromise = Promise.resolve(); +var currentFlushPromise = null; +var RECURSION_LIMIT = 100; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex(id) { + let start = flushIndex + 1; + let end = queue.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJobId = getId(queue[middle]); + middleJobId < id ? start = middle + 1 : end = middle; + } + return start; +} +function queueJob(job) { + if (!queue.length || !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) { + if (job.id == null) { + queue.push(job); + } else { + queue.splice(findInsertionIndex(job.id), 0, job); + } + queueFlush(); + } +} +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function invalidateJob(job) { + const i = queue.indexOf(job); + if (i > flushIndex) { + queue.splice(i, 1); + } +} +function queuePostFlushCb(cb) { + if (!isArray(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes(cb, cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex)) { + pendingPostFlushCbs.push(cb); + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) { + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.pre) { + if (checkRecursiveUpdates(seen, cb)) { + continue; + } + queue.splice(i, 1); + i--; + cb(); + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)]; + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + activePostFlushCbs.sort((a, b) => getId(a) - getId(b)); + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) { + continue; + } + activePostFlushCbs[postFlushIndex](); + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +var getId = (job) => job.id == null ? Infinity : job.id; +var comparator = (a, b) => { + const diff = getId(a) - getId(b); + if (diff === 0) { + if (a.pre && !b.pre) + return -1; + if (b.pre && !a.pre) + return 1; + } + return diff; +}; +function flushJobs(seen) { + isFlushPending = false; + isFlushing = true; + if (true) { + seen = seen || /* @__PURE__ */ new Map(); + } + queue.sort(comparator); + const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP; + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && job.active !== false) { + if (check(job)) { + continue; + } + callWithErrorHandling( + job, + null, + 14 + /* ErrorCodes.SCHEDULER */ + ); + } + } + } finally { + flushIndex = 0; + queue.length = 0; + flushPostFlushCbs(seen); + isFlushing = false; + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(seen); + } + } +} +function checkRecursiveUpdates(seen, fn) { + if (!seen.has(fn)) { + seen.set(fn, 1); + } else { + const count = seen.get(fn); + if (count > RECURSION_LIMIT) { + const instance = fn.ownerInstance; + const componentName = instance && getComponentName(instance.type); + warn2(`Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`); + return true; + } else { + seen.set(fn, count + 1); + } + } +} +var isHmrUpdating = false; +var hmrDirtyComponents = /* @__PURE__ */ new Set(); +if (true) { + getGlobalThis().__VUE_HMR_RUNTIME__ = { + createRecord: tryWrap(createRecord), + rerender: tryWrap(rerender), + reload: tryWrap(reload) + }; +} +var map = /* @__PURE__ */ new Map(); +function registerHMR(instance) { + const id = instance.type.__hmrId; + let record = map.get(id); + if (!record) { + createRecord(id, instance.type); + record = map.get(id); + } + record.instances.add(instance); +} +function unregisterHMR(instance) { + map.get(instance.type.__hmrId).instances.delete(instance); +} +function createRecord(id, initialDef) { + if (map.has(id)) { + return false; + } + map.set(id, { + initialDef: normalizeClassComponent(initialDef), + instances: /* @__PURE__ */ new Set() + }); + return true; +} +function normalizeClassComponent(component) { + return isClassComponent(component) ? component.__vccOpts : component; +} +function rerender(id, newRender) { + const record = map.get(id); + if (!record) { + return; + } + record.initialDef.render = newRender; + [...record.instances].forEach((instance) => { + if (newRender) { + instance.render = newRender; + normalizeClassComponent(instance.type).render = newRender; + } + instance.renderCache = []; + isHmrUpdating = true; + instance.update(); + isHmrUpdating = false; + }); +} +function reload(id, newComp) { + const record = map.get(id); + if (!record) + return; + newComp = normalizeClassComponent(newComp); + updateComponentDef(record.initialDef, newComp); + const instances = [...record.instances]; + for (const instance of instances) { + const oldComp = normalizeClassComponent(instance.type); + if (!hmrDirtyComponents.has(oldComp)) { + if (oldComp !== record.initialDef) { + updateComponentDef(oldComp, newComp); + } + hmrDirtyComponents.add(oldComp); + } + instance.appContext.optionsCache.delete(instance.type); + if (instance.ceReload) { + hmrDirtyComponents.add(oldComp); + instance.ceReload(newComp.styles); + hmrDirtyComponents.delete(oldComp); + } else if (instance.parent) { + queueJob(instance.parent.update); + } else if (instance.appContext.reload) { + instance.appContext.reload(); + } else if (typeof window !== "undefined") { + window.location.reload(); + } else { + console.warn("[HMR] Root or manually mounted instance modified. Full reload required."); + } + } + queuePostFlushCb(() => { + for (const instance of instances) { + hmrDirtyComponents.delete(normalizeClassComponent(instance.type)); + } + }); +} +function updateComponentDef(oldComp, newComp) { + extend(oldComp, newComp); + for (const key in oldComp) { + if (key !== "__file" && !(key in newComp)) { + delete oldComp[key]; + } + } +} +function tryWrap(fn) { + return (id, arg) => { + try { + return fn(id, arg); + } catch (e) { + console.error(e); + console.warn(`[HMR] Something went wrong during Vue component hot-reload. Full reload required.`); + } + }; +} +var devtools; +var buffer = []; +var devtoolsNotInstalled = false; +function emit$1(event, ...args) { + if (devtools) { + devtools.emit(event, ...args); + } else if (!devtoolsNotInstalled) { + buffer.push({ event, args }); + } +} +function setDevtoolsHook(hook, target) { + var _a2, _b; + devtools = hook; + if (devtools) { + devtools.enabled = true; + buffer.forEach(({ event, args }) => devtools.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + !((_b = (_a2 = window.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent) === null || _b === void 0 ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook(newHook, target); + }); + setTimeout(() => { + if (!devtools) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + devtoolsNotInstalled = true; + buffer = []; + } + }, 3e3); + } else { + devtoolsNotInstalled = true; + buffer = []; + } +} +function devtoolsInitApp(app, version2) { + emit$1("app:init", app, version2, { + Fragment, + Text, + Comment, + Static + }); +} +function devtoolsUnmountApp(app) { + emit$1("app:unmount", app); +} +var devtoolsComponentAdded = createDevtoolsComponentHook( + "component:added" + /* DevtoolsHooks.COMPONENT_ADDED */ +); +var devtoolsComponentUpdated = createDevtoolsComponentHook( + "component:updated" + /* DevtoolsHooks.COMPONENT_UPDATED */ +); +var _devtoolsComponentRemoved = createDevtoolsComponentHook( + "component:removed" + /* DevtoolsHooks.COMPONENT_REMOVED */ +); +var devtoolsComponentRemoved = (component) => { + if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered + !devtools.cleanupBuffer(component)) { + _devtoolsComponentRemoved(component); + } +}; +function createDevtoolsComponentHook(hook) { + return (component) => { + emit$1(hook, component.appContext.app, component.uid, component.parent ? component.parent.uid : void 0, component); + }; +} +var devtoolsPerfStart = createDevtoolsPerformanceHook( + "perf:start" + /* DevtoolsHooks.PERFORMANCE_START */ +); +var devtoolsPerfEnd = createDevtoolsPerformanceHook( + "perf:end" + /* DevtoolsHooks.PERFORMANCE_END */ +); +function createDevtoolsPerformanceHook(hook) { + return (component, type, time) => { + emit$1(hook, component.appContext.app, component.uid, component, type, time); + }; +} +function devtoolsComponentEmit(component, event, params) { + emit$1("component:emit", component.appContext.app, component, event, params); +} +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) + return; + const props = instance.vnode.props || EMPTY_OBJ; + if (true) { + const { emitsOptions, propsOptions: [propsOptions] } = instance; + if (emitsOptions) { + if (!(event in emitsOptions) && true) { + if (!propsOptions || !(toHandlerKey(event) in propsOptions)) { + warn2(`Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`); + } + } else { + const validator = emitsOptions[event]; + if (isFunction(validator)) { + const isValid = validator(...rawArgs); + if (!isValid) { + warn2(`Invalid event arguments: event validation failed for event "${event}".`); + } + } + } + } + } + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modelArg = isModelListener2 && event.slice(7); + if (modelArg && modelArg in props) { + const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; + const { number, trim } = props[modifiersKey] || EMPTY_OBJ; + if (trim) { + args = rawArgs.map((a) => isString(a) ? a.trim() : a); + } + if (number) { + args = rawArgs.map(looseToNumber); + } + } + if (true) { + devtoolsComponentEmit(instance, event, args); + } + if (true) { + const lowerCaseEvent = event.toLowerCase(); + if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { + warn2(`Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(instance, instance.type)} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".`); + } + } + let handlerName; + let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize(event))]; + if (!handler && isModelListener2) { + handler = props[handlerName = toHandlerKey(hyphenate(event))]; + } + if (handler) { + callWithAsyncErrorHandling(handler, instance, 6, args); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; + } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling(onceHandler, instance, 6, args); + } +} +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache = appContext.emitsCache; + const cached = cache.get(comp); + if (cached !== void 0) { + return cached; + } + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (__VUE_OPTIONS_API__ && !isFunction(comp)) { + const extendEmits = (raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend(normalized, normalizedFromExtend); + } + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); + } + if (comp.extends) { + extendEmits(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendEmits); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, null); + } + return null; + } + if (isArray(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend(normalized, raw); + } + if (isObject(comp)) { + cache.set(comp, normalized); + } + return normalized; +} +function isEmitListener(options, key) { + if (!options || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); +} +var currentRenderingInstance = null; +var currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function pushScopeId(id) { + currentScopeId = id; +} +function popScopeId() { + currentScopeId = null; +} +var withScopeId = (_id) => withCtx; +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) + return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + if (true) { + devtoolsComponentUpdated(ctx); + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +var accessedAttrs = false; +function markAttrsAccessed() { + accessedAttrs = true; +} +function renderComponentRoot(instance) { + const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit: emit2, render: render2, renderCache, data, setupState, ctx, inheritAttrs } = instance; + let result; + let fallthroughAttrs; + const prev = setCurrentRenderingInstance(instance); + if (true) { + accessedAttrs = false; + } + try { + if (vnode.shapeFlag & 4) { + const proxyToUse = withProxy || proxy; + result = normalizeVNode(render2.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx)); + fallthroughAttrs = attrs; + } else { + const render3 = Component; + if (attrs === props) { + markAttrsAccessed(); + } + result = normalizeVNode(render3.length > 1 ? render3(props, true ? { + get attrs() { + markAttrsAccessed(); + return attrs; + }, + slots, + emit: emit2 + } : { attrs, slots, emit: emit2 }) : render3( + props, + null + /* we know it doesn't need it */ + )); + fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); + } + } catch (err) { + blockStack.length = 0; + handleError( + err, + instance, + 1 + /* ErrorCodes.RENDER_FUNCTION */ + ); + result = createVNode(Comment); + } + let root = result; + let setRoot = void 0; + if (result.patchFlag > 0 && result.patchFlag & 2048) { + [root, setRoot] = getChildRoot(result); + } + if (fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs); + const { shapeFlag } = root; + if (keys.length) { + if (shapeFlag & (1 | 6)) { + if (propsOptions && keys.some(isModelListener)) { + fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions); + } + root = cloneVNode(root, fallthroughAttrs); + } else if (!accessedAttrs && root.type !== Comment) { + const allAttrs = Object.keys(attrs); + const eventAttrs = []; + const extraAttrs = []; + for (let i = 0, l = allAttrs.length; i < l; i++) { + const key = allAttrs[i]; + if (isOn(key)) { + if (!isModelListener(key)) { + eventAttrs.push(key[2].toLowerCase() + key.slice(3)); + } + } else { + extraAttrs.push(key); + } + } + if (extraAttrs.length) { + warn2(`Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`); + } + if (eventAttrs.length) { + warn2(`Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.`); + } + } + } + } + if (vnode.dirs) { + if (!isElementRoot(root)) { + warn2(`Runtime directive used on component with non-element root node. The directives will not function as intended.`); + } + root = cloneVNode(root); + root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; + } + if (vnode.transition) { + if (!isElementRoot(root)) { + warn2(`Component inside renders non-element root node that cannot be animated.`); + } + root.transition = vnode.transition; + } + if (setRoot) { + setRoot(root); + } else { + result = root; + } + setCurrentRenderingInstance(prev); + return result; +} +var getChildRoot = (vnode) => { + const rawChildren = vnode.children; + const dynamicChildren = vnode.dynamicChildren; + const childRoot = filterSingleRoot(rawChildren); + if (!childRoot) { + return [vnode, void 0]; + } + const index = rawChildren.indexOf(childRoot); + const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; + const setRoot = (updatedRoot) => { + rawChildren[index] = updatedRoot; + if (dynamicChildren) { + if (dynamicIndex > -1) { + dynamicChildren[dynamicIndex] = updatedRoot; + } else if (updatedRoot.patchFlag > 0) { + vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; + } + } + }; + return [normalizeVNode(childRoot), setRoot]; +}; +function filterSingleRoot(children) { + let singleRoot; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (isVNode(child)) { + if (child.type !== Comment || child.children === "v-if") { + if (singleRoot) { + return; + } else { + singleRoot = child; + } + } + } else { + return; + } + } + return singleRoot; +} +var getFunctionalFallthrough = (attrs) => { + let res; + for (const key in attrs) { + if (key === "class" || key === "style" || isOn(key)) { + (res || (res = {}))[key] = attrs[key]; + } + } + return res; +}; +var filterModelListeners = (attrs, props) => { + const res = {}; + for (const key in attrs) { + if (!isModelListener(key) || !(key.slice(9) in props)) { + res[key] = attrs[key]; + } + } + return res; +}; +var isElementRoot = (vnode) => { + return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; +}; +function shouldUpdateComponent(prevVNode, nextVNode, optimized) { + const { props: prevProps, children: prevChildren, component } = prevVNode; + const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; + const emits = component.emitsOptions; + if ((prevChildren || nextChildren) && isHmrUpdating) { + return true; + } + if (nextVNode.dirs || nextVNode.transition) { + return true; + } + if (optimized && patchFlag >= 0) { + if (patchFlag & 1024) { + return true; + } + if (patchFlag & 16) { + if (!prevProps) { + return !!nextProps; + } + return hasPropsChanged(prevProps, nextProps, emits); + } else if (patchFlag & 8) { + const dynamicProps = nextVNode.dynamicProps; + for (let i = 0; i < dynamicProps.length; i++) { + const key = dynamicProps[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { + return true; + } + } + } + } else { + if (prevChildren || nextChildren) { + if (!nextChildren || !nextChildren.$stable) { + return true; + } + } + if (prevProps === nextProps) { + return false; + } + if (!prevProps) { + return !!nextProps; + } + if (!nextProps) { + return true; + } + return hasPropsChanged(prevProps, nextProps, emits); + } + return false; +} +function hasPropsChanged(prevProps, nextProps, emitsOptions) { + const nextKeys = Object.keys(nextProps); + if (nextKeys.length !== Object.keys(prevProps).length) { + return true; + } + for (let i = 0; i < nextKeys.length; i++) { + const key = nextKeys[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { + return true; + } + } + return false; +} +function updateHOCHostEl({ vnode, parent }, el) { + while (parent && parent.subTree === vnode) { + (vnode = parent.vnode).el = el; + parent = parent.parent; + } +} +var isSuspense = (type) => type.__isSuspense; +var SuspenseImpl = { + name: "Suspense", + // In order to make Suspense tree-shakable, we need to avoid importing it + // directly in the renderer. The renderer checks for the __isSuspense flag + // on a vnode's type and calls the `process` method, passing in renderer + // internals. + __isSuspense: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { + if (n1 == null) { + mountSuspense(n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals); + } else { + patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, rendererInternals); + } + }, + hydrate: hydrateSuspense, + create: createSuspenseBoundary, + normalize: normalizeSuspenseChildren +}; +var Suspense = SuspenseImpl; +function triggerEvent(vnode, name) { + const eventListener = vnode.props && vnode.props[name]; + if (isFunction(eventListener)) { + eventListener(); + } +} +function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { + const { p: patch, o: { createElement } } = rendererInternals; + const hiddenContainer = createElement("div"); + const suspense = vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals); + patch(null, suspense.pendingBranch = vnode.ssContent, hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds); + if (suspense.deps > 0) { + triggerEvent(vnode, "onPending"); + triggerEvent(vnode, "onFallback"); + patch( + null, + vnode.ssFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds + ); + setActiveBranch(suspense, vnode.ssFallback); + } else { + suspense.resolve(); + } +} +function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) { + const suspense = n2.suspense = n1.suspense; + suspense.vnode = n2; + n2.el = n1.el; + const newBranch = n2.ssContent; + const newFallback = n2.ssFallback; + const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; + if (pendingBranch) { + suspense.pendingBranch = newBranch; + if (isSameVNodeType(newBranch, pendingBranch)) { + patch(pendingBranch, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else if (isInFallback) { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else { + suspense.pendingId++; + if (isHydrating) { + suspense.isHydrating = false; + suspense.activeBranch = pendingBranch; + } else { + unmount(pendingBranch, parentComponent, suspense); + } + suspense.deps = 0; + suspense.effects.length = 0; + suspense.hiddenContainer = createElement("div"); + if (isInFallback) { + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + isSVG, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized); + suspense.resolve(true); + } else { + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } + } + } + } else { + if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG, slotScopeIds, optimized); + setActiveBranch(suspense, newBranch); + } else { + triggerEvent(n2, "onPending"); + suspense.pendingBranch = newBranch; + suspense.pendingId++; + patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG, slotScopeIds, optimized); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + const { timeout, pendingId } = suspense; + if (timeout > 0) { + setTimeout(() => { + if (suspense.pendingId === pendingId) { + suspense.fallback(newFallback); + } + }, timeout); + } else if (timeout === 0) { + suspense.fallback(newFallback); + } + } + } + } +} +var hasWarned = false; +function createSuspenseBoundary(vnode, parent, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) { + if (!hasWarned) { + hasWarned = true; + console[console.info ? "info" : "log"](` is an experimental feature and its API will likely change.`); + } + const { p: patch, m: move, um: unmount, n: next, o: { parentNode, remove: remove2 } } = rendererInternals; + const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0; + if (true) { + assertNumber(timeout, `Suspense timeout`); + } + const suspense = { + vnode, + parent, + parentComponent, + isSVG, + container, + hiddenContainer, + anchor, + deps: 0, + pendingId: 0, + timeout: typeof timeout === "number" ? timeout : -1, + activeBranch: null, + pendingBranch: null, + isInFallback: true, + isHydrating, + isUnmounted: false, + effects: [], + resolve(resume = false) { + if (true) { + if (!resume && !suspense.pendingBranch) { + throw new Error(`suspense.resolve() is called without a pending branch.`); + } + if (suspense.isUnmounted) { + throw new Error(`suspense.resolve() is called on an already unmounted suspense boundary.`); + } + } + const { vnode: vnode2, activeBranch, pendingBranch, pendingId, effects, parentComponent: parentComponent2, container: container2 } = suspense; + if (suspense.isHydrating) { + suspense.isHydrating = false; + } else if (!resume) { + const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = () => { + if (pendingId === suspense.pendingId) { + move( + pendingBranch, + container2, + anchor2, + 0 + /* MoveType.ENTER */ + ); + } + }; + } + let { anchor: anchor2 } = suspense; + if (activeBranch) { + anchor2 = next(activeBranch); + unmount(activeBranch, parentComponent2, suspense, true); + } + if (!delayEnter) { + move( + pendingBranch, + container2, + anchor2, + 0 + /* MoveType.ENTER */ + ); + } + } + setActiveBranch(suspense, pendingBranch); + suspense.pendingBranch = null; + suspense.isInFallback = false; + let parent2 = suspense.parent; + let hasUnresolvedAncestor = false; + while (parent2) { + if (parent2.pendingBranch) { + parent2.effects.push(...effects); + hasUnresolvedAncestor = true; + break; + } + parent2 = parent2.parent; + } + if (!hasUnresolvedAncestor) { + queuePostFlushCb(effects); + } + suspense.effects = []; + triggerEvent(vnode2, "onResolve"); + }, + fallback(fallbackVNode) { + if (!suspense.pendingBranch) { + return; + } + const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense; + triggerEvent(vnode2, "onFallback"); + const anchor2 = next(activeBranch); + const mountFallback = () => { + if (!suspense.isInFallback) { + return; + } + patch( + null, + fallbackVNode, + container2, + anchor2, + parentComponent2, + null, + // fallback tree will not have suspense context + isSVG2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, fallbackVNode); + }; + const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = mountFallback; + } + suspense.isInFallback = true; + unmount( + activeBranch, + parentComponent2, + null, + // no suspense so unmount hooks fire now + true + // shouldRemove + ); + if (!delayEnter) { + mountFallback(); + } + }, + move(container2, anchor2, type) { + suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); + suspense.container = container2; + }, + next() { + return suspense.activeBranch && next(suspense.activeBranch); + }, + registerDep(instance, setupRenderEffect) { + const isInPendingSuspense = !!suspense.pendingBranch; + if (isInPendingSuspense) { + suspense.deps++; + } + const hydratedEl = instance.vnode.el; + instance.asyncDep.catch((err) => { + handleError( + err, + instance, + 0 + /* ErrorCodes.SETUP_FUNCTION */ + ); + }).then((asyncSetupResult) => { + if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { + return; + } + instance.asyncResolved = true; + const { vnode: vnode2 } = instance; + if (true) { + pushWarningContext(vnode2); + } + handleSetupResult(instance, asyncSetupResult, false); + if (hydratedEl) { + vnode2.el = hydratedEl; + } + const placeholder = !hydratedEl && instance.subTree.el; + setupRenderEffect( + instance, + vnode2, + // component may have been moved before resolve. + // if this is not a hydration, instance.subTree will be the comment + // placeholder. + parentNode(hydratedEl || instance.subTree.el), + // anchor will not be used if this is hydration, so only need to + // consider the comment placeholder case. + hydratedEl ? null : next(instance.subTree), + suspense, + isSVG, + optimized + ); + if (placeholder) { + remove2(placeholder); + } + updateHOCHostEl(instance, vnode2.el); + if (true) { + popWarningContext(); + } + if (isInPendingSuspense && --suspense.deps === 0) { + suspense.resolve(); + } + }); + }, + unmount(parentSuspense, doRemove) { + suspense.isUnmounted = true; + if (suspense.activeBranch) { + unmount(suspense.activeBranch, parentComponent, parentSuspense, doRemove); + } + if (suspense.pendingBranch) { + unmount(suspense.pendingBranch, parentComponent, parentSuspense, doRemove); + } + } + }; + return suspense; +} +function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) { + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + node.parentNode, + document.createElement("div"), + null, + isSVG, + slotScopeIds, + optimized, + rendererInternals, + true + /* hydrating */ + ); + const result = hydrateNode(node, suspense.pendingBranch = vnode.ssContent, parentComponent, suspense, slotScopeIds, optimized); + if (suspense.deps === 0) { + suspense.resolve(); + } + return result; +} +function normalizeSuspenseChildren(vnode) { + const { shapeFlag, children } = vnode; + const isSlotChildren = shapeFlag & 32; + vnode.ssContent = normalizeSuspenseSlot(isSlotChildren ? children.default : children); + vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); +} +function normalizeSuspenseSlot(s) { + let block; + if (isFunction(s)) { + const trackBlock = isBlockTreeEnabled && s._c; + if (trackBlock) { + s._d = false; + openBlock(); + } + s = s(); + if (trackBlock) { + s._d = true; + block = currentBlock; + closeBlock(); + } + } + if (isArray(s)) { + const singleChild = filterSingleRoot(s); + if (!singleChild) { + warn2(` slots expect a single root node.`); + } + s = singleChild; + } + s = normalizeVNode(s); + if (block && !s.dynamicChildren) { + s.dynamicChildren = block.filter((c) => c !== s); + } + return s; +} +function queueEffectWithSuspense(fn, suspense) { + if (suspense && suspense.pendingBranch) { + if (isArray(fn)) { + suspense.effects.push(...fn); + } else { + suspense.effects.push(fn); + } + } else { + queuePostFlushCb(fn); + } +} +function setActiveBranch(suspense, branch) { + suspense.activeBranch = branch; + const { vnode, parentComponent } = suspense; + const el = vnode.el = branch.el; + if (parentComponent && parentComponent.subTree === vnode) { + parentComponent.vnode.el = el; + updateHOCHostEl(parentComponent, el); + } +} +function provide(key, value) { + if (!currentInstance) { + if (true) { + warn2(`provide() can only be used inside setup().`); + } + } else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance) { + const provides = instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance.proxy) : defaultValue; + } else if (true) { + warn2(`injection "${String(key)}" not found.`); + } + } else if (true) { + warn2(`inject() can only be used inside setup() or functional components.`); + } +} +function watchEffect(effect2, options) { + return doWatch(effect2, null, options); +} +function watchPostEffect(effect2, options) { + return doWatch(effect2, null, true ? Object.assign(Object.assign({}, options), { flush: "post" }) : { flush: "post" }); +} +function watchSyncEffect(effect2, options) { + return doWatch(effect2, null, true ? Object.assign(Object.assign({}, options), { flush: "sync" }) : { flush: "sync" }); +} +var INITIAL_WATCHER_VALUE = {}; +function watch(source, cb, options) { + if (!isFunction(cb)) { + warn2(`\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`); + } + return doWatch(source, cb, options); +} +function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) { + if (!cb) { + if (immediate !== void 0) { + warn2(`watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`); + } + if (deep !== void 0) { + warn2(`watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`); + } + } + const warnInvalidSource = (s) => { + warn2(`Invalid watch source: `, s, `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`); + }; + const instance = getCurrentScope() === (currentInstance === null || currentInstance === void 0 ? void 0 : currentInstance.scope) ? currentInstance : null; + let getter; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => source; + deep = true; + } else if (isArray(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return traverse(s); + } else if (isFunction(s)) { + return callWithErrorHandling( + s, + instance, + 2 + /* ErrorCodes.WATCH_GETTER */ + ); + } else { + warnInvalidSource(s); + } + }); + } else if (isFunction(source)) { + if (cb) { + getter = () => callWithErrorHandling( + source, + instance, + 2 + /* ErrorCodes.WATCH_GETTER */ + ); + } else { + getter = () => { + if (instance && instance.isUnmounted) { + return; + } + if (cleanup) { + cleanup(); + } + return callWithAsyncErrorHandling(source, instance, 3, [onCleanup]); + }; + } + } else { + getter = NOOP; + warnInvalidSource(source); + } + if (cb && deep) { + const baseGetter = getter; + getter = () => traverse(baseGetter()); + } + let cleanup; + let onCleanup = (fn) => { + cleanup = effect2.onStop = () => { + callWithErrorHandling( + fn, + instance, + 4 + /* ErrorCodes.WATCH_CLEANUP */ + ); + }; + }; + let ssrCleanup; + if (isInSSRComponentSetup) { + onCleanup = NOOP; + if (!cb) { + getter(); + } else if (immediate) { + callWithAsyncErrorHandling(cb, instance, 3, [ + getter(), + isMultiSource ? [] : void 0, + onCleanup + ]); + } + if (flush === "sync") { + const ctx = useSSRContext(); + ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); + } else { + return NOOP; + } + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = () => { + if (!effect2.active) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) { + if (cleanup) { + cleanup(); + } + callWithAsyncErrorHandling(cb, instance, 3, [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + onCleanup + ]); + oldValue = newValue; + } + } else { + effect2.run(); + } + }; + job.allowRecurse = !!cb; + let scheduler; + if (flush === "sync") { + scheduler = job; + } else if (flush === "post") { + scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); + } else { + job.pre = true; + if (instance) + job.id = instance.uid; + scheduler = () => queueJob(job); + } + const effect2 = new ReactiveEffect(getter, scheduler); + if (true) { + effect2.onTrack = onTrack; + effect2.onTrigger = onTrigger; + } + if (cb) { + if (immediate) { + job(); + } else { + oldValue = effect2.run(); + } + } else if (flush === "post") { + queuePostRenderEffect(effect2.run.bind(effect2), instance && instance.suspense); + } else { + effect2.run(); + } + const unwatch = () => { + effect2.stop(); + if (instance && instance.scope) { + remove(instance.scope.effects, effect2); + } + }; + if (ssrCleanup) + ssrCleanup.push(unwatch); + return unwatch; +} +function instanceWatch(source, value, options) { + const publicThis = this.proxy; + const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); + let cb; + if (isFunction(value)) { + cb = value; + } else { + cb = value.handler; + options = value; + } + const cur = currentInstance; + setCurrentInstance(this); + const res = doWatch(getter, cb.bind(publicThis), options); + if (cur) { + setCurrentInstance(cur); + } else { + unsetCurrentInstance(); + } + return res; +} +function createPathGetter(ctx, path) { + const segments = path.split("."); + return () => { + let cur = ctx; + for (let i = 0; i < segments.length && cur; i++) { + cur = cur[segments[i]]; + } + return cur; + }; +} +function traverse(value, seen) { + if (!isObject(value) || value[ + "__v_skip" + /* ReactiveFlags.SKIP */ + ]) { + return value; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + if (isRef(value)) { + traverse(value.value, seen); + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, seen); + }); + } else if (isPlainObject(value)) { + for (const key in value) { + traverse(value[key], seen); + } + } + return value; +} +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +var TransitionHookValidator = [Function, Array]; +var BaseTransitionImpl = { + name: `BaseTransition`, + props: { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + let prevTransitionKey; + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + let child = children[0]; + if (children.length > 1) { + let hasFound = false; + for (const c of children) { + if (c.type !== Comment) { + if (hasFound) { + warn2(" can only be used on a single element or component. Use for lists."); + break; + } + child = c; + hasFound = true; + if (false) + break; + } + } + } + const rawProps = toRaw(props); + const { mode } = rawProps; + if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { + warn2(`invalid mode: ${mode}`); + } + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getKeepAliveChild(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + const enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance); + setTransitionHooks(innerChild, enterHooks); + const oldChild = instance.subTree; + const oldInnerChild = oldChild && getKeepAliveChild(oldChild); + let transitionKeyChanged = false; + const { getTransitionKey } = innerChild.type; + if (getTransitionKey) { + const key = getTransitionKey(); + if (prevTransitionKey === void 0) { + prevTransitionKey = key; + } else if (key !== prevTransitionKey) { + prevTransitionKey = key; + transitionKeyChanged = true; + } + } + if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) { + const leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in") { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (instance.update.active !== false) { + instance.update(); + } + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el._leaveCb = () => { + earlyRemove(); + el._leaveCb = void 0; + delete enterHooks.delayedLeave; + }; + enterHooks.delayedLeave = delayedLeave; + }; + } + } + return child; + }; + } +}; +var BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance) { + const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook3 = (hook, args) => { + hook && callWithAsyncErrorHandling(hook, instance, 9, args); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook3(hook, args); + if (isArray(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) + done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el._leaveCb) { + el._leaveCb( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el._leaveCb) { + leavingVNode.el._leaveCb(); + } + callHook3(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el._enterCb = (cancelled) => { + if (called) + return; + called = true; + if (cancelled) { + callHook3(cancelHook, [el]); + } else { + callHook3(afterHook, [el]); + } + if (hooks.delayedLeave) { + hooks.delayedLeave(); + } + el._enterCb = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el._enterCb) { + el._enterCb( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook3(onBeforeLeave, [el]); + let called = false; + const done = el._leaveCb = (cancelled) => { + if (called) + return; + called = true; + remove2(); + if (cancelled) { + callHook3(onLeaveCancelled, [el]); + } else { + callHook3(onAfterLeave, [el]); + } + el._leaveCb = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + return resolveTransitionHooks(vnode2, props, state, instance); + } + }; + return hooks; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getKeepAliveChild(vnode) { + return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode; +} +function setTransitionHooks(vnode, hooks) { + if (vnode.shapeFlag & 6 && vnode.component) { + setTransitionHooks(vnode.component.subTree, hooks); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); + } else { + vnode.transition = hooks; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) + keyedFragmentCount++; + ret = ret.concat(getTransitionRawChildren(child.children, keepComment, key)); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +function defineComponent(options) { + return isFunction(options) ? { setup: options, name: options.name } : options; +} +var isAsyncWrapper = (i) => !!i.type.__asyncLoader; +function defineAsyncComponent(source) { + if (isFunction(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay = 200, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = () => { + retries++; + pendingRequest = null; + return load(); + }; + const load = () => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject) => { + const userRetry = () => resolve2(retry()); + const userFail = () => reject(err); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (!comp) { + warn2(`Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`); + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; + } + if (comp && !isObject(comp) && !isFunction(comp)) { + throw new Error(`Invalid async component load result: ${comp}`); + } + resolvedComp = comp; + return comp; + })); + }; + return defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load, + get __asyncResolved() { + return resolvedComp; + }, + setup() { + const instance = currentInstance; + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = (err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + /* do not throw in dev if user provided error component */ + ); + }; + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded = ref(false); + const error = ref(); + const delayed = ref(!!delay); + if (delay) { + setTimeout(() => { + delayed.value = false; + }, delay); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded.value && !error.value) { + const err = new Error(`Async component timed out after ${timeout}ms.`); + onError(err); + error.value = err; + } + }, timeout); + } + load().then(() => { + loaded.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + queueJob(instance.parent.update); + } + }).catch((err) => { + onError(err); + error.value = err; + }); + return () => { + if (loaded.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error.value && errorComponent) { + return createVNode(errorComponent, { + error: error.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; + } + }); +} +function createInnerComp(comp, parent) { + const { ref: ref2, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref2; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +var isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +var KeepAliveImpl = { + name: `KeepAlive`, + // Marker for special handling inside the renderer. We are not using a === + // check directly on KeepAlive in the renderer, because importing it directly + // would prevent it from being tree-shaken. + __isKeepAlive: true, + props: { + include: [String, RegExp, Array], + exclude: [String, RegExp, Array], + max: [String, Number] + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const sharedContext = instance.ctx; + if (!sharedContext.renderer) { + return () => { + const children = slots.default && slots.default(); + return children && children.length === 1 ? children[0] : children; + }; + } + const cache = /* @__PURE__ */ new Map(); + const keys = /* @__PURE__ */ new Set(); + let current = null; + if (true) { + instance.__v_cache = cache; + } + const parentSuspense = instance.suspense; + const { renderer: { p: patch, m: move, um: _unmount, o: { createElement } } } = sharedContext; + const storageContainer = createElement("div"); + sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => { + const instance2 = vnode.component; + move(vnode, container, anchor, 0, parentSuspense); + patch(instance2.vnode, vnode, container, anchor, instance2, parentSuspense, isSVG, vnode.slotScopeIds, optimized); + queuePostRenderEffect(() => { + instance2.isDeactivated = false; + if (instance2.a) { + invokeArrayFns(instance2.a); + } + const vnodeHook = vnode.props && vnode.props.onVnodeMounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + sharedContext.deactivate = (vnode) => { + const instance2 = vnode.component; + move(vnode, storageContainer, null, 1, parentSuspense); + queuePostRenderEffect(() => { + if (instance2.da) { + invokeArrayFns(instance2.da); + } + const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + instance2.isDeactivated = true; + }, parentSuspense); + if (true) { + devtoolsComponentAdded(instance2); + } + }; + function unmount(vnode) { + resetShapeFlag(vnode); + _unmount(vnode, instance, parentSuspense, true); + } + function pruneCache(filter) { + cache.forEach((vnode, key) => { + const name = getComponentName(vnode.type); + if (name && (!filter || !filter(name))) { + pruneCacheEntry(key); + } + }); + } + function pruneCacheEntry(key) { + const cached = cache.get(key); + if (!current || !isSameVNodeType(cached, current)) { + unmount(cached); + } else if (current) { + resetShapeFlag(current); + } + cache.delete(key); + keys.delete(key); + } + watch( + () => [props.include, props.exclude], + ([include, exclude]) => { + include && pruneCache((name) => matches(include, name)); + exclude && pruneCache((name) => !matches(exclude, name)); + }, + // prune post-render after `current` has been updated + { flush: "post", deep: true } + ); + let pendingCacheKey = null; + const cacheSubtree = () => { + if (pendingCacheKey != null) { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + } + }; + onMounted(cacheSubtree); + onUpdated(cacheSubtree); + onBeforeUnmount(() => { + cache.forEach((cached) => { + const { subTree, suspense } = instance; + const vnode = getInnerChild(subTree); + if (cached.type === vnode.type && cached.key === vnode.key) { + resetShapeFlag(vnode); + const da = vnode.component.da; + da && queuePostRenderEffect(da, suspense); + return; + } + unmount(cached); + }); + }); + return () => { + pendingCacheKey = null; + if (!slots.default) { + return null; + } + const children = slots.default(); + const rawVNode = children[0]; + if (children.length > 1) { + if (true) { + warn2(`KeepAlive should contain exactly one component child.`); + } + current = null; + return children; + } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { + current = null; + return rawVNode; + } + let vnode = getInnerChild(rawVNode); + const comp = vnode.type; + const name = getComponentName(isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp); + const { include, exclude, max } = props; + if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { + current = vnode; + return rawVNode; + } + const key = vnode.key == null ? comp : vnode.key; + const cachedVNode = cache.get(key); + if (vnode.el) { + vnode = cloneVNode(vnode); + if (rawVNode.shapeFlag & 128) { + rawVNode.ssContent = vnode; + } + } + pendingCacheKey = key; + if (cachedVNode) { + vnode.el = cachedVNode.el; + vnode.component = cachedVNode.component; + if (vnode.transition) { + setTransitionHooks(vnode, vnode.transition); + } + vnode.shapeFlag |= 512; + keys.delete(key); + keys.add(key); + } else { + keys.add(key); + if (max && keys.size > parseInt(max, 10)) { + pruneCacheEntry(keys.values().next().value); + } + } + vnode.shapeFlag |= 256; + current = vnode; + return isSuspense(rawVNode.type) ? rawVNode : vnode; + }; + } +}; +var KeepAlive = KeepAliveImpl; +function matches(pattern, name) { + if (isArray(pattern)) { + return pattern.some((p2) => matches(p2, name)); + } else if (isString(pattern)) { + return pattern.split(",").includes(name); + } else if (isRegExp(pattern)) { + return pattern.test(name); + } + return false; +} +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function resetShapeFlag(vnode) { + vnode.shapeFlag &= ~256; + vnode.shapeFlag &= ~512; +} +function getInnerChild(vnode) { + return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + if (target.isUnmounted) { + return; + } + pauseTracking(); + setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + unsetCurrentInstance(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } else if (true) { + const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, "")); + warn2(`${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`); + } +} +var createHook = (lifecycle) => (hook, target = currentInstance) => ( + // post-create lifecycle registrations are noops during SSR (except for serverPrefetch) + (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target) +); +var onBeforeMount = createHook( + "bm" + /* LifecycleHooks.BEFORE_MOUNT */ +); +var onMounted = createHook( + "m" + /* LifecycleHooks.MOUNTED */ +); +var onBeforeUpdate = createHook( + "bu" + /* LifecycleHooks.BEFORE_UPDATE */ +); +var onUpdated = createHook( + "u" + /* LifecycleHooks.UPDATED */ +); +var onBeforeUnmount = createHook( + "bum" + /* LifecycleHooks.BEFORE_UNMOUNT */ +); +var onUnmounted = createHook( + "um" + /* LifecycleHooks.UNMOUNTED */ +); +var onServerPrefetch = createHook( + "sp" + /* LifecycleHooks.SERVER_PREFETCH */ +); +var onRenderTriggered = createHook( + "rtg" + /* LifecycleHooks.RENDER_TRIGGERED */ +); +var onRenderTracked = createHook( + "rtc" + /* LifecycleHooks.RENDER_TRACKED */ +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +function validateDirectiveName(name) { + if (isBuiltInDirective(name)) { + warn2("Do not use built-in directive ids as custom directive id: " + name); + } +} +function withDirectives(vnode, directives) { + const internalInstance = currentRenderingInstance; + if (internalInstance === null) { + warn2(`withDirectives can only be used inside render functions.`); + return vnode; + } + const instance = getExposeProxy(internalInstance) || internalInstance.proxy; + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; + if (dir) { + if (isFunction(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +var COMPONENTS = "components"; +var DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +var NULL_DYNAMIC_COMPONENT = Symbol(); +function resolveDynamicComponent(component) { + if (isString(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + /* do not include inferred name to avoid breaking existing code */ + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + if (warnMissing && !res) { + const extra = type === COMPONENTS ? ` +If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; + warn2(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); + } + return res; + } else if (true) { + warn2(`resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`); + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache && cache[index]; + if (isArray(source) || isString(source)) { + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); + } + } else if (typeof source === "number") { + if (!Number.isInteger(source)) { + warn2(`The v-for range expect an integer value but got ${source}.`); + } + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); + } + } else if (isObject(source)) { + if (source[Symbol.iterator]) { + ret = Array.from(source, (item, i) => renderItem(item, i, void 0, cached && cached[i])); + } else { + const keys = Object.keys(source); + ret = new Array(keys.length); + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i]; + ret[i] = renderItem(source[key], key, i, cached && cached[i]); + } + } + } else { + ret = []; + } + if (cache) { + cache[index] = ret; + } + return ret; +} +function createSlots(slots, dynamicSlots) { + for (let i = 0; i < dynamicSlots.length; i++) { + const slot = dynamicSlots[i]; + if (isArray(slot)) { + for (let j = 0; j < slot.length; j++) { + slots[slot[j].name] = slot[j].fn; + } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) + res.key = slot.key; + return res; + } : slot.fn; + } + } + return slots; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { + if (name !== "default") + props.name = name; + return createVNode("slot", props, fallback && fallback()); + } + let slot = slots[name]; + if (slot && slot.length > 1) { + warn2(`SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`); + slot = () => []; + } + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const rendered = createBlock( + Fragment, + { + key: props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key || `_${name}` + }, + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + /* PatchFlags.BAIL */ + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) + return true; + if (child.type === Comment) + return false; + if (child.type === Fragment && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + if (!isObject(obj)) { + warn2(`v-on with no argument expects an object value.`); + return ret; + } + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +var getPublicInstance = (i) => { + if (!i) + return null; + if (isStatefulComponent(i)) + return getExposeProxy(i) || i.proxy; + return getPublicInstance(i.parent); +}; +var publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + extend(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => true ? shallowReadonly(i.props) : i.props, + $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs, + $slots: (i) => true ? shallowReadonly(i.slots) : i.slots, + $refs: (i) => true ? shallowReadonly(i.refs) : i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $emit: (i) => i.emit, + $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type, + $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP + }) +); +var isReservedPrefix = (key) => key === "_" || key === "$"; +var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +var PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + if (key === "__isVue") { + return true; + } + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance, "get", key); + markAttrsAccessed(); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading + // to infinite warning loop + key.indexOf("__v") !== 0)) { + if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { + warn2(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`); + } else if (instance === currentRenderingInstance) { + warn2(`Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`); + } + } + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { + warn2(`Cannot mutate + + + + + + +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/idata/is.html b/docs/v2/.vitepress/dist/api/idata/is.html new file mode 100644 index 0000000..0e8af3d --- /dev/null +++ b/docs/v2/.vitepress/dist/api/idata/is.html @@ -0,0 +1,71 @@ + + + + + + is(value:string):boolean | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

is(value:string):boolean ​

This method returns true if the passed value matches with the value of one of the properties of current object, false otherwise.

INFO

  • device properties are checked in this particular order: type, model, vendor.
  • When checking for browser, any Browser suffix will be ignored.
  • When checking for OS, any OS suffix will be ignored.
  • The comparison is case-insensitive, thus is("firefox") == is("Firefox").

Code Example ​

js
// is() is just a shorthand comparison
+// so that instead of write it using `==` operator like this:
+
+const ua = UAParser();
+const device = ua.device;
+const os = ua.os;
+
+if (device.type == "mobile" && os.name != "iOS") {}
+if (device.type == "smarttv" || device.vendor == "Samsung") {}
+
+// we can also write the comparison above into as follow:
+
+if (device.is("mobile") && !os.is("iOS")) {}
+if (device.is("SmartTV") || device.is("SaMsUnG")) {}
js
// Another examples:
+
+const uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
+
+uap.getBrowser().name;              // "IEMobile"
+uap.getBrowser().is("IEMobile");    // true
+uap.getCPU().is("ARM");             // true
+
+uap.getOS().name;                   // "Windows Phone"
+uap.getOS().is("Windows Phone");    // true
+
+uap.getDevice();                    // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
+uap.getResult().device;             // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
+
+const device = uap.getDevice();
+device.is("mobile");                // true
+device.is("Lumia 635");             // true
+device.is("Nokia");                 // true
+device.is("iPhone");                // false
+uap.getResult().device.is("Nokia"); // true
+uap.getResult().device.model;       // "Lumia 635"
+
+uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
+
+const browser = uap.getBrowser();
+browser.is("IEMobile");             // false 
+browser.is("Chrome");               // true
+
+uap.getResult().browser.is("Edge"); // false
+uap.getResult().os.name             // "Mac OS"
+uap.getResult().os.is("Mac OS");    // true
+uap.getResult().os.version;         // "10.6.8"
+
+const engine = uap.getEngine();
+engine.is("Blink");                 // true

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/idata/to-string.html b/docs/v2/.vitepress/dist/api/idata/to-string.html new file mode 100644 index 0000000..8a40eea --- /dev/null +++ b/docs/v2/.vitepress/dist/api/idata/to-string.html @@ -0,0 +1,48 @@ + + + + + + toString():string | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

toString():string ​

Retrieve full-name values as a string

INFO

Values will be concatenated following this pattern:

  • browser : name + version
  • cpu : architecture
  • device : vendor + model
  • engine : name + version
  • os : name + version

Code Example ​

js
// Usage examples
+
+let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
+
+uap.getDevice();                    // { 
+                                    //    vendor: "Nokia", 
+                                    //    model: "Lumia 635", 
+                                    //    type: "mobile"
+                                    // }
+uap.getDevice().toString();         // "Nokia Lumia 635"
+
+uap.getResult().os.name;            // "Windows Phone"
+uap.getResult().os.version;         // "8.1"
+uap.getResult().os.toString();      // "Windows Phone 8.1"
+
+uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
+uap.getBrowser().name;              // "Chrome"
+uap.getBrowser().version;           // "28.0.1500.95"
+uap.getBrowser().major;             // "28"
+uap.getBrowser().toString();        // "Chrome 28.0.1500.95"
+
+let engine = uap.getEngine();
+engine.name;                        // "Blink"
+engine.version;                     // "28.0.1500.95"
+engine.toString();                  // "Blink 28.0.1500.95"

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/idata/with-client-hints.html b/docs/v2/.vitepress/dist/api/idata/with-client-hints.html new file mode 100644 index 0000000..a997ff9 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/idata/with-client-hints.html @@ -0,0 +1,70 @@ + + + + + + withClientHints():Promise<IData>|Thenable<IData>|IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

withClientHints():Promise<IData>|Thenable<IData>|IData ​

Recently, Chrome limits the information that exposed through user-agent and introduces a new experimental set of data called "Client Hints"↗.

Chrome also sends this client-hints data by default under Sec-CH-UA-* HTTP headers in each request, along with the legacy User-Agent HTTP header. In server-side development, you can capture this extra information by passing the req.headers to UAParser() (see examples below).

In browser-environment, obtaining the client-hints data via JavaScript must be done in an asynchronous way. You can chain the result object from get* method with withClientHints() to also read the client-hints data from the browser which will return the updated data in a Promise.

INFO

In Node.js or in browser-environment without client-hints support (basically anything that's not Chromium-based), withClientHints() will return the updated data as a new object instead of as a Promise.

Code Example ​

Client-side Example ​

js
(async function () {  
+    const ua = new UAParser();
+
+    // get browser data from user-agent only :
+    let browser = ua.getBrowser();
+    console.log('Using User-Agent: ', browser);
+
+    // get browser data from client-hints 
+    // (with user-agent as a fallback) :
+    browser = await ua.getBrowser().withClientHints();
+    console.log('Using Client-Hints: ', browser);
+})();
js
// alternatively without async-await:
+const ua = new UAParser();
+
+ua.getBrowser().withClientHints().then(function (browser) {
+    console.log('Using Client-Hints: ', browser);
+});

Server-side Example ​

js
// Suppose we got a request having these HTTP headers: 
+const request = {
+    headers : {
+        'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
+
+        'sec-ch-ua-mobile' : '?1',
+        'sec-ch-ua-model' : 'Galaxy S3 Marketing',
+        'sec-ch-ua-platform' : 'Android'
+    }
+};
+
+// parse only "user-agent" header
+const result1 = UAParser(request.headers);
+
+// also use "sec-ch-ua" headers, in addition to "user-agent"
+const result2 = UAParser(request.headers).withClientHints();    
+
+console.log(result1.os.name);       // "Linux"
+console.log(result1.device.type);   // undefined
+console.log(result1.device.model);  // undefined
+
+console.log(result2.os.name);       // "Android"
+console.log(result2.device.type);   // "mobile"
+console.log(result2.device.model);  // "Galaxy S3 Marketing"
+
+new UAParser(request.headers)
+        .getBrowser()
+        .withClientHints()
+        .then((browser) => {
+    console.log(browser.toString());    // Chrome 110.0.0.0 
+});

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/idata/with-feature-check.html b/docs/v2/.vitepress/dist/api/idata/with-feature-check.html new file mode 100644 index 0000000..275b7b9 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/idata/with-feature-check.html @@ -0,0 +1,29 @@ + + + + + + withFeatureCheck():IData` | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

withFeatureCheck():IData` ​

This method allows us to examine other features beyond navigator.userAgent. Currently this further improve the detection of the following:

  • browser :
    • Brave (check for navigator.isBrave)
  • device :
    • iPad (check for navigator.standalone & navigator.maxTouchPoints)

Code Example ​

js
// suppose this code runs on iPad
+const withoutFeatureCheck = UAParser();
+const withFeatureCheck = UAParser().withFeatureCheck();
+
+console.log(withoutFeatureCheck.device); // { vendor : "Apple", model : "Macintosh", type : undefined }
+console.log(withFeatureCheck.device);    // { vendor : "Apple", model : "iPad", type : "tablet" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/submodules/enums.html b/docs/v2/.vitepress/dist/api/submodules/enums.html new file mode 100644 index 0000000..946564a --- /dev/null +++ b/docs/v2/.vitepress/dist/api/submodules/enums.html @@ -0,0 +1,24 @@ + + + + + + UAParser.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/submodules/extensions.html b/docs/v2/.vitepress/dist/api/submodules/extensions.html new file mode 100644 index 0000000..ae49bae --- /dev/null +++ b/docs/v2/.vitepress/dist/api/submodules/extensions.html @@ -0,0 +1,24 @@ + + + + + + UAParser.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/submodules/maps.html b/docs/v2/.vitepress/dist/api/submodules/maps.html new file mode 100644 index 0000000..016e3cb --- /dev/null +++ b/docs/v2/.vitepress/dist/api/submodules/maps.html @@ -0,0 +1,24 @@ + + + + + + UAParser.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-browser.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-browser.html new file mode 100644 index 0000000..9fb70ff --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-browser.html @@ -0,0 +1,51 @@ + + + + + + getBrowser():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getBrowser():IData ​

Get browser name, full version, & major version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '', major: '' }

name:string ​

sh
# List of possible `browser.name`:
+2345Explorer, 360 Browser, Amaya, Android Browser, Arora, 
+Avant, Avast, AVG, BIDUBrowser, Baidu, Basilisk, Blazer, 
+Bolt, Brave, Bowser, Camino, Chimera, [Mobile] Chrome 
+[Headless/WebView], Chromium, Cobalt, Comodo Dragon, 
+Dillo, Dolphin, Doris, DuckDuckGo, Edge, Electron, 
+Epiphany, Facebook, Falkon, Fennec, Firebird, [Mobile] 
+Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, 
+HeyTap, Huawei Browser, ICE Browser, IE, IEMobile, 
+IceApe, IceCat, IceDragon, Iceweasel, Instagram, Iridium, 
+Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, 
+Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, 
+Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr,
+Midori, Minimo, Mosaic, Mozilla, NetFront, NetSurf, 
+Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, 
+OmniWeb, Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, 
+PhantomJS, Phoenix, Polaris, Puffin, QQ, QQBrowser, 
+QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari, 
+Sailfish Browser, Samsung Browser, SeaMonkey, Silk, 
+Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tesla, 
+TikTok, Tizen Browser, UCBrowser, UP.Browser, Viera, Vivaldi, 
+Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, 
+Whale Browser, ...

version:string ​

Determined dynamically

major:string ​

Major number of version following semver↗, eg: if we have version 5.1.21214 the major would be 5.

Code Example ​

js
const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25'
+const parser = new UAParser(operamini);
+
+console.log(parser.getBrowser());
+// { name : "Opera Mini", version : "5.1.21214", major : "5" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-cpu.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-cpu.html new file mode 100644 index 0000000..34209e0 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-cpu.html @@ -0,0 +1,31 @@ + + + + + + getCPU():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getCPU():IData ​

Get type of CPU architecture from user-agent string.

js
// Result object is structured as follow:
+{ architecture: '' }

architecture:string ​

sh
# List of possible values for `cpu.architecture`
+68k, amd64, arm[64/hf], avr, ia[32/64], irix[64], 
+mips[64], pa-risc, ppc, sparc[64]

INFO

Our convention here for 32-bit version of 'x86' is referred as ia32, while its 64-bit extension (also known as 'x86-64' or simply 'x64') is referred as amd64.

Code Example ​

js
const powerpc = 'Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC Mac OS; en)'
+const parser = new UAParser(powerpc);
+
+console.log(parser.getCPU());
+// { architecture : "ppc" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-device.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-device.html new file mode 100644 index 0000000..8a5a0e8 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-device.html @@ -0,0 +1,37 @@ + + + + + + getDevice():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getDevice():IData ​

Get details of device information (type, vendor, model) from user-agent string.

js
// Result object is structured as follow:
+{ type: '', vendor: '', model: '' }

type:string ​

sh
# List of possible values for `device.type`:
+mobile, tablet, smarttv, console, wearable, embedded

INFO

If you wish to detect desktop devices, you must handle the logic yourself, since UAParser only reports info that is directly available from user-agent string. Read more about this issue here↗

vendor:string ​

sh
# List of possible `device.vendor`:
+Acer, Alcatel, Amazon, Apple, Archos, ASUS, AT&T, BenQ,
+BlackBerry, Dell, Essential, Facebook, Fairphone, GeeksPhone,
+Google, HP, HTC, Huawei, Jolla, Kobo, Lenovo, LG, Meizu,
+Microsoft, Motorola, Nexian, Nintendo, Nokia, Nvidia, OnePlus, 
+OPPO, Ouya, Palm, Panasonic, Pebble, Polytron, Realme, RIM, 
+Roku, Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Tesla, 
+Vivo, Vodafone, Xbox, Xiaomi, Zebra, ZTE, ...

model:string ​

Determined dynamically

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getDevice());
+// { type : "tablet", vendor : "Samsung", model : "SM-X706B" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-engine.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-engine.html new file mode 100644 index 0000000..03d5abd --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-engine.html @@ -0,0 +1,32 @@ + + + + + + getEngine():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getEngine():IData ​

Get layout rendering engine name & version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '' }

name:string ​

sh
# List of possible value of `engine.name`
+Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, 
+KHTML, LibWeb, Links, Lynx, NetFront, NetSurf, 
+Presto, Tasman, Trident, w3m, WebKit

version:string ​

Determined dynamically

Code Example ​

js
const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25'
+const parser = new UAParser(operamini);
+
+console.log(parser.getEngine());
+// { name : "Presto", version : "2.5.25" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-os.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-os.html new file mode 100644 index 0000000..9b959d3 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-os.html @@ -0,0 +1,38 @@ + + + + + + getOS():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getOS():IData ​

Get operating system name & version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '' }

name:string ​

sh
# List of possible values for `os.name`
+AIX, Amiga OS, Android[-x86], Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
+Contiki, Fedora, Firefox OS, FreeBSD, Debian, Deepin, DragonFly, elementary OS, 
+Fuchsia, Gentoo, GhostBSD, GNU, Haiku, HarmonyOS, HP-UX, Hurd, iOS, Joli, KaiOS, 
+Linpus, Linspire,Linux, Mac OS, Maemo, Mageia, Mandriva, Manjaro, MeeGo, Minix, 
+Mint, Morph OS, NetBSD, NetRange, NetTV, Nintendo, OpenBSD, OpenVMS, OS/2, Palm, 
+PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS, 
+RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian, 
+Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], 
+Zenwalk, ...

version:string ​

Determined dynamically

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getOS());
+// { name : "Android", version : "12" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-result.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-result.html new file mode 100644 index 0000000..58993cb --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-result.html @@ -0,0 +1,77 @@ + + + + + + getResult():IData | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getResult():IData ​

Get all information regarding browser, CPU, device, engine, & OS from user-agent string.

js
// Result object is structured as follow:
+{ 
+    ua: "", 
+    browser: { 
+        name: "", 
+        version: "",
+        major: ""
+    }, 
+    cpu: {
+        architecture: ""
+    }, 
+    device: {
+        type: "",
+        vendor: "",
+        model: ""
+    }, 
+    engine: {
+        name: "",
+        version: ""
+    }, 
+    os: {
+        name: "",
+        version: ""
+    }
+}

ua:string ​

The user-agent string value of current instance.

browser:IData ​

Object that contains the value of browser name, full version, & major version.

cpu:IData ​

Object that contains the value of type of CPU architecture.

device:IData ​

Object that contains the value of device details: type, vendor, model.

engine:IData ​

Object that contains the value of layout rendering engine name & version.

os:IData ​

Object that contains the value of operating system name & version.

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getResult());
+/*
+{ 
+    ua: "Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", 
+    browser: { 
+        name: "Chrome", 
+        version: "103.0.5060.53",
+        major: "103"
+    }, 
+    cpu: {
+        architecture: undefined
+    }, 
+    device: {
+        type: "mobile",
+        vendor: "Huawei",
+        model: "SM-X706B"
+    },
+    engine: {
+        name: "Blink",
+        version: "103.0.5060.53"
+    }, 
+    os: {
+        name: "Android",
+        version: "12"
+    }
+}
+*/

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/get-ua.html b/docs/v2/.vitepress/dist/api/ua-parser-js/get-ua.html new file mode 100644 index 0000000..baaee92 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/get-ua.html @@ -0,0 +1,34 @@ + + + + + + getUA():string | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

getUA():string ​

Get user-agent string of current instance

Code Example ​

js
// Try to run this code on a browser
+const parser = new UAParser();
+
+// This will print the user-agent of current browser
+console.log(parser.getUA());
+
+// Replace the user-agent value
+parser.setUA('Mozilla/5.0 MyBrowser/1.0');
+
+parser.getUA();
+// "Mozilla/5.0 MyBrowser/1.0"

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/overview.html b/docs/v2/.vitepress/dist/api/ua-parser-js/overview.html new file mode 100644 index 0000000..6743dac --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/overview.html @@ -0,0 +1,52 @@ + + + + + + UAParser Class Overview | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

UAParser Class Overview ​

Constructor ​

new UAParser([user-agent:string][,extensions:object][,headers:object]):UAParser ​

When called with the new keyword, it will return a new instance of UAParser.

js
const parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs
+console.log(parser); 
+/* 
+    {}
+*/
+
+const parserResults = parser.getResult();
+console.log(parserResults);
+/* 
+    {
+        ua      : "",
+        browser : {},
+        engine  : {},
+        os      : {},
+        device  : {},
+        cpu     : {}
+    }
+*/

UAParser([user-agent:string][,extensions:object][,headers:object]):IData ​

When called without the new keyword, it will directly return the results of getResult():

js
const parser = UAParser("your user-agent here");
+console.log(parser);
+/* 
+    {
+        ua      : "",
+        browser : {},
+        engine  : {},
+        os      : {},
+        device  : {},
+        cpu     : {}
+    }
+*/

TIP

In browser environment you don't need to pass the user-agent string, as it should automatically get the string from the current window.navigator.userAgent.

TIP

In Node.js environment, user-agent string must be passed in order for the function to work. Usually you can find it in: request.headers["user-agent"].

Methods ​

The methods are self explanatory, here's a small overview of available methods:

getBrowser():IData ​

returns the browser name, version, and major.

getCPU():IData ​

returns CPU architectural design name.

getDevice():IData ​

returns the device model, type, vendor.

getEngine():IData ​

returns the browser engine name and version.

getOS():IData ​

returns the operating system name and version.

getResult():IData ​

returns all function object calls, user-agent string, browser info, cpu, device, engine, os.

getUA():string ​

returns the user-agent string.

setUA(ua:string):UAParser ​

set a custom user-agent string to be parsed.

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/api/ua-parser-js/set-ua.html b/docs/v2/.vitepress/dist/api/ua-parser-js/set-ua.html new file mode 100644 index 0000000..4e900b4 --- /dev/null +++ b/docs/v2/.vitepress/dist/api/ua-parser-js/set-ua.html @@ -0,0 +1,34 @@ + + + + + + setUA(ua:string):UAParser | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

setUA(ua:string):UAParser ​

Set user-agent string to be parsed, returns current instance

Code Example ​

js
// Try to run this code on a browser
+const parser = new UAParser();
+
+// This will print the user-agent of current browser
+console.log(parser.getUA());
+
+// Replace the user-agent value
+parser.setUA('Mozilla/5.0 MyBrowser/1.0');
+
+parser.getUA();
+// "Mozilla/5.0 MyBrowser/1.0"

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.js b/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.js new file mode 100644 index 0000000..0985d9d --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.js @@ -0,0 +1,48 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"is(value:string):boolean","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/is.md","lastUpdated":null}'),o={name:"api/idata/is.md"},p=l(`

is(value:string):boolean ​

This method returns true if the passed value matches with the value of one of the properties of current object, false otherwise.

INFO

  • device properties are checked in this particular order: type, model, vendor.
  • When checking for browser, any Browser suffix will be ignored.
  • When checking for OS, any OS suffix will be ignored.
  • The comparison is case-insensitive, thus is("firefox") == is("Firefox").

Code Example ​

js
// is() is just a shorthand comparison
+// so that instead of write it using \`==\` operator like this:
+
+const ua = UAParser();
+const device = ua.device;
+const os = ua.os;
+
+if (device.type == "mobile" && os.name != "iOS") {}
+if (device.type == "smarttv" || device.vendor == "Samsung") {}
+
+// we can also write the comparison above into as follow:
+
+if (device.is("mobile") && !os.is("iOS")) {}
+if (device.is("SmartTV") || device.is("SaMsUnG")) {}
js
// Another examples:
+
+const uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
+
+uap.getBrowser().name;              // "IEMobile"
+uap.getBrowser().is("IEMobile");    // true
+uap.getCPU().is("ARM");             // true
+
+uap.getOS().name;                   // "Windows Phone"
+uap.getOS().is("Windows Phone");    // true
+
+uap.getDevice();                    // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
+uap.getResult().device;             // { vendor: "Nokia", model: "Lumia 635", type: "mobile" }
+
+const device = uap.getDevice();
+device.is("mobile");                // true
+device.is("Lumia 635");             // true
+device.is("Nokia");                 // true
+device.is("iPhone");                // false
+uap.getResult().device.is("Nokia"); // true
+uap.getResult().device.model;       // "Lumia 635"
+
+uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
+
+const browser = uap.getBrowser();
+browser.is("IEMobile");             // false 
+browser.is("Chrome");               // true
+
+uap.getResult().browser.is("Edge"); // false
+uap.getResult().os.name             // "Mac OS"
+uap.getResult().os.is("Mac OS");    // true
+uap.getResult().os.version;         // "10.6.8"
+
+const engine = uap.getEngine();
+engine.is("Blink");                 // true
`,6),e=[p];function t(c,r,D,y,A,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{C as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.lean.js b/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.lean.js new file mode 100644 index 0000000..5ea4d20 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_is.md.e021670c.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"is(value:string):boolean","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/is.md","lastUpdated":null}'),o={name:"api/idata/is.md"},p=l("",6),e=[p];function t(c,r,D,y,A,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{C as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.js b/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.js new file mode 100644 index 0000000..1a22cc1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.js @@ -0,0 +1,25 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"toString():string","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/to-string.md","lastUpdated":null}'),o={name:"api/idata/to-string.md"},p=l(`

toString():string ​

Retrieve full-name values as a string

INFO

Values will be concatenated following this pattern:

  • browser : name + version
  • cpu : architecture
  • device : vendor + model
  • engine : name + version
  • os : name + version

Code Example ​

js
// Usage examples
+
+let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537');
+
+uap.getDevice();                    // { 
+                                    //    vendor: "Nokia", 
+                                    //    model: "Lumia 635", 
+                                    //    type: "mobile"
+                                    // }
+uap.getDevice().toString();         // "Nokia Lumia 635"
+
+uap.getResult().os.name;            // "Windows Phone"
+uap.getResult().os.version;         // "8.1"
+uap.getResult().os.toString();      // "Windows Phone 8.1"
+
+uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36");
+uap.getBrowser().name;              // "Chrome"
+uap.getBrowser().version;           // "28.0.1500.95"
+uap.getBrowser().major;             // "28"
+uap.getBrowser().toString();        // "Chrome 28.0.1500.95"
+
+let engine = uap.getEngine();
+engine.name;                        // "Blink"
+engine.version;                     // "28.0.1500.95"
+engine.toString();                  // "Blink 28.0.1500.95"
`,5),e=[p];function t(c,r,i,y,D,A){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{C as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.lean.js b/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.lean.js new file mode 100644 index 0000000..7ec7593 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_to-string.md.20eaa222.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"toString():string","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/to-string.md","lastUpdated":null}'),o={name:"api/idata/to-string.md"},p=l("",5),e=[p];function t(c,r,i,y,D,A){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{C as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.js b/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.js new file mode 100644 index 0000000..ac201be --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.js @@ -0,0 +1,47 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"withClientHints():Promise|Thenable|IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/with-client-hints.md","lastUpdated":null}'),e={name:"api/idata/with-client-hints.md"},p=l(`

withClientHints():Promise<IData>|Thenable<IData>|IData ​

Recently, Chrome limits the information that exposed through user-agent and introduces a new experimental set of data called "Client Hints"↗.

Chrome also sends this client-hints data by default under Sec-CH-UA-* HTTP headers in each request, along with the legacy User-Agent HTTP header. In server-side development, you can capture this extra information by passing the req.headers to UAParser() (see examples below).

In browser-environment, obtaining the client-hints data via JavaScript must be done in an asynchronous way. You can chain the result object from get* method with withClientHints() to also read the client-hints data from the browser which will return the updated data in a Promise.

INFO

In Node.js or in browser-environment without client-hints support (basically anything that's not Chromium-based), withClientHints() will return the updated data as a new object instead of as a Promise.

Code Example ​

Client-side Example ​

js
(async function () {  
+    const ua = new UAParser();
+
+    // get browser data from user-agent only :
+    let browser = ua.getBrowser();
+    console.log('Using User-Agent: ', browser);
+
+    // get browser data from client-hints 
+    // (with user-agent as a fallback) :
+    browser = await ua.getBrowser().withClientHints();
+    console.log('Using Client-Hints: ', browser);
+})();
js
// alternatively without async-await:
+const ua = new UAParser();
+
+ua.getBrowser().withClientHints().then(function (browser) {
+    console.log('Using Client-Hints: ', browser);
+});

Server-side Example ​

js
// Suppose we got a request having these HTTP headers: 
+const request = {
+    headers : {
+        'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
+
+        'sec-ch-ua-mobile' : '?1',
+        'sec-ch-ua-model' : 'Galaxy S3 Marketing',
+        'sec-ch-ua-platform' : 'Android'
+    }
+};
+
+// parse only "user-agent" header
+const result1 = UAParser(request.headers);
+
+// also use "sec-ch-ua" headers, in addition to "user-agent"
+const result2 = UAParser(request.headers).withClientHints();    
+
+console.log(result1.os.name);       // "Linux"
+console.log(result1.device.type);   // undefined
+console.log(result1.device.model);  // undefined
+
+console.log(result2.os.name);       // "Android"
+console.log(result2.device.type);   // "mobile"
+console.log(result2.device.model);  // "Galaxy S3 Marketing"
+
+new UAParser(request.headers)
+        .getBrowser()
+        .withClientHints()
+        .then((browser) => {
+    console.log(browser.toString());    // Chrome 110.0.0.0 
+});
`,11),o=[p];function t(r,c,i,y,D,F){return a(),n("div",null,o)}const d=s(e,[["render",t]]);export{C as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.lean.js b/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.lean.js new file mode 100644 index 0000000..37a803e --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_with-client-hints.md.ed97926a.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"withClientHints():Promise|Thenable|IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/with-client-hints.md","lastUpdated":null}'),e={name:"api/idata/with-client-hints.md"},p=l("",11),o=[p];function t(r,c,i,y,D,F){return a(),n("div",null,o)}const d=s(e,[["render",t]]);export{C as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.js b/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.js new file mode 100644 index 0000000..52dedf9 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.js @@ -0,0 +1,6 @@ +import{_ as a,c as s,o as e,N as n}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"withFeatureCheck():IData`","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/with-feature-check.md","lastUpdated":null}'),o={name:"api/idata/with-feature-check.md"},t=n(`

withFeatureCheck():IData\` ​

This method allows us to examine other features beyond navigator.userAgent. Currently this further improve the detection of the following:

  • browser :
    • Brave (check for navigator.isBrave)
  • device :
    • iPad (check for navigator.standalone & navigator.maxTouchPoints)

Code Example ​

js
// suppose this code runs on iPad
+const withoutFeatureCheck = UAParser();
+const withFeatureCheck = UAParser().withFeatureCheck();
+
+console.log(withoutFeatureCheck.device); // { vendor : "Apple", model : "Macintosh", type : undefined }
+console.log(withFeatureCheck.device);    // { vendor : "Apple", model : "iPad", type : "tablet" }
`,5),l=[t];function p(c,r,i,d,u,h){return e(),s("div",null,l)}const y=a(o,[["render",p]]);export{C as __pageData,y as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.lean.js b/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.lean.js new file mode 100644 index 0000000..043b03f --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_idata_with-feature-check.md.6b15066b.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as e,N as n}from"./chunks/framework.eb892692.js";const C=JSON.parse('{"title":"withFeatureCheck():IData`","description":"","frontmatter":{},"headers":[],"relativePath":"api/idata/with-feature-check.md","lastUpdated":null}'),o={name:"api/idata/with-feature-check.md"},t=n("",5),l=[t];function p(c,r,i,d,u,h){return e(),s("div",null,l)}const y=a(o,[["render",p]]);export{C as __pageData,y as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.js b/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.js new file mode 100644 index 0000000..e1e1eed --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s}from"./chunks/framework.eb892692.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/enums.md","lastUpdated":null}'),a={name:"api/submodules/enums.md"};function n(o,r,c,p,d,m){return s(),t("div")}const l=e(a,[["render",n]]);export{i as __pageData,l as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.lean.js b/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.lean.js new file mode 100644 index 0000000..e1e1eed --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_enums.md.67d01874.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s}from"./chunks/framework.eb892692.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/enums.md","lastUpdated":null}'),a={name:"api/submodules/enums.md"};function n(o,r,c,p,d,m){return s(),t("div")}const l=e(a,[["render",n]]);export{i as __pageData,l as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.js b/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.js new file mode 100644 index 0000000..b2eb793 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s}from"./chunks/framework.eb892692.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/extensions.md","lastUpdated":null}'),a={name:"api/submodules/extensions.md"};function n(o,r,c,i,p,d){return s(),t("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.lean.js b/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.lean.js new file mode 100644 index 0000000..b2eb793 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_extensions.md.af715bdb.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s}from"./chunks/framework.eb892692.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/extensions.md","lastUpdated":null}'),a={name:"api/submodules/extensions.md"};function n(o,r,c,i,p,d){return s(),t("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.js b/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.js new file mode 100644 index 0000000..1fb3fd1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t}from"./chunks/framework.eb892692.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/maps.md","lastUpdated":null}'),s={name:"api/submodules/maps.md"};function o(r,p,n,c,d,m){return t(),a("div")}const _=e(s,[["render",o]]);export{l as __pageData,_ as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.lean.js b/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.lean.js new file mode 100644 index 0000000..1fb3fd1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_submodules_maps.md.ae1e54e0.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t}from"./chunks/framework.eb892692.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/submodules/maps.md","lastUpdated":null}'),s={name:"api/submodules/maps.md"};function o(r,p,n,c,d,m){return t(),a("div")}const _=e(s,[["render",o]]);export{l as __pageData,_ as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.js new file mode 100644 index 0000000..d10ec9b --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.js @@ -0,0 +1,28 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"getBrowser():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-browser.md","lastUpdated":null}'),o={name:"api/ua-parser-js/get-browser.md"},p=l(`

getBrowser():IData ​

Get browser name, full version, & major version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '', major: '' }

name:string ​

sh
# List of possible \`browser.name\`:
+2345Explorer, 360 Browser, Amaya, Android Browser, Arora, 
+Avant, Avast, AVG, BIDUBrowser, Baidu, Basilisk, Blazer, 
+Bolt, Brave, Bowser, Camino, Chimera, [Mobile] Chrome 
+[Headless/WebView], Chromium, Cobalt, Comodo Dragon, 
+Dillo, Dolphin, Doris, DuckDuckGo, Edge, Electron, 
+Epiphany, Facebook, Falkon, Fennec, Firebird, [Mobile] 
+Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, 
+HeyTap, Huawei Browser, ICE Browser, IE, IEMobile, 
+IceApe, IceCat, IceDragon, Iceweasel, Instagram, Iridium, 
+Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, 
+Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, 
+Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr,
+Midori, Minimo, Mosaic, Mozilla, NetFront, NetSurf, 
+Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, 
+OmniWeb, Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, 
+PhantomJS, Phoenix, Polaris, Puffin, QQ, QQBrowser, 
+QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari, 
+Sailfish Browser, Samsung Browser, SeaMonkey, Silk, 
+Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tesla, 
+TikTok, Tizen Browser, UCBrowser, UP.Browser, Viera, Vivaldi, 
+Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, 
+Whale Browser, ...

version:string ​

Determined dynamically

major:string ​

Major number of version following semver↗, eg: if we have version 5.1.21214 the major would be 5.

Code Example ​

js
const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25'
+const parser = new UAParser(operamini);
+
+console.log(parser.getBrowser());
+// { name : "Opera Mini", version : "5.1.21214", major : "5" }
`,11),e=[p];function r(t,c,C,y,D,A){return n(),a("div",null,e)}const E=s(o,[["render",r]]);export{F as __pageData,E as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.lean.js new file mode 100644 index 0000000..be5c3b7 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-browser.md.f4df1518.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"getBrowser():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-browser.md","lastUpdated":null}'),o={name:"api/ua-parser-js/get-browser.md"},p=l("",11),e=[p];function r(t,c,C,y,D,A){return n(),a("div",null,e)}const E=s(o,[["render",r]]);export{F as __pageData,E as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.js new file mode 100644 index 0000000..fb501c3 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.js @@ -0,0 +1,8 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"getCPU():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-cpu.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-cpu.md"},p=e(`

getCPU():IData ​

Get type of CPU architecture from user-agent string.

js
// Result object is structured as follow:
+{ architecture: '' }

architecture:string ​

sh
# List of possible values for \`cpu.architecture\`
+68k, amd64, arm[64/hf], avr, ia[32/64], irix[64], 
+mips[64], pa-risc, ppc, sparc[64]

INFO

Our convention here for 32-bit version of 'x86' is referred as ia32, while its 64-bit extension (also known as 'x86-64' or simply 'x64') is referred as amd64.

Code Example ​

js
const powerpc = 'Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC Mac OS; en)'
+const parser = new UAParser(powerpc);
+
+console.log(parser.getCPU());
+// { architecture : "ppc" }
`,8),o=[p];function t(r,c,i,d,y,u){return n(),a("div",null,o)}const F=s(l,[["render",t]]);export{D as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.lean.js new file mode 100644 index 0000000..8c4a255 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-cpu.md.b4ef11dc.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"getCPU():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-cpu.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-cpu.md"},p=e("",8),o=[p];function t(r,c,i,d,y,u){return n(),a("div",null,o)}const F=s(l,[["render",t]]);export{D as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.js new file mode 100644 index 0000000..975b648 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.js @@ -0,0 +1,14 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"getDevice():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-device.md","lastUpdated":null}'),e={name:"api/ua-parser-js/get-device.md"},o=l(`

getDevice():IData ​

Get details of device information (type, vendor, model) from user-agent string.

js
// Result object is structured as follow:
+{ type: '', vendor: '', model: '' }

type:string ​

sh
# List of possible values for \`device.type\`:
+mobile, tablet, smarttv, console, wearable, embedded

INFO

If you wish to detect desktop devices, you must handle the logic yourself, since UAParser only reports info that is directly available from user-agent string. Read more about this issue here↗

vendor:string ​

sh
# List of possible \`device.vendor\`:
+Acer, Alcatel, Amazon, Apple, Archos, ASUS, AT&T, BenQ,
+BlackBerry, Dell, Essential, Facebook, Fairphone, GeeksPhone,
+Google, HP, HTC, Huawei, Jolla, Kobo, Lenovo, LG, Meizu,
+Microsoft, Motorola, Nexian, Nintendo, Nokia, Nvidia, OnePlus, 
+OPPO, Ouya, Palm, Panasonic, Pebble, Polytron, Realme, RIM, 
+Roku, Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Tesla, 
+Vivo, Vodafone, Xbox, Xiaomi, Zebra, ZTE, ...

model:string ​

Determined dynamically

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getDevice());
+// { type : "tablet", vendor : "Samsung", model : "SM-X706B" }
`,12),p=[o];function t(r,c,i,C,y,D){return n(),a("div",null,p)}const u=s(e,[["render",t]]);export{d as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.lean.js new file mode 100644 index 0000000..201cc9a --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-device.md.f2518671.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"getDevice():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-device.md","lastUpdated":null}'),e={name:"api/ua-parser-js/get-device.md"},o=l("",12),p=[o];function t(r,c,i,C,y,D){return n(),a("div",null,p)}const u=s(e,[["render",t]]);export{d as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.js new file mode 100644 index 0000000..fba9352 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.js @@ -0,0 +1,9 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const A=JSON.parse('{"title":"getEngine():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-engine.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-engine.md"},o=e(`

getEngine():IData ​

Get layout rendering engine name & version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '' }

name:string ​

sh
# List of possible value of \`engine.name\`
+Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, 
+KHTML, LibWeb, Links, Lynx, NetFront, NetSurf, 
+Presto, Tasman, Trident, w3m, WebKit

version:string ​

Determined dynamically

Code Example ​

js
const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25'
+const parser = new UAParser(operamini);
+
+console.log(parser.getEngine());
+// { name : "Presto", version : "2.5.25" }
`,9),p=[o];function t(r,c,i,y,C,D){return n(),a("div",null,p)}const m=s(l,[["render",t]]);export{A as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.lean.js new file mode 100644 index 0000000..a94eb11 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-engine.md.93357cf9.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const A=JSON.parse('{"title":"getEngine():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-engine.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-engine.md"},o=e("",9),p=[o];function t(r,c,i,y,C,D){return n(),a("div",null,p)}const m=s(l,[["render",t]]);export{A as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.js new file mode 100644 index 0000000..b14be8f --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.js @@ -0,0 +1,15 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const E=JSON.parse('{"title":"getOS():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-os.md","lastUpdated":null}'),p={name:"api/ua-parser-js/get-os.md"},o=l(`

getOS():IData ​

Get operating system name & version from user-agent string.

js
// Result object is structured as follow:
+{ name: '', version: '' }

name:string ​

sh
# List of possible values for \`os.name\`
+AIX, Amiga OS, Android[-x86], Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
+Contiki, Fedora, Firefox OS, FreeBSD, Debian, Deepin, DragonFly, elementary OS, 
+Fuchsia, Gentoo, GhostBSD, GNU, Haiku, HarmonyOS, HP-UX, Hurd, iOS, Joli, KaiOS, 
+Linpus, Linspire,Linux, Mac OS, Maemo, Mageia, Mandriva, Manjaro, MeeGo, Minix, 
+Mint, Morph OS, NetBSD, NetRange, NetTV, Nintendo, OpenBSD, OpenVMS, OS/2, Palm, 
+PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS, 
+RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian, 
+Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], 
+Zenwalk, ...

version:string ​

Determined dynamically

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getOS());
+// { name : "Android", version : "12" }
`,9),e=[o];function r(t,c,C,y,D,A){return n(),a("div",null,e)}const d=s(p,[["render",r]]);export{E as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.lean.js new file mode 100644 index 0000000..0f34cb1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-os.md.71bcb7f0.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const E=JSON.parse('{"title":"getOS():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-os.md","lastUpdated":null}'),p={name:"api/ua-parser-js/get-os.md"},o=l("",9),e=[o];function r(t,c,C,y,D,A){return n(),a("div",null,e)}const d=s(p,[["render",r]]);export{E as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.js new file mode 100644 index 0000000..190b50c --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.js @@ -0,0 +1,54 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"getResult():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-result.md","lastUpdated":null}'),e={name:"api/ua-parser-js/get-result.md"},p=l(`

getResult():IData ​

Get all information regarding browser, CPU, device, engine, & OS from user-agent string.

js
// Result object is structured as follow:
+{ 
+    ua: "", 
+    browser: { 
+        name: "", 
+        version: "",
+        major: ""
+    }, 
+    cpu: {
+        architecture: ""
+    }, 
+    device: {
+        type: "",
+        vendor: "",
+        model: ""
+    }, 
+    engine: {
+        name: "",
+        version: ""
+    }, 
+    os: {
+        name: "",
+        version: ""
+    }
+}

ua:string ​

The user-agent string value of current instance.

browser:IData ​

Object that contains the value of browser name, full version, & major version.

cpu:IData ​

Object that contains the value of type of CPU architecture.

device:IData ​

Object that contains the value of device details: type, vendor, model.

engine:IData ​

Object that contains the value of layout rendering engine name & version.

os:IData ​

Object that contains the value of operating system name & version.

Code Example ​

js
const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36'
+const parser = new UAParser(galaxytabs8);
+
+console.log(parser.getResult());
+/*
+{ 
+    ua: "Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", 
+    browser: { 
+        name: "Chrome", 
+        version: "103.0.5060.53",
+        major: "103"
+    }, 
+    cpu: {
+        architecture: undefined
+    }, 
+    device: {
+        type: "mobile",
+        vendor: "Huawei",
+        model: "SM-X706B"
+    },
+    engine: {
+        name: "Blink",
+        version: "103.0.5060.53"
+    }, 
+    os: {
+        name: "Android",
+        version: "12"
+    }
+}
+*/
`,17),o=[p];function t(r,c,i,y,F,u){return n(),a("div",null,o)}const d=s(e,[["render",t]]);export{D as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.lean.js new file mode 100644 index 0000000..61a027c --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-result.md.f65ecd4a.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"getResult():IData","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-result.md","lastUpdated":null}'),e={name:"api/ua-parser-js/get-result.md"},p=l("",17),o=[p];function t(r,c,i,y,F,u){return n(),a("div",null,o)}const d=s(e,[["render",t]]);export{D as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.js new file mode 100644 index 0000000..d671ff1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.js @@ -0,0 +1,11 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"getUA():string","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-ua.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-ua.md"},p=e(`

getUA():string ​

Get user-agent string of current instance

Code Example ​

js
// Try to run this code on a browser
+const parser = new UAParser();
+
+// This will print the user-agent of current browser
+console.log(parser.getUA());
+
+// Replace the user-agent value
+parser.setUA('Mozilla/5.0 MyBrowser/1.0');
+
+parser.getUA();
+// "Mozilla/5.0 MyBrowser/1.0"
`,4),o=[p];function r(t,c,i,A,y,u){return n(),a("div",null,o)}const F=s(l,[["render",r]]);export{d as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.lean.js new file mode 100644 index 0000000..c0dcb32 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_get-ua.md.0fa9fd7f.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"getUA():string","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/get-ua.md","lastUpdated":null}'),l={name:"api/ua-parser-js/get-ua.md"},p=e("",4),o=[p];function r(t,c,i,A,y,u){return n(),a("div",null,o)}const F=s(l,[["render",r]]);export{d as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.js new file mode 100644 index 0000000..fb198c4 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.js @@ -0,0 +1,29 @@ +import{_ as s,c as a,o as e,N as n}from"./chunks/framework.eb892692.js";const g=JSON.parse('{"title":"UAParser Class Overview","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/overview.md","lastUpdated":null}'),t={name:"api/ua-parser-js/overview.md"},r=n(`

UAParser Class Overview ​

Constructor ​

new UAParser([user-agent:string][,extensions:object][,headers:object]):UAParser ​

When called with the new keyword, it will return a new instance of UAParser.

js
const parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs
+console.log(parser); 
+/* 
+    {}
+*/
+
+const parserResults = parser.getResult();
+console.log(parserResults);
+/* 
+    {
+        ua      : "",
+        browser : {},
+        engine  : {},
+        os      : {},
+        device  : {},
+        cpu     : {}
+    }
+*/

UAParser([user-agent:string][,extensions:object][,headers:object]):IData ​

When called without the new keyword, it will directly return the results of getResult():

js
const parser = UAParser("your user-agent here");
+console.log(parser);
+/* 
+    {
+        ua      : "",
+        browser : {},
+        engine  : {},
+        os      : {},
+        device  : {},
+        cpu     : {}
+    }
+*/

TIP

In browser environment you don't need to pass the user-agent string, as it should automatically get the string from the current window.navigator.userAgent.

TIP

In Node.js environment, user-agent string must be passed in order for the function to work. Usually you can find it in: request.headers["user-agent"].

Methods ​

The methods are self explanatory, here's a small overview of available methods:

getBrowser():IData ​

returns the browser name, version, and major.

getCPU():IData ​

returns CPU architectural design name.

getDevice():IData ​

returns the device model, type, vendor.

getEngine():IData ​

returns the browser engine name and version.

getOS():IData ​

returns the operating system name and version.

getResult():IData ​

returns all function object calls, user-agent string, browser info, cpu, device, engine, os.

getUA():string ​

returns the user-agent string.

setUA(ua:string):UAParser ​

set a custom user-agent string to be parsed.

`,28),l=[r];function o(p,c,i,u,d,h){return e(),a("div",null,l)}const y=s(t,[["render",o]]);export{g as __pageData,y as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.lean.js new file mode 100644 index 0000000..0d9d885 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_overview.md.1d0cad56.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as e,N as n}from"./chunks/framework.eb892692.js";const g=JSON.parse('{"title":"UAParser Class Overview","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/overview.md","lastUpdated":null}'),t={name:"api/ua-parser-js/overview.md"},r=n("",28),l=[r];function o(p,c,i,u,d,h){return e(),a("div",null,l)}const y=s(t,[["render",o]]);export{g as __pageData,y as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.js new file mode 100644 index 0000000..d09172b --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.js @@ -0,0 +1,11 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"setUA(ua:string):UAParser","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/set-ua.md","lastUpdated":null}'),l={name:"api/ua-parser-js/set-ua.md"},p=e(`

setUA(ua:string):UAParser ​

Set user-agent string to be parsed, returns current instance

Code Example ​

js
// Try to run this code on a browser
+const parser = new UAParser();
+
+// This will print the user-agent of current browser
+console.log(parser.getUA());
+
+// Replace the user-agent value
+parser.setUA('Mozilla/5.0 MyBrowser/1.0');
+
+parser.getUA();
+// "Mozilla/5.0 MyBrowser/1.0"
`,4),r=[p];function o(t,c,i,u,A,y){return n(),a("div",null,r)}const F=s(l,[["render",o]]);export{d as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.lean.js b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.lean.js new file mode 100644 index 0000000..bcf4e41 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/api_ua-parser-js_set-ua.md.8907efd2.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"setUA(ua:string):UAParser","description":"","frontmatter":{},"headers":[],"relativePath":"api/ua-parser-js/set-ua.md","lastUpdated":null}'),l={name:"api/ua-parser-js/set-ua.md"},p=e("",4),r=[p];function o(t,c,i,u,A,y){return n(),a("div",null,r)}const F=s(l,[["render",o]]);export{d as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/app.a149bf9c.js b/docs/v2/.vitepress/dist/assets/app.a149bf9c.js new file mode 100644 index 0000000..2172e77 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/app.a149bf9c.js @@ -0,0 +1 @@ +import{d as p,I as s,a3 as i,u,h as c,l,a4 as d,a5 as f,a6 as m,a7 as h,a8 as A,a9 as g,aa as P,ab as v,ac as y,ad as C,ae as w,af as _,ag as b,a1 as E}from"./chunks/framework.eb892692.js";import{t as R}from"./chunks/theme.683fbe81.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(R),D=p({name:"VitePressApp",setup(){const{site:e}=u();return c(()=>{l(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),d(),f(),m(),n.setup&&n.setup(),()=>h(n.Layout)}});async function O(){const e=T(),a=S();a.provide(A,e);const t=g(e.route);return a.provide(P,t),a.component("Content",v),a.component("ClientOnly",y),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:C}),{app:a,router:e,data:t}}function S(){return w(D)}function T(){let e=s,a;return _(t=>{let o=b(t);return e&&(a=o),(e||a===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),E(()=>import(o),[])},n.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{O as createApp}; diff --git a/docs/v2/.vitepress/dist/assets/chunks/framework.eb892692.js b/docs/v2/.vitepress/dist/assets/chunks/framework.eb892692.js new file mode 100644 index 0000000..c95a636 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/chunks/framework.eb892692.js @@ -0,0 +1,2 @@ +function zn(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}function Yn(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(wi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Jn(e){let t="";if(ie(e))t=e;else if(N(e))for(let n=0;nie(e)?e:e==null?"":N(e)||ee(e)&&(e.toString===ar||!j(e.toString))?JSON.stringify(e,cr,2):String(e),cr=(e,t)=>t&&t.__v_isRef?cr(e,t.value):ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:fr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!N(t)&&!dr(t)?String(t):t,te={},ft=[],Oe=()=>{},vi=()=>!1,Ai=/^on[^a-z]/,Nt=e=>Ai.test(e),Xn=e=>e.startsWith("onUpdate:"),le=Object.assign,Zn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ri=Object.prototype.hasOwnProperty,V=(e,t)=>Ri.call(e,t),N=Array.isArray,ut=e=>fn(e)==="[object Map]",fr=e=>fn(e)==="[object Set]",j=e=>typeof e=="function",ie=e=>typeof e=="string",Qn=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",ur=e=>ee(e)&&j(e.then)&&j(e.catch),ar=Object.prototype.toString,fn=e=>ar.call(e),Oi=e=>fn(e).slice(8,-1),dr=e=>fn(e)==="[object Object]",Gn=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=zn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),un=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ii=/-(\w)/g,Se=un(e=>e.replace(Ii,(t,n)=>n?n.toUpperCase():"")),Fi=/\B([A-Z])/g,it=un(e=>e.replace(Fi,"-$1").toLowerCase()),an=un(e=>e.charAt(0).toUpperCase()+e.slice(1)),Zt=un(e=>e?`on${an(e)}`:""),Ft=(e,t)=>!Object.is(e,t),xn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Pi=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Mi=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let ws;const Si=()=>ws||(ws=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let _e;class Li{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=_e;try{return _e=this,t()}finally{_e=n}}}on(){_e=this}off(){_e=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},hr=e=>(e.w&qe)>0,pr=e=>(e.n&qe)>0,Hi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":N(e)?Gn(n)&&l.push(o.get("length")):(l.push(o.get(st)),ut(e)&&l.push(o.get(Ln)));break;case"delete":N(e)||(l.push(o.get(st)),ut(e)&&l.push(o.get(Ln)));break;case"set":ut(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&Nn(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Nn(es(c))}}function Nn(e,t){const n=N(e)?e:[...e];for(const s of n)s.computed&&xs(s);for(const s of n)s.computed||xs(s)}function xs(e,t){(e!==Ae||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Ui=zn("__proto__,__v_isRef,__isVue"),_r=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Qn)),ji=ns(),Di=ns(!1,!0),Ki=ns(!0),Es=ki();function ki(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=Y(this);for(let i=0,o=this.length;i{e[t]=function(...n){wt();const s=Y(this)[t].apply(this,n);return Ct(),s}}),e}function Wi(e){const t=Y(this);return pe(t,"has",e),t.hasOwnProperty(e)}function ns(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?oo:xr:t?Cr:wr).get(s))return s;const o=N(s);if(!e){if(o&&V(Es,r))return Reflect.get(Es,r,i);if(r==="hasOwnProperty")return Wi}const l=Reflect.get(s,r,i);return(Qn(r)?_r.has(r):Ui(r))||(e||pe(s,"get",r),t)?l:fe(l)?o&&Gn(r)?l:l.value:ee(l)?e?Er(l):hn(l):l}}const qi=br(),Vi=br(!0);function br(e=!1){return function(n,s,r,i){let o=n[s];if(mt(o)&&fe(o)&&!fe(r))return!1;if(!e&&(!nn(r)&&!mt(r)&&(o=Y(o),r=Y(r)),!N(n)&&fe(o)&&!fe(r)))return o.value=r,!0;const l=N(n)&&Gn(s)?Number(s)e,dn=e=>Reflect.getPrototypeOf(e);function Kt(e,t,n=!1,s=!1){e=e.__v_raw;const r=Y(e),i=Y(t);n||(t!==i&&pe(r,"get",t),pe(r,"get",i));const{has:o}=dn(r),l=s?ss:n?os:Pt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function kt(e,t=!1){const n=this.__v_raw,s=Y(n),r=Y(e);return t||(e!==r&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Wt(e,t=!1){return e=e.__v_raw,!t&&pe(Y(e),"iterate",st),Reflect.get(e,"size",e)}function Ts(e){e=Y(e);const t=Y(this);return dn(t).has.call(t,e)||(t.add(e),$e(t,"add",e,e)),this}function vs(e,t){t=Y(t);const n=Y(this),{has:s,get:r}=dn(n);let i=s.call(n,e);i||(e=Y(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Ft(t,o)&&$e(n,"set",e,t):$e(n,"add",e,t),this}function As(e){const t=Y(this),{has:n,get:s}=dn(t);let r=n.call(t,e);r||(e=Y(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&$e(t,"delete",e,void 0),i}function Rs(){const e=Y(this),t=e.size!==0,n=e.clear();return t&&$e(e,"clear",void 0,void 0),n}function qt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=Y(o),c=t?ss:e?os:Pt;return!e&&pe(l,"iterate",st),o.forEach((a,d)=>s.call(r,c(a),c(d),i))}}function Vt(e,t,n){return function(...s){const r=this.__v_raw,i=Y(r),o=ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),d=n?ss:t?os:Pt;return!t&&pe(i,"iterate",c?Ln:st),{next(){const{value:p,done:y}=a.next();return y?{value:p,done:y}:{value:l?[d(p[0]),d(p[1])]:d(p),done:y}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function Qi(){const e={get(i){return Kt(this,i)},get size(){return Wt(this)},has:kt,add:Ts,set:vs,delete:As,clear:Rs,forEach:qt(!1,!1)},t={get(i){return Kt(this,i,!1,!0)},get size(){return Wt(this)},has:kt,add:Ts,set:vs,delete:As,clear:Rs,forEach:qt(!1,!0)},n={get(i){return Kt(this,i,!0)},get size(){return Wt(this,!0)},has(i){return kt.call(this,i,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:qt(!0,!1)},s={get(i){return Kt(this,i,!0,!0)},get size(){return Wt(this,!0)},has(i){return kt.call(this,i,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:qt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Vt(i,!1,!1),n[i]=Vt(i,!0,!1),t[i]=Vt(i,!1,!0),s[i]=Vt(i,!0,!0)}),[e,n,t,s]}const[Gi,eo,to,no]=Qi();function rs(e,t){const n=t?e?no:to:e?eo:Gi;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(V(n,r)&&r in s?n:s,r,i)}const so={get:rs(!1,!1)},ro={get:rs(!1,!0)},io={get:rs(!0,!1)},wr=new WeakMap,Cr=new WeakMap,xr=new WeakMap,oo=new WeakMap;function lo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function co(e){return e.__v_skip||!Object.isExtensible(e)?0:lo(Oi(e))}function hn(e){return mt(e)?e:is(e,!1,yr,so,wr)}function fo(e){return is(e,!1,Zi,ro,Cr)}function Er(e){return is(e,!0,Xi,io,xr)}function is(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=co(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function at(e){return mt(e)?at(e.__v_raw):!!(e&&e.__v_isReactive)}function mt(e){return!!(e&&e.__v_isReadonly)}function nn(e){return!!(e&&e.__v_isShallow)}function Tr(e){return at(e)||mt(e)}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function At(e){return tn(e,"__v_skip",!0),e}const Pt=e=>ee(e)?hn(e):e,os=e=>ee(e)?Er(e):e;function vr(e){ke&&Ae&&(e=Y(e),mr(e.dep||(e.dep=es())))}function Ar(e,t){e=Y(e);const n=e.dep;n&&Nn(n)}function fe(e){return!!(e&&e.__v_isRef===!0)}function Rt(e){return Rr(e,!1)}function uo(e){return Rr(e,!0)}function Rr(e,t){return fe(e)?e:new ao(e,t)}class ao{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Y(t),this._value=n?t:Pt(t)}get value(){return vr(this),this._value}set value(t){const n=this.__v_isShallow||nn(t)||mt(t);t=n?t:Y(t),Ft(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Pt(t),Ar(this))}}function ho(e){return fe(e)?e.value:e}const po={get:(e,t,n)=>ho(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Or(e){return at(e)?e:new Proxy(e,po)}var Ir;class go{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[Ir]=!1,this._dirty=!0,this.effect=new ts(t,()=>{this._dirty||(this._dirty=!0,Ar(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=Y(this);return vr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Ir="__v_isReadonly";function mo(e,t,n=!1){let s,r;const i=j(e);return i?(s=e,r=Oe):(s=e.get,r=e.set),new go(s,r,i||!r,n)}function We(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){$t(i,t,n)}return r}function xe(e,t,n,s){if(j(e)){const i=We(e,t,n,s);return i&&ur(i)&&i.catch(o=>{$t(o,t,n)}),i}const r=[];for(let i=0;i>>1;St(ce[s])Me&&ce.splice(t,1)}function wo(e){N(e)?dt.push(...e):(!Ne||!Ne.includes(e,e.allowRecurse?Ge+1:Ge))&&dt.push(e),Mr()}function Os(e,t=Mt?Me+1:0){for(;tSt(n)-St(s)),Ge=0;Gee.id==null?1/0:e.id,Co=(e,t)=>{const n=St(e)-St(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Sr(e){$n=!1,Mt=!0,ce.sort(Co);const t=Oe;try{for(Me=0;Meie(T)?T.trim():T)),p&&(r=n.map(Pi))}let l,c=s[l=Zt(t)]||s[l=Zt(Se(t))];!c&&i&&(c=s[l=Zt(it(t))]),c&&xe(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,r)}}function Lr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!j(e)){const c=a=>{const d=Lr(a,t,!0);d&&(l=!0,le(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(N(i)?i.forEach(c=>o[c]=null):le(o,i),ee(e)&&s.set(e,o),o)}function gn(e,t){return!e||!Nt(t)?!1:(t=t.slice(2).replace(/Once$/,""),V(e,t[0].toLowerCase()+t.slice(1))||V(e,it(t))||V(e,t))}let ue=null,mn=null;function rn(e){const t=ue;return ue=e,mn=e&&e.type.__scopeId||null,t}function vc(e){mn=e}function Ac(){mn=null}function Eo(e,t=ue,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Bs(-1);const i=rn(t);let o;try{o=e(...r)}finally{rn(i),s._d&&Bs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function En(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:a,render:d,renderCache:p,data:y,setupState:T,ctx:R,inheritAttrs:I}=e;let B,g;const w=rn(e);try{if(n.shapeFlag&4){const H=r||s;B=ve(d.call(H,H,p,i,T,y,R)),g=c}else{const H=t;B=ve(H.length>1?H(i,{attrs:c,slots:l,emit:a}):H(i,null)),g=t.props?c:To(c)}}catch(H){It.length=0,$t(H,e,1),B=re(be)}let O=B;if(g&&I!==!1){const H=Object.keys(g),{shapeFlag:K}=O;H.length&&K&7&&(o&&H.some(Xn)&&(g=vo(g,o)),O=Ve(O,g))}return n.dirs&&(O=Ve(O),O.dirs=O.dirs?O.dirs.concat(n.dirs):n.dirs),n.transition&&(O.transition=n.transition),B=O,rn(w),B}const To=e=>{let t;for(const n in e)(n==="class"||n==="style"||Nt(n))&&((t||(t={}))[n]=e[n]);return t},vo=(e,t)=>{const n={};for(const s in e)(!Xn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ao(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Is(s,o,a):!!o;if(c&8){const d=t.dynamicProps;for(let p=0;pe.__isSuspense;function Nr(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):wo(e)}function Io(e,t){if(se){let n=se.provides;const s=se.parent&&se.parent.provides;s===n&&(n=se.provides=Object.create(s)),n[e]=t}}function ht(e,t,n=!1){const s=se||ue;if(s){const r=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&j(t)?t.call(s.proxy):t}}function Fo(e,t){return _n(e,null,t)}function Po(e,t){return _n(e,null,{flush:"post"})}const zt={};function Qt(e,t,n){return _n(e,t,n)}function _n(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){const l=$i()===(se==null?void 0:se.scope)?se:null;let c,a=!1,d=!1;if(fe(e)?(c=()=>e.value,a=nn(e)):at(e)?(c=()=>e,s=!0):N(e)?(d=!0,a=e.some(O=>at(O)||nn(O)),c=()=>e.map(O=>{if(fe(O))return O.value;if(at(O))return ct(O);if(j(O))return We(O,l,2)})):j(e)?t?c=()=>We(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return p&&p(),xe(e,l,3,[y])}:c=Oe,t&&s){const O=c;c=()=>ct(O())}let p,y=O=>{p=g.onStop=()=>{We(O,l,4)}},T;if(yt)if(y=Oe,t?n&&xe(t,l,3,[c(),d?[]:void 0,y]):c(),r==="sync"){const O=El();T=O.__watcherHandles||(O.__watcherHandles=[])}else return Oe;let R=d?new Array(e.length).fill(zt):zt;const I=()=>{if(g.active)if(t){const O=g.run();(s||a||(d?O.some((H,K)=>Ft(H,R[K])):Ft(O,R)))&&(p&&p(),xe(t,l,3,[O,R===zt?void 0:d&&R[0]===zt?[]:R,y]),R=O)}else g.run()};I.allowRecurse=!!t;let B;r==="sync"?B=I:r==="post"?B=()=>he(I,l&&l.suspense):(I.pre=!0,l&&(I.id=l.uid),B=()=>pn(I));const g=new ts(c,B);t?n?I():R=g.run():r==="post"?he(g.run.bind(g),l&&l.suspense):g.run();const w=()=>{g.stop(),l&&l.scope&&Zn(l.scope.effects,g)};return T&&T.push(w),w}function Mo(e,t,n){const s=this.proxy,r=ie(e)?e.includes(".")?$r(s,e):()=>s[e]:e.bind(s,s);let i;j(t)?i=t:(i=t.handler,n=t);const o=se;bt(this);const l=_n(r,i.bind(s),n);return o?bt(o):rt(),l}function $r(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{ct(n,t)});else if(dr(e))for(const n in e)ct(e[n],t);return e}function So(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Bt(()=>{e.isMounted=!0}),Dr(()=>{e.isUnmounting=!0}),e}const ye=[Function,Array],Lo={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ye,onEnter:ye,onAfterEnter:ye,onEnterCancelled:ye,onBeforeLeave:ye,onLeave:ye,onAfterLeave:ye,onLeaveCancelled:ye,onBeforeAppear:ye,onAppear:ye,onAfterAppear:ye,onAppearCancelled:ye},setup(e,{slots:t}){const n=hs(),s=So();let r;return()=>{const i=t.default&&Ur(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const I of i)if(I.type!==be){o=I;break}}const l=Y(e),{mode:c}=l;if(s.isLeaving)return Tn(o);const a=Fs(o);if(!a)return Tn(o);const d=Hn(a,l,s,n);Bn(a,d);const p=n.subTree,y=p&&Fs(p);let T=!1;const{getTransitionKey:R}=a.type;if(R){const I=R();r===void 0?r=I:I!==r&&(r=I,T=!0)}if(y&&y.type!==be&&(!et(a,y)||T)){const I=Hn(y,l,s,n);if(Bn(y,I),c==="out-in")return s.isLeaving=!0,I.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Tn(o);c==="in-out"&&a.type!==be&&(I.delayLeave=(B,g,w)=>{const O=Br(s,y);O[String(y.key)]=y,B._leaveCb=()=>{g(),B._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=w})}return o}}},Hr=Lo;function Br(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:p,onLeave:y,onAfterLeave:T,onLeaveCancelled:R,onBeforeAppear:I,onAppear:B,onAfterAppear:g,onAppearCancelled:w}=t,O=String(e.key),H=Br(n,e),K=(A,D)=>{A&&xe(A,s,9,D)},Z=(A,D)=>{const U=D[1];K(A,D),N(A)?A.every(z=>z.length<=1)&&U():A.length<=1&&U()},q={mode:i,persisted:o,beforeEnter(A){let D=l;if(!n.isMounted)if(r)D=I||l;else return;A._leaveCb&&A._leaveCb(!0);const U=H[O];U&&et(e,U)&&U.el._leaveCb&&U.el._leaveCb(),K(D,[A])},enter(A){let D=c,U=a,z=d;if(!n.isMounted)if(r)D=B||c,U=g||a,z=w||d;else return;let F=!1;const k=A._enterCb=M=>{F||(F=!0,M?K(z,[A]):K(U,[A]),q.delayedLeave&&q.delayedLeave(),A._enterCb=void 0)};D?Z(D,[A,k]):k()},leave(A,D){const U=String(e.key);if(A._enterCb&&A._enterCb(!0),n.isUnmounting)return D();K(p,[A]);let z=!1;const F=A._leaveCb=k=>{z||(z=!0,D(),k?K(R,[A]):K(T,[A]),A._leaveCb=void 0,H[U]===e&&delete H[U])};H[U]=e,y?Z(y,[A,F]):F()},clone(A){return Hn(A,t,n,s)}};return q}function Tn(e){if(Ht(e))return e=Ve(e),e.children=null,e}function Fs(e){return Ht(e)?e.children?e.children[0]:void 0:e}function Bn(e,t){e.shapeFlag&6&&e.component?Bn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ur(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader;function Rc(e){j(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,a,d=0;const p=()=>(d++,c=null,y()),y=()=>{let T;return c||(T=c=t().catch(R=>{if(R=R instanceof Error?R:new Error(String(R)),l)return new Promise((I,B)=>{l(R,()=>I(p()),()=>B(R),d+1)});throw R}).then(R=>T!==c&&c?c:(R&&(R.__esModule||R[Symbol.toStringTag]==="Module")&&(R=R.default),a=R,R)))};return cs({name:"AsyncComponentWrapper",__asyncLoader:y,get __asyncResolved(){return a},setup(){const T=se;if(a)return()=>vn(a,T);const R=w=>{c=null,$t(w,T,13,!s)};if(o&&T.suspense||yt)return y().then(w=>()=>vn(w,T)).catch(w=>(R(w),()=>s?re(s,{error:w}):null));const I=Rt(!1),B=Rt(),g=Rt(!!r);return r&&setTimeout(()=>{g.value=!1},r),i!=null&&setTimeout(()=>{if(!I.value&&!B.value){const w=new Error(`Async component timed out after ${i}ms.`);R(w),B.value=w}},i),y().then(()=>{I.value=!0,T.parent&&Ht(T.parent.vnode)&&pn(T.parent.update)}).catch(w=>{R(w),B.value=w}),()=>{if(I.value&&a)return vn(a,T);if(B.value&&s)return re(s,{error:B.value});if(n&&!g.value)return re(n)}}})}function vn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=re(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const Ht=e=>e.type.__isKeepAlive;function No(e,t){jr(e,"a",t)}function $o(e,t){jr(e,"da",t)}function jr(e,t,n=se){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(bn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Ht(r.parent.vnode)&&Ho(s,t,n,r),r=r.parent}}function Ho(e,t,n,s){const r=bn(t,e,s,!0);Ut(()=>{Zn(s[t],r)},n)}function bn(e,t,n=se,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;wt(),bt(n);const l=xe(t,n,e,o);return rt(),Ct(),l});return s?r.unshift(i):r.push(i),i}}const He=e=>(t,n=se)=>(!yt||e==="sp")&&bn(e,(...s)=>t(...s),n),Bo=He("bm"),Bt=He("m"),Uo=He("bu"),jo=He("u"),Dr=He("bum"),Ut=He("um"),Do=He("sp"),Ko=He("rtg"),ko=He("rtc");function Wo(e,t=se){bn("ec",e,t)}function Pe(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lcn(t)?!(t.type===be||t.type===de&&!Wr(t.children)):!0)?e:null}function Mc(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:Zt(s)]=e[s];return n}const Un=e=>e?ii(e)?ps(e)||e.proxy:Un(e.parent):null,Ot=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Un(e.parent),$root:e=>Un(e.root),$emit:e=>e.emit,$options:e=>us(e),$forceUpdate:e=>e.f||(e.f=()=>pn(e.update)),$nextTick:e=>e.n||(e.n=Pr.bind(e.proxy)),$watch:e=>Mo.bind(e)}),An=(e,t)=>e!==te&&!e.__isScriptSetup&&V(e,t),qo={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const T=o[t];if(T!==void 0)switch(T){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(An(s,t))return o[t]=1,s[t];if(r!==te&&V(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&V(a,t))return o[t]=3,i[t];if(n!==te&&V(n,t))return o[t]=4,n[t];jn&&(o[t]=0)}}const d=Ot[t];let p,y;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==te&&V(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,V(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return An(r,t)?(r[t]=n,!0):s!==te&&V(s,t)?(s[t]=n,!0):V(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&V(e,o)||An(t,o)||(l=i[0])&&V(l,o)||V(s,o)||V(Ot,o)||V(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:V(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let jn=!0;function Vo(e){const t=us(e),n=e.proxy,s=e.ctx;jn=!1,t.beforeCreate&&Ms(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:d,beforeMount:p,mounted:y,beforeUpdate:T,updated:R,activated:I,deactivated:B,beforeDestroy:g,beforeUnmount:w,destroyed:O,unmounted:H,render:K,renderTracked:Z,renderTriggered:q,errorCaptured:A,serverPrefetch:D,expose:U,inheritAttrs:z,components:F,directives:k,filters:M}=t;if(a&&zo(a,s,null,e.appContext.config.unwrapInjectedRef),o)for(const ne in o){const Q=o[ne];j(Q)&&(s[ne]=Q.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=hn(ne))}if(jn=!0,i)for(const ne in i){const Q=i[ne],ze=j(Q)?Q.bind(n,n):j(Q.get)?Q.get.bind(n,n):Oe,jt=!j(Q)&&j(Q.set)?Q.set.bind(n):Oe,Ye=Te({get:ze,set:jt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ie=>Ye.value=Ie})}if(l)for(const ne in l)qr(l[ne],s,n,ne);if(c){const ne=j(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Q=>{Io(Q,ne[Q])})}d&&Ms(d,e,"c");function J(ne,Q){N(Q)?Q.forEach(ze=>ne(ze.bind(n))):Q&&ne(Q.bind(n))}if(J(Bo,p),J(Bt,y),J(Uo,T),J(jo,R),J(No,I),J($o,B),J(Wo,A),J(ko,Z),J(Ko,q),J(Dr,w),J(Ut,H),J(Do,D),N(U))if(U.length){const ne=e.exposed||(e.exposed={});U.forEach(Q=>{Object.defineProperty(ne,Q,{get:()=>n[Q],set:ze=>n[Q]=ze})})}else e.exposed||(e.exposed={});K&&e.render===Oe&&(e.render=K),z!=null&&(e.inheritAttrs=z),F&&(e.components=F),k&&(e.directives=k)}function zo(e,t,n=Oe,s=!1){N(e)&&(e=Dn(e));for(const r in e){const i=e[r];let o;ee(i)?"default"in i?o=ht(i.from||r,i.default,!0):o=ht(i.from||r):o=ht(i),fe(o)&&s?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):t[r]=o}}function Ms(e,t,n){xe(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function qr(e,t,n,s){const r=s.includes(".")?$r(n,s):()=>n[s];if(ie(e)){const i=t[e];j(i)&&Qt(r,i)}else if(j(e))Qt(r,e.bind(n));else if(ee(e))if(N(e))e.forEach(i=>qr(i,t,n,s));else{const i=j(e.handler)?e.handler.bind(n):t[e.handler];j(i)&&Qt(r,i,e)}}function us(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(a=>on(c,a,o,!0)),on(c,t,o)),ee(t)&&i.set(t,c),c}function on(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&on(e,i,n,!0),r&&r.forEach(o=>on(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Yo[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Yo={data:Ss,props:Qe,emits:Qe,methods:Qe,computed:Qe,beforeCreate:ae,created:ae,beforeMount:ae,mounted:ae,beforeUpdate:ae,updated:ae,beforeDestroy:ae,beforeUnmount:ae,destroyed:ae,unmounted:ae,activated:ae,deactivated:ae,errorCaptured:ae,serverPrefetch:ae,components:Qe,directives:Qe,watch:Xo,provide:Ss,inject:Jo};function Ss(e,t){return t?e?function(){return le(j(e)?e.call(this,this):e,j(t)?t.call(this,this):t)}:t:e}function Jo(e,t){return Qe(Dn(e),Dn(t))}function Dn(e){if(N(e)){const t={};for(let n=0;n0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[y,T]=zr(p,t,!0);le(o,y),T&&l.push(...T)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,ft),ft;if(N(i))for(let d=0;d-1,T[1]=I<0||R-1||V(T,"default"))&&l.push(p)}}}const a=[o,l];return ee(e)&&s.set(e,a),a}function Ls(e){return e[0]!=="$"}function Ns(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function $s(e,t){return Ns(e)===Ns(t)}function Hs(e,t){return N(t)?t.findIndex(n=>$s(n,e)):j(t)&&$s(t,e)?0:-1}const Yr=e=>e[0]==="_"||e==="$stable",as=e=>N(e)?e.map(ve):[ve(e)],Go=(e,t,n)=>{if(t._n)return t;const s=Eo((...r)=>as(t(...r)),n);return s._c=!1,s},Jr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Yr(r))continue;const i=e[r];if(j(i))t[r]=Go(r,i,s);else if(i!=null){const o=as(i);t[r]=()=>o}}},Xr=(e,t)=>{const n=as(t);e.slots.default=()=>n},el=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Y(t),tn(t,"_",n)):Jr(t,e.slots={})}else e.slots={},t&&Xr(e,t);tn(e.slots,yn,1)},tl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(le(r,t),!n&&l===1&&delete r._):(i=!t.$stable,Jr(t,r)),o=t}else t&&(Xr(e,t),o={default:1});if(i)for(const l in r)!Yr(l)&&!(l in o)&&delete r[l]};function Zr(){return{app:null,config:{isNativeTag:vi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let nl=0;function sl(e,t){return function(s,r=null){j(s)||(s=Object.assign({},s)),r!=null&&!ee(r)&&(r=null);const i=Zr(),o=new Set;let l=!1;const c=i.app={_uid:nl++,_component:s,_props:r,_container:null,_context:i,_instance:null,version:Tl,get config(){return i.config},set config(a){},use(a,...d){return o.has(a)||(a&&j(a.install)?(o.add(a),a.install(c,...d)):j(a)&&(o.add(a),a(c,...d))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,d){return d?(i.components[a]=d,c):i.components[a]},directive(a,d){return d?(i.directives[a]=d,c):i.directives[a]},mount(a,d,p){if(!l){const y=re(s,r);return y.appContext=i,d&&t?t(y,a):e(y,a,p),l=!0,c._container=a,a.__vue_app__=c,ps(y.component)||y.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,d){return i.provides[a]=d,c}};return c}}function ln(e,t,n,s,r=!1){if(N(e)){e.forEach((y,T)=>ln(y,t&&(N(t)?t[T]:t),n,s,r));return}if(pt(s)&&!r)return;const i=s.shapeFlag&4?ps(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,d=l.refs===te?l.refs={}:l.refs,p=l.setupState;if(a!=null&&a!==c&&(ie(a)?(d[a]=null,V(p,a)&&(p[a]=null)):fe(a)&&(a.value=null)),j(c))We(c,l,12,[o,d]);else{const y=ie(c),T=fe(c);if(y||T){const R=()=>{if(e.f){const I=y?V(p,c)?p[c]:d[c]:c.value;r?N(I)&&Zn(I,i):N(I)?I.includes(i)||I.push(i):y?(d[c]=[i],V(p,c)&&(p[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else y?(d[c]=o,V(p,c)&&(p[c]=o)):T&&(c.value=o,e.k&&(d[e.k]=o))};o?(R.id=-1,he(R,n)):R()}}}let Ue=!1;const Yt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Jt=e=>e.nodeType===8;function rl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:a}}=e,d=(g,w)=>{if(!w.hasChildNodes()){n(null,g,w),sn(),w._vnode=g;return}Ue=!1,p(w.firstChild,g,null,null,null),sn(),w._vnode=g,Ue&&console.error("Hydration completed but contains mismatches.")},p=(g,w,O,H,K,Z=!1)=>{const q=Jt(g)&&g.data==="[",A=()=>I(g,w,O,H,K,q),{type:D,ref:U,shapeFlag:z,patchFlag:F}=w;let k=g.nodeType;w.el=g,F===-2&&(Z=!1,w.dynamicChildren=null);let M=null;switch(D){case _t:k!==3?w.children===""?(c(w.el=r(""),o(g),g),M=g):M=A():(g.data!==w.children&&(Ue=!0,g.data=w.children),M=i(g));break;case be:k!==8||q?M=A():M=i(g);break;case gt:if(q&&(g=i(g),k=g.nodeType),k===1||k===3){M=g;const ge=!w.children.length;for(let J=0;J{Z=Z||!!w.dynamicChildren;const{type:q,props:A,patchFlag:D,shapeFlag:U,dirs:z}=w,F=q==="input"&&z||q==="option";if(F||D!==-1){if(z&&Pe(w,null,O,"created"),A)if(F||!Z||D&48)for(const M in A)(F&&M.endsWith("value")||Nt(M)&&!vt(M))&&s(g,M,null,A[M],!1,void 0,O);else A.onClick&&s(g,"onClick",null,A.onClick,!1,void 0,O);let k;if((k=A&&A.onVnodeBeforeMount)&&we(k,O,w),z&&Pe(w,null,O,"beforeMount"),((k=A&&A.onVnodeMounted)||z)&&Nr(()=>{k&&we(k,O,w),z&&Pe(w,null,O,"mounted")},H),U&16&&!(A&&(A.innerHTML||A.textContent))){let M=T(g.firstChild,w,g,O,H,K,Z);for(;M;){Ue=!0;const ge=M;M=M.nextSibling,l(ge)}}else U&8&&g.textContent!==w.children&&(Ue=!0,g.textContent=w.children)}return g.nextSibling},T=(g,w,O,H,K,Z,q)=>{q=q||!!w.dynamicChildren;const A=w.children,D=A.length;for(let U=0;U{const{slotScopeIds:q}=w;q&&(K=K?K.concat(q):q);const A=o(g),D=T(i(g),w,A,O,H,K,Z);return D&&Jt(D)&&D.data==="]"?i(w.anchor=D):(Ue=!0,c(w.anchor=a("]"),A,D),D)},I=(g,w,O,H,K,Z)=>{if(Ue=!0,w.el=null,Z){const D=B(g);for(;;){const U=i(g);if(U&&U!==D)l(U);else break}}const q=i(g),A=o(g);return l(g),n(null,w,A,q,O,H,Yt(A),K),q},B=g=>{let w=0;for(;g;)if(g=i(g),g&&Jt(g)&&(g.data==="["&&w++,g.data==="]")){if(w===0)return i(g);w--}return g};return[d,p]}const he=Nr;function il(e){return ol(e,rl)}function ol(e,t){const n=Si();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:d,parentNode:p,nextSibling:y,setScopeId:T=Oe,insertStaticContent:R}=e,I=(f,u,h,_=null,m=null,x=null,v=!1,C=null,E=!!u.dynamicChildren)=>{if(f===u)return;f&&!et(f,u)&&(_=Dt(f),Ie(f,m,x,!0),f=null),u.patchFlag===-2&&(E=!1,u.dynamicChildren=null);const{type:b,ref:S,shapeFlag:P}=u;switch(b){case _t:B(f,u,h,_);break;case be:g(f,u,h,_);break;case gt:f==null&&w(u,h,_,v);break;case de:F(f,u,h,_,m,x,v,C,E);break;default:P&1?K(f,u,h,_,m,x,v,C,E):P&6?k(f,u,h,_,m,x,v,C,E):(P&64||P&128)&&b.process(f,u,h,_,m,x,v,C,E,ot)}S!=null&&m&&ln(S,f&&f.ref,x,u||f,!u)},B=(f,u,h,_)=>{if(f==null)s(u.el=l(u.children),h,_);else{const m=u.el=f.el;u.children!==f.children&&a(m,u.children)}},g=(f,u,h,_)=>{f==null?s(u.el=c(u.children||""),h,_):u.el=f.el},w=(f,u,h,_)=>{[f.el,f.anchor]=R(f.children,u,h,_,f.el,f.anchor)},O=({el:f,anchor:u},h,_)=>{let m;for(;f&&f!==u;)m=y(f),s(f,h,_),f=m;s(u,h,_)},H=({el:f,anchor:u})=>{let h;for(;f&&f!==u;)h=y(f),r(f),f=h;r(u)},K=(f,u,h,_,m,x,v,C,E)=>{v=v||u.type==="svg",f==null?Z(u,h,_,m,x,v,C,E):D(f,u,m,x,v,C,E)},Z=(f,u,h,_,m,x,v,C)=>{let E,b;const{type:S,props:P,shapeFlag:L,transition:$,dirs:W}=f;if(E=f.el=o(f.type,x,P&&P.is,P),L&8?d(E,f.children):L&16&&A(f.children,E,null,_,m,x&&S!=="foreignObject",v,C),W&&Pe(f,null,_,"created"),q(E,f,f.scopeId,v,_),P){for(const X in P)X!=="value"&&!vt(X)&&i(E,X,null,P[X],x,f.children,_,m,Le);"value"in P&&i(E,"value",null,P.value),(b=P.onVnodeBeforeMount)&&we(b,_,f)}W&&Pe(f,null,_,"beforeMount");const G=(!m||m&&!m.pendingBranch)&&$&&!$.persisted;G&&$.beforeEnter(E),s(E,u,h),((b=P&&P.onVnodeMounted)||G||W)&&he(()=>{b&&we(b,_,f),G&&$.enter(E),W&&Pe(f,null,_,"mounted")},m)},q=(f,u,h,_,m)=>{if(h&&T(f,h),_)for(let x=0;x<_.length;x++)T(f,_[x]);if(m){let x=m.subTree;if(u===x){const v=m.vnode;q(f,v,v.scopeId,v.slotScopeIds,m.parent)}}},A=(f,u,h,_,m,x,v,C,E=0)=>{for(let b=E;b{const C=u.el=f.el;let{patchFlag:E,dynamicChildren:b,dirs:S}=u;E|=f.patchFlag&16;const P=f.props||te,L=u.props||te;let $;h&&Je(h,!1),($=L.onVnodeBeforeUpdate)&&we($,h,u,f),S&&Pe(u,f,h,"beforeUpdate"),h&&Je(h,!0);const W=m&&u.type!=="foreignObject";if(b?U(f.dynamicChildren,b,C,h,_,W,x):v||Q(f,u,C,null,h,_,W,x,!1),E>0){if(E&16)z(C,u,P,L,h,_,m);else if(E&2&&P.class!==L.class&&i(C,"class",null,L.class,m),E&4&&i(C,"style",P.style,L.style,m),E&8){const G=u.dynamicProps;for(let X=0;X{$&&we($,h,u,f),S&&Pe(u,f,h,"updated")},_)},U=(f,u,h,_,m,x,v)=>{for(let C=0;C{if(h!==_){if(h!==te)for(const C in h)!vt(C)&&!(C in _)&&i(f,C,h[C],null,v,u.children,m,x,Le);for(const C in _){if(vt(C))continue;const E=_[C],b=h[C];E!==b&&C!=="value"&&i(f,C,b,E,v,u.children,m,x,Le)}"value"in _&&i(f,"value",h.value,_.value)}},F=(f,u,h,_,m,x,v,C,E)=>{const b=u.el=f?f.el:l(""),S=u.anchor=f?f.anchor:l("");let{patchFlag:P,dynamicChildren:L,slotScopeIds:$}=u;$&&(C=C?C.concat($):$),f==null?(s(b,h,_),s(S,h,_),A(u.children,h,S,m,x,v,C,E)):P>0&&P&64&&L&&f.dynamicChildren?(U(f.dynamicChildren,L,h,m,x,v,C),(u.key!=null||m&&u===m.subTree)&&Qr(f,u,!0)):Q(f,u,h,S,m,x,v,C,E)},k=(f,u,h,_,m,x,v,C,E)=>{u.slotScopeIds=C,f==null?u.shapeFlag&512?m.ctx.activate(u,h,_,v,E):M(u,h,_,m,x,v,E):ge(f,u,E)},M=(f,u,h,_,m,x,v)=>{const C=f.component=gl(f,_,m);if(Ht(f)&&(C.ctx.renderer=ot),ml(C),C.asyncDep){if(m&&m.registerDep(C,J),!f.el){const E=C.subTree=re(be);g(null,E,u,h)}return}J(C,f,u,h,m,x,v)},ge=(f,u,h)=>{const _=u.component=f.component;if(Ao(f,u,h))if(_.asyncDep&&!_.asyncResolved){ne(_,u,h);return}else _.next=u,yo(_.update),_.update();else u.el=f.el,_.vnode=u},J=(f,u,h,_,m,x,v)=>{const C=()=>{if(f.isMounted){let{next:S,bu:P,u:L,parent:$,vnode:W}=f,G=S,X;Je(f,!1),S?(S.el=W.el,ne(f,S,v)):S=W,P&&xn(P),(X=S.props&&S.props.onVnodeBeforeUpdate)&&we(X,$,S,W),Je(f,!0);const oe=En(f),Ee=f.subTree;f.subTree=oe,I(Ee,oe,p(Ee.el),Dt(Ee),f,m,x),S.el=oe.el,G===null&&Ro(f,oe.el),L&&he(L,m),(X=S.props&&S.props.onVnodeUpdated)&&he(()=>we(X,$,S,W),m)}else{let S;const{el:P,props:L}=u,{bm:$,m:W,parent:G}=f,X=pt(u);if(Je(f,!1),$&&xn($),!X&&(S=L&&L.onVnodeBeforeMount)&&we(S,G,u),Je(f,!0),P&&Cn){const oe=()=>{f.subTree=En(f),Cn(P,f.subTree,f,m,null)};X?u.type.__asyncLoader().then(()=>!f.isUnmounted&&oe()):oe()}else{const oe=f.subTree=En(f);I(null,oe,h,_,f,m,x),u.el=oe.el}if(W&&he(W,m),!X&&(S=L&&L.onVnodeMounted)){const oe=u;he(()=>we(S,G,oe),m)}(u.shapeFlag&256||G&&pt(G.vnode)&&G.vnode.shapeFlag&256)&&f.a&&he(f.a,m),f.isMounted=!0,u=h=_=null}},E=f.effect=new ts(C,()=>pn(b),f.scope),b=f.update=()=>E.run();b.id=f.uid,Je(f,!0),b()},ne=(f,u,h)=>{u.component=f;const _=f.vnode.props;f.vnode=u,f.next=null,Qo(f,u.props,_,h),tl(f,u.children,h),wt(),Os(),Ct()},Q=(f,u,h,_,m,x,v,C,E=!1)=>{const b=f&&f.children,S=f?f.shapeFlag:0,P=u.children,{patchFlag:L,shapeFlag:$}=u;if(L>0){if(L&128){jt(b,P,h,_,m,x,v,C,E);return}else if(L&256){ze(b,P,h,_,m,x,v,C,E);return}}$&8?(S&16&&Le(b,m,x),P!==b&&d(h,P)):S&16?$&16?jt(b,P,h,_,m,x,v,C,E):Le(b,m,x,!0):(S&8&&d(h,""),$&16&&A(P,h,_,m,x,v,C,E))},ze=(f,u,h,_,m,x,v,C,E)=>{f=f||ft,u=u||ft;const b=f.length,S=u.length,P=Math.min(b,S);let L;for(L=0;LS?Le(f,m,x,!0,!1,P):A(u,h,_,m,x,v,C,E,P)},jt=(f,u,h,_,m,x,v,C,E)=>{let b=0;const S=u.length;let P=f.length-1,L=S-1;for(;b<=P&&b<=L;){const $=f[b],W=u[b]=E?Ke(u[b]):ve(u[b]);if(et($,W))I($,W,h,null,m,x,v,C,E);else break;b++}for(;b<=P&&b<=L;){const $=f[P],W=u[L]=E?Ke(u[L]):ve(u[L]);if(et($,W))I($,W,h,null,m,x,v,C,E);else break;P--,L--}if(b>P){if(b<=L){const $=L+1,W=$L)for(;b<=P;)Ie(f[b],m,x,!0),b++;else{const $=b,W=b,G=new Map;for(b=W;b<=L;b++){const me=u[b]=E?Ke(u[b]):ve(u[b]);me.key!=null&&G.set(me.key,b)}let X,oe=0;const Ee=L-W+1;let lt=!1,_s=0;const xt=new Array(Ee);for(b=0;b=Ee){Ie(me,m,x,!0);continue}let Fe;if(me.key!=null)Fe=G.get(me.key);else for(X=W;X<=L;X++)if(xt[X-W]===0&&et(me,u[X])){Fe=X;break}Fe===void 0?Ie(me,m,x,!0):(xt[Fe-W]=b+1,Fe>=_s?_s=Fe:lt=!0,I(me,u[Fe],h,null,m,x,v,C,E),oe++)}const bs=lt?ll(xt):ft;for(X=bs.length-1,b=Ee-1;b>=0;b--){const me=W+b,Fe=u[me],ys=me+1{const{el:x,type:v,transition:C,children:E,shapeFlag:b}=f;if(b&6){Ye(f.component.subTree,u,h,_);return}if(b&128){f.suspense.move(u,h,_);return}if(b&64){v.move(f,u,h,ot);return}if(v===de){s(x,u,h);for(let P=0;PC.enter(x),m);else{const{leave:P,delayLeave:L,afterLeave:$}=C,W=()=>s(x,u,h),G=()=>{P(x,()=>{W(),$&&$()})};L?L(x,W,G):G()}else s(x,u,h)},Ie=(f,u,h,_=!1,m=!1)=>{const{type:x,props:v,ref:C,children:E,dynamicChildren:b,shapeFlag:S,patchFlag:P,dirs:L}=f;if(C!=null&&ln(C,null,h,f,!0),S&256){u.ctx.deactivate(f);return}const $=S&1&&L,W=!pt(f);let G;if(W&&(G=v&&v.onVnodeBeforeUnmount)&&we(G,u,f),S&6)bi(f.component,h,_);else{if(S&128){f.suspense.unmount(h,_);return}$&&Pe(f,null,u,"beforeUnmount"),S&64?f.type.remove(f,u,h,m,ot,_):b&&(x!==de||P>0&&P&64)?Le(b,u,h,!1,!0):(x===de&&P&384||!m&&S&16)&&Le(E,u,h),_&&gs(f)}(W&&(G=v&&v.onVnodeUnmounted)||$)&&he(()=>{G&&we(G,u,f),$&&Pe(f,null,u,"unmounted")},h)},gs=f=>{const{type:u,el:h,anchor:_,transition:m}=f;if(u===de){_i(h,_);return}if(u===gt){H(f);return}const x=()=>{r(h),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(f.shapeFlag&1&&m&&!m.persisted){const{leave:v,delayLeave:C}=m,E=()=>v(h,x);C?C(f.el,x,E):E()}else x()},_i=(f,u)=>{let h;for(;f!==u;)h=y(f),r(f),f=h;r(u)},bi=(f,u,h)=>{const{bum:_,scope:m,update:x,subTree:v,um:C}=f;_&&xn(_),m.stop(),x&&(x.active=!1,Ie(v,f,u,h)),C&&he(C,u),he(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(f,u,h,_=!1,m=!1,x=0)=>{for(let v=x;vf.shapeFlag&6?Dt(f.component.subTree):f.shapeFlag&128?f.suspense.next():y(f.anchor||f.el),ms=(f,u,h)=>{f==null?u._vnode&&Ie(u._vnode,null,null,!0):I(u._vnode||null,f,u,null,null,null,h),Os(),sn(),u._vnode=f},ot={p:I,um:Ie,m:Ye,r:gs,mt:M,mc:A,pc:Q,pbc:U,n:Dt,o:e};let wn,Cn;return t&&([wn,Cn]=t(ot)),{render:ms,hydrate:wn,createApp:sl(ms,wn)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Qr(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const cl=e=>e.__isTeleport,de=Symbol(void 0),_t=Symbol(void 0),be=Symbol(void 0),gt=Symbol(void 0),It=[];let Re=null;function Gr(e=!1){It.push(Re=e?null:[])}function fl(){It.pop(),Re=It[It.length-1]||null}let Lt=1;function Bs(e){Lt+=e}function ei(e){return e.dynamicChildren=Lt>0?Re||ft:null,fl(),Lt>0&&Re&&Re.push(e),e}function Sc(e,t,n,s,r,i){return ei(si(e,t,n,s,r,i,!0))}function ti(e,t,n,s,r){return ei(re(e,t,n,s,r,!0))}function cn(e){return e?e.__v_isVNode===!0:!1}function et(e,t){return e.type===t.type&&e.key===t.key}const yn="__vInternal",ni=({key:e})=>e??null,Gt=({ref:e,ref_key:t,ref_for:n})=>e!=null?ie(e)||fe(e)||j(e)?{i:ue,r:e,k:t,f:!!n}:e:null;function si(e,t=null,n=null,s=0,r=null,i=e===de?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ni(t),ref:t&&Gt(t),scopeId:mn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ue};return l?(ds(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Lt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=ul;function ul(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Kr)&&(e=be),cn(e)){const l=Ve(e,t,!0);return n&&ds(l,n),Lt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(wl(e)&&(e=e.__vccOpts),t){t=al(t);let{class:l,style:c}=t;l&&!ie(l)&&(t.class=Jn(l)),ee(c)&&(Tr(c)&&!N(c)&&(c=le({},c)),t.style=Yn(c))}const o=ie(e)?1:Oo(e)?128:cl(e)?64:ee(e)?4:j(e)?2:0;return si(e,t,n,s,r,o,i,!0)}function al(e){return e?Tr(e)||yn in e?le({},e):e:null}function Ve(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?dl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ni(l),ref:t&&t.ref?n&&r?N(r)?r.concat(Gt(t)):[r,Gt(t)]:Gt(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ve(e.ssContent),ssFallback:e.ssFallback&&Ve(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function ri(e=" ",t=0){return re(_t,null,e,t)}function Lc(e,t){const n=re(gt,null,e);return n.staticCount=t,n}function Nc(e="",t=!1){return t?(Gr(),ti(be,null,e)):re(be,null,e)}function ve(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(de,null,e.slice()):typeof e=="object"?Ke(e):re(_t,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ve(e)}function ds(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ds(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(yn in t)?t._ctx=ue:r===3&&ue&&(ue.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else j(t)?(t={default:t,_ctx:ue},n=32):(t=String(t),s&64?(n=16,t=[ri(t)]):n=8);e.children=t,e.shapeFlag|=n}function dl(...e){const t={};for(let n=0;nse||ue,bt=e=>{se=e,e.scope.on()},rt=()=>{se&&se.scope.off(),se=null};function ii(e){return e.vnode.shapeFlag&4}let yt=!1;function ml(e,t=!1){yt=t;const{props:n,children:s}=e.vnode,r=ii(e);Zo(e,n,r,t),el(e,s);const i=r?_l(e,t):void 0;return yt=!1,i}function _l(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=At(new Proxy(e.ctx,qo));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?li(e):null;bt(e),wt();const i=We(s,e,0,[e.props,r]);if(Ct(),rt(),ur(i)){if(i.then(rt,rt),t)return i.then(o=>{Us(e,o,t)}).catch(o=>{$t(o,e,0)});e.asyncDep=i}else Us(e,i,t)}else oi(e,t)}function Us(e,t,n){j(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Or(t)),oi(e,n)}let js;function oi(e,t,n){const s=e.type;if(!e.render){if(!t&&js&&!s.render){const r=s.template||us(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=le(le({isCustomElement:i,delimiters:l},o),c);s.render=js(r,a)}}e.render=s.render||Oe}bt(e),wt(),Vo(e),Ct(),rt()}function bl(e){return new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}})}function li(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=bl(e))},slots:e.slots,emit:e.emit,expose:t}}function ps(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Or(At(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ot)return Ot[n](e)},has(t,n){return n in t||n in Ot}}))}function yl(e,t=!0){return j(e)?e.displayName||e.name:e.name||t&&e.__name}function wl(e){return j(e)&&"__vccOpts"in e}const Te=(e,t)=>mo(e,t,yt);function $c(){return Cl().slots}function Cl(){const e=hs();return e.setupContext||(e.setupContext=li(e))}function kn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?cn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&cn(n)&&(n=[n]),re(e,t,n))}const xl=Symbol(""),El=()=>ht(xl),Tl="3.2.47",vl="http://www.w3.org/2000/svg",tt=typeof document<"u"?document:null,Ds=tt&&tt.createElement("template"),Al={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?tt.createElementNS(vl,e):tt.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>tt.createTextNode(e),createComment:e=>tt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>tt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ds.innerHTML=s?`${e}`:e;const l=Ds.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Rl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Ol(e,t,n){const s=e.style,r=ie(n);if(n&&!r){if(t&&!ie(t))for(const i in t)n[i]==null&&Wn(s,i,"");for(const i in n)Wn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const Ks=/\s*!important$/;function Wn(e,t,n){if(N(n))n.forEach(s=>Wn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Il(e,t);Ks.test(n)?e.setProperty(it(s),n.replace(Ks,""),"important"):e[s]=n}}const ks=["Webkit","Moz","ms"],Rn={};function Il(e,t){const n=Rn[t];if(n)return n;let s=Se(t);if(s!=="filter"&&s in e)return Rn[t]=s;s=an(s);for(let r=0;rOn||($l.then(()=>On=0),On=Date.now());function Bl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;xe(Ul(s,n.value),t,5,[s])};return n.value=e,n.attached=Hl(),n}function Ul(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Vs=/^on[a-z]/,jl=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Rl(e,s,r):t==="style"?Ol(e,n,s):Nt(t)?Xn(t)||Ll(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Dl(e,t,s,r))?Pl(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Fl(e,t,s,r))};function Dl(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&Vs.test(t)&&j(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Vs.test(t)&&ie(n)?!1:t in e}function Hc(e){const t=hs();if(!t)return;const n=t.ut=(r=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(i=>Vn(i,r))},s=()=>{const r=e(t.proxy);qn(t.subTree,r),n(r)};Po(s),Bt(()=>{const r=new MutationObserver(s);r.observe(t.subTree.el.parentNode,{childList:!0}),Ut(()=>r.disconnect())})}function qn(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{qn(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Vn(e.el,t);else if(e.type===de)e.children.forEach(n=>qn(n,t));else if(e.type===gt){let{el:n,anchor:s}=e;for(;n&&(Vn(n,t),n!==s);)n=n.nextSibling}}function Vn(e,t){if(e.nodeType===1){const n=e.style;for(const s in t)n.setProperty(`--${s}`,t[s])}}const je="transition",Et="animation",ci=(e,{slots:t})=>kn(Hr,Kl(e),t);ci.displayName="Transition";const fi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ci.props=le({},Hr.props,fi);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},zs=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function Kl(e){const t={};for(const F in e)F in fi||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=o,appearToClass:d=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:T=`${n}-leave-to`}=e,R=kl(r),I=R&&R[0],B=R&&R[1],{onBeforeEnter:g,onEnter:w,onEnterCancelled:O,onLeave:H,onLeaveCancelled:K,onBeforeAppear:Z=g,onAppear:q=w,onAppearCancelled:A=O}=t,D=(F,k,M)=>{Ze(F,k?d:l),Ze(F,k?a:o),M&&M()},U=(F,k)=>{F._isLeaving=!1,Ze(F,p),Ze(F,T),Ze(F,y),k&&k()},z=F=>(k,M)=>{const ge=F?q:w,J=()=>D(k,F,M);Xe(ge,[k,J]),Ys(()=>{Ze(k,F?c:i),De(k,F?d:l),zs(ge)||Js(k,s,I,J)})};return le(t,{onBeforeEnter(F){Xe(g,[F]),De(F,i),De(F,o)},onBeforeAppear(F){Xe(Z,[F]),De(F,c),De(F,a)},onEnter:z(!1),onAppear:z(!0),onLeave(F,k){F._isLeaving=!0;const M=()=>U(F,k);De(F,p),Vl(),De(F,y),Ys(()=>{F._isLeaving&&(Ze(F,p),De(F,T),zs(H)||Js(F,s,B,M))}),Xe(H,[F,M])},onEnterCancelled(F){D(F,!1),Xe(O,[F])},onAppearCancelled(F){D(F,!0),Xe(A,[F])},onLeaveCancelled(F){U(F),Xe(K,[F])}})}function kl(e){if(e==null)return null;if(ee(e))return[In(e.enter),In(e.leave)];{const t=In(e);return[t,t]}}function In(e){return Mi(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Ys(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Wl=0;function Js(e,t,n,s){const r=e._endId=++Wl,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ql(e,t);if(!o)return s();const a=o+"end";let d=0;const p=()=>{e.removeEventListener(a,y),i()},y=T=>{T.target===e&&++d>=c&&p()};setTimeout(()=>{d(n[R]||"").split(", "),r=s(`${je}Delay`),i=s(`${je}Duration`),o=Xs(r,i),l=s(`${Et}Delay`),c=s(`${Et}Duration`),a=Xs(l,c);let d=null,p=0,y=0;t===je?o>0&&(d=je,p=o,y=i.length):t===Et?a>0&&(d=Et,p=a,y=c.length):(p=Math.max(o,a),d=p>0?o>a?je:Et:null,y=d?d===je?i.length:c.length:0);const T=d===je&&/\b(transform|all)(,|$)/.test(s(`${je}Property`).toString());return{type:d,timeout:p,propCount:y,hasTransform:T}}function Xs(e,t){for(;e.lengthZs(n)+Zs(e[s])))}function Zs(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Vl(){return document.body.offsetHeight}const zl=["ctrl","shift","alt","meta"],Yl={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>zl.some(n=>e[`${n}Key`]&&!t.includes(n))},Bc=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||Jl[r]===s))return e(n)},Xl=le({patchProp:jl},Al);let Fn,Qs=!1;function Zl(){return Fn=Qs?Fn:il(Xl),Qs=!0,Fn}const jc=(...e)=>{const t=Zl().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ql(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ql(e){return ie(e)?document.querySelector(e):e}const Dc=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Gl="modulepreload",ec=function(e){return"/ua-parser-js/docs/v2/"+e},Gs={},Kc=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=ec(i),i in Gs)return;Gs[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const p=r[d];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":Gl,o||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),o)return new Promise((d,p)=>{a.addEventListener("load",d),a.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())},tc=window.__VP_SITE_DATA__,ui=/^[a-z]+:/i,kc=/^pathname:\/\//,Wc="vitepress-theme-appearance",ai=/#.*$/,nc=/(index)?\.(md|html)$/,Ce=typeof document<"u",di={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function sc(e,t,n=!1){if(t===void 0)return!1;if(e=er(`/${e}`),n)return new RegExp(t).test(e);if(er(t)!==e)return!1;const s=t.match(ai);return s?(Ce?location.hash:"")===s[0]:!0}function er(e){return decodeURI(e).replace(ai,"").replace(nc,"")}function rc(e){return ui.test(e)}function ic(e,t){var s,r,i,o,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!rc(d)&&sc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:pi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function hi(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=oc(e.title,s);return`${n}${r}`}function oc(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function lc(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function pi(e,t){return[...e.filter(n=>!lc(t,n)),...t]}const cc=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,fc=/^[a-z]:/i;function tr(e){const t=fc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(cc,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const uc=Symbol(),nt=uo(tc);function qc(e){const t=Te(()=>ic(nt.value,e.data.relativePath));return{site:t,theme:Te(()=>t.value.themeConfig),page:Te(()=>e.data),frontmatter:Te(()=>e.data.frontmatter),params:Te(()=>e.data.params),lang:Te(()=>t.value.lang),dir:Te(()=>t.value.dir),localeIndex:Te(()=>t.value.localeIndex||"root"),title:Te(()=>hi(t.value,e.data)),description:Te(()=>e.data.description||t.value.description),isDark:Rt(!1)}}function Vc(){const e=ht(uc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function ac(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function nr(e){return ui.test(e)||e.startsWith(".")?e:ac(nt.value.base,e)}function dc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/ua-parser-js/docs/v2/";t=tr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${tr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let en=[];function zc(e){en.push(e),Ut(()=>{en=en.filter(t=>t!==e)})}const hc=Symbol(),sr="http://a.com",pc=()=>({path:"/",component:null,data:di});function Yc(e,t){const n=hn(pc()),s={route:n,go:r};async function r(l=Ce?location.href:"/"){var a,d;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,sr);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Ce&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,a=!1){const d=new URL(l,sr),p=i=d.pathname;try{let y=await e(p);if(i===p){i=null;const{default:T,__pageData:R}=y;if(!T)throw new Error(`Invalid route component: ${T}`);n.path=Ce?p:nr(p),n.component=At(T),n.data=At(R),Ce&&Pr(()=>{let I=nt.value.base+R.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!I.endsWith("/")&&(I+=".html"),I!==d.pathname&&(d.pathname=I,l=I+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let B=null;try{B=document.querySelector(decodeURIComponent(d.hash))}catch(g){console.warn(g)}if(B){rr(B,d.hash);return}}window.scrollTo(0,c)})}}catch(y){if(!/fetch/.test(y.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(y),!a)try{const T=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await T.json(),await o(l,c,!0);return}catch{}i===p&&(i=null,n.path=Ce?p:nr(p),n.component=t?At(t):null,n.data=di)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:p,origin:y,pathname:T,hash:R,search:I}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),B=window.location,g=T.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&d!=="_blank"&&y===B.origin&&!(g&&g[0]!==".html")&&(l.preventDefault(),T===B.pathname&&I===B.search?R&&R!==B.hash&&(history.pushState(null,"",R),window.dispatchEvent(new Event("hashchange")),rr(a,R,a.classList.contains("header-anchor"))):r(p))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function gc(){const e=ht(hc);if(!e)throw new Error("useRouter() is called without provider.");return e}function gi(){return gc().route}function rr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(r){console.warn(r)}if(s){const r=nt.value.scrollOffset;let i=0;if(typeof r=="number")i=r;else if(typeof r=="string")i=ir(r);else if(Array.isArray(r))for(const c of r){const a=ir(c);if(a){i=a;break}}const o=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-i+o;!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})}}function ir(e){const t=document.querySelector(e);if(!t)return 0;const n=t.getBoundingClientRect().bottom;return n<0?0:n+24}const or=()=>en.forEach(e=>e()),Jc=cs({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=gi();return()=>kn(e.as,{style:{position:"relative"}},[t.component?kn(t.component,{onVnodeMounted:or,onVnodeUpdated:or}):"404 Page Not Found"])}});function Xc(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=mc(o);document.head.appendChild(l),n.push(l)})};Fo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=hi(o,i),document.querySelector("meta[name=description]").setAttribute("content",l||o.description),r(pi(o.head,bc(c)))})}function mc([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function _c(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function bc(e){return e.filter(t=>!_c(t))}const Pn=new Set,mi=()=>document.createElement("link"),yc=e=>{const t=mi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},wc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Xt;const Cc=Ce&&(Xt=mi())&&Xt.relList&&Xt.relList.supports&&Xt.relList.supports("prefetch")?yc:wc;function Zc(){if(!Ce||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Pn.has(c)){Pn.add(c);const a=dc(c);Cc(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:o}=i,{hostname:l,pathname:c}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),a=c.match(/\.\w+$/);a&&a[0]!==".html"||o!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):Pn.add(c))})})};Bt(s);const r=gi();Qt(()=>r.path,s),Ut(()=>{n&&n.disconnect()})}const Qc=cs({setup(e,{slots:t}){const n=Rt(!1);return Bt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Gc(){if(Ce){const e=new Map;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),xc(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function xc(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function ef(){Ce&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((r==null?void 0:r.querySelectorAll("input"))||[]).indexOf(t),o=r==null?void 0:r.querySelector('div[class*="language-"].active'),l=(s=r==null?void 0:r.querySelectorAll('div[class*="language-"]:not(.language-id)'))==null?void 0:s[i];o&&l&&o!==l&&(o.classList.remove("active"),l.classList.add("active"))}})}export{Bc as $,Nc as A,dl as B,re as C,Oc as D,Hc as E,de as F,Ic as G,ui as H,Ce as I,Er as J,Fc as K,vc as L,Ac as M,Lc as N,Wc as O,kc as P,ht as Q,Io as R,jo as S,ci as T,zc as U,uo as V,Yn as W,Uc as X,Mc as Y,Po as Z,Dc as _,ri as a,Rc as a0,Kc as a1,$c as a2,Xc as a3,Zc as a4,Gc as a5,ef as a6,kn as a7,hc as a8,qc as a9,uc as aa,Jc as ab,Qc as ac,nt as ad,jc as ae,Yc as af,dc as ag,ho as b,Sc as c,cs as d,Te as e,Rt as f,hs as g,Bt as h,Pr as i,$i as j,Tc as k,Fo as l,rc as m,Jn as n,Gr as o,nr as p,sc as q,Pc as r,gi as s,Ec as t,Vc as u,Ut as v,Qt as w,si as x,ti as y,Eo as z}; diff --git a/docs/v2/.vitepress/dist/assets/chunks/theme.683fbe81.js b/docs/v2/.vitepress/dist/assets/chunks/theme.683fbe81.js new file mode 100644 index 0000000..74dd95d --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/chunks/theme.683fbe81.js @@ -0,0 +1,7 @@ +import{d as g,o as a,c as i,r as u,n as M,a as C,t as w,_ as p,u as tt,b as c,e as y,f as x,g as nt,h as G,i as ze,j as st,k as ot,w as q,l as Y,m as at,P as ct,p as ve,q as K,s as Z,v as ce,x as r,F as I,y as b,z as v,T as he,A as m,B as te,C as f,D as R,E as lt,G as U,H as De,I as it,J as rt,K as B,L as E,M as H,N as ut,O as Ie,Q as fe,R as ne,S as dt,U as X,V as pe,W as _t,X as vt,Y as ht,Z as ft,$ as pt,a0 as mt,a1 as gt,a2 as bt}from"./framework.eb892692.js";const yt=g({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>(a(),i("span",{class:M(["VPBadge",e.type??"tip"])},[u(t.$slots,"default",{},()=>[C(w(e.text),1)],!0)],2))}});const kt=p(yt,[["__scopeId","data-v-2624088a"]]),V=tt;var Ce;const Fe=typeof window<"u",$t=e=>typeof e=="string",Pt=()=>{};Fe&&((Ce=window==null?void 0:window.navigator)!=null&&Ce.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Ge(e){return typeof e=="function"?e():c(e)}function wt(e){return e}function Re(e){return st()?(ot(e),!0):!1}function Vt(e){return typeof e=="function"?y(e):x(e)}function xt(e,t=!0){nt()?G(e):t?e():ze(e)}function St(e){var t;const n=Ge(e);return(t=n==null?void 0:n.$el)!=null?t:n}const me=Fe?window:void 0;function Lt(...e){let t,n,s,o;if($t(e[0])||Array.isArray(e[0])?([n,s,o]=e,t=me):[t,n,s,o]=e,!t)return Pt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const l=[],d=()=>{l.forEach($=>$()),l.length=0},h=($,L,P,S)=>($.addEventListener(L,P,S),()=>$.removeEventListener(L,P,S)),_=q(()=>[St(t),Ge(o)],([$,L])=>{d(),$&&l.push(...n.flatMap(P=>s.map(S=>h($,P,S,L))))},{immediate:!0,flush:"post"}),k=()=>{_(),d()};return Re(k),k}function Mt(e,t=!1){const n=x(),s=()=>n.value=!!e();return s(),xt(s,t),n}function ue(e,t={}){const{window:n=me}=t,s=Mt(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const l=x(!1),d=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",h):o.removeListener(h))},h=()=>{s.value&&(d(),o=n.matchMedia(Vt(e).value),l.value=o.matches,"addEventListener"in o?o.addEventListener("change",h):o.addListener(h))};return Y(h),Re(()=>d()),l}const Te=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Be="__vueuse_ssr_handlers__";Te[Be]=Te[Be]||{};var Ne;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(Ne||(Ne={}));var It=Object.defineProperty,Ae=Object.getOwnPropertySymbols,Ct=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,Ee=(e,t,n)=>t in e?It(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Bt=(e,t)=>{for(var n in t||(t={}))Ct.call(t,n)&&Ee(e,n,t[n]);if(Ae)for(var n of Ae(t))Tt.call(t,n)&&Ee(e,n,t[n]);return e};const Nt={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};Bt({linear:wt},Nt);function At({window:e=me}={}){if(!e)return{x:x(0),y:x(0)};const t=x(e.scrollX),n=x(e.scrollY);return Lt(e,"scroll",()=>{t.value=e.scrollX,n.value=e.scrollY},{capture:!1,passive:!0}),{x:t,y:n}}function Et(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function de(e){return/^\//.test(e)?e:`/${e}`}function J(e){if(at(e))return e.replace(ct,"");const{site:t}=V(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),l=n.endsWith("/")||n.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,t.value.cleanUrls?"":".html")}${s}${o}`);return ve(l)}function Ue(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=de(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(de(s)));return n?e[n]:[]}function Ht(e){const t=[];let n=0;for(const s in e){const o=e[s];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function Ot(e){const t=[];function n(s){for(const o of s)o.text&&o.link&&t.push({text:o.text,link:o.link}),o.items&&n(o.items)}return n(e),t}function _e(e,t){return Array.isArray(t)?t.some(n=>_e(e,n)):K(e,t.link)?!0:t.items?_e(e,t.items):!1}function O(){const e=Z(),{theme:t,frontmatter:n}=V(),s=ue("(min-width: 960px)"),o=x(!1),l=y(()=>{const T=t.value.sidebar,N=e.data.relativePath;return T?Ue(T,N):[]}),d=y(()=>n.value.sidebar!==!1&&l.value.length>0&&n.value.layout!=="home"),h=y(()=>_?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),_=y(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),k=y(()=>d.value&&s.value),$=y(()=>d.value?Ht(l.value):[]);function L(){o.value=!0}function P(){o.value=!1}function S(){o.value?P():L()}return{isOpen:o,sidebar:l,sidebarGroups:$,hasSidebar:d,hasAside:_,leftAside:h,isSidebarEnabled:k,open:L,close:P,toggle:S}}function zt(e,t){let n;Y(()=>{n=e.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",s)}),ce(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function Dt(e){const{page:t}=V(),n=x(!1),s=y(()=>e.value.collapsed!=null),o=y(()=>!!e.value.link),l=y(()=>K(t.value.relativePath,e.value.link)),d=y(()=>l.value?!0:e.value.items?_e(t.value.relativePath,e.value.items):!1),h=y(()=>!!(e.value.items&&e.value.items.length));Y(()=>{n.value=!!(s.value&&e.value.collapsed)}),Y(()=>{(l.value||d.value)&&(n.value=!1)});function _(){s.value&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:h,toggle:_}}const Ft=g({__name:"VPSkipLink",setup(e){const t=Z(),n=x();q(()=>t.path,()=>n.value.focus());function s({target:o}){const l=document.querySelector(decodeURIComponent(o.hash));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),i(I,null,[r("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),r("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const Gt=p(Ft,[["__scopeId","data-v-b1e5adb7"]]),Rt={key:0,class:"VPBackdrop"},Ut=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(a(),b(he,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Rt)):m("",!0)]),_:1}))}});const jt=p(Ut,[["__scopeId","data-v-b06cdb19"]]);function qt(){const e=x(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const l=Z();return q(()=>l.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}function ee({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:s,page:o,theme:l}=V(),d=y(()=>{var _,k;return{label:(_=n.value.locales[s.value])==null?void 0:_.label,link:((k=n.value.locales[s.value])==null?void 0:k.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:y(()=>Object.entries(n.value.locales).flatMap(([_,k])=>e&&d.value.label===k.label?[]:{text:k.label,link:Kt(k.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&t,o.value.relativePath.slice(d.value.link.length-1),!n.value.cleanUrls)})),currentLang:d}}function Kt(e,t,n,s){return t?e.replace(/\/$/,"")+de(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,s?".html":"")):e}const Wt=["src","alt"],Qt={inheritAttrs:!1},Yt=g({...Qt,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{const s=R("VPImage",!0);return e.image?(a(),i(I,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",te({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:c(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Wt)):(a(),i(I,{key:1},[f(s,te({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),f(s,te({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}});const ge=p(Yt,[["__scopeId","data-v-5666d3c1"]]),Xt=["href"],Jt=g({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=V(),{hasSidebar:s}=O(),{currentLang:o}=ee();return(l,d)=>(a(),i("div",{class:M(["VPNavBarTitle",{"has-sidebar":c(s)}])},[r("a",{class:"title",href:c(J)(c(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),c(n).logo?(a(),b(ge,{key:0,class:"logo",image:c(n).logo},null,8,["image"])):m("",!0),c(n).siteTitle?(a(),i(I,{key:1},[C(w(c(n).siteTitle),1)],64)):c(n).siteTitle===void 0?(a(),i(I,{key:2},[C(w(c(t).title),1)],64)):m("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Xt)],2))}});const Zt=p(Jt,[["__scopeId","data-v-4b4b99f1"]]);const en={key:0,class:"VPNavBarSearch"},tn={key:1,id:"docsearch"},nn={class:"DocSearch-Button-Container"},sn=r("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[r("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),on={class:"DocSearch-Button-Placeholder"},an=r("span",{class:"DocSearch-Button-Keys"},[r("kbd",{class:"DocSearch-Button-Key"}),r("kbd",{class:"DocSearch-Button-Key"},"K")],-1),cn=g({__name:"VPNavBarSearch",setup(e){lt($=>({e33de7f2:l.value}));const t=()=>null,{theme:n,localeIndex:s}=V(),o=x(!1),l=x("'Meta'"),d=y(()=>{var $,L,P,S,T,N,A,z;return((T=(S=(P=(L=($=n.value.algolia)==null?void 0:$.locales)==null?void 0:L[s.value])==null?void 0:P.translations)==null?void 0:S.button)==null?void 0:T.buttonText)||((z=(A=(N=n.value.algolia)==null?void 0:N.translations)==null?void 0:A.button)==null?void 0:z.buttonText)||"Search"}),h=()=>{const $="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{const P=document.createElement("link");P.id=$,P.rel="preconnect",P.href=`https://${n.value.algolia.appId}-dsn.algolia.net`,P.crossOrigin="",document.head.appendChild(P)})};G(()=>{if(!n.value.algolia)return;h(),l.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'";const $=P=>{P.key==="k"&&(P.ctrlKey||P.metaKey)&&(P.preventDefault(),_(),L())},L=()=>{window.removeEventListener("keydown",$)};window.addEventListener("keydown",$),ce(L)});function _(){o.value||(o.value=!0,setTimeout(k,16))}function k(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||k()},16)}return($,L)=>c(n).algolia?(a(),i("div",en,[o.value?(a(),b(c(t),{key:0,algolia:c(n).algolia},null,8,["algolia"])):(a(),i("div",tn,[r("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search",onClick:_},[r("span",nn,[sn,r("span",on,w(c(d)),1)]),an])]))])):m("",!0)}});const ln={},rn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},un=r("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),dn=r("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),_n=[un,dn];function vn(e,t){return a(),i("svg",rn,_n)}const hn=p(ln,[["render",vn]]),fn=g({__name:"VPLink",props:{tag:null,href:null,noIcon:{type:Boolean},target:null,rel:null},setup(e){const t=e,n=y(()=>t.tag??t.href?"a":"span"),s=y(()=>t.href&&De.test(t.href));return(o,l)=>(a(),b(U(c(n)),{class:M(["VPLink",{link:e.href}]),href:e.href?c(J)(e.href):void 0,target:e.target||(c(s)?"_blank":void 0),rel:e.rel||(c(s)?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default",{},void 0,!0),c(s)&&!e.noIcon?(a(),b(hn,{key:0,class:"icon"})):m("",!0)]),_:3},8,["class","href","target","rel"]))}});const D=p(fn,[["__scopeId","data-v-40bbea7a"]]),pn=g({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=V();return(n,s)=>(a(),b(D,{class:M({VPNavBarMenuLink:!0,active:c(K)(c(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,tabindex:"0"},{default:v(()=>[C(w(e.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const mn=p(pn,[["__scopeId","data-v-42f218ec"]]),be=x();let je=!1,re=0;function gn(e){const t=x(!1);if(it){!je&&bn(),re++;const n=q(be,s=>{var o,l,d;s===e.el.value||(o=e.el.value)!=null&&o.contains(s)?(t.value=!0,(l=e.onFocus)==null||l.call(e)):(t.value=!1,(d=e.onBlur)==null||d.call(e))});ce(()=>{n(),re--,re||yn()})}return rt(t)}function bn(){document.addEventListener("focusin",qe),je=!0,be.value=document.activeElement}function yn(){document.removeEventListener("focusin",qe)}function qe(){be.value=document.activeElement}const kn={},$n={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Pn=r("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),wn=[Pn];function Vn(e,t){return a(),i("svg",$n,wn)}const Ke=p(kn,[["render",Vn]]),xn={},Sn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ln=r("circle",{cx:"12",cy:"12",r:"2"},null,-1),Mn=r("circle",{cx:"19",cy:"12",r:"2"},null,-1),In=r("circle",{cx:"5",cy:"12",r:"2"},null,-1),Cn=[Ln,Mn,In];function Tn(e,t){return a(),i("svg",Sn,Cn)}const Bn=p(xn,[["render",Tn]]),Nn={class:"VPMenuLink"},An=g({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=V();return(n,s)=>(a(),i("div",Nn,[f(D,{class:M({active:c(K)(c(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel},{default:v(()=>[C(w(e.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const le=p(An,[["__scopeId","data-v-ec28281a"]]),En={class:"VPMenuGroup"},Hn={key:0,class:"title"},On=g({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(a(),i("div",En,[e.text?(a(),i("p",Hn,w(e.text),1)):m("",!0),(a(!0),i(I,null,B(e.items,s=>(a(),i(I,null,["link"in s?(a(),b(le,{key:0,item:s},null,8,["item"])):m("",!0)],64))),256))]))}});const zn=p(On,[["__scopeId","data-v-48c802d0"]]),Dn={class:"VPMenu"},Fn={key:0,class:"items"},Gn=g({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(a(),i("div",Dn,[e.items?(a(),i("div",Fn,[(a(!0),i(I,null,B(e.items,s=>(a(),i(I,{key:s.text},["link"in s?(a(),b(le,{key:0,item:s},null,8,["item"])):(a(),b(zn,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):m("",!0),u(t.$slots,"default",{},void 0,!0)]))}});const Rn=p(Gn,[["__scopeId","data-v-97491713"]]),Un=["aria-expanded","aria-label"],jn={key:0,class:"text"},qn={class:"menu"},Kn=g({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=x(!1),n=x();gn({el:n,onBlur:s});function s(){t.value=!1}return(o,l)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:l[1]||(l[1]=d=>t.value=!0),onMouseleave:l[2]||(l[2]=d=>t.value=!1)},[r("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:l[0]||(l[0]=d=>t.value=!t.value)},[e.button||e.icon?(a(),i("span",jn,[e.icon?(a(),b(U(e.icon),{key:0,class:"option-icon"})):m("",!0),C(" "+w(e.button)+" ",1),f(Ke,{class:"text-icon"})])):(a(),b(Bn,{key:1,class:"icon"}))],8,Un),r("div",qn,[f(Rn,{items:e.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ye=p(Kn,[["__scopeId","data-v-e4ec5600"]]),Wn=g({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=V();return(n,s)=>(a(),b(ye,{class:M({VPNavBarMenuGroup:!0,active:c(K)(c(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),Qn=e=>(E("data-v-492ea56d"),e=e(),H(),e),Yn={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Xn=Qn(()=>r("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Jn=g({__name:"VPNavBarMenu",setup(e){const{theme:t}=V();return(n,s)=>c(t).nav?(a(),i("nav",Yn,[Xn,(a(!0),i(I,null,B(c(t).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),b(mn,{key:0,item:o},null,8,["item"])):(a(),b(Wn,{key:1,item:o},null,8,["item"]))],64))),128))])):m("",!0)}});const Zn=p(Jn,[["__scopeId","data-v-492ea56d"]]),es={},ts={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ns=r("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),ss=r("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),os=[ns,ss];function as(e,t){return a(),i("svg",ts,os)}const We=p(es,[["render",as]]),cs={class:"items"},ls={class:"title"},is=g({__name:"VPNavBarTranslations",setup(e){const{theme:t}=V(),{localeLinks:n,currentLang:s}=ee({correspondingLink:!0});return(o,l)=>c(n).length&&c(s).label?(a(),b(ye,{key:0,class:"VPNavBarTranslations",icon:We,label:c(t).langMenuLabel||"Change language"},{default:v(()=>[r("div",cs,[r("p",ls,w(c(s).label),1),(a(!0),i(I,null,B(c(n),d=>(a(),b(le,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}});const rs=p(is,[["__scopeId","data-v-bb3d9832"]]);const us={},ds={class:"VPSwitch",type:"button",role:"switch"},_s={class:"check"},vs={key:0,class:"icon"};function hs(e,t){return a(),i("button",ds,[r("span",_s,[e.$slots.default?(a(),i("span",vs,[u(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const fs=p(us,[["render",hs],["__scopeId","data-v-0832a754"]]),ps={},ms={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},gs=ut('',9),bs=[gs];function ys(e,t){return a(),i("svg",ms,bs)}const ks=p(ps,[["render",ys]]),$s={},Ps={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ws=r("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Vs=[ws];function xs(e,t){return a(),i("svg",Ps,Vs)}const Ss=p($s,[["render",xs]]),Ls={title:"toggle dark mode"},Ms=g({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=V(),s=x(!1),o=typeof localStorage<"u"?l():()=>{};G(()=>{s.value=document.documentElement.classList.contains("dark")});function l(){const d=window.matchMedia("(prefers-color-scheme: dark)"),h=document.documentElement.classList;let _=localStorage.getItem(Ie),k=t.value.appearance==="dark"&&_==null||(_==="auto"||_==null?d.matches:_==="dark");d.onchange=P=>{_==="auto"&&L(k=P.matches)};function $(){L(k=!k),_=k?d.matches?"auto":"dark":d.matches?"light":"auto",localStorage.setItem(Ie,_)}function L(P){const S=document.createElement("style");S.type="text/css",S.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; +}`)),document.head.appendChild(S),s.value=P,h[P?"add":"remove"]("dark"),window.getComputedStyle(S).opacity,document.head.removeChild(S)}return $}return q(s,d=>{n.value=d}),(d,h)=>(a(),i("label",Ls,[f(fs,{class:"VPSwitchAppearance","aria-checked":s.value,onClick:c(o)},{default:v(()=>[f(ks,{class:"sun"}),f(Ss,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const ke=p(Ms,[["__scopeId","data-v-12bb4a49"]]),Is={key:0,class:"VPNavBarAppearance"},Cs=g({__name:"VPNavBarAppearance",setup(e){const{site:t}=V();return(n,s)=>c(t).appearance?(a(),i("div",Is,[f(ke)])):m("",!0)}});const Ts=p(Cs,[["__scopeId","data-v-98566150"]]),Bs={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},Ns=["href","aria-label","innerHTML"],As=g({__name:"VPSocialLink",props:{icon:null,link:null},setup(e){const t=e,n=y(()=>typeof t.icon=="object"?t.icon.svg:Bs[t.icon]);return(s,o)=>(a(),i("a",{class:"VPSocialLink",href:e.link,"aria-label":typeof e.icon=="string"?e.icon:"",target:"_blank",rel:"noopener",innerHTML:c(n)},null,8,Ns))}});const Es=p(As,[["__scopeId","data-v-ac1ebd17"]]),Hs={class:"VPSocialLinks"},Os=g({__name:"VPSocialLinks",props:{links:null},setup(e){return(t,n)=>(a(),i("div",Hs,[(a(!0),i(I,null,B(e.links,({link:s,icon:o})=>(a(),b(Es,{key:s,icon:o,link:s},null,8,["icon","link"]))),128))]))}});const $e=p(Os,[["__scopeId","data-v-5f80acc1"]]),zs=g({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=V();return(n,s)=>c(t).socialLinks?(a(),b($e,{key:0,class:"VPNavBarSocialLinks",links:c(t).socialLinks},null,8,["links"])):m("",!0)}});const Ds=p(zs,[["__scopeId","data-v-164c457f"]]),Fs={key:0,class:"group translations"},Gs={class:"trans-title"},Rs={key:1,class:"group"},Us={class:"item appearance"},js={class:"label"},qs={class:"appearance-action"},Ks={key:2,class:"group"},Ws={class:"item social-links"},Qs=g({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=V(),{localeLinks:s,currentLang:o}=ee({correspondingLink:!0}),l=y(()=>s.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(d,h)=>c(l)?(a(),b(ye,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[c(s).length&&c(o).label?(a(),i("div",Fs,[r("p",Gs,w(c(o).label),1),(a(!0),i(I,null,B(c(s),_=>(a(),b(le,{key:_.link,item:_},null,8,["item"]))),128))])):m("",!0),c(t).appearance?(a(),i("div",Rs,[r("div",Us,[r("p",js,w(c(n).darkModeSwitchLabel||"Appearance"),1),r("div",qs,[f(ke)])])])):m("",!0),c(n).socialLinks?(a(),i("div",Ks,[r("div",Ws,[f($e,{class:"social-links-list",links:c(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}});const Ys=p(Qs,[["__scopeId","data-v-608cba8b"]]),Xs=e=>(E("data-v-5dea55bf"),e=e(),H(),e),Js=["aria-expanded"],Zs=Xs(()=>r("span",{class:"container"},[r("span",{class:"top"}),r("span",{class:"middle"}),r("span",{class:"bottom"})],-1)),eo=[Zs],to=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(a(),i("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=s=>t.$emit("click"))},eo,10,Js))}});const no=p(to,[["__scopeId","data-v-5dea55bf"]]),so=e=>(E("data-v-b1bba9bb"),e=e(),H(),e),oo={class:"container"},ao={class:"title"},co={class:"content"},lo=so(()=>r("div",{class:"curtain"},null,-1)),io={class:"content-body"},ro=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=At(),{hasSidebar:n}=O(),s=y(()=>({"has-sidebar":n.value,fill:t.value>0}));return(o,l)=>(a(),i("div",{class:M(["VPNavBar",c(s)])},[r("div",oo,[r("div",ao,[f(Zt,null,{"nav-bar-title-before":v(()=>[u(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(o.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),r("div",co,[lo,r("div",io,[u(o.$slots,"nav-bar-content-before",{},void 0,!0),f(cn,{class:"search"}),f(Zn,{class:"menu"}),f(rs,{class:"translations"}),f(Ts,{class:"appearance"}),f(Ds,{class:"social-links"}),f(Ys,{class:"extra"}),u(o.$slots,"nav-bar-content-after",{},void 0,!0),f(no,{class:"hamburger",active:e.isScreenOpen,onClick:l[0]||(l[0]=d=>o.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const uo=p(ro,[["__scopeId","data-v-b1bba9bb"]]);function _o(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1),j=[],oe=!1,we=-1,W=void 0,F=void 0,Q=void 0,Qe=function(t){return j.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(t))})},ae=function(t){var n=t||window.event;return Qe(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},vo=function(t){if(Q===void 0){var n=!!t&&t.reserveScrollBarGap===!0,s=window.innerWidth-document.documentElement.clientWidth;if(n&&s>0){var o=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);Q=document.body.style.paddingRight,document.body.style.paddingRight=o+s+"px"}}W===void 0&&(W=document.body.style.overflow,document.body.style.overflow="hidden")},ho=function(){Q!==void 0&&(document.body.style.paddingRight=Q,Q=void 0),W!==void 0&&(document.body.style.overflow=W,W=void 0)},fo=function(){return window.requestAnimationFrame(function(){if(F===void 0){F={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var t=window,n=t.scrollY,s=t.scrollX,o=t.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-s,setTimeout(function(){return window.requestAnimationFrame(function(){var l=o-window.innerHeight;l&&n>=o&&(document.body.style.top=-(n+l))})},300)}})},po=function(){if(F!==void 0){var t=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=F.position,document.body.style.top=F.top,document.body.style.left=F.left,window.scrollTo(n,t),F=void 0}},mo=function(t){return t?t.scrollHeight-t.scrollTop<=t.clientHeight:!1},go=function(t,n){var s=t.targetTouches[0].clientY-we;return Qe(t.target)?!1:n&&n.scrollTop===0&&s>0||mo(n)&&s<0?ae(t):(t.stopPropagation(),!0)},Ye=function(t,n){if(!t){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!j.some(function(o){return o.targetElement===t})){var s={targetElement:t,options:n||{}};j=[].concat(_o(j),[s]),se?fo():vo(n),se&&(t.ontouchstart=function(o){o.targetTouches.length===1&&(we=o.targetTouches[0].clientY)},t.ontouchmove=function(o){o.targetTouches.length===1&&go(o,t)},oe||(document.addEventListener("touchmove",ae,Pe?{passive:!1}:void 0),oe=!0))}},Xe=function(){se&&(j.forEach(function(t){t.targetElement.ontouchstart=null,t.targetElement.ontouchmove=null}),oe&&(document.removeEventListener("touchmove",ae,Pe?{passive:!1}:void 0),oe=!1),we=-1),se?po():ho(),j=[]};const bo=g({__name:"VPNavScreenMenuLink",props:{text:null,link:null},setup(e){const t=fe("close-screen");return(n,s)=>(a(),b(D,{class:"VPNavScreenMenuLink",href:e.link,onClick:c(t)},{default:v(()=>[C(w(e.text),1)]),_:1},8,["href","onClick"]))}});const yo=p(bo,[["__scopeId","data-v-77e33ec4"]]),ko={},$o={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Po=r("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),wo=[Po];function Vo(e,t){return a(),i("svg",$o,wo)}const xo=p(ko,[["render",Vo]]),So=g({__name:"VPNavScreenMenuGroupLink",props:{text:null,link:null},setup(e){const t=fe("close-screen");return(n,s)=>(a(),b(D,{class:"VPNavScreenMenuGroupLink",href:e.link,onClick:c(t)},{default:v(()=>[C(w(e.text),1)]),_:1},8,["href","onClick"]))}});const Je=p(So,[["__scopeId","data-v-ba699804"]]),Lo={class:"VPNavScreenMenuGroupSection"},Mo={key:0,class:"title"},Io=g({__name:"VPNavScreenMenuGroupSection",props:{text:null,items:null},setup(e){return(t,n)=>(a(),i("div",Lo,[e.text?(a(),i("p",Mo,w(e.text),1)):m("",!0),(a(!0),i(I,null,B(e.items,s=>(a(),b(Je,{key:s.text,text:s.text,link:s.link},null,8,["text","link"]))),128))]))}});const Co=p(Io,[["__scopeId","data-v-fdc70419"]]),To=["aria-controls","aria-expanded"],Bo={class:"button-text"},No=["id"],Ao={key:1,class:"group"},Eo=g({__name:"VPNavScreenMenuGroup",props:{text:null,items:null},setup(e){const t=e,n=x(!1),s=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(l,d)=>(a(),i("div",{class:M(["VPNavScreenMenuGroup",{open:n.value}])},[r("button",{class:"button","aria-controls":c(s),"aria-expanded":n.value,onClick:o},[r("span",Bo,w(e.text),1),f(xo,{class:"button-icon"})],8,To),r("div",{id:c(s),class:"items"},[(a(!0),i(I,null,B(e.items,h=>(a(),i(I,{key:h.text},["link"in h?(a(),i("div",{key:h.text,class:"item"},[f(Je,{text:h.text,link:h.link},null,8,["text","link"])])):(a(),i("div",Ao,[f(Co,{text:h.text,items:h.items},null,8,["text","items"])]))],64))),128))],8,No)],2))}});const Ho=p(Eo,[["__scopeId","data-v-ef3d30f9"]]),Oo={key:0,class:"VPNavScreenMenu"},zo=g({__name:"VPNavScreenMenu",setup(e){const{theme:t}=V();return(n,s)=>c(t).nav?(a(),i("nav",Oo,[(a(!0),i(I,null,B(c(t).nav,o=>(a(),i(I,{key:o.text},["link"in o?(a(),b(yo,{key:0,text:o.text,link:o.link},null,8,["text","link"])):(a(),b(Ho,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),Do={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Go=g({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=V();return(s,o)=>c(t).appearance?(a(),i("div",Do,[r("p",Fo,w(c(n).darkModeSwitchLabel||"Appearance"),1),f(ke)])):m("",!0)}});const Ro=p(Go,[["__scopeId","data-v-b557c0fb"]]),Uo={class:"list"},jo=g({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=ee({correspondingLink:!0}),s=x(!1);function o(){s.value=!s.value}return(l,d)=>c(t).length&&c(n).label?(a(),i("div",{key:0,class:M(["VPNavScreenTranslations",{open:s.value}])},[r("button",{class:"title",onClick:o},[f(We,{class:"icon lang"}),C(" "+w(c(n).label)+" ",1),f(Ke,{class:"icon chevron"})]),r("ul",Uo,[(a(!0),i(I,null,B(c(t),h=>(a(),i("li",{key:h.link,class:"item"},[f(D,{class:"link",href:h.link},{default:v(()=>[C(w(h.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}});const qo=p(jo,[["__scopeId","data-v-56996409"]]),Ko=g({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=V();return(n,s)=>c(t).socialLinks?(a(),b($e,{key:0,class:"VPNavScreenSocialLinks",links:c(t).socialLinks},null,8,["links"])):m("",!0)}}),Wo={class:"container"},Qo=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=x(null);function n(){Ye(t.value,{reserveScrollBarGap:!0})}function s(){Xe()}return(o,l)=>(a(),b(he,{name:"fade",onEnter:n,onAfterLeave:s},{default:v(()=>[e.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t},[r("div",Wo,[u(o.$slots,"nav-screen-content-before",{},void 0,!0),f(zo,{class:"menu"}),f(qo,{class:"translations"}),f(Ro,{class:"appearance"}),f(Ko,{class:"social-links"}),u(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}});const Yo=p(Qo,[["__scopeId","data-v-92d935ac"]]),Xo={class:"VPNav"},Jo=g({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:s}=qt();return ne("close-screen",n),(o,l)=>(a(),i("header",Xo,[f(uo,{"is-screen-open":c(t),onToggleScreen:c(s)},{"nav-bar-title-before":v(()=>[u(o.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(o.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(o.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(o.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Yo,{open:c(t)},{"nav-screen-content-before":v(()=>[u(o.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(o.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const Zo=p(Jo,[["__scopeId","data-v-7c10a9e2"]]),ea={},ta={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},na=r("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),sa=r("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),oa=r("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),aa=r("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),ca=[na,sa,oa,aa];function la(e,t){return a(),i("svg",ta,ca)}const ia=p(ea,[["render",la]]);function ra(){const{hasSidebar:e}=O(),t=ue("(min-width: 960px)"),n=ue("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ua=71;function Ve(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function xe(e){const t=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const s=Number(n.tagName[1]);return{title:da(n),link:"#"+n.id,level:s}});return _a(t,e)}function da(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function _a(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[s,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(d=>d.level>=s&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const k=e[_];if(k.level{requestAnimationFrame(l),window.addEventListener("scroll",s)}),dt(()=>{d(location.hash)}),ce(()=>{window.removeEventListener("scroll",s)});function l(){if(!n.value)return;const h=[].slice.call(e.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>h.some(T=>T.hash===S.hash&&S.offsetParent!==null)),k=window.scrollY,$=window.innerHeight,L=document.body.offsetHeight,P=Math.abs(k+$-L)<1;if(_.length&&P){d(_[_.length-1].hash);return}for(let S=0;S<_.length;S++){const T=_[S],N=_[S+1],[A,z]=ha(S,T,N);if(A){d(z);return}}}function d(h){o&&o.classList.remove("active"),h!==null&&(o=e.value.querySelector(`a[href="${decodeURIComponent(h)}"]`));const _=o;_?(_.classList.add("active"),t.value.style.top=_.offsetTop+33+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Oe(e){return e.parentElement.offsetTop-ua}function ha(e,t,n){const s=window.scrollY;return e===0&&s===0?[!0,null]:s{const o=R("VPDocOutlineItem",!0);return a(),i("ul",{class:M(e.root?"root":"nested")},[(a(!0),i(I,null,B(e.headers,({children:l,link:d,title:h})=>(a(),i("li",null,[r("a",{class:"outline-link",href:d,onClick:t},w(h),9,fa),l!=null&&l.length?(a(),b(o,{key:0,headers:l},null,8,["headers"])):m("",!0)]))),256))],2)}}});const Se=p(pa,[["__scopeId","data-v-3e213931"]]),ma={},ga={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ba=r("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ya=[ba];function ka(e,t){return a(),i("svg",ga,ya)}const Le=p(ma,[["render",ka]]),$a=g({__name:"VPLocalNavOutlineDropdown",setup(e){const{frontmatter:t,theme:n}=V(),s=x(!1),o=x(0),l=x();X(()=>{s.value=!1});function d(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-64,0)}function h($){$.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),ze(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const k=pe([]);return X(()=>{k.value=xe(t.value.outline??n.value.outline)}),($,L)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:_t({"--vp-vh":o.value+"px"})},[c(k).length>0?(a(),i("button",{key:0,onClick:d,class:M({open:s.value})},[C(w(c(Ve)(c(n)))+" ",1),f(Le,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},w(c(n).returnToTopLabel||"Return to top"),1)),f(he,{name:"flyout"},{default:v(()=>[s.value?(a(),i("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:h},[r("a",{class:"top-link",href:"#",onClick:_},w(c(n).returnToTopLabel||"Return to top"),1),f(Se,{headers:c(k)},null,8,["headers"])],512)):m("",!0)]),_:1})],4))}});const Pa=p($a,[["__scopeId","data-v-7526cab1"]]),wa={key:0,class:"VPLocalNav"},Va=["aria-expanded"],xa={class:"menu-text"},Sa=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t}=V(),{hasSidebar:n}=O();return(s,o)=>c(n)?(a(),i("div",wa,[r("button",{class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:o[0]||(o[0]=l=>s.$emit("open-menu"))},[f(ia,{class:"menu-icon"}),r("span",xa,w(c(t).sidebarMenuLabel||"Menu"),1)],8,Va),f(Pa)])):m("",!0)}});const La=p(Sa,[["__scopeId","data-v-117fc0fa"]]),Ma=e=>(E("data-v-9a82e1d6"),e=e(),H(),e),Ia=["role","tabindex"],Ca=Ma(()=>r("div",{class:"indicator"},null,-1)),Ta=["onKeydown"],Ba={key:1,class:"items"},Na=g({__name:"VPSidebarItem",props:{item:null,depth:null},setup(e){const t=e,{collapsed:n,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:h,toggle:_}=Dt(y(()=>t.item)),k=y(()=>h.value?"section":"div"),$=y(()=>o.value?"a":"div"),L=y(()=>h.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),S=y(()=>[[`level-${t.depth}`],{collapsible:s.value},{collapsed:n.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function T(A){"key"in A&&A.key!=="Enter"||!t.item.link&&_()}function N(){t.item.link&&_()}return(A,z)=>{const et=R("VPSidebarItem",!0);return a(),b(U(c(k)),{class:M(["VPSidebarItem",c(S)])},{default:v(()=>[e.item.text?(a(),i("div",te({key:0,class:"item",role:c(P)},ht(e.item.items?{click:T,keydown:T}:{},!0),{tabindex:e.item.items&&0}),[Ca,e.item.link?(a(),b(D,{key:0,tag:c($),class:"link",href:e.item.link},{default:v(()=>[(a(),b(U(c(L)),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),b(U(c(L)),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:vt(N,["enter"]),tabindex:"0"},[f(Le,{class:"caret-icon"})],40,Ta)):m("",!0)],16,Ia)):m("",!0),e.item.items&&e.item.items.length?(a(),i("div",Ba,[e.depth<5?(a(!0),i(I,{key:0},B(e.item.items,Me=>(a(),b(et,{key:Me.text,item:Me,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}});const Aa=p(Na,[["__scopeId","data-v-9a82e1d6"]]),Ze=e=>(E("data-v-0640f721"),e=e(),H(),e),Ea=Ze(()=>r("div",{class:"curtain"},null,-1)),Ha={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Oa=Ze(()=>r("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),za=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const t=e,{sidebarGroups:n,hasSidebar:s}=O();let o=x(null);function l(){Ye(o.value,{reserveScrollBarGap:!0})}function d(){Xe()}return ft(async()=>{var h;t.open?(l(),(h=o.value)==null||h.focus()):d()}),(h,_)=>c(s)?(a(),i("aside",{key:0,class:M(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:_[0]||(_[0]=pt(()=>{},["stop"]))},[Ea,r("nav",Ha,[Oa,u(h.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(I,null,B(c(n),k=>(a(),i("div",{key:k.text,class:"group"},[f(Aa,{item:k,depth:0},null,8,["item"])]))),128)),u(h.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}});const Da=p(za,[["__scopeId","data-v-0640f721"]]),Fa={},Ga={class:"VPPage"};function Ra(e,t){const n=R("Content");return a(),i("div",Ga,[u(e.$slots,"page-top"),f(n),u(e.$slots,"page-bottom")])}const Ua=p(Fa,[["render",Ra]]),ja=g({__name:"VPButton",props:{tag:null,size:null,theme:null,text:null,href:null},setup(e){const t=e,n=y(()=>[t.size??"medium",t.theme??"brand"]),s=y(()=>t.href&&De.test(t.href)),o=y(()=>t.tag?t.tag:t.href?"a":"button");return(l,d)=>(a(),b(U(c(o)),{class:M(["VPButton",c(n)]),href:e.href?c(J)(e.href):void 0,target:c(s)?"_blank":void 0,rel:c(s)?"noreferrer":void 0},{default:v(()=>[C(w(e.text),1)]),_:1},8,["class","href","target","rel"]))}});const qa=p(ja,[["__scopeId","data-v-3b59a1dc"]]),Ka=e=>(E("data-v-ef8a39f0"),e=e(),H(),e),Wa={class:"container"},Qa={class:"main"},Ya={key:0,class:"name"},Xa={class:"clip"},Ja={key:1,class:"text"},Za={key:2,class:"tagline"},ec={key:0,class:"actions"},tc={key:0,class:"image"},nc={class:"image-container"},sc=Ka(()=>r("div",{class:"image-bg"},null,-1)),oc=g({__name:"VPHero",props:{name:null,text:null,tagline:null,image:null,actions:null},setup(e){const t=fe("hero-image-slot-exists");return(n,s)=>(a(),i("div",{class:M(["VPHero",{"has-image":e.image||c(t)}])},[r("div",Wa,[r("div",Qa,[u(n.$slots,"home-hero-info",{},()=>[e.name?(a(),i("h1",Ya,[r("span",Xa,w(e.name),1)])):m("",!0),e.text?(a(),i("p",Ja,w(e.text),1)):m("",!0),e.tagline?(a(),i("p",Za,w(e.tagline),1)):m("",!0)],!0),e.actions?(a(),i("div",ec,[(a(!0),i(I,null,B(e.actions,o=>(a(),i("div",{key:o.link,class:"action"},[f(qa,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):m("",!0)]),e.image||c(t)?(a(),i("div",tc,[r("div",nc,[sc,u(n.$slots,"home-hero-image",{},()=>[e.image?(a(),b(ge,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}});const ac=p(oc,[["__scopeId","data-v-ef8a39f0"]]),cc=g({__name:"VPHomeHero",setup(e){const{frontmatter:t}=V();return(n,s)=>c(t).hero?(a(),b(ac,{key:0,class:"VPHomeHero",name:c(t).hero.name,text:c(t).hero.text,tagline:c(t).hero.tagline,image:c(t).hero.image,actions:c(t).hero.actions},{"home-hero-info":v(()=>[u(n.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),lc={},ic={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},rc=r("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),uc=[rc];function dc(e,t){return a(),i("svg",ic,uc)}const _c=p(lc,[["render",dc]]),vc={class:"box"},hc=["innerHTML"],fc=["innerHTML"],pc=["innerHTML"],mc={key:3,class:"link-text"},gc={class:"link-text-value"},bc=g({__name:"VPFeature",props:{icon:null,title:null,details:null,link:null,linkText:null},setup(e){return(t,n)=>(a(),b(D,{class:"VPFeature",href:e.link,"no-icon":!0},{default:v(()=>[r("article",vc,[typeof e.icon=="object"?(a(),b(ge,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:1,class:"icon",innerHTML:e.icon},null,8,hc)):m("",!0),r("h2",{class:"title",innerHTML:e.title},null,8,fc),e.details?(a(),i("p",{key:2,class:"details",innerHTML:e.details},null,8,pc)):m("",!0),e.linkText?(a(),i("div",mc,[r("p",gc,[C(w(e.linkText)+" ",1),f(_c,{class:"link-text-icon"})])])):m("",!0)])]),_:1},8,["href"]))}});const yc=p(bc,[["__scopeId","data-v-13a88a6c"]]),kc={key:0,class:"VPFeatures"},$c={class:"container"},Pc={class:"items"},wc=g({__name:"VPFeatures",props:{features:null},setup(e){const t=e,n=y(()=>{const s=t.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s%2===0)return"grid-4"}else return});return(s,o)=>e.features?(a(),i("div",kc,[r("div",$c,[r("div",Pc,[(a(!0),i(I,null,B(e.features,l=>(a(),i("div",{key:l.title,class:M(["item",[c(n)]])},[f(yc,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):m("",!0)}});const Vc=p(wc,[["__scopeId","data-v-84141c71"]]),xc=g({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=V();return(n,s)=>c(t).features?(a(),b(Vc,{key:0,class:"VPHomeFeatures",features:c(t).features},null,8,["features"])):m("",!0)}}),Sc={class:"VPHome"},Lc=g({__name:"VPHome",setup(e){return(t,n)=>{const s=R("Content");return a(),i("div",Sc,[u(t.$slots,"home-hero-before",{},void 0,!0),f(cc,null,{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(t.$slots,"home-hero-after",{},void 0,!0),u(t.$slots,"home-features-before",{},void 0,!0),f(xc),u(t.$slots,"home-features-after",{},void 0,!0),f(s)])}}});const Mc=p(Lc,[["__scopeId","data-v-c3f834ca"]]),Ic=e=>(E("data-v-9bb6ddc9"),e=e(),H(),e),Cc={class:"content"},Tc={class:"outline-title"},Bc={"aria-labelledby":"doc-outline-aria-label"},Nc=Ic(()=>r("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Ac=g({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=V(),s=pe([]);X(()=>{s.value=xe(t.value.outline??n.value.outline)});const o=x(),l=x();return va(o,l),(d,h)=>(a(),i("div",{class:M(["VPDocAsideOutline",{"has-outline":c(s).length>0}]),ref_key:"container",ref:o},[r("div",Cc,[r("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),r("div",Tc,w(c(Ve)(c(n))),1),r("nav",Bc,[Nc,f(Se,{headers:c(s),root:!0},null,8,["headers"])])])],2))}});const Ec=p(Ac,[["__scopeId","data-v-9bb6ddc9"]]),Hc={class:"VPDocAsideCarbonAds"},Oc=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:null},setup(e){const t=mt(()=>gt(()=>import("./ui-custom.5c5b2e5f.js"),["assets/chunks/ui-custom.5c5b2e5f.js","assets/chunks/framework.eb892692.js"]));return(n,s)=>(a(),i("div",Hc,[f(c(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),zc=e=>(E("data-v-6d7b3c46"),e=e(),H(),e),Dc={class:"VPDocAside"},Fc=zc(()=>r("div",{class:"spacer"},null,-1)),Gc=g({__name:"VPDocAside",setup(e){const{theme:t}=V();return(n,s)=>(a(),i("div",Dc,[u(n.$slots,"aside-top",{},void 0,!0),u(n.$slots,"aside-outline-before",{},void 0,!0),f(Ec),u(n.$slots,"aside-outline-after",{},void 0,!0),Fc,u(n.$slots,"aside-ads-before",{},void 0,!0),c(t).carbonAds?(a(),b(Oc,{key:0,"carbon-ads":c(t).carbonAds},null,8,["carbon-ads"])):m("",!0),u(n.$slots,"aside-ads-after",{},void 0,!0),u(n.$slots,"aside-bottom",{},void 0,!0)]))}});const Rc=p(Gc,[["__scopeId","data-v-6d7b3c46"]]);function Uc(){const{theme:e,page:t}=V();return y(()=>{const{text:n="Edit this page",pattern:s=""}=e.value.editLink||{},{relativePath:o}=t.value;let l;return typeof s=="function"?l=s({relativePath:o}):l=s.replace(/:path/g,o),{url:l,text:n}})}function jc(){const{page:e,theme:t,frontmatter:n}=V();return y(()=>{var d,h,_,k;const s=Ue(t.value.sidebar,e.value.relativePath),o=Ot(s),l=o.findIndex($=>K(e.value.relativePath,$.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((d=o[l-1])==null?void 0:d.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((h=o[l-1])==null?void 0:h.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((_=o[l+1])==null?void 0:_.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((k=o[l+1])==null?void 0:k.link)}}})}const qc={},Kc={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Wc=r("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Qc=r("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Yc=[Wc,Qc];function Xc(e,t){return a(),i("svg",Kc,Yc)}const Jc=p(qc,[["render",Xc]]),Zc={class:"VPLastUpdated"},el=["datetime"],tl=g({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:s}=V(),o=y(()=>new Date(n.value.lastUpdated)),l=y(()=>o.value.toISOString()),d=x("");return G(()=>{Y(()=>{d.value=o.value.toLocaleString(s.value)})}),(h,_)=>(a(),i("p",Zc,[C(w(c(t).lastUpdatedText||"Last updated")+": ",1),r("time",{datetime:c(l)},w(d.value),9,el)]))}});const nl=p(tl,[["__scopeId","data-v-f84fa165"]]),sl={key:0,class:"VPDocFooter"},ol={key:0,class:"edit-info"},al={key:0,class:"edit-link"},cl={key:1,class:"last-updated"},ll={key:1,class:"prev-next"},il={class:"pager"},rl=["href"],ul=["innerHTML"],dl=["innerHTML"],_l=["href"],vl=["innerHTML"],hl=["innerHTML"],fl=g({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:s}=V(),o=Uc(),l=jc(),d=y(()=>t.value.editLink&&s.value.editLink!==!1),h=y(()=>n.value.lastUpdated&&s.value.lastUpdated!==!1),_=y(()=>d.value||h.value||l.value.prev||l.value.next);return(k,$)=>{var L,P,S,T,N,A,z;return c(_)?(a(),i("footer",sl,[u(k.$slots,"doc-footer-before",{},void 0,!0),c(d)||c(h)?(a(),i("div",ol,[c(d)?(a(),i("div",al,[f(D,{class:"edit-link-button",href:c(o).url,"no-icon":!0},{default:v(()=>[f(Jc,{class:"edit-link-icon","aria-label":"edit icon"}),C(" "+w(c(o).text),1)]),_:1},8,["href"])])):m("",!0),c(h)?(a(),i("div",cl,[f(nl)])):m("",!0)])):m("",!0),(L=c(l).prev)!=null&&L.link||(P=c(l).next)!=null&&P.link?(a(),i("div",ll,[r("div",il,[(S=c(l).prev)!=null&&S.link?(a(),i("a",{key:0,class:"pager-link prev",href:c(J)(c(l).prev.link)},[r("span",{class:"desc",innerHTML:((T=c(t).docFooter)==null?void 0:T.prev)||"Previous page"},null,8,ul),r("span",{class:"title",innerHTML:c(l).prev.text},null,8,dl)],8,rl)):m("",!0)]),r("div",{class:M(["pager",{"has-prev":(N=c(l).prev)==null?void 0:N.link}])},[(A=c(l).next)!=null&&A.link?(a(),i("a",{key:0,class:"pager-link next",href:c(J)(c(l).next.link)},[r("span",{class:"desc",innerHTML:((z=c(t).docFooter)==null?void 0:z.next)||"Next page"},null,8,vl),r("span",{class:"title",innerHTML:c(l).next.text},null,8,hl)],8,_l)):m("",!0)],2)])):m("",!0)])):m("",!0)}}});const pl=p(fl,[["__scopeId","data-v-10d8714f"]]),ml={key:0,class:"VPDocOutlineDropdown"},gl={key:0,class:"items"},bl=g({__name:"VPDocOutlineDropdown",setup(e){const{frontmatter:t,theme:n}=V(),s=x(!1);X(()=>{s.value=!1});const o=pe([]);return X(()=>{o.value=xe(t.value.outline??n.value.outline)}),(l,d)=>c(o).length>0?(a(),i("div",ml,[r("button",{onClick:d[0]||(d[0]=h=>s.value=!s.value),class:M({open:s.value})},[C(w(c(Ve)(c(n)))+" ",1),f(Le,{class:"icon"})],2),s.value?(a(),i("div",gl,[f(Se,{headers:c(o)},null,8,["headers"])])):m("",!0)])):m("",!0)}});const yl=p(bl,[["__scopeId","data-v-c8bfe2f9"]]),kl=e=>(E("data-v-39b3cdb2"),e=e(),H(),e),$l={class:"container"},Pl=kl(()=>r("div",{class:"aside-curtain"},null,-1)),wl={class:"aside-container"},Vl={class:"aside-content"},xl={class:"content"},Sl={class:"content-container"},Ll={class:"main"},Ml=g({__name:"VPDoc",setup(e){const t=Z(),{hasSidebar:n,hasAside:s,leftAside:o}=O(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,h)=>{const _=R("Content");return a(),i("div",{class:M(["VPDoc",{"has-sidebar":c(n),"has-aside":c(s)}])},[u(d.$slots,"doc-top",{},void 0,!0),r("div",$l,[c(s)?(a(),i("div",{key:0,class:M(["aside",{"left-aside":c(o)}])},[Pl,r("div",wl,[r("div",Vl,[f(Rc,null,{"aside-top":v(()=>[u(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),r("div",xl,[r("div",Sl,[u(d.$slots,"doc-before",{},void 0,!0),f(yl),r("main",Ll,[f(_,{class:M(["vp-doc",c(l)])},null,8,["class"])]),f(pl,null,{"doc-footer-before":v(()=>[u(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(d.$slots,"doc-after",{},void 0,!0)])])]),u(d.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Il=p(Ml,[["__scopeId","data-v-39b3cdb2"]]),ie=e=>(E("data-v-6163eb66"),e=e(),H(),e),Cl={class:"NotFound"},Tl=ie(()=>r("p",{class:"code"},"404",-1)),Bl=ie(()=>r("h1",{class:"title"},"PAGE NOT FOUND",-1)),Nl=ie(()=>r("div",{class:"divider"},null,-1)),Al=ie(()=>r("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),El={class:"action"},Hl=["href"],Ol=g({__name:"NotFound",setup(e){const{site:t}=V(),{localeLinks:n}=ee({removeCurrent:!1}),s=x("/");return G(()=>{var l;const o=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(s.value=((l=n.value.find(({link:d})=>d.startsWith(o)))==null?void 0:l.link)||n.value[0].link)}),(o,l)=>(a(),i("div",Cl,[Tl,Bl,Nl,Al,r("div",El,[r("a",{class:"link",href:c(ve)(s.value),"aria-label":"go to home"}," Take me home ",8,Hl)])]))}});const zl=p(Ol,[["__scopeId","data-v-6163eb66"]]),Dl=g({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=V(),{hasSidebar:s}=O();return(o,l)=>(a(),i("div",{class:M(["VPContent",{"has-sidebar":c(s),"is-home":c(n).layout==="home"}]),id:"VPContent"},[c(t).isNotFound?u(o.$slots,"not-found",{key:0},()=>[f(zl)],!0):c(n).layout==="page"?(a(),b(Ua,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):c(n).layout==="home"?(a(),b(Mc,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),b(Il,{key:3},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Fl=p(Dl,[["__scopeId","data-v-9d78bab4"]]),Gl={class:"container"},Rl=["innerHTML"],Ul=["innerHTML"],jl=g({__name:"VPFooter",setup(e){const{theme:t}=V(),{hasSidebar:n}=O();return(s,o)=>c(t).footer?(a(),i("footer",{key:0,class:M(["VPFooter",{"has-sidebar":c(n)}])},[r("div",Gl,[c(t).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:c(t).footer.message},null,8,Rl)):m("",!0),c(t).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:c(t).footer.copyright},null,8,Ul)):m("",!0)])],2)):m("",!0)}});const ql=p(jl,[["__scopeId","data-v-c7eeb802"]]),Kl={key:0,class:"Layout"},Wl=g({__name:"Layout",setup(e){const{isOpen:t,open:n,close:s}=O(),o=Z();q(()=>o.path,s),zt(t,s),ne("close-sidebar",s),ne("is-sidebar-open",t);const{frontmatter:l}=V(),d=bt(),h=y(()=>!!d["home-hero-image"]);return ne("hero-image-slot-exists",h),(_,k)=>{const $=R("Content");return c(l).layout!==!1?(a(),i("div",Kl,[u(_.$slots,"layout-top",{},void 0,!0),f(Gt),f(jt,{class:"backdrop",show:c(t),onClick:c(s)},null,8,["show","onClick"]),f(Zo,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(La,{open:c(t),onOpenMenu:c(n)},null,8,["open","onOpenMenu"]),f(Da,{open:c(t)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Fl,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(ql),u(_.$slots,"layout-bottom",{},void 0,!0)])):(a(),b($,{key:1}))}}});const Ql=p(Wl,[["__scopeId","data-v-1d113308"]]);const Xl={Layout:Ql,enhanceApp:({app:e})=>{e.component("Badge",kt)}};export{ra as a,Xl as t,V as u}; diff --git a/docs/v2/.vitepress/dist/assets/chunks/ui-custom.5c5b2e5f.js b/docs/v2/.vitepress/dist/assets/chunks/ui-custom.5c5b2e5f.js new file mode 100644 index 0000000..ee8799a --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/chunks/ui-custom.5c5b2e5f.js @@ -0,0 +1 @@ +import{u as l,a as _}from"./theme.683fbe81.js";import{d as p,f as u,w as c,h as f,o as m,c as b,_ as v}from"./framework.eb892692.js";const A=p({__name:"VPCarbonAds",props:{carbonAds:null},setup(r){const d=r,{page:i}=l(),a=d.carbonAds,{isAsideEnabled:s}=_(),o=u();let n=!1;function t(){if(!n){n=!0;const e=document.createElement("script");e.id="_carbonads_js",e.src=`//cdn.carbonads.com/carbon.js?serve=${a.code}&placement=${a.placement}`,e.async=!0,o.value.appendChild(e)}}return c(()=>i.value.relativePath,()=>{var e;n&&s.value&&((e=window._carbonads)==null||e.refresh())}),a&&f(()=>{s.value?t():c(s,e=>e&&t())}),(e,h)=>(m(),b("div",{class:"VPCarbonAds",ref_key:"container",ref:o},null,512))}});const w=v(A,[["__scopeId","data-v-6e6a73ad"]]);export{w as default}; diff --git a/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.js b/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.js new file mode 100644 index 0000000..61d4560 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.eb892692.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"UAParser.js","text":"Documentation Reference","tagline":"Detect Browser, OS, CPU, & Device with JavaScript","actions":[{"text":"Introduction","link":"/intro/why-ua-parser-js"},{"theme":"alt","text":"API Reference","link":"/api/ua-parser-js/overview"}]}},"headers":[],"relativePath":"index.md","lastUpdated":1681052658000}'),r={name:"index.md"};function n(o,s,i,c,p,d){return a(),t("div")}const _=e(r,[["render",n]]);export{m as __pageData,_ as default}; diff --git a/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.lean.js b/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.lean.js new file mode 100644 index 0000000..61d4560 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/index.md.9cfed7b9.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.eb892692.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"UAParser.js","text":"Documentation Reference","tagline":"Detect Browser, OS, CPU, & Device with JavaScript","actions":[{"text":"Introduction","link":"/intro/why-ua-parser-js"},{"theme":"alt","text":"API Reference","link":"/api/ua-parser-js/overview"}]}},"headers":[],"relativePath":"index.md","lastUpdated":1681052658000}'),r={name:"index.md"};function n(o,s,i,c,p,d){return a(),t("div")}const _=e(r,[["render",n]]);export{m as __pageData,_ as default}; diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 new file mode 100644 index 0000000..2a68729 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 new file mode 100644 index 0000000..f640351 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-greek-ext.4fbe9427.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-greek-ext.4fbe9427.woff2 new file mode 100644 index 0000000..0021896 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-greek-ext.4fbe9427.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-greek.8f4463c4.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-greek.8f4463c4.woff2 new file mode 100644 index 0000000..71c265f Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-greek.8f4463c4.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 new file mode 100644 index 0000000..9c1b944 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 new file mode 100644 index 0000000..01fcf20 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 b/docs/v2/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 new file mode 100644 index 0000000..e4f788e Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 new file mode 100644 index 0000000..28593cc Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 new file mode 100644 index 0000000..a20adc1 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-greek-ext.ab0619bc.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-greek-ext.ab0619bc.woff2 new file mode 100644 index 0000000..e3b0be7 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-greek-ext.ab0619bc.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 new file mode 100644 index 0000000..f790e04 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 new file mode 100644 index 0000000..715bd90 Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-latin.2ed14f66.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-latin.2ed14f66.woff2 new file mode 100644 index 0000000..a540b7a Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-latin.2ed14f66.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 b/docs/v2/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 new file mode 100644 index 0000000..5a9f9cb Binary files /dev/null and b/docs/v2/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 differ diff --git a/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.js b/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.js new file mode 100644 index 0000000..bb418f4 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.js @@ -0,0 +1,33 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const i=JSON.parse('{"title":"Extending Regex","description":"","frontmatter":{},"headers":[],"relativePath":"intro/extending-regex.md","lastUpdated":null}'),p={name:"intro/extending-regex.md"},o=l(`

Extending Regex ​

Write Your Own Extension ​

If you want to detect something that's not currently provided by UAParser.js (eg: bots, specific apps, etc), you can pass a list of regexes to extends internal UAParser.js regexes with your own.

  • UAParser([uastring:string,] extensions:object [,headers:object])
js
// Example:
+const myOwnListOfBrowsers = [
+    [/(mybrowser)\\/([\\w\\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']]
+];
+
+const myUA = 'Mozilla/5.0 MyBrowser/1.3';
+
+const myParser = new UAParser({ browser: myOwnListOfBrowsers });
+
+console.log(myParser.setUA(myUA).getBrowser());  // {name: "MyBrowser", version: "1.3", major: "1", type : "bot"}
+console.log(myParser.getBrowser().is('bot'));    // true
js
// Another example:
+const myOwnListOfDevices = [
+    [/(mytab) ([\\w ]+)/i], [UAParser.DEVICE.VENDOR, UAParser.DEVICE.MODEL, [UAParser.DEVICE.TYPE, UAParser.DEVICE.TABLET]],
+    [/(myphone)/i], [UAParser.DEVICE.VENDOR, [UAParser.DEVICE.TYPE, UAParser.DEVICE.MOBILE]]
+];
+
+const myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max';
+
+const myParser2 = new UAParser({
+    browser: myOwnListOfBrowsers,
+    device: myOwnListOfDevices
+});
+
+console.log(myParser2.setUA(myUA2).getDevice());  // {vendor: "MyTab", model: "14 Pro Max", type: "tablet"}

INFO

When custom regexes passed into UAParser constructor, they will be ordered before internal regexes, thus when the parser runs they will get checked first.

Use Predefined Extensions Submodule ​

Some basic extensions (although not very complete at the moment) can also be found under ua-parser-js/extensions↗ submodule.

js
// Usage example
+import { UAParser } from 'ua-parser-js';
+import { Emails } from 'ua-parser-js/extensions';
+
+const ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
+const browser = new UAParser(Emails)
+                    .setUA(ua)
+                    .getBrowser();
+
+console.log(browser.toString()); // Thunderbird 78.13.0
`,10),e=[o];function r(t,c,D,y,A,F){return a(),n("div",null,e)}const u=s(p,[["render",r]]);export{i as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.lean.js b/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.lean.js new file mode 100644 index 0000000..b4aa759 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_extending-regex.md.83598a7d.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const i=JSON.parse('{"title":"Extending Regex","description":"","frontmatter":{},"headers":[],"relativePath":"intro/extending-regex.md","lastUpdated":null}'),p={name:"intro/extending-regex.md"},o=l("",10),e=[o];function r(t,c,D,y,A,F){return a(),n("div",null,e)}const u=s(p,[["render",r]]);export{i as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.js new file mode 100644 index 0000000..4ac8d00 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,N as s}from"./chunks/framework.eb892692.js";const k=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/quick-start.md","lastUpdated":null}'),e={name:"intro/quick-start/quick-start.md"},i=s('

Quick Start ​

Choose your fighter development strategy:

',3),o=[i];function c(u,l,n,d,_,p){return r(),a("div",null,o)}const m=t(e,[["render",c]]);export{k as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.lean.js new file mode 100644 index 0000000..679042c --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_quick-start.md.3fcc54ad.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,N as s}from"./chunks/framework.eb892692.js";const k=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/quick-start.md","lastUpdated":null}'),e={name:"intro/quick-start/quick-start.md"},i=s("",3),o=[i];function c(u,l,n,d,_,p){return r(),a("div",null,o)}const m=t(e,[["render",c]]);export{k as __pageData,m as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.js new file mode 100644 index 0000000..196bbc1 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.js @@ -0,0 +1,8 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"Using ES Modules","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-es-modules.md","lastUpdated":null}'),o={name:"intro/quick-start/using-es-modules.md"},e=l(`

Using ES Modules ​

sh
$ npm install ua-parser-js

Code Example ​

js
import { UAParser } from 'ua-parser-js';
+
+const { browser, cpu, device } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
+
+console.log(browser.name);          // Maemo Browser
+console.log(cpu.is('arm'));         // true
+console.log(device.is('mobile'));   // true
+console.log(device.model);          // N900
`,4),p=[e];function r(t,c,D,i,y,A){return n(),a("div",null,p)}const d=s(o,[["render",r]]);export{F as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.lean.js new file mode 100644 index 0000000..038778f --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-es-modules.md.add772ad.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"Using ES Modules","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-es-modules.md","lastUpdated":null}'),o={name:"intro/quick-start/using-es-modules.md"},e=l("",4),p=[e];function r(t,c,D,i,y,A){return n(),a("div",null,p)}const d=s(o,[["render",r]]);export{F as __pageData,d as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.js new file mode 100644 index 0000000..f96a323 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.js @@ -0,0 +1,67 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const u=JSON.parse('{"title":"Using HTML","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-html.md","lastUpdated":null}'),p={name:"intro/quick-start/using-html.md"},o=l(`

Using HTML ​


Code Example ​

html
<!doctype html>
+<html>
+<head>
+<script src="ua-parser.min.js"></script>
+<script>
+
+    var uap = new UAParser();
+    console.log(uap.getResult());
+    /*
+        /// This will print an object structured like this:
+        {
+            ua: "",
+            browser: {
+                name: "",
+                version: "",
+                major: ""
+            },
+            engine: {
+                name: "",
+                version: ""
+            },
+            os: {
+                name: "",
+                version: ""
+            },
+            device: {
+                model: "",
+                type: "",
+                vendor: ""
+            },
+            cpu: {
+                architecture: ""
+            }
+        }
+    */
+    // Default result depends on current window.navigator.userAgent value
+
+    // Now let's try a custom user-agent string as an example
+    var uastring1 = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
+    uap.setUA(uastring1);
+    var result = uap.getResult();
+    // You can also use UAParser constructor directly without having to create an instance:
+    // var ua = UAParser(uastring1);
+
+    console.log(result.browser);        // {name: "Chromium", version: "15.0.874.106"}
+    console.log(result.device);         // {model: undefined, type: undefined, vendor: undefined}
+    console.log(result.os);             // {name: "Ubuntu", version: "11.10"}
+    console.log(result.os.version);     // "11.10"
+    console.log(result.engine.name);    // "WebKit"
+    console.log(result.cpu.architecture);   // "amd64"
+
+    // Do some other tests
+    var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
+    console.log(uap.setUA(uastring2).getBrowser().name); // "Konqueror"
+    console.log(uap.getOS());                            // {name: "OpenBSD", version: undefined}
+    console.log(uap.getEngine());                        // {name: "KHTML", version: "4.1.4"}
+
+    var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
+    console.log(uap.setUA(uastring3).getDevice().model); // "PlayBook"
+    console.log(uap.getOS())                             // {name: "RIM Tablet OS", version: "1.0.0"}
+    console.log(uap.getBrowser().name);                  // "Safari"
+
+</script>
+</head>
+<body>
+</body>
+</html>
`,5),e=[o];function t(r,c,i,y,D,F){return a(),n("div",null,e)}const C=s(p,[["render",t]]);export{u as __pageData,C as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.lean.js new file mode 100644 index 0000000..03e7e52 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-html.md.c26425e5.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const u=JSON.parse('{"title":"Using HTML","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-html.md","lastUpdated":null}'),p={name:"intro/quick-start/using-html.md"},o=l("",5),e=[o];function t(r,c,i,y,D,F){return a(),n("div",null,e)}const C=s(p,[["render",t]]);export{u as __pageData,C as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.js new file mode 100644 index 0000000..c46e263 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.js @@ -0,0 +1,27 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"Using jQuery/Zepto ($.ua)","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-jquery.md","lastUpdated":null}'),o={name:"intro/quick-start/using-jquery.md"},p=l(`

Using jQuery/Zepto ($.ua) ​

Although written in vanilla js, this library will automatically detect if jQuery/Zepto is present and create $.ua object (with values based on its User-Agent) along with window.UAParser constructor. To get/set user-agent you can use:

$.ua.get():string ​

Get user-agent string

$.ua.set(ua:string) ​

Set user-agent string

Code Example ​

js
// Say we are in a browser which has default user-agent: 
+// "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
+
+// Get the details
+console.log($.ua.device);           // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"}
+console.log($.ua.os);               // {name: "Android", version: "2.3.4"}
+console.log($.ua.os.name);          // "Android"
+console.log($.ua.get());            // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
+
+// Now lets try to reset to another custom user-agent
+$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13');
+
+// Test again
+console.log($.ua.browser.name);     // "Safari"
+console.log($.ua.engine.name);      // "Webkit"
+console.log($.ua.device);           // {vendor: "Motorola", model: "Xoom", type: "tablet"}
+console.log($.ua.browser.version);  // "4.0"
+console.log($.ua.browser.major);    // "4"
+
+// Add class to <body> tag
+// <body class="ua-browser-safari ua-devicetype-tablet">
+$('body')
+    .addClass(
+        'ua-browser-' + 
+        $.ua.browser.name + 
+        ' ua-devicetype-' + 
+        $.ua.device.type);
`,8),e=[p];function t(r,c,y,i,D,A){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{F as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.lean.js new file mode 100644 index 0000000..7f79378 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-jquery.md.a8bfabfc.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const F=JSON.parse('{"title":"Using jQuery/Zepto ($.ua)","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-jquery.md","lastUpdated":null}'),o={name:"intro/quick-start/using-jquery.md"},p=l("",8),e=[p];function t(r,c,y,i,D,A){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{F as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.js new file mode 100644 index 0000000..8e2c197 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.js @@ -0,0 +1,25 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const A=JSON.parse('{"title":"Using Node.js","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-node-js.md","lastUpdated":null}'),p={name:"intro/quick-start/using-node-js.md"},e=l(`

Using Node.js ​

sh
$ npm install ua-parser-js

Code Example ​

js
var http = require('http');
+var uap = require('ua-parser-js');
+
+http.createServer(function (req, res) {
+    // get user-agent header
+    var ua = uap(req.headers['user-agent']);
+
+    /* // BEGIN since@2.0 - you can also pass client-hints data to UAParser
+
+    // note: only works in secure context (https:// or localhost or file://)
+
+    var getHighEntropyValues = 'Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Bitness';
+    res.setHeader('Accept-CH', getHighEntropyValues);
+    res.setHeader('Critical-CH', getHighEntropyValues);
+    
+    var ua = uap(req.headers).withClientHints();
+
+    // END since@2.0 */
+
+    // write the result as response
+    res.end(JSON.stringify(ua, null, '  '));
+})
+.listen(1337, '127.0.0.1');
+
+console.log('Server running at http://127.0.0.1:1337/');
`,4),o=[e];function r(t,c,i,y,D,F){return a(),n("div",null,o)}const u=s(p,[["render",r]]);export{A as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.lean.js new file mode 100644 index 0000000..a0dd4b4 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-node-js.md.d0e3ffe9.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const A=JSON.parse('{"title":"Using Node.js","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-node-js.md","lastUpdated":null}'),p={name:"intro/quick-start/using-node-js.md"},e=l("",4),o=[e];function r(t,c,i,y,D,F){return a(),n("div",null,o)}const u=s(p,[["render",r]]);export{A as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.js new file mode 100644 index 0000000..ad7db1c --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.js @@ -0,0 +1,9 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"Using TypeScript","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-typescript.md","lastUpdated":null}'),l={name:"intro/quick-start/using-typescript.md"},p=e(`

Using TypeScript ​

sh
$ npm install --save ua-parser-js
+# Install ua-parser-js
+
+$ npm install --save-dev @types/ua-parser-js
+# Download type definition from DefinitelyTyped repository
+# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js

Code Example ​

js
import { UAParser } from 'ua-parser-js'; 
+
+const parser = new UAParser();
+console.log(parser.getResult());
`,4),o=[p];function t(r,c,i,y,D,C){return n(),a("div",null,o)}const u=s(l,[["render",t]]);export{d as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.lean.js b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.lean.js new file mode 100644 index 0000000..3703294 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_quick-start_using-typescript.md.c1578797.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as n,N as e}from"./chunks/framework.eb892692.js";const d=JSON.parse('{"title":"Using TypeScript","description":"","frontmatter":{},"headers":[],"relativePath":"intro/quick-start/using-typescript.md","lastUpdated":null}'),l={name:"intro/quick-start/using-typescript.md"},p=e("",4),o=[p];function t(r,c,i,y,D,C){return n(),a("div",null,o)}const u=s(l,[["render",t]]);export{d as __pageData,u as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.js b/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.js new file mode 100644 index 0000000..311fe3a --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.js @@ -0,0 +1,25 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"Why UAParser.js","description":"","frontmatter":{},"headers":[],"relativePath":"intro/why-ua-parser-js.md","lastUpdated":null}'),e={name:"intro/why-ua-parser-js.md"},p=l(`

Why UAParser.js ​


This illustration sums up why:

js
// Consider we got this user-agent (yes it's real):
+const ua = \`Mozilla/5.0 (Linux; Android 10; STK-LX1 
+Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, 
+like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile 
+Safari/537.36 musical_ly_2022803040 JsSdk/1.0 
+NetType/WIFI Channel/huaweiadsglobal_int 
+AppName/musical_ly app_version/28.3.4 ByteLocale/en 
+ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 
+AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6\`;
+
+// what???

Worry not:

js
// Just pass it to \`UAParser\`
+const parser = new UAParser(ua);
+
+// And voila!
+console.log(parser.getBrowser());
+// { name : "TikTok", version : "28.3.4", major : "28" }
+
+console.log(parser.getEngine());
+// { name : "Blink", version : "110.0.5481.153" }
+
+console.log(parser.getDevice());
+// { type : "mobile", vendor : "Huawei", model : "STK-LX1" }
+
+console.log(parser.getOS());
+// { name : "Android", version : "10" }
`,6),o=[p];function r(t,c,i,y,u,A){return a(),n("div",null,o)}const F=s(e,[["render",r]]);export{D as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.lean.js b/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.lean.js new file mode 100644 index 0000000..05f5f3e --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/intro_why-ua-parser-js.md.b5f993b6.lean.js @@ -0,0 +1 @@ +import{_ as s,c as n,o as a,N as l}from"./chunks/framework.eb892692.js";const D=JSON.parse('{"title":"Why UAParser.js","description":"","frontmatter":{},"headers":[],"relativePath":"intro/why-ua-parser-js.md","lastUpdated":null}'),e={name:"intro/why-ua-parser-js.md"},p=l("",6),o=[p];function r(t,c,i,y,u,A){return a(),n("div",null,o)}const F=s(e,[["render",r]]);export{D as __pageData,F as default}; diff --git a/docs/v2/.vitepress/dist/assets/style.57130259.css b/docs/v2/.vitepress/dist/assets/style.57130259.css new file mode 100644 index 0000000..27e1d88 --- /dev/null +++ b/docs/v2/.vitepress/dist/assets/style.57130259.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/ua-parser-js/docs/v2/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/ua-parser-js/docs/v2/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-text-dark-3);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info th{color:var(--vp-custom-block-info-text)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip th{color:var(--vp-custom-block-tip-text)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning th{color:var(--vp-custom-block-warning-text)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger th{color:var(--vp-custom-block-danger-text)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details th{color:var(--vp-custom-block-details-text)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:absolute;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:10;height:1px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-]{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active{display:block}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;user-select:none;opacity:0;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-]{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;left:-65px;display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;width:64px;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-text-dark-3);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-2624088a]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-2624088a],h2 .VPBadge[data-v-2624088a],h3 .VPBadge[data-v-2624088a],h4 .VPBadge[data-v-2624088a],h5 .VPBadge[data-v-2624088a],h6 .VPBadge[data-v-2624088a]{vertical-align:top}h2 .VPBadge[data-v-2624088a]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-2624088a]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-2624088a]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-2624088a]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-2624088a]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-b1e5adb7]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-b1e5adb7]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-b1e5adb7]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-b1e5adb7]{top:14px;left:16px}}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}html:not(.dark) .VPImage.dark[data-v-5666d3c1]{display:none}.dark .VPImage.light[data-v-5666d3c1]{display:none}.title[data-v-4b4b99f1]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}.title[data-v-4b4b99f1]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-4b4b99f1]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-4b4b99f1]{border-bottom-color:var(--vp-c-divider)}}[data-v-4b4b99f1] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.3.3 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"\bb "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:32px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--e33de7f2);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-40bbea7a]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-42f218ec]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-42f218ec],.VPNavBarMenuLink[data-v-42f218ec]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-ec28281a]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-ec28281a]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-ec28281a]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-ec28281a]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-97491713]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-97491713] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-97491713] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-97491713] .group:last-child{padding-bottom:0}.VPMenu[data-v-97491713] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-97491713] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-97491713] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-97491713] .action{padding-left:24px}.VPFlyout[data-v-e4ec5600]{position:relative}.VPFlyout[data-v-e4ec5600]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-e4ec5600]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-e4ec5600]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-e4ec5600]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-e4ec5600]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-e4ec5600],.button[aria-expanded=true]+.menu[data-v-e4ec5600]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-e4ec5600]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-e4ec5600]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-e4ec5600]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-e4ec5600]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-e4ec5600]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-e4ec5600]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-492ea56d]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-492ea56d]{display:flex}}.VPNavBarTranslations[data-v-bb3d9832]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-bb3d9832]{display:flex;align-items:center}}.title[data-v-bb3d9832]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-0832a754]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s}.VPSwitch[data-v-0832a754]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-0832a754]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s}.icon[data-v-0832a754]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-0832a754] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-0832a754] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-12bb4a49]{opacity:1}.moon[data-v-12bb4a49],.dark .sun[data-v-12bb4a49]{opacity:0}.dark .moon[data-v-12bb4a49]{opacity:1}.dark .VPSwitchAppearance[data-v-12bb4a49] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-98566150]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-98566150]{display:flex;align-items:center}}.VPSocialLink[data-v-ac1ebd17]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-ac1ebd17]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-ac1ebd17]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-5f80acc1]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.VPNavBarExtra[data-v-608cba8b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-608cba8b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-608cba8b]{display:none}}.trans-title[data-v-608cba8b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-608cba8b],.item.social-links[data-v-608cba8b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-608cba8b]{min-width:176px}.appearance-action[data-v-608cba8b]{margin-right:-2px}.social-links-list[data-v-608cba8b]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-b1bba9bb]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none}.VPNavBar.has-sidebar[data-v-b1bba9bb]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-b1bba9bb]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-b1bba9bb]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-b1bba9bb]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-b1bba9bb]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container[data-v-b1bba9bb] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-b1bba9bb]{max-width:100%}}.title[data-v-b1bba9bb]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-b1bba9bb]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-b1bba9bb]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-b1bba9bb]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-b1bba9bb]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-b1bba9bb]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-b1bba9bb]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-b1bba9bb],.VPNavBar.fill .content-body[data-v-b1bba9bb]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-b1bba9bb]:before,.menu+.appearance[data-v-b1bba9bb]:before,.menu+.social-links[data-v-b1bba9bb]:before,.translations+.appearance[data-v-b1bba9bb]:before,.appearance+.social-links[data-v-b1bba9bb]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-b1bba9bb]:before,.translations+.appearance[data-v-b1bba9bb]:before{margin-right:16px}.appearance+.social-links[data-v-b1bba9bb]:before{margin-left:16px}.social-links[data-v-b1bba9bb]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-b1bba9bb]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-b1bba9bb]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-b1bba9bb]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-77e33ec4]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-77e33ec4]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-ba699804]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-ba699804]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-fdc70419]{display:block}.title[data-v-fdc70419]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-ef3d30f9]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-ef3d30f9]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-ef3d30f9]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-ef3d30f9]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-ef3d30f9]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-ef3d30f9]{transform:rotate(45deg)}.button[data-v-ef3d30f9]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-ef3d30f9]:hover{color:var(--vp-c-brand)}.button-icon[data-v-ef3d30f9]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-ef3d30f9]:first-child{padding-top:0}.group+.group[data-v-ef3d30f9],.group+.item[data-v-ef3d30f9]{padding-top:4px}.VPNavScreenAppearance[data-v-b557c0fb]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-b557c0fb]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-56996409]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-56996409]{height:auto}.title[data-v-56996409]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-56996409]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-56996409]{margin-right:8px}.icon.chevron[data-v-56996409]{margin-left:4px}.list[data-v-56996409]{padding:4px 0 0 24px}.link[data-v-56996409]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-92d935ac]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-92d935ac],.VPNavScreen.fade-leave-active[data-v-92d935ac]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-92d935ac],.VPNavScreen.fade-leave-active .container[data-v-92d935ac]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-92d935ac],.VPNavScreen.fade-leave-to[data-v-92d935ac]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-92d935ac],.VPNavScreen.fade-leave-to .container[data-v-92d935ac]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-92d935ac]{display:none}}.container[data-v-92d935ac]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-92d935ac],.menu+.appearance[data-v-92d935ac],.translations+.appearance[data-v-92d935ac]{margin-top:24px}.menu+.social-links[data-v-92d935ac]{margin-top:16px}.appearance+.social-links[data-v-92d935ac]{margin-top:16px}.VPNav[data-v-7c10a9e2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7c10a9e2]{position:fixed}}.root[data-v-3e213931]{position:relative;z-index:1}.nested[data-v-3e213931]{padding-left:13px}.outline-link[data-v-3e213931]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-3e213931]:hover,.outline-link.active[data-v-3e213931]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3e213931]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-7526cab1]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-7526cab1]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-7526cab1]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-7526cab1]{color:var(--vp-c-text-1)}.icon[data-v-7526cab1]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-7526cab1] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-7526cab1]{transform:rotate(90deg)}.items[data-v-7526cab1]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-7526cab1]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-7526cab1]{transition:all .2s ease-out}.flyout-leave-active[data-v-7526cab1]{transition:all .15s ease-in}.flyout-enter-from[data-v-7526cab1],.flyout-leave-to[data-v-7526cab1]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-117fc0fa]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-117fc0fa]{display:none}}.menu[data-v-117fc0fa]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-117fc0fa]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-117fc0fa]{padding:0 32px}}.menu-icon[data-v-117fc0fa]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-117fc0fa]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-117fc0fa]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-9a82e1d6]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-9a82e1d6]{padding-bottom:10px}.item[data-v-9a82e1d6]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-9a82e1d6]{cursor:pointer}.indicator[data-v-9a82e1d6]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-9a82e1d6],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-9a82e1d6],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-9a82e1d6],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-9a82e1d6]{background-color:var(--vp-c-brand)}.link[data-v-9a82e1d6]{display:flex;align-items:center;flex-grow:1}.text[data-v-9a82e1d6]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-9a82e1d6]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-9a82e1d6],.VPSidebarItem.level-2 .text[data-v-9a82e1d6],.VPSidebarItem.level-3 .text[data-v-9a82e1d6],.VPSidebarItem.level-4 .text[data-v-9a82e1d6],.VPSidebarItem.level-5 .text[data-v-9a82e1d6]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-9a82e1d6],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-9a82e1d6],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-9a82e1d6],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-9a82e1d6],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-9a82e1d6],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-9a82e1d6]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-9a82e1d6],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-9a82e1d6],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-9a82e1d6],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-9a82e1d6],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-9a82e1d6],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-9a82e1d6]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-9a82e1d6],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-9a82e1d6],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-9a82e1d6],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-9a82e1d6],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-9a82e1d6],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-9a82e1d6]{color:var(--vp-c-brand)}.caret[data-v-9a82e1d6]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s}.item:hover .caret[data-v-9a82e1d6]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-9a82e1d6]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-9a82e1d6]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-9a82e1d6]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-9a82e1d6],.VPSidebarItem.level-2 .items[data-v-9a82e1d6],.VPSidebarItem.level-3 .items[data-v-9a82e1d6],.VPSidebarItem.level-4 .items[data-v-9a82e1d6],.VPSidebarItem.level-5 .items[data-v-9a82e1d6]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-9a82e1d6]{display:none}.VPSidebar[data-v-0640f721]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease}.VPSidebar.open[data-v-0640f721]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-0640f721]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-0640f721]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-0640f721]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-0640f721]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-0640f721]{outline:0}.group+.group[data-v-0640f721]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-0640f721]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-3b59a1dc]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-3b59a1dc]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-3b59a1dc]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-3b59a1dc]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-3b59a1dc]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-3b59a1dc]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-3b59a1dc]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-3b59a1dc]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-3b59a1dc]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-3b59a1dc]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-3b59a1dc]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-3b59a1dc]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-3b59a1dc]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHero[data-v-ef8a39f0]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-ef8a39f0]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-ef8a39f0]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-ef8a39f0]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-ef8a39f0]{flex-direction:row}}.main[data-v-ef8a39f0]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-ef8a39f0]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-ef8a39f0]{text-align:left}}@media (min-width: 960px){.main[data-v-ef8a39f0]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-ef8a39f0]{max-width:592px}}.name[data-v-ef8a39f0],.text[data-v-ef8a39f0]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-ef8a39f0],.VPHero.has-image .text[data-v-ef8a39f0]{margin:0 auto}.name[data-v-ef8a39f0]{color:var(--vp-home-hero-name-color)}.clip[data-v-ef8a39f0]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-ef8a39f0],.text[data-v-ef8a39f0]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-ef8a39f0],.text[data-v-ef8a39f0]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-ef8a39f0],.VPHero.has-image .text[data-v-ef8a39f0]{margin:0}}.tagline[data-v-ef8a39f0]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-ef8a39f0]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-ef8a39f0]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-ef8a39f0]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-ef8a39f0]{margin:0}}.actions[data-v-ef8a39f0]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-ef8a39f0]{justify-content:center}@media (min-width: 640px){.actions[data-v-ef8a39f0]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-ef8a39f0]{justify-content:flex-start}}.action[data-v-ef8a39f0]{flex-shrink:0;padding:6px}.image[data-v-ef8a39f0]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-ef8a39f0]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-ef8a39f0]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-ef8a39f0]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-ef8a39f0]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-ef8a39f0]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-ef8a39f0]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-ef8a39f0]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-ef8a39f0]{width:320px;height:320px}}[data-v-ef8a39f0] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-ef8a39f0] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-ef8a39f0] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-13a88a6c]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-13a88a6c]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-13a88a6c]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-13a88a6c] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-13a88a6c]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-13a88a6c]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-13a88a6c]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-13a88a6c]{padding-top:8px}.link-text-value[data-v-13a88a6c]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-13a88a6c]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-84141c71]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-84141c71]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-84141c71]{padding:0 64px}}.container[data-v-84141c71]{margin:0 auto;max-width:1152px}.items[data-v-84141c71]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-84141c71]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-84141c71],.item.grid-4[data-v-84141c71],.item.grid-6[data-v-84141c71]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-84141c71],.item.grid-4[data-v-84141c71]{width:50%}.item.grid-3[data-v-84141c71],.item.grid-6[data-v-84141c71]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-84141c71]{width:25%}}.VPHome[data-v-c3f834ca]{padding-bottom:96px}.VPHome[data-v-c3f834ca] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-c3f834ca]{padding-bottom:128px}}.VPDocAsideOutline[data-v-9bb6ddc9]{display:none}.VPDocAsideOutline.has-outline[data-v-9bb6ddc9]{display:block}.content[data-v-9bb6ddc9]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-9bb6ddc9]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-9bb6ddc9]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-f84fa165]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-f84fa165]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-10d8714f]{margin-top:64px}.edit-info[data-v-10d8714f]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-10d8714f]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-10d8714f]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-10d8714f]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-10d8714f]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-10d8714f]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-10d8714f]{display:flex}}.pager.has-prev[data-v-10d8714f]{padding-top:8px}@media (min-width: 640px){.pager[data-v-10d8714f]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-10d8714f]{padding-top:0;padding-left:16px}}.pager-link[data-v-10d8714f]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-10d8714f]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-10d8714f]{margin-left:auto;text-align:right}.desc[data-v-10d8714f]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-10d8714f]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-c8bfe2f9]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-c8bfe2f9]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-c8bfe2f9]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-c8bfe2f9]{color:var(--vp-c-text-1)}.icon[data-v-c8bfe2f9]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-c8bfe2f9] .outline-link{font-size:13px}.open>.icon[data-v-c8bfe2f9]{transform:rotate(90deg)}.items[data-v-c8bfe2f9]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-39b3cdb2]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-39b3cdb2]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-39b3cdb2]{display:block}}@media (min-width: 768px){.VPDoc[data-v-39b3cdb2]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-39b3cdb2]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-39b3cdb2]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-39b3cdb2]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-39b3cdb2]{display:flex;justify-content:center}.VPDoc .aside[data-v-39b3cdb2]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-39b3cdb2]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-39b3cdb2]{max-width:1104px}}.container[data-v-39b3cdb2]{margin:0 auto;width:100%}.aside[data-v-39b3cdb2]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-39b3cdb2]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-39b3cdb2]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-39b3cdb2]::-webkit-scrollbar{display:none}.aside-curtain[data-v-39b3cdb2]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-39b3cdb2]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-39b3cdb2]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-39b3cdb2]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-39b3cdb2]{order:1;margin:0;min-width:640px}}.content-container[data-v-39b3cdb2]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-39b3cdb2]{max-width:688px}.NotFound[data-v-6163eb66]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-6163eb66]{padding:96px 32px 168px}}.code[data-v-6163eb66]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-6163eb66]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-6163eb66]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-6163eb66]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-6163eb66]{padding-top:20px}.link[data-v-6163eb66]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-6163eb66]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-9d78bab4]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9d78bab4]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9d78bab4]{margin:0}@media (min-width: 960px){.VPContent[data-v-9d78bab4]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9d78bab4]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9d78bab4]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c7eeb802]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c7eeb802]{display:none}@media (min-width: 768px){.VPFooter[data-v-c7eeb802]{padding:32px}}.container[data-v-c7eeb802]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c7eeb802],.copyright[data-v-c7eeb802]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-c7eeb802]{order:2}.copyright[data-v-c7eeb802]{order:1}.Layout[data-v-1d113308]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-5ce22bb9]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-5ce22bb9]{margin:0 auto;max-width:1152px}.love[data-v-5ce22bb9]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-5ce22bb9]{width:28px;height:28px;fill:currentColor}.message[data-v-5ce22bb9]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-5ce22bb9]{padding-top:32px}.action[data-v-5ce22bb9]{padding-top:40px;text-align:center}.VPTeamPage[data-v-679de4be]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-679de4be]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-679de4be-s],.VPTeamMembers+.VPTeamPageSection[data-v-679de4be-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-679de4be-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-679de4be-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-679de4be-s],.VPTeamMembers+.VPTeamPageSection[data-v-679de4be-s]{margin-top:96px}}.VPTeamMembers[data-v-679de4be-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-679de4be-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-679de4be-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-20db3c9f]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-20db3c9f]{padding:32px}.VPTeamMembersItem.small .data[data-v-20db3c9f]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-20db3c9f]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-20db3c9f]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-20db3c9f]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-20db3c9f]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-20db3c9f]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-20db3c9f]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-20db3c9f]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-20db3c9f]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-20db3c9f]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-20db3c9f]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-20db3c9f]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-20db3c9f]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-20db3c9f]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-20db3c9f]{text-align:center}.avatar[data-v-20db3c9f]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-20db3c9f]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-20db3c9f]{margin:0;font-weight:600}.affiliation[data-v-20db3c9f]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-20db3c9f]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-20db3c9f]:hover{color:var(--vp-c-brand)}.desc[data-v-20db3c9f]{margin:0 auto}.links[data-v-20db3c9f]{display:flex;justify-content:center;height:56px}.sp-link[data-v-20db3c9f]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-20db3c9f]:hover,.sp .sp-link.link[data-v-20db3c9f]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-20db3c9f]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-5692f2f2]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-5692f2f2]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-5692f2f2]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-5692f2f2]{max-width:876px}.VPTeamMembers.medium .container[data-v-5692f2f2]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-5692f2f2]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-5692f2f2]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-5692f2f2]{max-width:760px}.container[data-v-5692f2f2]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPCarbonAds[data-v-6e6a73ad]{display:flex;justify-content:center;align-items:center;padding:24px;border-radius:12px;min-height:256px;text-align:center;line-height:18px;font-size:12px;font-weight:500;background-color:var(--vp-carbon-ads-bg-color)}.VPCarbonAds[data-v-6e6a73ad] img{margin:0 auto;border-radius:6px}.VPCarbonAds[data-v-6e6a73ad] .carbon-text{display:block;margin:0 auto;padding-top:12px;color:var(--vp-carbon-ads-text-color);transition:color .25s}.VPCarbonAds[data-v-6e6a73ad] .carbon-text:hover{color:var(--vp-carbon-ads-hover-text-color)}.VPCarbonAds[data-v-6e6a73ad] .carbon-poweredby{display:block;padding-top:6px;font-size:11px;font-weight:500;color:var(--vp-carbon-ads-poweredby-color);text-transform:uppercase;transition:color .25s}.VPCarbonAds[data-v-6e6a73ad] .carbon-poweredby:hover{color:var(--vp-carbon-ads-hover-poweredby-color)} diff --git a/docs/v2/.vitepress/dist/hashmap.json b/docs/v2/.vitepress/dist/hashmap.json new file mode 100644 index 0000000..aca04d5 --- /dev/null +++ b/docs/v2/.vitepress/dist/hashmap.json @@ -0,0 +1 @@ +{"api_submodules_extensions.md":"af715bdb","api_submodules_enums.md":"67d01874","api_submodules_maps.md":"ae1e54e0","api_ua-parser-js_set-ua.md":"8907efd2","api_ua-parser-js_overview.md":"1d0cad56","api_ua-parser-js_get-ua.md":"0fa9fd7f","api_ua-parser-js_get-browser.md":"f4df1518","intro_quick-start_using-html.md":"c26425e5","intro_quick-start_using-typescript.md":"c1578797","api_ua-parser-js_get-result.md":"f65ecd4a","index.md":"9cfed7b9","api_idata_to-string.md":"20eaa222","api_ua-parser-js_get-cpu.md":"b4ef11dc","intro_quick-start_quick-start.md":"3fcc54ad","intro_quick-start_using-jquery.md":"a8bfabfc","intro_quick-start_using-es-modules.md":"add772ad","api_ua-parser-js_get-os.md":"71bcb7f0","api_ua-parser-js_get-engine.md":"93357cf9","intro_extending-regex.md":"83598a7d","api_idata_with-feature-check.md":"6b15066b","api_idata_is.md":"e021670c","intro_why-ua-parser-js.md":"b5f993b6","api_idata_with-client-hints.md":"ed97926a","api_ua-parser-js_get-device.md":"f2518671","intro_quick-start_using-node-js.md":"d0e3ffe9"} diff --git a/docs/v2/.vitepress/dist/images/illustration.png b/docs/v2/.vitepress/dist/images/illustration.png new file mode 100644 index 0000000..aea390b Binary files /dev/null and b/docs/v2/.vitepress/dist/images/illustration.png differ diff --git a/docs/v2/.vitepress/dist/images/logo.png b/docs/v2/.vitepress/dist/images/logo.png new file mode 100644 index 0000000..275b2ef Binary files /dev/null and b/docs/v2/.vitepress/dist/images/logo.png differ diff --git a/docs/v2/.vitepress/dist/index.html b/docs/v2/.vitepress/dist/index.html new file mode 100644 index 0000000..d0d72cd --- /dev/null +++ b/docs/v2/.vitepress/dist/index.html @@ -0,0 +1,24 @@ + + + + + + UAParser.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content

UAParser.js

Documentation Reference

Detect Browser, OS, CPU, & Device with JavaScript

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/extending-regex.html b/docs/v2/.vitepress/dist/intro/extending-regex.html new file mode 100644 index 0000000..7baee77 --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/extending-regex.html @@ -0,0 +1,56 @@ + + + + + + Extending Regex | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Extending Regex ​

Write Your Own Extension ​

If you want to detect something that's not currently provided by UAParser.js (eg: bots, specific apps, etc), you can pass a list of regexes to extends internal UAParser.js regexes with your own.

  • UAParser([uastring:string,] extensions:object [,headers:object])
js
// Example:
+const myOwnListOfBrowsers = [
+    [/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']]
+];
+
+const myUA = 'Mozilla/5.0 MyBrowser/1.3';
+
+const myParser = new UAParser({ browser: myOwnListOfBrowsers });
+
+console.log(myParser.setUA(myUA).getBrowser());  // {name: "MyBrowser", version: "1.3", major: "1", type : "bot"}
+console.log(myParser.getBrowser().is('bot'));    // true
js
// Another example:
+const myOwnListOfDevices = [
+    [/(mytab) ([\w ]+)/i], [UAParser.DEVICE.VENDOR, UAParser.DEVICE.MODEL, [UAParser.DEVICE.TYPE, UAParser.DEVICE.TABLET]],
+    [/(myphone)/i], [UAParser.DEVICE.VENDOR, [UAParser.DEVICE.TYPE, UAParser.DEVICE.MOBILE]]
+];
+
+const myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max';
+
+const myParser2 = new UAParser({
+    browser: myOwnListOfBrowsers,
+    device: myOwnListOfDevices
+});
+
+console.log(myParser2.setUA(myUA2).getDevice());  // {vendor: "MyTab", model: "14 Pro Max", type: "tablet"}

INFO

When custom regexes passed into UAParser constructor, they will be ordered before internal regexes, thus when the parser runs they will get checked first.

Use Predefined Extensions Submodule ​

Some basic extensions (although not very complete at the moment) can also be found under ua-parser-js/extensions↗ submodule.

js
// Usage example
+import { UAParser } from 'ua-parser-js';
+import { Emails } from 'ua-parser-js/extensions';
+
+const ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
+const browser = new UAParser(Emails)
+                    .setUA(ua)
+                    .getBrowser();
+
+console.log(browser.toString()); // Thunderbird 78.13.0

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/quick-start.html b/docs/v2/.vitepress/dist/intro/quick-start/quick-start.html new file mode 100644 index 0000000..935917f --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/quick-start.html @@ -0,0 +1,24 @@ + + + + + + Quick Start | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/using-es-modules.html b/docs/v2/.vitepress/dist/intro/quick-start/using-es-modules.html new file mode 100644 index 0000000..2b4618e --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/using-es-modules.html @@ -0,0 +1,31 @@ + + + + + + Using ES Modules | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Using ES Modules ​

sh
$ npm install ua-parser-js

Code Example ​

js
import { UAParser } from 'ua-parser-js';
+
+const { browser, cpu, device } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
+
+console.log(browser.name);          // Maemo Browser
+console.log(cpu.is('arm'));         // true
+console.log(device.is('mobile'));   // true
+console.log(device.model);          // N900

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/using-html.html b/docs/v2/.vitepress/dist/intro/quick-start/using-html.html new file mode 100644 index 0000000..30f6fac --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/using-html.html @@ -0,0 +1,90 @@ + + + + + + Using HTML | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Using HTML ​


Code Example ​

html
<!doctype html>
+<html>
+<head>
+<script src="ua-parser.min.js"></script>
+<script>
+
+    var uap = new UAParser();
+    console.log(uap.getResult());
+    /*
+        /// This will print an object structured like this:
+        {
+            ua: "",
+            browser: {
+                name: "",
+                version: "",
+                major: ""
+            },
+            engine: {
+                name: "",
+                version: ""
+            },
+            os: {
+                name: "",
+                version: ""
+            },
+            device: {
+                model: "",
+                type: "",
+                vendor: ""
+            },
+            cpu: {
+                architecture: ""
+            }
+        }
+    */
+    // Default result depends on current window.navigator.userAgent value
+
+    // Now let's try a custom user-agent string as an example
+    var uastring1 = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
+    uap.setUA(uastring1);
+    var result = uap.getResult();
+    // You can also use UAParser constructor directly without having to create an instance:
+    // var ua = UAParser(uastring1);
+
+    console.log(result.browser);        // {name: "Chromium", version: "15.0.874.106"}
+    console.log(result.device);         // {model: undefined, type: undefined, vendor: undefined}
+    console.log(result.os);             // {name: "Ubuntu", version: "11.10"}
+    console.log(result.os.version);     // "11.10"
+    console.log(result.engine.name);    // "WebKit"
+    console.log(result.cpu.architecture);   // "amd64"
+
+    // Do some other tests
+    var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
+    console.log(uap.setUA(uastring2).getBrowser().name); // "Konqueror"
+    console.log(uap.getOS());                            // {name: "OpenBSD", version: undefined}
+    console.log(uap.getEngine());                        // {name: "KHTML", version: "4.1.4"}
+
+    var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
+    console.log(uap.setUA(uastring3).getDevice().model); // "PlayBook"
+    console.log(uap.getOS())                             // {name: "RIM Tablet OS", version: "1.0.0"}
+    console.log(uap.getBrowser().name);                  // "Safari"
+
+</script>
+</head>
+<body>
+</body>
+</html>

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/using-jquery.html b/docs/v2/.vitepress/dist/intro/quick-start/using-jquery.html new file mode 100644 index 0000000..4a1c730 --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/using-jquery.html @@ -0,0 +1,50 @@ + + + + + + Using jQuery/Zepto ($.ua) | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Using jQuery/Zepto ($.ua) ​

Although written in vanilla js, this library will automatically detect if jQuery/Zepto is present and create $.ua object (with values based on its User-Agent) along with window.UAParser constructor. To get/set user-agent you can use:

$.ua.get():string ​

Get user-agent string

$.ua.set(ua:string) ​

Set user-agent string

Code Example ​

js
// Say we are in a browser which has default user-agent: 
+// "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
+
+// Get the details
+console.log($.ua.device);           // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"}
+console.log($.ua.os);               // {name: "Android", version: "2.3.4"}
+console.log($.ua.os.name);          // "Android"
+console.log($.ua.get());            // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
+
+// Now lets try to reset to another custom user-agent
+$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13');
+
+// Test again
+console.log($.ua.browser.name);     // "Safari"
+console.log($.ua.engine.name);      // "Webkit"
+console.log($.ua.device);           // {vendor: "Motorola", model: "Xoom", type: "tablet"}
+console.log($.ua.browser.version);  // "4.0"
+console.log($.ua.browser.major);    // "4"
+
+// Add class to <body> tag
+// <body class="ua-browser-safari ua-devicetype-tablet">
+$('body')
+    .addClass(
+        'ua-browser-' + 
+        $.ua.browser.name + 
+        ' ua-devicetype-' + 
+        $.ua.device.type);

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/using-node-js.html b/docs/v2/.vitepress/dist/intro/quick-start/using-node-js.html new file mode 100644 index 0000000..a9434b2 --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/using-node-js.html @@ -0,0 +1,48 @@ + + + + + + Using Node.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Using Node.js ​

sh
$ npm install ua-parser-js

Code Example ​

js
var http = require('http');
+var uap = require('ua-parser-js');
+
+http.createServer(function (req, res) {
+    // get user-agent header
+    var ua = uap(req.headers['user-agent']);
+
+    /* // BEGIN since@2.0 - you can also pass client-hints data to UAParser
+
+    // note: only works in secure context (https:// or localhost or file://)
+
+    var getHighEntropyValues = 'Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Bitness';
+    res.setHeader('Accept-CH', getHighEntropyValues);
+    res.setHeader('Critical-CH', getHighEntropyValues);
+    
+    var ua = uap(req.headers).withClientHints();
+
+    // END since@2.0 */
+
+    // write the result as response
+    res.end(JSON.stringify(ua, null, '  '));
+})
+.listen(1337, '127.0.0.1');
+
+console.log('Server running at http://127.0.0.1:1337/');

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/quick-start/using-typescript.html b/docs/v2/.vitepress/dist/intro/quick-start/using-typescript.html new file mode 100644 index 0000000..30fe30b --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/quick-start/using-typescript.html @@ -0,0 +1,32 @@ + + + + + + Using TypeScript | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Using TypeScript ​

sh
$ npm install --save ua-parser-js
+# Install ua-parser-js
+
+$ npm install --save-dev @types/ua-parser-js
+# Download type definition from DefinitelyTyped repository
+# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js

Code Example ​

js
import { UAParser } from 'ua-parser-js'; 
+
+const parser = new UAParser();
+console.log(parser.getResult());

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/.vitepress/dist/intro/why-ua-parser-js.html b/docs/v2/.vitepress/dist/intro/why-ua-parser-js.html new file mode 100644 index 0000000..166dc07 --- /dev/null +++ b/docs/v2/.vitepress/dist/intro/why-ua-parser-js.html @@ -0,0 +1,48 @@ + + + + + + Why UAParser.js | Detect Browser, OS, CPU, & Device with JavaScript + + + + + + + + + + + + +
Skip to content
On this page

Why UAParser.js ​


This illustration sums up why:

js
// Consider we got this user-agent (yes it's real):
+const ua = `Mozilla/5.0 (Linux; Android 10; STK-LX1 
+Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, 
+like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile 
+Safari/537.36 musical_ly_2022803040 JsSdk/1.0 
+NetType/WIFI Channel/huaweiadsglobal_int 
+AppName/musical_ly app_version/28.3.4 ByteLocale/en 
+ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 
+AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6`;
+
+// what???

Worry not:

js
// Just pass it to `UAParser`
+const parser = new UAParser(ua);
+
+// And voila!
+console.log(parser.getBrowser());
+// { name : "TikTok", version : "28.3.4", major : "28" }
+
+console.log(parser.getEngine());
+// { name : "Blink", version : "110.0.5481.153" }
+
+console.log(parser.getDevice());
+// { type : "mobile", vendor : "Huawei", model : "STK-LX1" }
+
+console.log(parser.getOS());
+// { name : "Android", version : "10" }

Licensed under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/v2/api/idata/is.md b/docs/v2/api/idata/is.md new file mode 100644 index 0000000..1de7b09 --- /dev/null +++ b/docs/v2/api/idata/is.md @@ -0,0 +1,67 @@ +# is(value:string):boolean + +This method returns `true` if the passed value matches with the value of one of the properties of current object, `false` otherwise. + +::: info +* `device` properties are checked in this particular order: `type`, `model`, `vendor`. +* When checking for browser, any `Browser` suffix will be ignored. +* When checking for OS, any `OS` suffix will be ignored. +* The comparison is case-insensitive, thus `is("firefox") == is("Firefox")`. +::: + +## Code Example + +```js +// is() is just a shorthand comparison +// so that instead of write it using `==` operator like this: + +const ua = UAParser(); +const device = ua.device; +const os = ua.os; + +if (device.type == "mobile" && os.name != "iOS") {} +if (device.type == "smarttv" || device.vendor == "Samsung") {} + +// we can also write the comparison above into as follow: + +if (device.is("mobile") && !os.is("iOS")) {} +if (device.is("SmartTV") || device.is("SaMsUnG")) {} +``` + +```js +// Another examples: + +const uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537'); + +uap.getBrowser().name; // "IEMobile" +uap.getBrowser().is("IEMobile"); // true +uap.getCPU().is("ARM"); // true + +uap.getOS().name; // "Windows Phone" +uap.getOS().is("Windows Phone"); // true + +uap.getDevice(); // { vendor: "Nokia", model: "Lumia 635", type: "mobile" } +uap.getResult().device; // { vendor: "Nokia", model: "Lumia 635", type: "mobile" } + +const device = uap.getDevice(); +device.is("mobile"); // true +device.is("Lumia 635"); // true +device.is("Nokia"); // true +device.is("iPhone"); // false +uap.getResult().device.is("Nokia"); // true +uap.getResult().device.model; // "Lumia 635" + +uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"); + +const browser = uap.getBrowser(); +browser.is("IEMobile"); // false +browser.is("Chrome"); // true + +uap.getResult().browser.is("Edge"); // false +uap.getResult().os.name // "Mac OS" +uap.getResult().os.is("Mac OS"); // true +uap.getResult().os.version; // "10.6.8" + +const engine = uap.getEngine(); +engine.is("Blink"); // true +``` \ No newline at end of file diff --git a/docs/v2/api/idata/to-string.md b/docs/v2/api/idata/to-string.md new file mode 100644 index 0000000..0568ff3 --- /dev/null +++ b/docs/v2/api/idata/to-string.md @@ -0,0 +1,42 @@ +# `toString():string` + +Retrieve full-name values as a string + +::: info +Values will be concatenated following this pattern: +* browser : `name` + `version` +* cpu : `architecture` +* device : `vendor` + `model` +* engine : `name` + `version` +* os : `name` + `version` +::: + +## Code Example + +```js +// Usage examples + +let uap = new UAParser('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537'); + +uap.getDevice(); // { + // vendor: "Nokia", + // model: "Lumia 635", + // type: "mobile" + // } +uap.getDevice().toString(); // "Nokia Lumia 635" + +uap.getResult().os.name; // "Windows Phone" +uap.getResult().os.version; // "8.1" +uap.getResult().os.toString(); // "Windows Phone 8.1" + +uap.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"); +uap.getBrowser().name; // "Chrome" +uap.getBrowser().version; // "28.0.1500.95" +uap.getBrowser().major; // "28" +uap.getBrowser().toString(); // "Chrome 28.0.1500.95" + +let engine = uap.getEngine(); +engine.name; // "Blink" +engine.version; // "28.0.1500.95" +engine.toString(); // "Blink 28.0.1500.95" +``` diff --git a/docs/v2/api/idata/with-client-hints.md b/docs/v2/api/idata/with-client-hints.md new file mode 100644 index 0000000..674d39c --- /dev/null +++ b/docs/v2/api/idata/with-client-hints.md @@ -0,0 +1,74 @@ +# `withClientHints():Promise|Thenable|IData` + +Recently, Chrome limits the information that exposed through user-agent and introduces a new experimental set of data called ["Client Hints"↗](https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API). + +Chrome also sends this client-hints data by default under `Sec-CH-UA-*` HTTP headers in each request, along with the legacy `User-Agent` HTTP header. In server-side development, you can capture this extra information by passing the `req.headers` to `UAParser()` (see examples below). + +In browser-environment, obtaining the client-hints data via JavaScript must be done in an asynchronous way. You can chain the result object from `get*` method with `withClientHints()` to also read the client-hints data from the browser which will return the updated data in a `Promise`. + +::: info +In Node.js or in browser-environment without client-hints support (basically anything that's not Chromium-based), `withClientHints()` will return the updated data as a new object instead of as a `Promise`. +::: + +## Code Example + +### Client-side Example + +```js +(async function () { + const ua = new UAParser(); + + // get browser data from user-agent only : + let browser = ua.getBrowser(); + console.log('Using User-Agent: ', browser); + + // get browser data from client-hints + // (with user-agent as a fallback) : + browser = await ua.getBrowser().withClientHints(); + console.log('Using Client-Hints: ', browser); +})(); +``` +```js +// alternatively without async-await: +const ua = new UAParser(); + +ua.getBrowser().withClientHints().then(function (browser) { + console.log('Using Client-Hints: ', browser); +}); +``` + +### Server-side Example + +```js +// Suppose we got a request having these HTTP headers: +const request = { + headers : { + 'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', + + 'sec-ch-ua-mobile' : '?1', + 'sec-ch-ua-model' : 'Galaxy S3 Marketing', + 'sec-ch-ua-platform' : 'Android' + } +}; + +// parse only "user-agent" header +const result1 = UAParser(request.headers); + +// also use "sec-ch-ua" headers, in addition to "user-agent" +const result2 = UAParser(request.headers).withClientHints(); + +console.log(result1.os.name); // "Linux" +console.log(result1.device.type); // undefined +console.log(result1.device.model); // undefined + +console.log(result2.os.name); // "Android" +console.log(result2.device.type); // "mobile" +console.log(result2.device.model); // "Galaxy S3 Marketing" + +new UAParser(request.headers) + .getBrowser() + .withClientHints() + .then((browser) => { + console.log(browser.toString()); // Chrome 110.0.0.0 +}); +``` \ No newline at end of file diff --git a/docs/v2/api/idata/with-feature-check.md b/docs/v2/api/idata/with-feature-check.md new file mode 100644 index 0000000..4120966 --- /dev/null +++ b/docs/v2/api/idata/with-feature-check.md @@ -0,0 +1,19 @@ +# withFeatureCheck():IData` + +This method allows us to examine other features beyond `navigator.userAgent`. Currently this further improve the detection of the following: + +- browser : + - Brave (check for `navigator.isBrave`) +- device : + - iPad (check for `navigator.standalone` & `navigator.maxTouchPoints`) + +## Code Example + +```js +// suppose this code runs on iPad +const withoutFeatureCheck = UAParser(); +const withFeatureCheck = UAParser().withFeatureCheck(); + +console.log(withoutFeatureCheck.device); // { vendor : "Apple", model : "Macintosh", type : undefined } +console.log(withFeatureCheck.device); // { vendor : "Apple", model : "iPad", type : "tablet" } +``` \ No newline at end of file diff --git a/docs/v2/api/submodules/enums.md b/docs/v2/api/submodules/enums.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/v2/api/submodules/extensions.md b/docs/v2/api/submodules/extensions.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/v2/api/submodules/maps.md b/docs/v2/api/submodules/maps.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/v2/api/ua-parser-js/get-browser.md b/docs/v2/api/ua-parser-js/get-browser.md new file mode 100644 index 0000000..3cd5e46 --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-browser.md @@ -0,0 +1,55 @@ +# getBrowser():IData + +Get browser name, full version, & major version from user-agent string. + +```js +// Result object is structured as follow: +{ name: '', version: '', major: '' } +``` + +## `name:string` + +```sh +# List of possible `browser.name`: +2345Explorer, 360 Browser, Amaya, Android Browser, Arora, +Avant, Avast, AVG, BIDUBrowser, Baidu, Basilisk, Blazer, +Bolt, Brave, Bowser, Camino, Chimera, [Mobile] Chrome +[Headless/WebView], Chromium, Cobalt, Comodo Dragon, +Dillo, Dolphin, Doris, DuckDuckGo, Edge, Electron, +Epiphany, Facebook, Falkon, Fennec, Firebird, [Mobile] +Firefox [Focus/Reality], Flock, Flow, GSA, GoBrowser, +HeyTap, Huawei Browser, ICE Browser, IE, IEMobile, +IceApe, IceCat, IceDragon, Iceweasel, Instagram, Iridium, +Iron, Jasmine, Kakao[Story/Talk], K-Meleon, Kindle, Klar, +Konqueror, LBBROWSER, Line, LinkedIn, Links, Lunascape, +Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr, +Midori, Minimo, Mosaic, Mozilla, NetFront, NetSurf, +Netfront, Netscape, NokiaBrowser, Obigo, Oculus Browser, +OmniWeb, Opera Coast, Opera [Mini/Mobi/Tablet], PaleMoon, +PhantomJS, Phoenix, Polaris, Puffin, QQ, QQBrowser, +QQBrowserLite, Quark, QupZilla, RockMelt, [Mobile] Safari, +Sailfish Browser, Samsung Browser, SeaMonkey, Silk, +Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tesla, +TikTok, Tizen Browser, UCBrowser, UP.Browser, Viera, Vivaldi, +Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, +Whale Browser, ... +``` + +## `version:string` + +Determined dynamically + +## `major:string` + +Major number of `version` following [semver↗](https://semver.org/), eg: if we have version `5.1.21214` the major would be `5`. + + +## Code Example + +```js +const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25' +const parser = new UAParser(operamini); + +console.log(parser.getBrowser()); +// { name : "Opera Mini", version : "5.1.21214", major : "5" } +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/get-cpu.md b/docs/v2/api/ua-parser-js/get-cpu.md new file mode 100644 index 0000000..ac0a8de --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-cpu.md @@ -0,0 +1,30 @@ +# getCPU():IData + +Get type of CPU architecture from user-agent string. + +```js +// Result object is structured as follow: +{ architecture: '' } +``` + +## `architecture:string` + +```sh +# List of possible values for `cpu.architecture` +68k, amd64, arm[64/hf], avr, ia[32/64], irix[64], +mips[64], pa-risc, ppc, sparc[64] +``` + +::: info +Our convention here for 32-bit version of **'x86'** is referred as `ia32`, while its 64-bit extension (also known as **'x86-64'** or simply **'x64'**) is referred as `amd64`. +::: + +## Code Example + +```js +const powerpc = 'Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC Mac OS; en)' +const parser = new UAParser(powerpc); + +console.log(parser.getCPU()); +// { architecture : "ppc" } +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/get-device.md b/docs/v2/api/ua-parser-js/get-device.md new file mode 100644 index 0000000..1573c92 --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-device.md @@ -0,0 +1,47 @@ +# getDevice():IData + +Get details of device information (type, vendor, model) from user-agent string. + +```js +// Result object is structured as follow: +{ type: '', vendor: '', model: '' } +``` + +## `type:string` + +```sh +# List of possible values for `device.type`: +mobile, tablet, smarttv, console, wearable, embedded +``` + +::: info +If you wish to detect desktop devices, you must handle the logic yourself, since `UAParser` only reports info that is directly available from user-agent string. Read more about this issue [here↗](https://github.com/faisalman/ua-parser-js/issues/182) +::: + +## `vendor:string` + +```sh +# List of possible `device.vendor`: +Acer, Alcatel, Amazon, Apple, Archos, ASUS, AT&T, BenQ, +BlackBerry, Dell, Essential, Facebook, Fairphone, GeeksPhone, +Google, HP, HTC, Huawei, Jolla, Kobo, Lenovo, LG, Meizu, +Microsoft, Motorola, Nexian, Nintendo, Nokia, Nvidia, OnePlus, +OPPO, Ouya, Palm, Panasonic, Pebble, Polytron, Realme, RIM, +Roku, Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Tesla, +Vivo, Vodafone, Xbox, Xiaomi, Zebra, ZTE, ... +``` + +## `model:string` + +Determined dynamically + +## Code Example + +```js + +const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36' +const parser = new UAParser(galaxytabs8); + +console.log(parser.getDevice()); +// { type : "tablet", vendor : "Samsung", model : "SM-X706B" } +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/get-engine.md b/docs/v2/api/ua-parser-js/get-engine.md new file mode 100644 index 0000000..0be99d3 --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-engine.md @@ -0,0 +1,31 @@ +# getEngine():IData + +Get layout rendering engine name & version from user-agent string. + +```js +// Result object is structured as follow: +{ name: '', version: '' } +``` + +## `name:string` + +```sh +# List of possible value of `engine.name` +Amaya, Blink, EdgeHTML, Flow, Gecko, Goanna, iCab, +KHTML, LibWeb, Links, Lynx, NetFront, NetSurf, +Presto, Tasman, Trident, w3m, WebKit +``` + +## `version:string` + +Determined dynamically + +## Code Example + +```js +const operamini = 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25' +const parser = new UAParser(operamini); + +console.log(parser.getEngine()); +// { name : "Presto", version : "2.5.25" } +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/get-os.md b/docs/v2/api/ua-parser-js/get-os.md new file mode 100644 index 0000000..e5f1977 --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-os.md @@ -0,0 +1,38 @@ +# getOS():IData + +Get operating system name & version from user-agent string. + +```js +// Result object is structured as follow: +{ name: '', version: '' } +``` + +## `name:string` + +```sh +# List of possible values for `os.name` +AIX, Amiga OS, Android[-x86], Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, +Contiki, Fedora, Firefox OS, FreeBSD, Debian, Deepin, DragonFly, elementary OS, +Fuchsia, Gentoo, GhostBSD, GNU, Haiku, HarmonyOS, HP-UX, Hurd, iOS, Joli, KaiOS, +Linpus, Linspire,Linux, Mac OS, Maemo, Mageia, Mandriva, Manjaro, MeeGo, Minix, +Mint, Morph OS, NetBSD, NetRange, NetTV, Nintendo, OpenBSD, OpenVMS, OS/2, Palm, +PC-BSD, PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS, +RISC OS, Sabayon, Sailfish, SerenityOS, Series40, Slackware, Solaris, SUSE, Symbian, +Tizen, Ubuntu, Unix, VectorLinux, Viera, watchOS, WebOS, Windows [Phone/Mobile], +Zenwalk, ... +``` + +## `version:string` + +Determined dynamically + +## Code Example + +```js + +const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36' +const parser = new UAParser(galaxytabs8); + +console.log(parser.getOS()); +// { name : "Android", version : "12" } +``` diff --git a/docs/v2/api/ua-parser-js/get-result.md b/docs/v2/api/ua-parser-js/get-result.md new file mode 100644 index 0000000..ce29b1f --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-result.md @@ -0,0 +1,90 @@ +# getResult():IData + +Get all information regarding browser, CPU, device, engine, & OS from user-agent string. + +```js +// Result object is structured as follow: +{ + ua: "", + browser: { + name: "", + version: "", + major: "" + }, + cpu: { + architecture: "" + }, + device: { + type: "", + vendor: "", + model: "" + }, + engine: { + name: "", + version: "" + }, + os: { + name: "", + version: "" + } +} +``` + +## `ua:string` + +The user-agent string value of current instance. + +## [`browser:IData`](/api/ua-parser-js/get-browser) + +Object that contains the value of browser name, full version, & major version. + +## [`cpu:IData`](/api/ua-parser-js/get-cpu) + +Object that contains the value of type of CPU architecture. + +## [`device:IData`](/api/ua-parser-js/get-device) + +Object that contains the value of device details: type, vendor, model. + +## [`engine:IData`](/api/ua-parser-js/get-engine) + +Object that contains the value of layout rendering engine name & version. + +## [`os:IData`](/api/ua-parser-js/get-os) + +Object that contains the value of operating system name & version. + +## Code Example + +```js +const galaxytabs8 = 'Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36' +const parser = new UAParser(galaxytabs8); + +console.log(parser.getResult()); +/* +{ + ua: "Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", + browser: { + name: "Chrome", + version: "103.0.5060.53", + major: "103" + }, + cpu: { + architecture: undefined + }, + device: { + type: "mobile", + vendor: "Huawei", + model: "SM-X706B" + }, + engine: { + name: "Blink", + version: "103.0.5060.53" + }, + os: { + name: "Android", + version: "12" + } +} +*/ +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/get-ua.md b/docs/v2/api/ua-parser-js/get-ua.md new file mode 100644 index 0000000..4731729 --- /dev/null +++ b/docs/v2/api/ua-parser-js/get-ua.md @@ -0,0 +1,19 @@ +# getUA():string + +Get user-agent string of current instance + +## Code Example + +```js +// Try to run this code on a browser +const parser = new UAParser(); + +// This will print the user-agent of current browser +console.log(parser.getUA()); + +// Replace the user-agent value +parser.setUA('Mozilla/5.0 MyBrowser/1.0'); + +parser.getUA(); +// "Mozilla/5.0 MyBrowser/1.0" +``` \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/overview.md b/docs/v2/api/ua-parser-js/overview.md new file mode 100644 index 0000000..5e0102a --- /dev/null +++ b/docs/v2/api/ua-parser-js/overview.md @@ -0,0 +1,90 @@ +# UAParser Class Overview + +## Constructor + +### `new UAParser([user-agent:string][,extensions:object][,headers:object]):UAParser` + +When called with the `new` keyword, it will return a new instance of `UAParser`. + +```js +const parser = new UAParser("your user-agent here"); // you need to pass the user-agent for nodejs +console.log(parser); +/* + {} +*/ + +const parserResults = parser.getResult(); +console.log(parserResults); +/* + { + ua : "", + browser : {}, + engine : {}, + os : {}, + device : {}, + cpu : {} + } +*/ +``` + +### `UAParser([user-agent:string][,extensions:object][,headers:object]):IData` + +When called without the `new` keyword, it will directly return the results of `getResult()`: + +```js +const parser = UAParser("your user-agent here"); +console.log(parser); +/* + { + ua : "", + browser : {}, + engine : {}, + os : {}, + device : {}, + cpu : {} + } +*/ +``` + +::: tip +In **browser** environment you don't need to pass the user-agent string, as it should automatically get the string from the current `window.navigator.userAgent`. +::: + +::: tip +In **Node.js** environment, user-agent string must be passed in order for the function to work. Usually you can find it in: `request.headers["user-agent"]`. +::: + +## Methods +The methods are self explanatory, here's a small overview of available methods: + +### [`getBrowser():IData`](/api/ua-parser-js/get-browser) + +returns the browser name, version, and major. + +### [`getCPU():IData`](/api/ua-parser-js/get-cpu) + +returns CPU architectural design name. + +### [`getDevice():IData`](/api/ua-parser-js/get-device) + +returns the device model, type, vendor. + +### [`getEngine():IData`](/api/ua-parser-js/get-engine) + +returns the browser engine name and version. + +### [`getOS():IData`](/api/ua-parser-js/get-os) + +returns the operating system name and version. + +### [`getResult():IData`](/api/ua-parser-js/get-result) + +returns all function object calls, user-agent string, browser info, cpu, device, engine, os. + +### [`getUA():string`](/api/ua-parser-js/get-ua) + +returns the user-agent string. + +### [`setUA(ua:string):UAParser`](/api/ua-parser-js/set-ua) + +set a custom user-agent string to be parsed. \ No newline at end of file diff --git a/docs/v2/api/ua-parser-js/set-ua.md b/docs/v2/api/ua-parser-js/set-ua.md new file mode 100644 index 0000000..e698d50 --- /dev/null +++ b/docs/v2/api/ua-parser-js/set-ua.md @@ -0,0 +1,19 @@ +# setUA(ua:string):UAParser + +Set user-agent string to be parsed, returns current instance + +## Code Example + +```js +// Try to run this code on a browser +const parser = new UAParser(); + +// This will print the user-agent of current browser +console.log(parser.getUA()); + +// Replace the user-agent value +parser.setUA('Mozilla/5.0 MyBrowser/1.0'); + +parser.getUA(); +// "Mozilla/5.0 MyBrowser/1.0" +``` \ No newline at end of file diff --git a/docs/v2/index.md b/docs/v2/index.md new file mode 100644 index 0000000..694a7f5 --- /dev/null +++ b/docs/v2/index.md @@ -0,0 +1,16 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "UAParser.js" + text: "Documentation Reference" + tagline: Detect Browser, OS, CPU, & Device with JavaScript + + actions: + - text: Introduction + link: /intro/why-ua-parser-js + - theme: alt + text: API Reference + link: /api/ua-parser-js/overview +--- \ No newline at end of file diff --git a/docs/v2/intro/extending-regex.md b/docs/v2/intro/extending-regex.md new file mode 100644 index 0000000..1381ee9 --- /dev/null +++ b/docs/v2/intro/extending-regex.md @@ -0,0 +1,59 @@ +# Extending Regex + +## Write Your Own Extension + +If you want to detect something that's not currently provided by UAParser.js (eg: bots, specific apps, etc), you can pass a list of regexes to extends internal UAParser.js regexes with your own. + +- `UAParser([uastring:string,] extensions:object [,headers:object])` + +```js +// Example: +const myOwnListOfBrowsers = [ + [/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']] +]; + +const myUA = 'Mozilla/5.0 MyBrowser/1.3'; + +const myParser = new UAParser({ browser: myOwnListOfBrowsers }); + +console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3", major: "1", type : "bot"} +console.log(myParser.getBrowser().is('bot')); // true +``` + +```js +// Another example: +const myOwnListOfDevices = [ + [/(mytab) ([\w ]+)/i], [UAParser.DEVICE.VENDOR, UAParser.DEVICE.MODEL, [UAParser.DEVICE.TYPE, UAParser.DEVICE.TABLET]], + [/(myphone)/i], [UAParser.DEVICE.VENDOR, [UAParser.DEVICE.TYPE, UAParser.DEVICE.MOBILE]] +]; + +const myUA2 = 'Mozilla/5.0 MyTab 14 Pro Max'; + +const myParser2 = new UAParser({ + browser: myOwnListOfBrowsers, + device: myOwnListOfDevices +}); + +console.log(myParser2.setUA(myUA2).getDevice()); // {vendor: "MyTab", model: "14 Pro Max", type: "tablet"} +``` + +::: info +When custom regexes passed into `UAParser` constructor, they will be ordered **before** internal regexes, thus when the parser runs they will get checked first. +::: + +## Use Predefined Extensions Submodule + +Some basic extensions (although not very complete at the moment) can also be found under [`ua-parser-js/extensions`↗](/api/submodules/extensions) submodule. + +```js +// Usage example +import { UAParser } from 'ua-parser-js'; +import { Emails } from 'ua-parser-js/extensions'; + +const ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0'; +const browser = new UAParser(Emails) + .setUA(ua) + .getBrowser(); + +console.log(browser.toString()); // Thunderbird 78.13.0 +``` diff --git a/docs/v2/intro/quick-start/quick-start.md b/docs/v2/intro/quick-start/quick-start.md new file mode 100644 index 0000000..bd81883 --- /dev/null +++ b/docs/v2/intro/quick-start/quick-start.md @@ -0,0 +1,9 @@ +# Quick Start + +Choose your ~~fighter~~ development strategy: + +- [HTML ↗](/intro/quick-start/using-html) +- [Node.js ↗](/intro/quick-start/using-node-js) +- [ES Modules ↗](/intro/quick-start/using-es-modules) +- [TypeScript ↗](/intro/quick-start/using-typescript) +- [jQuery ↗](/intro/quick-start/using-jquery) \ No newline at end of file diff --git a/docs/v2/intro/quick-start/using-es-modules.md b/docs/v2/intro/quick-start/using-es-modules.md new file mode 100644 index 0000000..7d5d0ae --- /dev/null +++ b/docs/v2/intro/quick-start/using-es-modules.md @@ -0,0 +1,18 @@ +# Using ES Modules + +```sh +$ npm install ua-parser-js +``` + +## Code Example + +```js +import { UAParser } from 'ua-parser-js'; + +const { browser, cpu, device } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900'); + +console.log(browser.name); // Maemo Browser +console.log(cpu.is('arm')); // true +console.log(device.is('mobile')); // true +console.log(device.model); // N900 +``` \ No newline at end of file diff --git a/docs/v2/intro/quick-start/using-html.md b/docs/v2/intro/quick-start/using-html.md new file mode 100644 index 0000000..1d57c01 --- /dev/null +++ b/docs/v2/intro/quick-start/using-html.md @@ -0,0 +1,78 @@ +# Using HTML +--- +- Download minified file locally from [GitHub ↗](https://github.com/faisalman/ua-parser-js/blob/master/dist/ua-parser.pack.js) +- Or use CDN for extra cache performance + - [jsDelivr ↗](https://cdn.jsdelivr.net/npm/ua-parser-js/src/ua-parser.min.js) + - [cdnjs ↗](https://cdnjs.com/libraries/UAParser.js) + +## Code Example + +```html + + + + + + + + + +``` \ No newline at end of file diff --git a/docs/v2/intro/quick-start/using-jquery.md b/docs/v2/intro/quick-start/using-jquery.md new file mode 100644 index 0000000..650cd71 --- /dev/null +++ b/docs/v2/intro/quick-start/using-jquery.md @@ -0,0 +1,43 @@ +# Using jQuery/Zepto ($.ua) + +Although written in vanilla js, this library will automatically detect if jQuery/Zepto is present and create `$.ua` object (with values based on its User-Agent) along with `window.UAParser` constructor. To get/set user-agent you can use: + +## `$.ua.get():string` + +Get user-agent string + +## `$.ua.set(ua:string)` + +Set user-agent string + +## Code Example + +```js +// Say we are in a browser which has default user-agent: +// "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0" + +// Get the details +console.log($.ua.device); // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"} +console.log($.ua.os); // {name: "Android", version: "2.3.4"} +console.log($.ua.os.name); // "Android" +console.log($.ua.get()); // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0" + +// Now lets try to reset to another custom user-agent +$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13'); + +// Test again +console.log($.ua.browser.name); // "Safari" +console.log($.ua.engine.name); // "Webkit" +console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"} +console.log($.ua.browser.version); // "4.0" +console.log($.ua.browser.major); // "4" + +// Add class to tag +// +$('body') + .addClass( + 'ua-browser-' + + $.ua.browser.name + + ' ua-devicetype-' + + $.ua.device.type); +``` \ No newline at end of file diff --git a/docs/v2/intro/quick-start/using-node-js.md b/docs/v2/intro/quick-start/using-node-js.md new file mode 100644 index 0000000..c790736 --- /dev/null +++ b/docs/v2/intro/quick-start/using-node-js.md @@ -0,0 +1,35 @@ +# Using Node.js + +```sh +$ npm install ua-parser-js +``` + +## Code Example + +```js +var http = require('http'); +var uap = require('ua-parser-js'); + +http.createServer(function (req, res) { + // get user-agent header + var ua = uap(req.headers['user-agent']); + + /* // BEGIN since@2.0 - you can also pass client-hints data to UAParser + + // note: only works in secure context (https:// or localhost or file://) + + var getHighEntropyValues = 'Sec-CH-UA-Full-Version-List, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-Bitness'; + res.setHeader('Accept-CH', getHighEntropyValues); + res.setHeader('Critical-CH', getHighEntropyValues); + + var ua = uap(req.headers).withClientHints(); + + // END since@2.0 */ + + // write the result as response + res.end(JSON.stringify(ua, null, ' ')); +}) +.listen(1337, '127.0.0.1'); + +console.log('Server running at http://127.0.0.1:1337/'); +``` \ No newline at end of file diff --git a/docs/v2/intro/quick-start/using-typescript.md b/docs/v2/intro/quick-start/using-typescript.md new file mode 100644 index 0000000..43b0b21 --- /dev/null +++ b/docs/v2/intro/quick-start/using-typescript.md @@ -0,0 +1,19 @@ +# Using TypeScript + +```sh +$ npm install --save ua-parser-js +# Install ua-parser-js + +$ npm install --save-dev @types/ua-parser-js +# Download type definition from DefinitelyTyped repository +# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js +``` + +## Code Example + +```js +import { UAParser } from 'ua-parser-js'; + +const parser = new UAParser(); +console.log(parser.getResult()); +``` \ No newline at end of file diff --git a/docs/v2/intro/why-ua-parser-js.md b/docs/v2/intro/why-ua-parser-js.md new file mode 100644 index 0000000..d60d319 --- /dev/null +++ b/docs/v2/intro/why-ua-parser-js.md @@ -0,0 +1,39 @@ +# Why UAParser.js + +--- + +This illustration sums up why: + +```js +// Consider we got this user-agent (yes it's real): +const ua = `Mozilla/5.0 (Linux; Android 10; STK-LX1 +Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, +like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile +Safari/537.36 musical_ly_2022803040 JsSdk/1.0 +NetType/WIFI Channel/huaweiadsglobal_int +AppName/musical_ly app_version/28.3.4 ByteLocale/en +ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 +AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6`; + +// what??? +``` + +Worry not: + +```js +// Just pass it to `UAParser` +const parser = new UAParser(ua); + +// And voila! +console.log(parser.getBrowser()); +// { name : "TikTok", version : "28.3.4", major : "28" } + +console.log(parser.getEngine()); +// { name : "Blink", version : "110.0.5481.153" } + +console.log(parser.getDevice()); +// { type : "mobile", vendor : "Huawei", model : "STK-LX1" } + +console.log(parser.getOS()); +// { name : "Android", version : "10" } +``` \ No newline at end of file diff --git a/docs/v2/public/images/illustration.png b/docs/v2/public/images/illustration.png new file mode 100644 index 0000000..aea390b Binary files /dev/null and b/docs/v2/public/images/illustration.png differ diff --git a/docs/v2/public/images/logo.png b/docs/v2/public/images/logo.png new file mode 100644 index 0000000..275b2ef Binary files /dev/null and b/docs/v2/public/images/logo.png differ diff --git a/index.html b/index.html index 02137ea..6ff6dbd 100644 --- a/index.html +++ b/index.html @@ -19,21 +19,23 @@
-

+

What device.type am I using? -

+
-

-

{UAParser.js} detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client-Hints with relatively small footprint (~17KB minified, ~6KB gzipped) that can be used either in browser (client-side) or node.js (server-side).

- -

Now, detecting browser is as simple as ua.getBrowser() -

+

+

{UAParser.js} detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client-Hints with relatively small footprint (~17KB minified, ~7KB gzipped) that can be used either in browser (client-side) or node.js (server-side).

+
-
+
FROM OUR SPONSORS :
@@ -67,13 +69,30 @@
+
+
+
+
+
+
+
+
+
+
+ +
+
- USER-AGENT PLAYGROUND + DEMO : A USER-AGENT PLAYGROUND
@@ -332,7 +351,7 @@
-

Who's Using {UAParser.js} ?
Showcasing some well-known companies that are using our library

+

Who's Using {UAParser.js} ?
Showcasing some companies that are using our library

@@ -901,7 +920,7 @@
-

Backers & Sponsors
Those who give back and generously keep this library alive

+

Backers & Sponsors
Those who give back and get the value from using this library

@@ -926,13 +945,16 @@
diff --git a/js/script.js b/js/script.js index 3530b0e..ce87f6b 100644 --- a/js/script.js +++ b/js/script.js @@ -4,7 +4,7 @@ $(document) var labels = ['browser.name', 'os.version', 'device.type', 'cpu.arch', 'device.model', 'browser.version', 'device.vendor', 'engine.name', 'engine.version']; var counter = 0; var rotateLabel = function () { - $('h1 .label').transition('fly down', function () { + $('h2 .label').transition('fly down', function () { $(this).text(labels[counter++]).transition('fade up', 100, function (){ if(counter>=labels.length)counter=0; $(this).transition('jiggle'); @@ -21,7 +21,7 @@ $(document) $(this).transition('flip vertical'); }); $('#ua-result').text(JSON.stringify(result, null, " ")); - $('#demo-result').transition('fly up', function () { + $('#demo-result').transition('zoom', function () { if (result.browser.name) { var version = result.browser.version!==undefined?result.browser.version:'-'; $('#browser-txt').html('' + result.browser.name + '' + version + ''); @@ -95,8 +95,10 @@ $(document) } else { $('#gpu-txt').text('-'); }*/ - $(this).transition('fly up', function () { - $(this).transition('pulse'); + $(this).transition('zoom', function () { + $(this).transition('pulse', function () { + $(this).transition('jiggle'); + }); }); }); } @@ -106,14 +108,19 @@ $(document) var i; var values = []; + var prevVal; for(i = 0; i < uaExampleList.length; i++){ values.push({ name: uaExampleList[i], value: uaExampleList[i]}); } $('#demo-select').dropdown({ values: values, onChange: function (val) { - $('#ua-txt-info').text('For a given user-agent:'); - updateDemo(UAParser(val)); + if (val != prevVal) + { + $('#ua-txt-info').text('For a given user-agent:'); + updateDemo(UAParser(val)); + prevVal = val; + } } }); $('#demo-btn').click(function() { diff --git a/js/ua-parser.js b/js/ua-parser.js index 50850b5..bc8c73a 100644 --- a/js/ua-parser.js +++ b/js/ua-parser.js @@ -1,4 +1,4 @@ /* UAParser.js v2.0.0-alpha.2 Copyright © 2012-2023 Faisal Salman MIT License */ -!function(i,u){"use strict";function e(i){for(var e={},t=0;tT?yi(i,T):i,this}]]).setUA(o),this}Ni.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:u:this.data},Ni.prototype.parse=function(){return this.itemType!=W&&l.call(this.data,this.ua,this.rgxMap),this},Ni.prototype.parseCH=function(){var e=this.ua,t=this.uaCH,o=this.rgxMap;switch(this.itemType){case V:var i=t[C]||t[q];if(i)for(var r in i){var a=i[r].brand,s=i[r].version;!/not.a.brand/i.test(a)&&(r<1||/chromi/i.test(this.get(g)))&&this.set(g,xi(K+" ",a)).set(x,s).set(f,vi(s))}break;case B:var n=t[k];n&&(n&&"64"==t[A]&&(n+="64"),l.call(this.data,n+";",o));break;case $:t[y]&&this.set(v,y),t[m]&&this.set(m,t[m]);break;case L:n=t[N];n&&(w=t[z],n==ui&&(w=13<=parseInt(vi(w),10)?"11":"10"),this.set(g,n).set(x,w));break;case W:var w=function(i){return new Ni(i,e,o[i],t).parseCH().get()};this.set("ua",e).set(V,w(V)).set(B,w(B)).set($,w($)).set(D,w(D)).set(L,w(L))}return this},Ni.prototype.set=function(i,e){return this.data[i]=e,this},zi.VERSION="2.0.0-alpha.2",zi.BROWSER=e([g,x,f]),zi.CPU=e([k]),zi.DEVICE=e([m,o,v,r,y,a,n,w,_]),zi.ENGINE=zi.OS=e([g,x]),typeof exports!==p?(typeof module!==p&&module.exports&&(exports=module.exports=zi),exports.UAParser=zi):typeof define===d&&define.amd?define(function(){return zi}):typeof i!==p&&(i.UAParser=zi);var Ai,Oi=typeof i!==p&&(i.jQuery||i.Zepto);Oi&&!Oi.ua&&(Ai=new zi,Oi.ua=Ai.getResult(),Oi.ua.get=function(){return Ai.getUA()},Oi.ua.set=function(i){Ai.setUA(i);var e,t=Ai.getResult();for(e in t)Oi.ua[e]=t[e]})}("object"==typeof window?window:this); \ No newline at end of file + (function(window,undefined){"use strict";var LIBVERSION="2.0.0-alpha.2",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",USER_AGENT="user-agent",UA_MAX_LENGTH=350,BRANDS="brands",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-bitness",CH_HEADER_MOBILE=CH_HEADER+"-mobile",CH_HEADER_MODEL=CH_HEADER+"-model",CH_HEADER_PLATFORM=CH_HEADER+"-platform",CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=["brands","fullVersionList",MOBILE,MODEL,"platform","platformVersion",ARCHITECTURE,"bitness"],UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",WINDOWS="Windows";var NAVIGATOR=typeof window!==UNDEF_TYPE&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){mergedRegexes[i]=extensions[i]&&extensions[i].length%2===0?extensions[i].concat(regexes[i]):regexes[i]}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str1[i])==lowerize(str2))return true}return false}return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},isExtensions=function(obj){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)}},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(", ");for(var i=0;i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var data=this.data;var detect=function(itemType){return data[itemType].getItem().detectFeature().get()};this.set(UA_BROWSER,detect(UA_BROWSER)).set(UA_CPU,detect(UA_CPU)).set(UA_DEVICE,detect(UA_DEVICE)).set(UA_ENGINE,detect(UA_ENGINE)).set(UA_OS,detect(UA_OS))}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var ua=this.ua,uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS];if(brands){for(var i in brands){var brandName=brands[i].brand,brandVersion=brands[i].version;if(!/not.a.brand/i.test(brandName)&&(i<1||/chromi/i.test(this.get(NAME)))){this.set(NAME,strip(GOOGLE+" ",brandName)).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL])}break;case UA_OS:var osName=uaCH[PLATFORM];if(osName){var osVersion=uaCH[PLATFORMVER];if(osName==WINDOWS)osVersion=parseInt(majorize(osVersion),10)>=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createIData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions)){headers=extensions;extensions=undefined}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=ua||(NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:headers&&headers[USER_AGENT]?headers[USER_AGENT]:EMPTY),HTTP_UACH=new UACHData(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAItem(itemType,userAgent,regexMap,HTTP_UACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAItem(itemType,userAgent,regexMap[itemType],HTTP_UACH).parseUA().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){userAgent=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8ec1488 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,834 @@ +{ + "name": "ua-parser-js", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "vitepress": "^1.0.0-alpha.65" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.7.4" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.7.4" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", + "dev": true + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.17.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz", + "integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.3.3", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz", + "integrity": "sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dev": true, + "dependencies": { + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dev": true, + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, + "node_modules/body-scroll-lock": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", + "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==", + "dev": true + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.13.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", + "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/shiki": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", + "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.18.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.0-alpha.65", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.65.tgz", + "integrity": "sha512-iGWC0AQC6WrfRZTJf5+TiGG4o8PLhqIJNyai8NVxZCY9YpmMJhddvQeqqjJdQniF/LQK/hQ5nQZ9HgSZDGRPGQ==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.3.3", + "@docsearch/js": "^3.3.3", + "@vitejs/plugin-vue": "^4.1.0", + "@vue/devtools-api": "^6.5.0", + "@vueuse/core": "^9.13.0", + "body-scroll-lock": "4.0.0-beta.0", + "shiki": "^0.14.1", + "vite": "^4.2.1", + "vue": "^3.2.47" + }, + "bin": { + "vitepress": "bin/vitepress.js" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..56e2fd8 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "devDependencies": { + "vitepress": "^1.0.0-alpha.65" + }, + "scripts": { + "docs:dev": "vitepress dev docs/v2", + "docs:build": "vitepress build docs/v2", + "docs:preview": "vitepress preview docs/v2" + } +} \ No newline at end of file