├── .gitignore
├── .nvmrc
├── README.md
├── app.feature
├── img
├── ai-alien.jpeg
├── et-bilu.jpeg
├── icon.webp
├── image.png
└── predator.jpeg
├── index.html
├── lib
├── boostrap.min.css
└── bootstrap.bundle.min.js
├── package-lock.json
├── package.json
└── src
├── controller.js
├── index.js
├── service.js
└── view.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 |
94 | # Gatsby files
95 | .cache/
96 | # Comment in the public line in if your project uses Gatsby and not Next.js
97 | # https://nextjs.org/blog/next-9-1#public-directory-support
98 | # public
99 |
100 | # vuepress build output
101 | .vuepress/dist
102 |
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 |
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 |
110 | # Serverless directories
111 | .serverless/
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | # DynamoDB Local files
117 | .dynamodb/
118 |
119 | # TernJS port file
120 | .tern-port
121 |
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 |
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
131 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | v20.12.1
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vanilla JS Web App example
2 |
3 | This is a simple app website to store images on localStorage using best practices of accessibility.
4 |
5 | [Access it live here](https://erickwendel.github.io/vanilla-js-web-app-example)
6 |
7 |
8 |
9 |
10 |
11 | # Running
12 |
13 | Restore the dependencies with `npm ci` and run with `npm start`.
14 |
15 |
--------------------------------------------------------------------------------
/app.feature:
--------------------------------------------------------------------------------
1 | Feature: Image Registration
2 |
3 | Scenario: Submitting an image with invalid inputs
4 | Given I am on the image registration page
5 | When I enter "" in the title field
6 | Then I enter "" in the URL field
7 | Then I click the submit button
8 | Then I should see "Please type a title for the image" message above the title field
9 | And I should see "Please type a valid URL" message above the imageUrl field
10 | And I should see an exclamation icon in the title and URL fields
11 |
12 | Scenario: Submitting an image with valid inputs using enter key
13 | Given I am on the image registration page
14 | When I enter "Alien BR" in the title field
15 | Then I should see a check icon in the title field
16 | When I enter "https://cdn.mos.cms.futurecdn.net/eM9EvWyDxXcnQTTyH8c8p5-1200-80.jpg" in the URL field
17 | Then I should see a check icon in the imageUrl field
18 | Then I can hit enter to submit the form
19 | And the list of registered images should be updated with the new item
20 | And the new item should be stored in the localStorage
21 | Then The inputs should be cleared
22 |
23 | Scenario: Submitting an image and updating the list
24 | Given I am on the image registration page
25 | Then I have entered "BR Alien" in the title field
26 | Then I have entered "https://cdn.mos.cms.futurecdn.net/eM9EvWyDxXcnQTTyH8c8p5-1200-80.jpg" in the URL field
27 | When I click the submit button
28 | And the list of registered images should be updated with the new item
29 | And the new item should be stored in the localStorage
30 | Then The inputs should be cleared
31 |
32 | Scenario: Refreshing the page after submitting an image clicking in the submit button
33 | Given I am on the image registration page
34 | Then I have submitted an image by clicking the submit button
35 | When I refresh the page
36 | Then I should still see the submitted image in the list of registered images
37 |
--------------------------------------------------------------------------------
/img/ai-alien.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/ai-alien.jpeg
--------------------------------------------------------------------------------
/img/et-bilu.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/et-bilu.jpeg
--------------------------------------------------------------------------------
/img/icon.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/icon.webp
--------------------------------------------------------------------------------
/img/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/image.png
--------------------------------------------------------------------------------
/img/predator.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/predator.jpeg
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | TDD Frontend Example
9 |
10 |
11 |
12 |
39 |
40 |
41 |
42 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
83 |
84 | AI Alien
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
95 |
96 | Predator Night Vision
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
107 |
108 | ET Bilu
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/lib/bootstrap.bundle.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v5.3.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5 | */
6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}}));
7 | //# sourceMappingURL=bootstrap.bundle.min.js.map
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aula00-tests-frontend-template",
3 | "version": "0.0.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "aula00-tests-frontend-template",
9 | "version": "0.0.1",
10 | "license": "ISC",
11 | "devDependencies": {
12 | "browser-sync": "^2.29.3"
13 | },
14 | "engines": {
15 | "node": "v20.12.1"
16 | }
17 | },
18 | "node_modules/@socket.io/component-emitter": {
19 | "version": "3.1.0",
20 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
21 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
22 | "dev": true
23 | },
24 | "node_modules/@types/cookie": {
25 | "version": "0.4.1",
26 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
27 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
28 | "dev": true
29 | },
30 | "node_modules/@types/cors": {
31 | "version": "2.8.17",
32 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
33 | "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
34 | "dev": true,
35 | "dependencies": {
36 | "@types/node": "*"
37 | }
38 | },
39 | "node_modules/@types/node": {
40 | "version": "20.5.7",
41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz",
42 | "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==",
43 | "dev": true
44 | },
45 | "node_modules/accepts": {
46 | "version": "1.3.8",
47 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
48 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
49 | "dev": true,
50 | "dependencies": {
51 | "mime-types": "~2.1.34",
52 | "negotiator": "0.6.3"
53 | },
54 | "engines": {
55 | "node": ">= 0.6"
56 | }
57 | },
58 | "node_modules/ansi-regex": {
59 | "version": "5.0.1",
60 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
61 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
62 | "dev": true,
63 | "engines": {
64 | "node": ">=8"
65 | }
66 | },
67 | "node_modules/ansi-styles": {
68 | "version": "4.3.0",
69 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
70 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
71 | "dev": true,
72 | "dependencies": {
73 | "color-convert": "^2.0.1"
74 | },
75 | "engines": {
76 | "node": ">=8"
77 | },
78 | "funding": {
79 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
80 | }
81 | },
82 | "node_modules/anymatch": {
83 | "version": "3.1.3",
84 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
85 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
86 | "dev": true,
87 | "dependencies": {
88 | "normalize-path": "^3.0.0",
89 | "picomatch": "^2.0.4"
90 | },
91 | "engines": {
92 | "node": ">= 8"
93 | }
94 | },
95 | "node_modules/async": {
96 | "version": "2.6.4",
97 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
98 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
99 | "dev": true,
100 | "dependencies": {
101 | "lodash": "^4.17.14"
102 | }
103 | },
104 | "node_modules/async-each-series": {
105 | "version": "0.1.1",
106 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
107 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==",
108 | "dev": true,
109 | "engines": {
110 | "node": ">=0.8.0"
111 | }
112 | },
113 | "node_modules/axios": {
114 | "version": "0.21.4",
115 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
116 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
117 | "dev": true,
118 | "dependencies": {
119 | "follow-redirects": "^1.14.0"
120 | }
121 | },
122 | "node_modules/balanced-match": {
123 | "version": "1.0.2",
124 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
125 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
126 | "dev": true
127 | },
128 | "node_modules/base64id": {
129 | "version": "2.0.0",
130 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
131 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
132 | "dev": true,
133 | "engines": {
134 | "node": "^4.5.0 || >= 5.9"
135 | }
136 | },
137 | "node_modules/batch": {
138 | "version": "0.6.1",
139 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
140 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
141 | "dev": true
142 | },
143 | "node_modules/binary-extensions": {
144 | "version": "2.2.0",
145 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
146 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
147 | "dev": true,
148 | "engines": {
149 | "node": ">=8"
150 | }
151 | },
152 | "node_modules/brace-expansion": {
153 | "version": "1.1.11",
154 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
155 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
156 | "dev": true,
157 | "dependencies": {
158 | "balanced-match": "^1.0.0",
159 | "concat-map": "0.0.1"
160 | }
161 | },
162 | "node_modules/braces": {
163 | "version": "3.0.2",
164 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
165 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
166 | "dev": true,
167 | "dependencies": {
168 | "fill-range": "^7.0.1"
169 | },
170 | "engines": {
171 | "node": ">=8"
172 | }
173 | },
174 | "node_modules/browser-sync": {
175 | "version": "2.29.3",
176 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz",
177 | "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==",
178 | "dev": true,
179 | "dependencies": {
180 | "browser-sync-client": "^2.29.3",
181 | "browser-sync-ui": "^2.29.3",
182 | "bs-recipes": "1.3.4",
183 | "chalk": "4.1.2",
184 | "chokidar": "^3.5.1",
185 | "connect": "3.6.6",
186 | "connect-history-api-fallback": "^1",
187 | "dev-ip": "^1.0.1",
188 | "easy-extender": "^2.3.4",
189 | "eazy-logger": "^4.0.1",
190 | "etag": "^1.8.1",
191 | "fresh": "^0.5.2",
192 | "fs-extra": "3.0.1",
193 | "http-proxy": "^1.18.1",
194 | "immutable": "^3",
195 | "localtunnel": "^2.0.1",
196 | "micromatch": "^4.0.2",
197 | "opn": "5.3.0",
198 | "portscanner": "2.2.0",
199 | "raw-body": "^2.3.2",
200 | "resp-modifier": "6.0.2",
201 | "rx": "4.1.0",
202 | "send": "0.16.2",
203 | "serve-index": "1.9.1",
204 | "serve-static": "1.13.2",
205 | "server-destroy": "1.0.1",
206 | "socket.io": "^4.4.1",
207 | "ua-parser-js": "^1.0.33",
208 | "yargs": "^17.3.1"
209 | },
210 | "bin": {
211 | "browser-sync": "dist/bin.js"
212 | },
213 | "engines": {
214 | "node": ">= 8.0.0"
215 | }
216 | },
217 | "node_modules/browser-sync-client": {
218 | "version": "2.29.3",
219 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz",
220 | "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==",
221 | "dev": true,
222 | "dependencies": {
223 | "etag": "1.8.1",
224 | "fresh": "0.5.2",
225 | "mitt": "^1.1.3"
226 | },
227 | "engines": {
228 | "node": ">=8.0.0"
229 | }
230 | },
231 | "node_modules/browser-sync-ui": {
232 | "version": "2.29.3",
233 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz",
234 | "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==",
235 | "dev": true,
236 | "dependencies": {
237 | "async-each-series": "0.1.1",
238 | "chalk": "4.1.2",
239 | "connect-history-api-fallback": "^1",
240 | "immutable": "^3",
241 | "server-destroy": "1.0.1",
242 | "socket.io-client": "^4.4.1",
243 | "stream-throttle": "^0.1.3"
244 | }
245 | },
246 | "node_modules/bs-recipes": {
247 | "version": "1.3.4",
248 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
249 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==",
250 | "dev": true
251 | },
252 | "node_modules/bytes": {
253 | "version": "3.1.2",
254 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
255 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
256 | "dev": true,
257 | "engines": {
258 | "node": ">= 0.8"
259 | }
260 | },
261 | "node_modules/chalk": {
262 | "version": "4.1.2",
263 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
264 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
265 | "dev": true,
266 | "dependencies": {
267 | "ansi-styles": "^4.1.0",
268 | "supports-color": "^7.1.0"
269 | },
270 | "engines": {
271 | "node": ">=10"
272 | },
273 | "funding": {
274 | "url": "https://github.com/chalk/chalk?sponsor=1"
275 | }
276 | },
277 | "node_modules/chokidar": {
278 | "version": "3.5.3",
279 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
280 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
281 | "dev": true,
282 | "funding": [
283 | {
284 | "type": "individual",
285 | "url": "https://paulmillr.com/funding/"
286 | }
287 | ],
288 | "dependencies": {
289 | "anymatch": "~3.1.2",
290 | "braces": "~3.0.2",
291 | "glob-parent": "~5.1.2",
292 | "is-binary-path": "~2.1.0",
293 | "is-glob": "~4.0.1",
294 | "normalize-path": "~3.0.0",
295 | "readdirp": "~3.6.0"
296 | },
297 | "engines": {
298 | "node": ">= 8.10.0"
299 | },
300 | "optionalDependencies": {
301 | "fsevents": "~2.3.2"
302 | }
303 | },
304 | "node_modules/cliui": {
305 | "version": "8.0.1",
306 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
307 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
308 | "dev": true,
309 | "dependencies": {
310 | "string-width": "^4.2.0",
311 | "strip-ansi": "^6.0.1",
312 | "wrap-ansi": "^7.0.0"
313 | },
314 | "engines": {
315 | "node": ">=12"
316 | }
317 | },
318 | "node_modules/color-convert": {
319 | "version": "2.0.1",
320 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
321 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
322 | "dev": true,
323 | "dependencies": {
324 | "color-name": "~1.1.4"
325 | },
326 | "engines": {
327 | "node": ">=7.0.0"
328 | }
329 | },
330 | "node_modules/color-name": {
331 | "version": "1.1.4",
332 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
333 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
334 | "dev": true
335 | },
336 | "node_modules/commander": {
337 | "version": "2.20.3",
338 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
339 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
340 | "dev": true
341 | },
342 | "node_modules/concat-map": {
343 | "version": "0.0.1",
344 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
345 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
346 | "dev": true
347 | },
348 | "node_modules/connect": {
349 | "version": "3.6.6",
350 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
351 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==",
352 | "dev": true,
353 | "dependencies": {
354 | "debug": "2.6.9",
355 | "finalhandler": "1.1.0",
356 | "parseurl": "~1.3.2",
357 | "utils-merge": "1.0.1"
358 | },
359 | "engines": {
360 | "node": ">= 0.10.0"
361 | }
362 | },
363 | "node_modules/connect-history-api-fallback": {
364 | "version": "1.6.0",
365 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
366 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
367 | "dev": true,
368 | "engines": {
369 | "node": ">=0.8"
370 | }
371 | },
372 | "node_modules/connect/node_modules/debug": {
373 | "version": "2.6.9",
374 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
375 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
376 | "dev": true,
377 | "dependencies": {
378 | "ms": "2.0.0"
379 | }
380 | },
381 | "node_modules/connect/node_modules/ms": {
382 | "version": "2.0.0",
383 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
384 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
385 | "dev": true
386 | },
387 | "node_modules/cookie": {
388 | "version": "0.4.2",
389 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
390 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
391 | "dev": true,
392 | "engines": {
393 | "node": ">= 0.6"
394 | }
395 | },
396 | "node_modules/cors": {
397 | "version": "2.8.5",
398 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
399 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
400 | "dev": true,
401 | "dependencies": {
402 | "object-assign": "^4",
403 | "vary": "^1"
404 | },
405 | "engines": {
406 | "node": ">= 0.10"
407 | }
408 | },
409 | "node_modules/debug": {
410 | "version": "4.3.4",
411 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
412 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
413 | "dev": true,
414 | "dependencies": {
415 | "ms": "2.1.2"
416 | },
417 | "engines": {
418 | "node": ">=6.0"
419 | },
420 | "peerDependenciesMeta": {
421 | "supports-color": {
422 | "optional": true
423 | }
424 | }
425 | },
426 | "node_modules/depd": {
427 | "version": "2.0.0",
428 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
429 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
430 | "dev": true,
431 | "engines": {
432 | "node": ">= 0.8"
433 | }
434 | },
435 | "node_modules/destroy": {
436 | "version": "1.0.4",
437 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
438 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
439 | "dev": true
440 | },
441 | "node_modules/dev-ip": {
442 | "version": "1.0.1",
443 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
444 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==",
445 | "dev": true,
446 | "bin": {
447 | "dev-ip": "lib/dev-ip.js"
448 | },
449 | "engines": {
450 | "node": ">= 0.8.0"
451 | }
452 | },
453 | "node_modules/easy-extender": {
454 | "version": "2.3.4",
455 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
456 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==",
457 | "dev": true,
458 | "dependencies": {
459 | "lodash": "^4.17.10"
460 | },
461 | "engines": {
462 | "node": ">= 4.0.0"
463 | }
464 | },
465 | "node_modules/eazy-logger": {
466 | "version": "4.0.1",
467 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz",
468 | "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==",
469 | "dev": true,
470 | "dependencies": {
471 | "chalk": "4.1.2"
472 | },
473 | "engines": {
474 | "node": ">= 0.8.0"
475 | }
476 | },
477 | "node_modules/ee-first": {
478 | "version": "1.1.1",
479 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
480 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
481 | "dev": true
482 | },
483 | "node_modules/emoji-regex": {
484 | "version": "8.0.0",
485 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
486 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
487 | "dev": true
488 | },
489 | "node_modules/encodeurl": {
490 | "version": "1.0.2",
491 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
492 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
493 | "dev": true,
494 | "engines": {
495 | "node": ">= 0.8"
496 | }
497 | },
498 | "node_modules/engine.io": {
499 | "version": "6.5.4",
500 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
501 | "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
502 | "dev": true,
503 | "dependencies": {
504 | "@types/cookie": "^0.4.1",
505 | "@types/cors": "^2.8.12",
506 | "@types/node": ">=10.0.0",
507 | "accepts": "~1.3.4",
508 | "base64id": "2.0.0",
509 | "cookie": "~0.4.1",
510 | "cors": "~2.8.5",
511 | "debug": "~4.3.1",
512 | "engine.io-parser": "~5.2.1",
513 | "ws": "~8.11.0"
514 | },
515 | "engines": {
516 | "node": ">=10.2.0"
517 | }
518 | },
519 | "node_modules/engine.io-client": {
520 | "version": "6.5.3",
521 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz",
522 | "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==",
523 | "dev": true,
524 | "dependencies": {
525 | "@socket.io/component-emitter": "~3.1.0",
526 | "debug": "~4.3.1",
527 | "engine.io-parser": "~5.2.1",
528 | "ws": "~8.11.0",
529 | "xmlhttprequest-ssl": "~2.0.0"
530 | }
531 | },
532 | "node_modules/engine.io-parser": {
533 | "version": "5.2.1",
534 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
535 | "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==",
536 | "dev": true,
537 | "engines": {
538 | "node": ">=10.0.0"
539 | }
540 | },
541 | "node_modules/escalade": {
542 | "version": "3.1.1",
543 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
544 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
545 | "dev": true,
546 | "engines": {
547 | "node": ">=6"
548 | }
549 | },
550 | "node_modules/escape-html": {
551 | "version": "1.0.3",
552 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
553 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
554 | "dev": true
555 | },
556 | "node_modules/etag": {
557 | "version": "1.8.1",
558 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
559 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
560 | "dev": true,
561 | "engines": {
562 | "node": ">= 0.6"
563 | }
564 | },
565 | "node_modules/eventemitter3": {
566 | "version": "4.0.7",
567 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
568 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
569 | "dev": true
570 | },
571 | "node_modules/fill-range": {
572 | "version": "7.0.1",
573 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
574 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
575 | "dev": true,
576 | "dependencies": {
577 | "to-regex-range": "^5.0.1"
578 | },
579 | "engines": {
580 | "node": ">=8"
581 | }
582 | },
583 | "node_modules/finalhandler": {
584 | "version": "1.1.0",
585 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
586 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==",
587 | "dev": true,
588 | "dependencies": {
589 | "debug": "2.6.9",
590 | "encodeurl": "~1.0.1",
591 | "escape-html": "~1.0.3",
592 | "on-finished": "~2.3.0",
593 | "parseurl": "~1.3.2",
594 | "statuses": "~1.3.1",
595 | "unpipe": "~1.0.0"
596 | },
597 | "engines": {
598 | "node": ">= 0.8"
599 | }
600 | },
601 | "node_modules/finalhandler/node_modules/debug": {
602 | "version": "2.6.9",
603 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
604 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
605 | "dev": true,
606 | "dependencies": {
607 | "ms": "2.0.0"
608 | }
609 | },
610 | "node_modules/finalhandler/node_modules/ms": {
611 | "version": "2.0.0",
612 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
613 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
614 | "dev": true
615 | },
616 | "node_modules/follow-redirects": {
617 | "version": "1.15.3",
618 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
619 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
620 | "dev": true,
621 | "funding": [
622 | {
623 | "type": "individual",
624 | "url": "https://github.com/sponsors/RubenVerborgh"
625 | }
626 | ],
627 | "engines": {
628 | "node": ">=4.0"
629 | },
630 | "peerDependenciesMeta": {
631 | "debug": {
632 | "optional": true
633 | }
634 | }
635 | },
636 | "node_modules/fresh": {
637 | "version": "0.5.2",
638 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
639 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
640 | "dev": true,
641 | "engines": {
642 | "node": ">= 0.6"
643 | }
644 | },
645 | "node_modules/fs-extra": {
646 | "version": "3.0.1",
647 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
648 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==",
649 | "dev": true,
650 | "dependencies": {
651 | "graceful-fs": "^4.1.2",
652 | "jsonfile": "^3.0.0",
653 | "universalify": "^0.1.0"
654 | }
655 | },
656 | "node_modules/fsevents": {
657 | "version": "2.3.3",
658 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
659 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
660 | "dev": true,
661 | "hasInstallScript": true,
662 | "optional": true,
663 | "os": [
664 | "darwin"
665 | ],
666 | "engines": {
667 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
668 | }
669 | },
670 | "node_modules/get-caller-file": {
671 | "version": "2.0.5",
672 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
673 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
674 | "dev": true,
675 | "engines": {
676 | "node": "6.* || 8.* || >= 10.*"
677 | }
678 | },
679 | "node_modules/glob-parent": {
680 | "version": "5.1.2",
681 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
682 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
683 | "dev": true,
684 | "dependencies": {
685 | "is-glob": "^4.0.1"
686 | },
687 | "engines": {
688 | "node": ">= 6"
689 | }
690 | },
691 | "node_modules/graceful-fs": {
692 | "version": "4.2.11",
693 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
694 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
695 | "dev": true
696 | },
697 | "node_modules/has-flag": {
698 | "version": "4.0.0",
699 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
700 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
701 | "dev": true,
702 | "engines": {
703 | "node": ">=8"
704 | }
705 | },
706 | "node_modules/http-errors": {
707 | "version": "2.0.0",
708 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
709 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
710 | "dev": true,
711 | "dependencies": {
712 | "depd": "2.0.0",
713 | "inherits": "2.0.4",
714 | "setprototypeof": "1.2.0",
715 | "statuses": "2.0.1",
716 | "toidentifier": "1.0.1"
717 | },
718 | "engines": {
719 | "node": ">= 0.8"
720 | }
721 | },
722 | "node_modules/http-errors/node_modules/statuses": {
723 | "version": "2.0.1",
724 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
725 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
726 | "dev": true,
727 | "engines": {
728 | "node": ">= 0.8"
729 | }
730 | },
731 | "node_modules/http-proxy": {
732 | "version": "1.18.1",
733 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
734 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
735 | "dev": true,
736 | "dependencies": {
737 | "eventemitter3": "^4.0.0",
738 | "follow-redirects": "^1.0.0",
739 | "requires-port": "^1.0.0"
740 | },
741 | "engines": {
742 | "node": ">=8.0.0"
743 | }
744 | },
745 | "node_modules/iconv-lite": {
746 | "version": "0.4.24",
747 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
748 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
749 | "dev": true,
750 | "dependencies": {
751 | "safer-buffer": ">= 2.1.2 < 3"
752 | },
753 | "engines": {
754 | "node": ">=0.10.0"
755 | }
756 | },
757 | "node_modules/immutable": {
758 | "version": "3.8.2",
759 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
760 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
761 | "dev": true,
762 | "engines": {
763 | "node": ">=0.10.0"
764 | }
765 | },
766 | "node_modules/inherits": {
767 | "version": "2.0.4",
768 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
769 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
770 | "dev": true
771 | },
772 | "node_modules/is-binary-path": {
773 | "version": "2.1.0",
774 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
775 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
776 | "dev": true,
777 | "dependencies": {
778 | "binary-extensions": "^2.0.0"
779 | },
780 | "engines": {
781 | "node": ">=8"
782 | }
783 | },
784 | "node_modules/is-extglob": {
785 | "version": "2.1.1",
786 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
787 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
788 | "dev": true,
789 | "engines": {
790 | "node": ">=0.10.0"
791 | }
792 | },
793 | "node_modules/is-fullwidth-code-point": {
794 | "version": "3.0.0",
795 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
796 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
797 | "dev": true,
798 | "engines": {
799 | "node": ">=8"
800 | }
801 | },
802 | "node_modules/is-glob": {
803 | "version": "4.0.3",
804 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
805 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
806 | "dev": true,
807 | "dependencies": {
808 | "is-extglob": "^2.1.1"
809 | },
810 | "engines": {
811 | "node": ">=0.10.0"
812 | }
813 | },
814 | "node_modules/is-number": {
815 | "version": "7.0.0",
816 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
817 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
818 | "dev": true,
819 | "engines": {
820 | "node": ">=0.12.0"
821 | }
822 | },
823 | "node_modules/is-number-like": {
824 | "version": "1.0.8",
825 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
826 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
827 | "dev": true,
828 | "dependencies": {
829 | "lodash.isfinite": "^3.3.2"
830 | }
831 | },
832 | "node_modules/is-wsl": {
833 | "version": "1.1.0",
834 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
835 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
836 | "dev": true,
837 | "engines": {
838 | "node": ">=4"
839 | }
840 | },
841 | "node_modules/jsonfile": {
842 | "version": "3.0.1",
843 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
844 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==",
845 | "dev": true,
846 | "optionalDependencies": {
847 | "graceful-fs": "^4.1.6"
848 | }
849 | },
850 | "node_modules/limiter": {
851 | "version": "1.1.5",
852 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
853 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
854 | "dev": true
855 | },
856 | "node_modules/localtunnel": {
857 | "version": "2.0.2",
858 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz",
859 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==",
860 | "dev": true,
861 | "dependencies": {
862 | "axios": "0.21.4",
863 | "debug": "4.3.2",
864 | "openurl": "1.1.1",
865 | "yargs": "17.1.1"
866 | },
867 | "bin": {
868 | "lt": "bin/lt.js"
869 | },
870 | "engines": {
871 | "node": ">=8.3.0"
872 | }
873 | },
874 | "node_modules/localtunnel/node_modules/cliui": {
875 | "version": "7.0.4",
876 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
877 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
878 | "dev": true,
879 | "dependencies": {
880 | "string-width": "^4.2.0",
881 | "strip-ansi": "^6.0.0",
882 | "wrap-ansi": "^7.0.0"
883 | }
884 | },
885 | "node_modules/localtunnel/node_modules/debug": {
886 | "version": "4.3.2",
887 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
888 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
889 | "dev": true,
890 | "dependencies": {
891 | "ms": "2.1.2"
892 | },
893 | "engines": {
894 | "node": ">=6.0"
895 | },
896 | "peerDependenciesMeta": {
897 | "supports-color": {
898 | "optional": true
899 | }
900 | }
901 | },
902 | "node_modules/localtunnel/node_modules/yargs": {
903 | "version": "17.1.1",
904 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
905 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
906 | "dev": true,
907 | "dependencies": {
908 | "cliui": "^7.0.2",
909 | "escalade": "^3.1.1",
910 | "get-caller-file": "^2.0.5",
911 | "require-directory": "^2.1.1",
912 | "string-width": "^4.2.0",
913 | "y18n": "^5.0.5",
914 | "yargs-parser": "^20.2.2"
915 | },
916 | "engines": {
917 | "node": ">=12"
918 | }
919 | },
920 | "node_modules/localtunnel/node_modules/yargs-parser": {
921 | "version": "20.2.9",
922 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
923 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
924 | "dev": true,
925 | "engines": {
926 | "node": ">=10"
927 | }
928 | },
929 | "node_modules/lodash": {
930 | "version": "4.17.21",
931 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
932 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
933 | "dev": true
934 | },
935 | "node_modules/lodash.isfinite": {
936 | "version": "3.3.2",
937 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
938 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==",
939 | "dev": true
940 | },
941 | "node_modules/micromatch": {
942 | "version": "4.0.5",
943 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
944 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
945 | "dev": true,
946 | "dependencies": {
947 | "braces": "^3.0.2",
948 | "picomatch": "^2.3.1"
949 | },
950 | "engines": {
951 | "node": ">=8.6"
952 | }
953 | },
954 | "node_modules/mime": {
955 | "version": "1.4.1",
956 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
957 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
958 | "dev": true,
959 | "bin": {
960 | "mime": "cli.js"
961 | }
962 | },
963 | "node_modules/mime-db": {
964 | "version": "1.52.0",
965 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
966 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
967 | "dev": true,
968 | "engines": {
969 | "node": ">= 0.6"
970 | }
971 | },
972 | "node_modules/mime-types": {
973 | "version": "2.1.35",
974 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
975 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
976 | "dev": true,
977 | "dependencies": {
978 | "mime-db": "1.52.0"
979 | },
980 | "engines": {
981 | "node": ">= 0.6"
982 | }
983 | },
984 | "node_modules/minimatch": {
985 | "version": "3.1.2",
986 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
987 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
988 | "dev": true,
989 | "dependencies": {
990 | "brace-expansion": "^1.1.7"
991 | },
992 | "engines": {
993 | "node": "*"
994 | }
995 | },
996 | "node_modules/mitt": {
997 | "version": "1.2.0",
998 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
999 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
1000 | "dev": true
1001 | },
1002 | "node_modules/ms": {
1003 | "version": "2.1.2",
1004 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1005 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1006 | "dev": true
1007 | },
1008 | "node_modules/negotiator": {
1009 | "version": "0.6.3",
1010 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1011 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1012 | "dev": true,
1013 | "engines": {
1014 | "node": ">= 0.6"
1015 | }
1016 | },
1017 | "node_modules/normalize-path": {
1018 | "version": "3.0.0",
1019 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1020 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1021 | "dev": true,
1022 | "engines": {
1023 | "node": ">=0.10.0"
1024 | }
1025 | },
1026 | "node_modules/object-assign": {
1027 | "version": "4.1.1",
1028 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1029 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1030 | "dev": true,
1031 | "engines": {
1032 | "node": ">=0.10.0"
1033 | }
1034 | },
1035 | "node_modules/on-finished": {
1036 | "version": "2.3.0",
1037 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1038 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1039 | "dev": true,
1040 | "dependencies": {
1041 | "ee-first": "1.1.1"
1042 | },
1043 | "engines": {
1044 | "node": ">= 0.8"
1045 | }
1046 | },
1047 | "node_modules/openurl": {
1048 | "version": "1.1.1",
1049 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
1050 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==",
1051 | "dev": true
1052 | },
1053 | "node_modules/opn": {
1054 | "version": "5.3.0",
1055 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
1056 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
1057 | "dev": true,
1058 | "dependencies": {
1059 | "is-wsl": "^1.1.0"
1060 | },
1061 | "engines": {
1062 | "node": ">=4"
1063 | }
1064 | },
1065 | "node_modules/parseurl": {
1066 | "version": "1.3.3",
1067 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1068 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1069 | "dev": true,
1070 | "engines": {
1071 | "node": ">= 0.8"
1072 | }
1073 | },
1074 | "node_modules/picomatch": {
1075 | "version": "2.3.1",
1076 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1077 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1078 | "dev": true,
1079 | "engines": {
1080 | "node": ">=8.6"
1081 | },
1082 | "funding": {
1083 | "url": "https://github.com/sponsors/jonschlinkert"
1084 | }
1085 | },
1086 | "node_modules/portscanner": {
1087 | "version": "2.2.0",
1088 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
1089 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==",
1090 | "dev": true,
1091 | "dependencies": {
1092 | "async": "^2.6.0",
1093 | "is-number-like": "^1.0.3"
1094 | },
1095 | "engines": {
1096 | "node": ">=0.4",
1097 | "npm": ">=1.0.0"
1098 | }
1099 | },
1100 | "node_modules/range-parser": {
1101 | "version": "1.2.1",
1102 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1103 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1104 | "dev": true,
1105 | "engines": {
1106 | "node": ">= 0.6"
1107 | }
1108 | },
1109 | "node_modules/raw-body": {
1110 | "version": "2.5.2",
1111 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1112 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1113 | "dev": true,
1114 | "dependencies": {
1115 | "bytes": "3.1.2",
1116 | "http-errors": "2.0.0",
1117 | "iconv-lite": "0.4.24",
1118 | "unpipe": "1.0.0"
1119 | },
1120 | "engines": {
1121 | "node": ">= 0.8"
1122 | }
1123 | },
1124 | "node_modules/readdirp": {
1125 | "version": "3.6.0",
1126 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1127 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1128 | "dev": true,
1129 | "dependencies": {
1130 | "picomatch": "^2.2.1"
1131 | },
1132 | "engines": {
1133 | "node": ">=8.10.0"
1134 | }
1135 | },
1136 | "node_modules/require-directory": {
1137 | "version": "2.1.1",
1138 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1139 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1140 | "dev": true,
1141 | "engines": {
1142 | "node": ">=0.10.0"
1143 | }
1144 | },
1145 | "node_modules/requires-port": {
1146 | "version": "1.0.0",
1147 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1148 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
1149 | "dev": true
1150 | },
1151 | "node_modules/resp-modifier": {
1152 | "version": "6.0.2",
1153 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
1154 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==",
1155 | "dev": true,
1156 | "dependencies": {
1157 | "debug": "^2.2.0",
1158 | "minimatch": "^3.0.2"
1159 | },
1160 | "engines": {
1161 | "node": ">= 0.8.0"
1162 | }
1163 | },
1164 | "node_modules/resp-modifier/node_modules/debug": {
1165 | "version": "2.6.9",
1166 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1167 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1168 | "dev": true,
1169 | "dependencies": {
1170 | "ms": "2.0.0"
1171 | }
1172 | },
1173 | "node_modules/resp-modifier/node_modules/ms": {
1174 | "version": "2.0.0",
1175 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1176 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1177 | "dev": true
1178 | },
1179 | "node_modules/rx": {
1180 | "version": "4.1.0",
1181 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
1182 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==",
1183 | "dev": true
1184 | },
1185 | "node_modules/safer-buffer": {
1186 | "version": "2.1.2",
1187 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1188 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1189 | "dev": true
1190 | },
1191 | "node_modules/send": {
1192 | "version": "0.16.2",
1193 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1194 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1195 | "dev": true,
1196 | "dependencies": {
1197 | "debug": "2.6.9",
1198 | "depd": "~1.1.2",
1199 | "destroy": "~1.0.4",
1200 | "encodeurl": "~1.0.2",
1201 | "escape-html": "~1.0.3",
1202 | "etag": "~1.8.1",
1203 | "fresh": "0.5.2",
1204 | "http-errors": "~1.6.2",
1205 | "mime": "1.4.1",
1206 | "ms": "2.0.0",
1207 | "on-finished": "~2.3.0",
1208 | "range-parser": "~1.2.0",
1209 | "statuses": "~1.4.0"
1210 | },
1211 | "engines": {
1212 | "node": ">= 0.8.0"
1213 | }
1214 | },
1215 | "node_modules/send/node_modules/debug": {
1216 | "version": "2.6.9",
1217 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1218 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1219 | "dev": true,
1220 | "dependencies": {
1221 | "ms": "2.0.0"
1222 | }
1223 | },
1224 | "node_modules/send/node_modules/depd": {
1225 | "version": "1.1.2",
1226 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1227 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1228 | "dev": true,
1229 | "engines": {
1230 | "node": ">= 0.6"
1231 | }
1232 | },
1233 | "node_modules/send/node_modules/http-errors": {
1234 | "version": "1.6.3",
1235 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1236 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1237 | "dev": true,
1238 | "dependencies": {
1239 | "depd": "~1.1.2",
1240 | "inherits": "2.0.3",
1241 | "setprototypeof": "1.1.0",
1242 | "statuses": ">= 1.4.0 < 2"
1243 | },
1244 | "engines": {
1245 | "node": ">= 0.6"
1246 | }
1247 | },
1248 | "node_modules/send/node_modules/inherits": {
1249 | "version": "2.0.3",
1250 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1251 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1252 | "dev": true
1253 | },
1254 | "node_modules/send/node_modules/ms": {
1255 | "version": "2.0.0",
1256 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1257 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1258 | "dev": true
1259 | },
1260 | "node_modules/send/node_modules/setprototypeof": {
1261 | "version": "1.1.0",
1262 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1263 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1264 | "dev": true
1265 | },
1266 | "node_modules/send/node_modules/statuses": {
1267 | "version": "1.4.0",
1268 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1269 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
1270 | "dev": true,
1271 | "engines": {
1272 | "node": ">= 0.6"
1273 | }
1274 | },
1275 | "node_modules/serve-index": {
1276 | "version": "1.9.1",
1277 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
1278 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
1279 | "dev": true,
1280 | "dependencies": {
1281 | "accepts": "~1.3.4",
1282 | "batch": "0.6.1",
1283 | "debug": "2.6.9",
1284 | "escape-html": "~1.0.3",
1285 | "http-errors": "~1.6.2",
1286 | "mime-types": "~2.1.17",
1287 | "parseurl": "~1.3.2"
1288 | },
1289 | "engines": {
1290 | "node": ">= 0.8.0"
1291 | }
1292 | },
1293 | "node_modules/serve-index/node_modules/debug": {
1294 | "version": "2.6.9",
1295 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1296 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1297 | "dev": true,
1298 | "dependencies": {
1299 | "ms": "2.0.0"
1300 | }
1301 | },
1302 | "node_modules/serve-index/node_modules/depd": {
1303 | "version": "1.1.2",
1304 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1305 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
1306 | "dev": true,
1307 | "engines": {
1308 | "node": ">= 0.6"
1309 | }
1310 | },
1311 | "node_modules/serve-index/node_modules/http-errors": {
1312 | "version": "1.6.3",
1313 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1314 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
1315 | "dev": true,
1316 | "dependencies": {
1317 | "depd": "~1.1.2",
1318 | "inherits": "2.0.3",
1319 | "setprototypeof": "1.1.0",
1320 | "statuses": ">= 1.4.0 < 2"
1321 | },
1322 | "engines": {
1323 | "node": ">= 0.6"
1324 | }
1325 | },
1326 | "node_modules/serve-index/node_modules/inherits": {
1327 | "version": "2.0.3",
1328 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1329 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1330 | "dev": true
1331 | },
1332 | "node_modules/serve-index/node_modules/ms": {
1333 | "version": "2.0.0",
1334 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1335 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1336 | "dev": true
1337 | },
1338 | "node_modules/serve-index/node_modules/setprototypeof": {
1339 | "version": "1.1.0",
1340 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1341 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
1342 | "dev": true
1343 | },
1344 | "node_modules/serve-index/node_modules/statuses": {
1345 | "version": "1.5.0",
1346 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1347 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
1348 | "dev": true,
1349 | "engines": {
1350 | "node": ">= 0.6"
1351 | }
1352 | },
1353 | "node_modules/serve-static": {
1354 | "version": "1.13.2",
1355 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1356 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1357 | "dev": true,
1358 | "dependencies": {
1359 | "encodeurl": "~1.0.2",
1360 | "escape-html": "~1.0.3",
1361 | "parseurl": "~1.3.2",
1362 | "send": "0.16.2"
1363 | },
1364 | "engines": {
1365 | "node": ">= 0.8.0"
1366 | }
1367 | },
1368 | "node_modules/server-destroy": {
1369 | "version": "1.0.1",
1370 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
1371 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
1372 | "dev": true
1373 | },
1374 | "node_modules/setprototypeof": {
1375 | "version": "1.2.0",
1376 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1377 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1378 | "dev": true
1379 | },
1380 | "node_modules/socket.io": {
1381 | "version": "4.7.2",
1382 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz",
1383 | "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==",
1384 | "dev": true,
1385 | "dependencies": {
1386 | "accepts": "~1.3.4",
1387 | "base64id": "~2.0.0",
1388 | "cors": "~2.8.5",
1389 | "debug": "~4.3.2",
1390 | "engine.io": "~6.5.2",
1391 | "socket.io-adapter": "~2.5.2",
1392 | "socket.io-parser": "~4.2.4"
1393 | },
1394 | "engines": {
1395 | "node": ">=10.2.0"
1396 | }
1397 | },
1398 | "node_modules/socket.io-adapter": {
1399 | "version": "2.5.2",
1400 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
1401 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
1402 | "dev": true,
1403 | "dependencies": {
1404 | "ws": "~8.11.0"
1405 | }
1406 | },
1407 | "node_modules/socket.io-client": {
1408 | "version": "4.7.2",
1409 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz",
1410 | "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==",
1411 | "dev": true,
1412 | "dependencies": {
1413 | "@socket.io/component-emitter": "~3.1.0",
1414 | "debug": "~4.3.2",
1415 | "engine.io-client": "~6.5.2",
1416 | "socket.io-parser": "~4.2.4"
1417 | },
1418 | "engines": {
1419 | "node": ">=10.0.0"
1420 | }
1421 | },
1422 | "node_modules/socket.io-parser": {
1423 | "version": "4.2.4",
1424 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
1425 | "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
1426 | "dev": true,
1427 | "dependencies": {
1428 | "@socket.io/component-emitter": "~3.1.0",
1429 | "debug": "~4.3.1"
1430 | },
1431 | "engines": {
1432 | "node": ">=10.0.0"
1433 | }
1434 | },
1435 | "node_modules/statuses": {
1436 | "version": "1.3.1",
1437 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
1438 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==",
1439 | "dev": true,
1440 | "engines": {
1441 | "node": ">= 0.6"
1442 | }
1443 | },
1444 | "node_modules/stream-throttle": {
1445 | "version": "0.1.3",
1446 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
1447 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==",
1448 | "dev": true,
1449 | "dependencies": {
1450 | "commander": "^2.2.0",
1451 | "limiter": "^1.0.5"
1452 | },
1453 | "bin": {
1454 | "throttleproxy": "bin/throttleproxy.js"
1455 | },
1456 | "engines": {
1457 | "node": ">= 0.10.0"
1458 | }
1459 | },
1460 | "node_modules/string-width": {
1461 | "version": "4.2.3",
1462 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1463 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1464 | "dev": true,
1465 | "dependencies": {
1466 | "emoji-regex": "^8.0.0",
1467 | "is-fullwidth-code-point": "^3.0.0",
1468 | "strip-ansi": "^6.0.1"
1469 | },
1470 | "engines": {
1471 | "node": ">=8"
1472 | }
1473 | },
1474 | "node_modules/strip-ansi": {
1475 | "version": "6.0.1",
1476 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1477 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1478 | "dev": true,
1479 | "dependencies": {
1480 | "ansi-regex": "^5.0.1"
1481 | },
1482 | "engines": {
1483 | "node": ">=8"
1484 | }
1485 | },
1486 | "node_modules/supports-color": {
1487 | "version": "7.2.0",
1488 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1489 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1490 | "dev": true,
1491 | "dependencies": {
1492 | "has-flag": "^4.0.0"
1493 | },
1494 | "engines": {
1495 | "node": ">=8"
1496 | }
1497 | },
1498 | "node_modules/to-regex-range": {
1499 | "version": "5.0.1",
1500 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1501 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1502 | "dev": true,
1503 | "dependencies": {
1504 | "is-number": "^7.0.0"
1505 | },
1506 | "engines": {
1507 | "node": ">=8.0"
1508 | }
1509 | },
1510 | "node_modules/toidentifier": {
1511 | "version": "1.0.1",
1512 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1513 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1514 | "dev": true,
1515 | "engines": {
1516 | "node": ">=0.6"
1517 | }
1518 | },
1519 | "node_modules/ua-parser-js": {
1520 | "version": "1.0.37",
1521 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
1522 | "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==",
1523 | "dev": true,
1524 | "funding": [
1525 | {
1526 | "type": "opencollective",
1527 | "url": "https://opencollective.com/ua-parser-js"
1528 | },
1529 | {
1530 | "type": "paypal",
1531 | "url": "https://paypal.me/faisalman"
1532 | },
1533 | {
1534 | "type": "github",
1535 | "url": "https://github.com/sponsors/faisalman"
1536 | }
1537 | ],
1538 | "engines": {
1539 | "node": "*"
1540 | }
1541 | },
1542 | "node_modules/universalify": {
1543 | "version": "0.1.2",
1544 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1545 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1546 | "dev": true,
1547 | "engines": {
1548 | "node": ">= 4.0.0"
1549 | }
1550 | },
1551 | "node_modules/unpipe": {
1552 | "version": "1.0.0",
1553 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1554 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1555 | "dev": true,
1556 | "engines": {
1557 | "node": ">= 0.8"
1558 | }
1559 | },
1560 | "node_modules/utils-merge": {
1561 | "version": "1.0.1",
1562 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1563 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1564 | "dev": true,
1565 | "engines": {
1566 | "node": ">= 0.4.0"
1567 | }
1568 | },
1569 | "node_modules/vary": {
1570 | "version": "1.1.2",
1571 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1572 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1573 | "dev": true,
1574 | "engines": {
1575 | "node": ">= 0.8"
1576 | }
1577 | },
1578 | "node_modules/wrap-ansi": {
1579 | "version": "7.0.0",
1580 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1581 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1582 | "dev": true,
1583 | "dependencies": {
1584 | "ansi-styles": "^4.0.0",
1585 | "string-width": "^4.1.0",
1586 | "strip-ansi": "^6.0.0"
1587 | },
1588 | "engines": {
1589 | "node": ">=10"
1590 | },
1591 | "funding": {
1592 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1593 | }
1594 | },
1595 | "node_modules/ws": {
1596 | "version": "8.11.0",
1597 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
1598 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
1599 | "dev": true,
1600 | "engines": {
1601 | "node": ">=10.0.0"
1602 | },
1603 | "peerDependencies": {
1604 | "bufferutil": "^4.0.1",
1605 | "utf-8-validate": "^5.0.2"
1606 | },
1607 | "peerDependenciesMeta": {
1608 | "bufferutil": {
1609 | "optional": true
1610 | },
1611 | "utf-8-validate": {
1612 | "optional": true
1613 | }
1614 | }
1615 | },
1616 | "node_modules/xmlhttprequest-ssl": {
1617 | "version": "2.0.0",
1618 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
1619 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
1620 | "dev": true,
1621 | "engines": {
1622 | "node": ">=0.4.0"
1623 | }
1624 | },
1625 | "node_modules/y18n": {
1626 | "version": "5.0.8",
1627 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1628 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1629 | "dev": true,
1630 | "engines": {
1631 | "node": ">=10"
1632 | }
1633 | },
1634 | "node_modules/yargs": {
1635 | "version": "17.7.2",
1636 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
1637 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
1638 | "dev": true,
1639 | "dependencies": {
1640 | "cliui": "^8.0.1",
1641 | "escalade": "^3.1.1",
1642 | "get-caller-file": "^2.0.5",
1643 | "require-directory": "^2.1.1",
1644 | "string-width": "^4.2.3",
1645 | "y18n": "^5.0.5",
1646 | "yargs-parser": "^21.1.1"
1647 | },
1648 | "engines": {
1649 | "node": ">=12"
1650 | }
1651 | },
1652 | "node_modules/yargs-parser": {
1653 | "version": "21.1.1",
1654 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1655 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1656 | "dev": true,
1657 | "engines": {
1658 | "node": ">=12"
1659 | }
1660 | }
1661 | }
1662 | }
1663 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aula00-tests-frontend-template",
3 | "version": "0.0.1",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "npx browser-sync start -w --server ."
8 | },
9 | "keywords": [],
10 | "author": "erickwendel",
11 | "license": "ISC",
12 | "type": "module",
13 | "engines": {
14 | "node": "v20.12.1"
15 | },
16 | "devDependencies": {
17 | "browser-sync": "^2.29.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/controller.js:
--------------------------------------------------------------------------------
1 | export default class Controller {
2 | #view = {}
3 | #service = {}
4 | constructor({ view, service }) {
5 | this.#view = view
6 | this.#service = service
7 | this.#view.configureOnSubmit(this.#onSubmit.bind(this))
8 | }
9 |
10 | async initialize() {
11 | this.#view.initialize()
12 | return this.loadItems()
13 | }
14 |
15 | /**
16 | * @param {object} item
17 | * @param {string} item.title
18 | * @param {string} item.imageUrl
19 | * @returns {Promise}
20 | */
21 | async #onSubmit(item) {
22 | await this.#service.saveItem(item)
23 | return this.#view.updateList([item])
24 | }
25 |
26 | async loadItems() {
27 | const items = await this.#service.getItems()
28 | if(!items.length) return
29 |
30 | this.#view.updateList(items)
31 | }
32 | }
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import View from "./view.js";
2 | import Service from "./service.js";
3 | import Controller from "./controller.js";
4 |
5 | const view = new View();
6 |
7 | // localStorage.removeItem('tdd-ew-db')
8 |
9 | const service = new Service({
10 | tableName: 'tdd-ew-db'
11 | });
12 |
13 | const controller = new Controller({ view, service });
14 | controller.initialize();
--------------------------------------------------------------------------------
/src/service.js:
--------------------------------------------------------------------------------
1 | export default class Service {
2 | #tableName = ''
3 | constructor({ tableName }) {
4 | this.#tableName = tableName
5 | }
6 |
7 | #getItems() {
8 | return JSON.parse(localStorage.getItem(this.#tableName)) ?? []
9 | }
10 |
11 | #setItems(items) {
12 | localStorage.setItem(this.#tableName, JSON.stringify(items))
13 | }
14 |
15 | #sleep(ms) {
16 | return new Promise(resolve => setTimeout(resolve, ms))
17 | }
18 |
19 | async saveItem(item) {
20 | const items = this.#getItems()
21 | items.push(item)
22 | await this.#sleep(200)
23 | this.#setItems(items)
24 | return;
25 | }
26 |
27 | async getItems() {
28 | await this.#sleep(200)
29 | return this.#getItems()
30 | }
31 | }
--------------------------------------------------------------------------------
/src/view.js:
--------------------------------------------------------------------------------
1 | const WAS_VALIDATED_CLASS = 'was-validated'
2 | export default class View {
3 | #forms = document.querySelectorAll('.needs-validation')
4 | #title = document.querySelector('#title')
5 | #cardList = document.querySelector('#card-list')
6 |
7 | #submitFn = () => { }
8 |
9 | constructor() { }
10 |
11 | initialize() {
12 | for (const form of this.#forms) {
13 | form.addEventListener('submit', this.#onSubmit(form), false)
14 | }
15 | }
16 |
17 | /**
18 | * @param {HTMLFormElement} form
19 | */
20 | #onSubmit(form) {
21 | /**
22 | * @param {Event} event
23 | */
24 | return (event) => {
25 | form.classList.add(WAS_VALIDATED_CLASS)
26 | event.preventDefault()
27 | event.stopPropagation()
28 |
29 | if (!form.checkValidity()) {
30 | const element = [...form.elements].find(item => !item.checkValidity())
31 | element?.focus()
32 | return;
33 | }
34 |
35 | form.classList.remove(WAS_VALIDATED_CLASS)
36 |
37 | this.#title.focus()
38 |
39 | this.#submitFn({
40 | title: form.title.value,
41 | imageUrl: form.imageUrl.value
42 | })
43 |
44 | form.reset()
45 | }
46 | }
47 | /**
48 | * @param {function} onSubmit
49 | */
50 | configureOnSubmit(onSubmit) {
51 | this.#submitFn = onSubmit
52 | }
53 |
54 | /**
55 | * @param {object[]} items
56 | * @param {string} items[].title
57 | * @param {string} items[].imageUrl
58 | */
59 | updateList(items) {
60 | const template = ({ imageUrl, title }) => `
61 |
62 |
63 |
64 |
67 |
68 | ${title}
69 |
70 |
71 |
72 |
73 | `
74 |
75 | this.#cardList.innerHTML += items.map(template).join('')
76 | }
77 | }
--------------------------------------------------------------------------------