diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2661515 --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Specify your website URL +# APP_SITE=https://count.getloli.com + +# Application port +APP_PORT=3000 + +# Database type: either 'sqlite' or 'mongodb' +DB_TYPE=sqlite + +# If using MongoDB, provide the connection string +# DB_URL=mongodb://127.0.0.1:27017 + +# Database write interval in seconds (0 for real-time) +DB_INTERVAL=60 + +# Log level: either 'debug' | 'info' | 'warn' | 'error' | 'none' +LOG_LEVEL=debug + +# Google Analytics `G-Tag` ID +# GA_ID=G-XXXX diff --git a/.github/ISSUE_TEMPLATE/contribute-theme.yml b/.github/ISSUE_TEMPLATE/contribute-theme.yml new file mode 100644 index 0000000..895d131 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/contribute-theme.yml @@ -0,0 +1,39 @@ +name: Contribute Themes +description: Contribute themes for everyone to use. +title: "[Theme]: " +labels: ["theme"] +body: + - type: markdown + attributes: + value: | + ### Contribute themes is welcome! Please read this brief tips to get started: + + - Create images of numbers from *0-9*, file type can be *jpeg, png, gif, webp*, + - Then named these images as *0.gif, 1.gif, ..., 9.gif* (or other extension). + - Try to ensure that each image has an equal height, and that the image size is not too large. + > Online image compressor: [TinyPNG](https://tinypng.com/) [Ezgif](https://ezgif.com/optimize) + - Then pack these images into a ZIP file. + + Additionally, please refrain from using political figures or controversial figures or characters. + - type: checkboxes + id: tips + attributes: + label: Tips + options: + - label: I have read and understood the tips above + required: true + - type: input + id: name + attributes: + label: Theme Name + description: Describe this theme with a short name that can include letters, numbers, and hyphens + placeholder: ex. awesome + validations: + required: true + - type: textarea + id: theme + attributes: + label: Preview and ZIP file + description: Upload the theme preview, and ZIP file + validations: + required: true diff --git a/.gitignore b/.gitignore index b329f95..b079941 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ count.db # misc .DS_Store +.env .env.local .env.development.local .env.test.local diff --git a/README.md b/README.md index a3d8cb3..99cf311 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,245 @@ Multiple styles of Moe-Counters to choose from ##### gelbooru ![Gelbooru](https://count.getloli.com/get/@demo?theme=gelbooru) +======= +# *Moe Counter!* + +多种风格可选的萌萌计数器 + +

+ + Moe Counter! + +

+ +

+ + + + + Featured|HelloGitHub + + +

+ +
+

More theme

+ +### *[Contribute themes is welcome!](https://github.com/journey-ad/Moe-Counter/issues/new?assignees=&labels=theme&projects=&template=contribute-theme.yml&title=%5BTheme%5D%3A+)* + +##### 3d-num + +![3d-num](https://count.getloli.com/@demo?theme=3d-num) + +##### ai-1 + +![ai-1](https://count.getloli.com/@demo?theme=ai-1) + +##### asoul + +![asoul](https://count.getloli.com/@demo?theme=asoul) + +##### booru-ffsr + +![booru-ffsr](https://count.getloli.com/@demo?theme=booru-ffsr) + +##### booru-helltaker + +![booru-helltaker](https://count.getloli.com/@demo?theme=booru-helltaker) + +##### booru-huggboo + +![booru-huggboo](https://count.getloli.com/@demo?theme=booru-huggboo) + +##### booru-jaypee + +![booru-jaypee](https://count.getloli.com/@demo?theme=booru-jaypee) + +##### booru-koe + +![booru-koe](https://count.getloli.com/@demo?theme=booru-koe) + +##### booru-lewd + +![booru-lewd](https://count.getloli.com/@demo?theme=booru-lewd) + +##### booru-lisu + +![booru-lisu](https://count.getloli.com/@demo?theme=booru-lisu) + +##### booru-mjg + +![booru-mjg](https://count.getloli.com/@demo?theme=booru-mjg) + +##### booru-mof + +![booru-mof](https://count.getloli.com/@demo?theme=booru-mof) + +##### booru-nandroid + +![booru-nandroid](https://count.getloli.com/@demo?theme=booru-nandroid) + +##### booru-qualityhentais + +![booru-qualityhentais](https://count.getloli.com/@demo?theme=booru-qualityhentais) + +##### booru-r6gdrawfriends + +![booru-r6gdrawfriends](https://count.getloli.com/@demo?theme=booru-r6gdrawfriends) + +##### booru-rfck + +![booru-rfck](https://count.getloli.com/@demo?theme=booru-rfck) + +##### booru-smtg + +![booru-smtg](https://count.getloli.com/@demo?theme=booru-smtg) + +##### booru-snyde + +![booru-snyde](https://count.getloli.com/@demo?theme=booru-snyde) + +##### booru-the-collection + +![booru-the-collection](https://count.getloli.com/@demo?theme=booru-the-collection) + +##### booru-touhoulat + +![booru-touhoulat](https://count.getloli.com/@demo?theme=booru-touhoulat) + +##### booru-townofgravityfalls + +![booru-townofgravityfalls](https://count.getloli.com/@demo?theme=booru-townofgravityfalls) + +##### booru-twifanartsfw + +![booru-twifanartsfw](https://count.getloli.com/@demo?theme=booru-twifanartsfw) + +##### booru-ve + +![booru-ve](https://count.getloli.com/@demo?theme=booru-ve) + +##### booru-vivi + +![booru-vivi](https://count.getloli.com/@demo?theme=booru-vivi) + +##### booru-vp + +![booru-vp](https://count.getloli.com/@demo?theme=booru-vp) + +##### booru-yuyuyui + +![booru-yuyuyui](https://count.getloli.com/@demo?theme=booru-yuyuyui) + +##### capoo-1 + +![capoo-1](https://count.getloli.com/@demo?theme=capoo-1) + +##### capoo-2 + +![capoo-2](https://count.getloli.com/@demo?theme=capoo-2) + +##### e621 + +![e621](https://count.getloli.com/@demo?theme=e621) + +##### food + +![food](https://count.getloli.com/@demo?theme=food) + +##### gelbooru + +![gelbooru](https://count.getloli.com/@demo?theme=gelbooru) + +##### green + +![green](https://count.getloli.com/@demo?theme=green) + +##### kasuterura-1 + +![kasuterura-1](https://count.getloli.com/@demo?theme=kasuterura-1) + +##### kasuterura-2 + +![kasuterura-2](https://count.getloli.com/@demo?theme=kasuterura-2) + +##### kasuterura-3 + +![kasuterura-3](https://count.getloli.com/@demo?theme=kasuterura-3) + +##### kasuterura-4 + +![kasuterura-4](https://count.getloli.com/@demo?theme=kasuterura-4) + +##### kyun + +![kyun](https://count.getloli.com/@demo?theme=kyun) + +##### love-and-deepspace + +![love-and-deepspace](https://count.getloli.com/@demo?theme=love-and-deepspace) + +##### minecraft + +![minecraft](https://count.getloli.com/@demo?theme=minecraft) + +##### moebooru + +![moebooru](https://count.getloli.com/@demo?theme=moebooru) + +##### morden-num + +![morden-num](https://count.getloli.com/@demo?theme=morden-num) + +##### nixietube-1 + +![nixietube-1](https://count.getloli.com/@demo?theme=nixietube-1) + +##### nixietube-2 + +![nixietube-2](https://count.getloli.com/@demo?theme=nixietube-2) + +##### normal-1 + +![normal-1](https://count.getloli.com/@demo?theme=normal-1) + +##### normal-2 + +![normal-2](https://count.getloli.com/@demo?theme=normal-2) + +##### original-new + +![original-new](https://count.getloli.com/@demo?theme=original-new) + +##### original-old + +![original-old](https://count.getloli.com/@demo?theme=original-old) + +##### rule34 + +![rule34](https://count.getloli.com/@demo?theme=rule34) + +##### shimmie2 + +![shimmie2](https://count.getloli.com/@demo?theme=shimmie2) + +##### sketch-1 + +![sketch-1](https://count.getloli.com/@demo?theme=sketch-1) + +##### sketch-2 + +![sketch-2](https://count.getloli.com/@demo?theme=sketch-2) + +
## Demo [https://count.getloli.com](https://count.getloli.com) +## How to use + +For information on counter usage and configuration, refer to the [demo website](https://count.getloli.com). + ## Usage ### Install @@ -38,14 +273,25 @@ Multiple styles of Moe-Counters to choose from - Just hit the **Fork** button - And hit the **Run** button +#### Run on Glitch + +- Open [Glitch project](https://glitch.com/~moe-counter-api) +- Just hit the **Remix your own** button +- That's it! + #### Deploying on your own server ```shell $ git clone https://github.com/journey-ad/Moe-Counter.git $ cd Moe-Counter + $ yarn install $ yarn start + +$ pnpm install + +$ pnpm run start ``` ### Configuration @@ -72,6 +318,30 @@ Replit can use Secrets, check [documentation](https://docs.replit.com/programmin ``` DB_URL="mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count" +======= +Set `.env` file to specify the environment variables. *[.env.example](./.env.example)* + +```dosini +# Specify your website URL +# APP_SITE=https://count.getloli.com + +# Application port +APP_PORT=3000 + +# Database type: either 'sqlite' or 'mongodb' +DB_TYPE=sqlite + +# If using MongoDB, provide the connection string +# DB_URL=mongodb://127.0.0.1:27017 + +# Database write interval in seconds (0 for real-time) +DB_INTERVAL=60 + +# Log level: either 'debug' | 'info' | 'warn' | 'error' | 'none' +LOG_LEVEL=debug + +# Google Analytics `G-Tag` ID +# GA_ID=G-XXXX ``` ## Credits @@ -86,3 +356,24 @@ DB_URL="mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count" ## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fjourney-ad%2FMoe-Counter.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fjourney-ad%2FMoe-Counter?ref=badge_large) +======= +* [Glitch](https://glitch.com/) +* [A-SOUL_Official](https://space.bilibili.com/703007996) +* [moebooru](https://github.com/moebooru/moebooru) +* gelbooru.com NSFW +* [Icons8](https://icons8.com/icon/80355/star) +* *And all booru site...* + +## License + +[MIT License](./LICENSE), excluding all themes + +--- + + + + + + Star History Chart + + diff --git a/assets/img/back-to-top.png b/assets/img/back-to-top.png new file mode 100644 index 0000000..2aec0d6 Binary files /dev/null and b/assets/img/back-to-top.png differ diff --git a/assets/img/failed.svg b/assets/img/failed.svg new file mode 100644 index 0000000..35a9920 --- /dev/null +++ b/assets/img/failed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/loading.svg b/assets/img/loading.svg new file mode 100644 index 0000000..023b81b --- /dev/null +++ b/assets/img/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/script.js b/assets/script.js new file mode 100644 index 0000000..5c27b3d --- /dev/null +++ b/assets/script.js @@ -0,0 +1,208 @@ +(function () { + const btn = document.getElementById('get'); + const img = document.getElementById('result'); + const code = document.getElementById('code'); + + const elements = { + name: document.getElementById('name'), + theme: document.getElementById('theme'), + padding: document.getElementById('padding'), + offset: document.getElementById('offset'), + align: document.getElementById('align'), + scale: document.getElementById('scale'), + pixelated: document.getElementById('pixelated'), + darkmode: document.getElementById('darkmode'), + num: document.getElementById('num'), + prefix: document.getElementById('prefix') + }; + + btn.addEventListener('click', throttle(handleButtonClick, 500)); + code.addEventListener('click', selectCodeText); + + const mainTitle = document.querySelector('#main_title i'); + const themes = document.querySelector('#themes'); + const moreTheme = document.querySelector('#more_theme'); + + mainTitle.addEventListener('click', throttle(() => party.sparkles(document.documentElement, { count: party.variation.range(40, 100) }), 1000)); + moreTheme.addEventListener('click', scrollToThemes); + + function handleButtonClick() { + const { name, theme, padding, offset, scale, pixelated, darkmode, num } = elements; + const nameValue = name.value.trim(); + + if (!nameValue) { + alert('Please input counter name.'); + return; + } + + const params = { + name: nameValue, + theme: theme.value || 'moebooru', + padding: padding.value || '7', + offset: offset.value || '0', + align: align.value || 'top', + scale: scale.value || '1', + pixelated: pixelated.checked ? '1' : '0', + darkmode: darkmode.value || 'auto' + }; + + if (num.value > 0) { + params.num = num.value; + } + if (prefix.value !== '') { + params.prefix = prefix.value; + } + + const query = new URLSearchParams(params).toString(); + const imgSrc = `${__global_data.site}/@${nameValue}?${query}`; + + img.src = `${imgSrc}&_=${Math.random()}`; + btn.setAttribute('disabled', ''); + + img.onload = () => { + img.scrollIntoView({ block: 'start', behavior: 'smooth' }); + code.textContent = imgSrc; + code.style.visibility = 'visible'; + party.confetti(btn, { count: party.variation.range(20, 40) }); + btn.removeAttribute('disabled'); + }; + + img.onerror = async () => { + try { + const res = await fetch(img.src); + if (!res.ok) { + const { message } = await res.json(); + alert(message); + } + } finally { + btn.removeAttribute('disabled'); + } + }; + } + + function selectCodeText(e) { + e.preventDefault(); + e.stopPropagation(); + + const target = e.target; + const range = document.createRange(); + const selection = window.getSelection(); + + range.selectNodeContents(target); + selection.removeAllRanges(); + selection.addRange(range); + } + + function scrollToThemes() { + if (!themes.hasAttribute('open')) { + party.sparkles(moreTheme.querySelector('h3'), { count: party.variation.range(20, 40) }); + themes.scrollIntoView({ block: 'start', behavior: 'smooth' }); + } + } + + function throttle(fn, threshold = 250) { + let last, deferTimer; + return function (...args) { + const now = Date.now(); + if (last && now < last + threshold) { + clearTimeout(deferTimer); + deferTimer = setTimeout(() => { + last = now; + fn.apply(this, args); + }, threshold); + } else { + last = now; + fn.apply(this, args); + } + }; + } +})(); + +// Lazy Load +(() => { + function lazyLoad(options = {}) { + const { selector = 'img[data-src]:not([src])', loading = '', failed = '', rootMargin = '200px', threshold = 0.01 } = options; + + const images = document.querySelectorAll(selector); + + const observer = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const img = entry.target; + observer.unobserve(img); + + img.onerror = failed ? () => { img.src = failed; img.setAttribute('data-failed', ''); } : null; + img.src = img.getAttribute('data-src'); + img.removeAttribute('data-loading'); + } + }); + }, { rootMargin, threshold }); + + images.forEach(img => { + if (loading) { + img.src = loading; + img.setAttribute('data-loading', ''); + } + observer.observe(img); + }); + } + + const lazyLoadOptions = { + selector: 'img[data-src]:not([src])', + loading: `${__global_data.site}/img/loading.svg`, + failed: `${__global_data.site}/img/failed.svg`, + rootMargin: '200px', + threshold: 0.01 + }; + + document.readyState === 'loading' + ? document.addEventListener("DOMContentLoaded", () => lazyLoad(lazyLoadOptions)) + : lazyLoad(lazyLoadOptions); +})(); + +// Back to top +(() => { + let isShow = false, lock = false; + const btn = document.querySelector('.back-to-top'); + + const handleScroll = () => { + if (lock) return; + if (document.body.scrollTop >= 1000) { + if (!isShow) { + btn.classList.add('load'); + isShow = true; + } + } else if (isShow) { + btn.classList.remove('load'); + isShow = false; + } + }; + + const handleClick = () => { + lock = true; + btn.classList.add('ani-leave'); + window.scrollTo({ top: 0, behavior: 'smooth' }); + + setTimeout(() => { + btn.classList.remove('ani-leave'); + btn.classList.add('leaved'); + }, 390); + + setTimeout(() => btn.classList.add('ending'), 120); + setTimeout(() => btn.classList.remove('load'), 1500); + + setTimeout(() => { + lock = false; + isShow = false; + btn.classList.remove('leaved', 'ending'); + }, 2000); + }; + + window.addEventListener('scroll', handleScroll); + btn.addEventListener('click', handleClick); +})(); + +// Prevent safari gesture +(() => { + document.addEventListener('gesturestart', e => e.preventDefault()); +})(); diff --git a/assets/style.css b/assets/style.css deleted file mode 100644 index 7a37b12..0000000 --- a/assets/style.css +++ /dev/null @@ -1,5 +0,0 @@ -@media screen and (max-width: 900px) { - iframe { - display: none; - } -} \ No newline at end of file diff --git a/assets/style.less b/assets/style.less new file mode 100644 index 0000000..eeac11e --- /dev/null +++ b/assets/style.less @@ -0,0 +1,243 @@ +html { + scroll-padding: 50px 0; +} + +#main_title { + margin-top: 0.5em; +} + +#themes { + margin-top: 2em; + + & > p { + margin: 0; + } +} + +#more_theme h3 { + display: inline-block; + margin: 0; + cursor: pointer; +} + +#get { + margin-bottom: 1em; +} + +#code { + visibility: hidden; + display: inline-block; + margin-bottom: 1em; +} + +#result { + display: block; +} + +.github { + margin-top: 2em; +} + +code { + word-break: break-all; +} + +input[type="checkbox"][role="switch"] { + height: 0; + width: 0; + visibility: hidden; + + & + label { + cursor: pointer; + width: 3.6em; + height: 1.8em; + margin: 0; + background: grey; + display: block; + border-radius: 1.8em; + position: relative; + transition: 0.3s; + + &:active:after { + width: 2.34em; + } + + &:after { + content: ""; + position: absolute; + top: 0.1em; + left: 0.1em; + width: 1.6em; + height: 1.6em; + background: #fff; + border-radius: 1.6em; + transition: 0.3s; + } + + span { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 12.5%; + font-size: 10px; + + &::before, + &::after { + display: block; + color: #fff; + font-weight: bold; + box-sizing: border-box; + } + + &::before { + content: "ON"; + } + + &::after { + content: "OFF"; + color: #ccc; + } + } + } + + &:checked + label { + background: var(--b-btn-bg); + + &:after { + left: calc(100% - 0.1em); + transform: translateX(-100%); + } + } +} + +img[data-loading], +img[data-failed] { + width: 40px; +} + +details > summary { + list-style: none; + + &::-webkit-details-marker, + &::marker { + display: none; + } +} + +summary::before { + border-bottom: 6px solid transparent; + border-left: 10px solid var(--b-txt); + border-top: 6px solid transparent; + content: ""; + display: inline-block; + height: 0; + margin-right: 10px; + position: relative; + transition: 0.2s; + width: 0; +} + +details[open] summary::before { + transform: rotate(90deg); +} + +h2, +h3, +h4, +h5 { + margin: 1.5em 0 0.6em; +} + +table { + tr { + .caption { + margin: 1em 0 0; + } + } +} + +.back-to-top { + position: fixed; + z-index: 2; + right: -108px; + bottom: 0; + width: 108px; + height: 150px; + background: url("./img/back-to-top.png?v=1") no-repeat 0 0; + background-size: 108px 450px; + opacity: 0.6; + transition: opacity 0.3s, right 0.8s; + cursor: pointer; + + &:hover { + background-position: 0 -150px; + opacity: 1; + } + + &::after { + content: ""; + position: fixed; + z-index: 2; + right: 0; + bottom: 0; + width: 108px; + height: 150px; + background: url("./img/back-to-top.png?v=1") no-repeat 0 0; + background-size: 108px 450px; + background-position: 0 -300px; + transition: opacity 0.3s; + opacity: 0; + pointer-events: none; + } + + &.load { + right: 0; + } + + &.ani-leave { + background-position: 0 -150px; + animation: ani-leave 390ms ease-in-out forwards; + + @keyframes ani-leave { + 0% { + transform: translateX(0); + } + + 100% { + transform: translateX(108px); + } + } + } + + &.leaved, + &.ending { + pointer-events: none; + } + + &.leaved { + background: none; + transition: none; + } + + &.ending::after { + opacity: 1; + transition-delay: 0.35s; + } +} + +@media screen and (min-width: 800px) { + body { + max-width: ~"min(90%, 800px)"; + } +} + +@media screen and (max-width: 900px) { + iframe { + display: none; + } +} diff --git a/assets/theme/3d-num/0.gif b/assets/theme/3d-num/0.gif new file mode 100644 index 0000000..f8bf0fd Binary files /dev/null and b/assets/theme/3d-num/0.gif differ diff --git a/assets/theme/3d-num/1.gif b/assets/theme/3d-num/1.gif new file mode 100644 index 0000000..4acaae8 Binary files /dev/null and b/assets/theme/3d-num/1.gif differ diff --git a/assets/theme/3d-num/2.gif b/assets/theme/3d-num/2.gif new file mode 100644 index 0000000..0640b3f Binary files /dev/null and b/assets/theme/3d-num/2.gif differ diff --git a/assets/theme/3d-num/3.gif b/assets/theme/3d-num/3.gif new file mode 100644 index 0000000..7a9e794 Binary files /dev/null and b/assets/theme/3d-num/3.gif differ diff --git a/assets/theme/3d-num/4.gif b/assets/theme/3d-num/4.gif new file mode 100644 index 0000000..822e235 Binary files /dev/null and b/assets/theme/3d-num/4.gif differ diff --git a/assets/theme/3d-num/5.gif b/assets/theme/3d-num/5.gif new file mode 100644 index 0000000..7bba7c1 Binary files /dev/null and b/assets/theme/3d-num/5.gif differ diff --git a/assets/theme/3d-num/6.gif b/assets/theme/3d-num/6.gif new file mode 100644 index 0000000..7839936 Binary files /dev/null and b/assets/theme/3d-num/6.gif differ diff --git a/assets/theme/3d-num/7.gif b/assets/theme/3d-num/7.gif new file mode 100644 index 0000000..de7aa9e Binary files /dev/null and b/assets/theme/3d-num/7.gif differ diff --git a/assets/theme/3d-num/8.gif b/assets/theme/3d-num/8.gif new file mode 100644 index 0000000..922efa3 Binary files /dev/null and b/assets/theme/3d-num/8.gif differ diff --git a/assets/theme/3d-num/9.gif b/assets/theme/3d-num/9.gif new file mode 100644 index 0000000..3d28498 Binary files /dev/null and b/assets/theme/3d-num/9.gif differ diff --git a/assets/theme/ai-1/0.png b/assets/theme/ai-1/0.png new file mode 100644 index 0000000..fced22b Binary files /dev/null and b/assets/theme/ai-1/0.png differ diff --git a/assets/theme/ai-1/1.png b/assets/theme/ai-1/1.png new file mode 100644 index 0000000..2fdd640 Binary files /dev/null and b/assets/theme/ai-1/1.png differ diff --git a/assets/theme/ai-1/2.png b/assets/theme/ai-1/2.png new file mode 100644 index 0000000..db4bb49 Binary files /dev/null and b/assets/theme/ai-1/2.png differ diff --git a/assets/theme/ai-1/3.png b/assets/theme/ai-1/3.png new file mode 100644 index 0000000..36a8b11 Binary files /dev/null and b/assets/theme/ai-1/3.png differ diff --git a/assets/theme/ai-1/4.png b/assets/theme/ai-1/4.png new file mode 100644 index 0000000..5170f43 Binary files /dev/null and b/assets/theme/ai-1/4.png differ diff --git a/assets/theme/ai-1/5.png b/assets/theme/ai-1/5.png new file mode 100644 index 0000000..91698b3 Binary files /dev/null and b/assets/theme/ai-1/5.png differ diff --git a/assets/theme/ai-1/6.png b/assets/theme/ai-1/6.png new file mode 100644 index 0000000..082fad1 Binary files /dev/null and b/assets/theme/ai-1/6.png differ diff --git a/assets/theme/ai-1/7.png b/assets/theme/ai-1/7.png new file mode 100644 index 0000000..cbe848d Binary files /dev/null and b/assets/theme/ai-1/7.png differ diff --git a/assets/theme/ai-1/8.png b/assets/theme/ai-1/8.png new file mode 100644 index 0000000..4e049b2 Binary files /dev/null and b/assets/theme/ai-1/8.png differ diff --git a/assets/theme/ai-1/9.png b/assets/theme/ai-1/9.png new file mode 100644 index 0000000..126b1a2 Binary files /dev/null and b/assets/theme/ai-1/9.png differ diff --git a/assets/theme/booru-ffsr/0.gif b/assets/theme/booru-ffsr/0.gif new file mode 100644 index 0000000..b56947a Binary files /dev/null and b/assets/theme/booru-ffsr/0.gif differ diff --git a/assets/theme/booru-ffsr/1.gif b/assets/theme/booru-ffsr/1.gif new file mode 100644 index 0000000..8338811 Binary files /dev/null and b/assets/theme/booru-ffsr/1.gif differ diff --git a/assets/theme/booru-ffsr/2.gif b/assets/theme/booru-ffsr/2.gif new file mode 100644 index 0000000..db34ac4 Binary files /dev/null and b/assets/theme/booru-ffsr/2.gif differ diff --git a/assets/theme/booru-ffsr/3.gif b/assets/theme/booru-ffsr/3.gif new file mode 100644 index 0000000..900e836 Binary files /dev/null and b/assets/theme/booru-ffsr/3.gif differ diff --git a/assets/theme/booru-ffsr/4.gif b/assets/theme/booru-ffsr/4.gif new file mode 100644 index 0000000..d598a15 Binary files /dev/null and b/assets/theme/booru-ffsr/4.gif differ diff --git a/assets/theme/booru-ffsr/5.gif b/assets/theme/booru-ffsr/5.gif new file mode 100644 index 0000000..799afe7 Binary files /dev/null and b/assets/theme/booru-ffsr/5.gif differ diff --git a/assets/theme/booru-ffsr/6.gif b/assets/theme/booru-ffsr/6.gif new file mode 100644 index 0000000..23ff5ca Binary files /dev/null and b/assets/theme/booru-ffsr/6.gif differ diff --git a/assets/theme/booru-ffsr/7.gif b/assets/theme/booru-ffsr/7.gif new file mode 100644 index 0000000..10b2f2f Binary files /dev/null and b/assets/theme/booru-ffsr/7.gif differ diff --git a/assets/theme/booru-ffsr/8.gif b/assets/theme/booru-ffsr/8.gif new file mode 100644 index 0000000..02c530b Binary files /dev/null and b/assets/theme/booru-ffsr/8.gif differ diff --git a/assets/theme/booru-ffsr/9.gif b/assets/theme/booru-ffsr/9.gif new file mode 100644 index 0000000..a886827 Binary files /dev/null and b/assets/theme/booru-ffsr/9.gif differ diff --git a/assets/theme/booru-helltaker/0.gif b/assets/theme/booru-helltaker/0.gif new file mode 100644 index 0000000..112ae96 Binary files /dev/null and b/assets/theme/booru-helltaker/0.gif differ diff --git a/assets/theme/booru-helltaker/1.gif b/assets/theme/booru-helltaker/1.gif new file mode 100644 index 0000000..8993c2f Binary files /dev/null and b/assets/theme/booru-helltaker/1.gif differ diff --git a/assets/theme/booru-helltaker/2.gif b/assets/theme/booru-helltaker/2.gif new file mode 100644 index 0000000..8722806 Binary files /dev/null and b/assets/theme/booru-helltaker/2.gif differ diff --git a/assets/theme/booru-helltaker/3.gif b/assets/theme/booru-helltaker/3.gif new file mode 100644 index 0000000..71e6aa6 Binary files /dev/null and b/assets/theme/booru-helltaker/3.gif differ diff --git a/assets/theme/booru-helltaker/4.gif b/assets/theme/booru-helltaker/4.gif new file mode 100644 index 0000000..e952af7 Binary files /dev/null and b/assets/theme/booru-helltaker/4.gif differ diff --git a/assets/theme/booru-helltaker/5.gif b/assets/theme/booru-helltaker/5.gif new file mode 100644 index 0000000..461f390 Binary files /dev/null and b/assets/theme/booru-helltaker/5.gif differ diff --git a/assets/theme/booru-helltaker/6.gif b/assets/theme/booru-helltaker/6.gif new file mode 100644 index 0000000..de44f5a Binary files /dev/null and b/assets/theme/booru-helltaker/6.gif differ diff --git a/assets/theme/booru-helltaker/7.gif b/assets/theme/booru-helltaker/7.gif new file mode 100644 index 0000000..8e30eb4 Binary files /dev/null and b/assets/theme/booru-helltaker/7.gif differ diff --git a/assets/theme/booru-helltaker/8.gif b/assets/theme/booru-helltaker/8.gif new file mode 100644 index 0000000..4db4abd Binary files /dev/null and b/assets/theme/booru-helltaker/8.gif differ diff --git a/assets/theme/booru-helltaker/9.gif b/assets/theme/booru-helltaker/9.gif new file mode 100644 index 0000000..679cc9b Binary files /dev/null and b/assets/theme/booru-helltaker/9.gif differ diff --git a/assets/theme/booru-huggboo/0.gif b/assets/theme/booru-huggboo/0.gif new file mode 100644 index 0000000..06118ad Binary files /dev/null and b/assets/theme/booru-huggboo/0.gif differ diff --git a/assets/theme/booru-huggboo/1.gif b/assets/theme/booru-huggboo/1.gif new file mode 100644 index 0000000..744c363 Binary files /dev/null and b/assets/theme/booru-huggboo/1.gif differ diff --git a/assets/theme/booru-huggboo/2.gif b/assets/theme/booru-huggboo/2.gif new file mode 100644 index 0000000..79452e3 Binary files /dev/null and b/assets/theme/booru-huggboo/2.gif differ diff --git a/assets/theme/booru-huggboo/3.gif b/assets/theme/booru-huggboo/3.gif new file mode 100644 index 0000000..e74a450 Binary files /dev/null and b/assets/theme/booru-huggboo/3.gif differ diff --git a/assets/theme/booru-huggboo/4.gif b/assets/theme/booru-huggboo/4.gif new file mode 100644 index 0000000..26c20d4 Binary files /dev/null and b/assets/theme/booru-huggboo/4.gif differ diff --git a/assets/theme/booru-huggboo/5.gif b/assets/theme/booru-huggboo/5.gif new file mode 100644 index 0000000..9636b98 Binary files /dev/null and b/assets/theme/booru-huggboo/5.gif differ diff --git a/assets/theme/booru-huggboo/6.gif b/assets/theme/booru-huggboo/6.gif new file mode 100644 index 0000000..c0c4a16 Binary files /dev/null and b/assets/theme/booru-huggboo/6.gif differ diff --git a/assets/theme/booru-huggboo/7.gif b/assets/theme/booru-huggboo/7.gif new file mode 100644 index 0000000..d43c771 Binary files /dev/null and b/assets/theme/booru-huggboo/7.gif differ diff --git a/assets/theme/booru-huggboo/8.gif b/assets/theme/booru-huggboo/8.gif new file mode 100644 index 0000000..3721ed5 Binary files /dev/null and b/assets/theme/booru-huggboo/8.gif differ diff --git a/assets/theme/booru-huggboo/9.gif b/assets/theme/booru-huggboo/9.gif new file mode 100644 index 0000000..f1f224d Binary files /dev/null and b/assets/theme/booru-huggboo/9.gif differ diff --git a/assets/theme/booru-jaypee/0.gif b/assets/theme/booru-jaypee/0.gif new file mode 100644 index 0000000..576c6aa Binary files /dev/null and b/assets/theme/booru-jaypee/0.gif differ diff --git a/assets/theme/booru-jaypee/1.gif b/assets/theme/booru-jaypee/1.gif new file mode 100644 index 0000000..5490a01 Binary files /dev/null and b/assets/theme/booru-jaypee/1.gif differ diff --git a/assets/theme/booru-jaypee/2.gif b/assets/theme/booru-jaypee/2.gif new file mode 100644 index 0000000..276a535 Binary files /dev/null and b/assets/theme/booru-jaypee/2.gif differ diff --git a/assets/theme/booru-jaypee/3.gif b/assets/theme/booru-jaypee/3.gif new file mode 100644 index 0000000..2f0e693 Binary files /dev/null and b/assets/theme/booru-jaypee/3.gif differ diff --git a/assets/theme/booru-jaypee/4.gif b/assets/theme/booru-jaypee/4.gif new file mode 100644 index 0000000..b78acde Binary files /dev/null and b/assets/theme/booru-jaypee/4.gif differ diff --git a/assets/theme/booru-jaypee/5.gif b/assets/theme/booru-jaypee/5.gif new file mode 100644 index 0000000..cb4ee1a Binary files /dev/null and b/assets/theme/booru-jaypee/5.gif differ diff --git a/assets/theme/booru-jaypee/6.gif b/assets/theme/booru-jaypee/6.gif new file mode 100644 index 0000000..176217b Binary files /dev/null and b/assets/theme/booru-jaypee/6.gif differ diff --git a/assets/theme/booru-jaypee/7.gif b/assets/theme/booru-jaypee/7.gif new file mode 100644 index 0000000..664cb4c Binary files /dev/null and b/assets/theme/booru-jaypee/7.gif differ diff --git a/assets/theme/booru-jaypee/8.gif b/assets/theme/booru-jaypee/8.gif new file mode 100644 index 0000000..4eb459c Binary files /dev/null and b/assets/theme/booru-jaypee/8.gif differ diff --git a/assets/theme/booru-jaypee/9.gif b/assets/theme/booru-jaypee/9.gif new file mode 100644 index 0000000..f7f1dba Binary files /dev/null and b/assets/theme/booru-jaypee/9.gif differ diff --git a/assets/theme/booru-koe/0.gif b/assets/theme/booru-koe/0.gif new file mode 100644 index 0000000..b4f7357 Binary files /dev/null and b/assets/theme/booru-koe/0.gif differ diff --git a/assets/theme/booru-koe/1.gif b/assets/theme/booru-koe/1.gif new file mode 100644 index 0000000..e0bd727 Binary files /dev/null and b/assets/theme/booru-koe/1.gif differ diff --git a/assets/theme/booru-koe/2.gif b/assets/theme/booru-koe/2.gif new file mode 100644 index 0000000..0480e41 Binary files /dev/null and b/assets/theme/booru-koe/2.gif differ diff --git a/assets/theme/booru-koe/3.gif b/assets/theme/booru-koe/3.gif new file mode 100644 index 0000000..813c4fa Binary files /dev/null and b/assets/theme/booru-koe/3.gif differ diff --git a/assets/theme/booru-koe/4.gif b/assets/theme/booru-koe/4.gif new file mode 100644 index 0000000..69fdfe0 Binary files /dev/null and b/assets/theme/booru-koe/4.gif differ diff --git a/assets/theme/booru-koe/5.gif b/assets/theme/booru-koe/5.gif new file mode 100644 index 0000000..2f7382c Binary files /dev/null and b/assets/theme/booru-koe/5.gif differ diff --git a/assets/theme/booru-koe/6.gif b/assets/theme/booru-koe/6.gif new file mode 100644 index 0000000..d07dd74 Binary files /dev/null and b/assets/theme/booru-koe/6.gif differ diff --git a/assets/theme/booru-koe/7.gif b/assets/theme/booru-koe/7.gif new file mode 100644 index 0000000..3aef98d Binary files /dev/null and b/assets/theme/booru-koe/7.gif differ diff --git a/assets/theme/booru-koe/8.gif b/assets/theme/booru-koe/8.gif new file mode 100644 index 0000000..5fc0447 Binary files /dev/null and b/assets/theme/booru-koe/8.gif differ diff --git a/assets/theme/booru-koe/9.gif b/assets/theme/booru-koe/9.gif new file mode 100644 index 0000000..f0a08c1 Binary files /dev/null and b/assets/theme/booru-koe/9.gif differ diff --git a/assets/theme/booru-lewd/0.gif b/assets/theme/booru-lewd/0.gif new file mode 100644 index 0000000..3512b00 Binary files /dev/null and b/assets/theme/booru-lewd/0.gif differ diff --git a/assets/theme/booru-lewd/1.gif b/assets/theme/booru-lewd/1.gif new file mode 100644 index 0000000..b292edd Binary files /dev/null and b/assets/theme/booru-lewd/1.gif differ diff --git a/assets/theme/booru-lewd/2.gif b/assets/theme/booru-lewd/2.gif new file mode 100644 index 0000000..455dae3 Binary files /dev/null and b/assets/theme/booru-lewd/2.gif differ diff --git a/assets/theme/booru-lewd/3.gif b/assets/theme/booru-lewd/3.gif new file mode 100644 index 0000000..6d266c8 Binary files /dev/null and b/assets/theme/booru-lewd/3.gif differ diff --git a/assets/theme/booru-lewd/4.gif b/assets/theme/booru-lewd/4.gif new file mode 100644 index 0000000..7dec2c2 Binary files /dev/null and b/assets/theme/booru-lewd/4.gif differ diff --git a/assets/theme/booru-lewd/5.gif b/assets/theme/booru-lewd/5.gif new file mode 100644 index 0000000..e89449d Binary files /dev/null and b/assets/theme/booru-lewd/5.gif differ diff --git a/assets/theme/booru-lewd/6.gif b/assets/theme/booru-lewd/6.gif new file mode 100644 index 0000000..3869b82 Binary files /dev/null and b/assets/theme/booru-lewd/6.gif differ diff --git a/assets/theme/booru-lewd/7.gif b/assets/theme/booru-lewd/7.gif new file mode 100644 index 0000000..5b29513 Binary files /dev/null and b/assets/theme/booru-lewd/7.gif differ diff --git a/assets/theme/booru-lewd/8.gif b/assets/theme/booru-lewd/8.gif new file mode 100644 index 0000000..e75867a Binary files /dev/null and b/assets/theme/booru-lewd/8.gif differ diff --git a/assets/theme/booru-lewd/9.gif b/assets/theme/booru-lewd/9.gif new file mode 100644 index 0000000..7c01747 Binary files /dev/null and b/assets/theme/booru-lewd/9.gif differ diff --git a/assets/theme/booru-lisu/0.gif b/assets/theme/booru-lisu/0.gif new file mode 100644 index 0000000..b402b58 Binary files /dev/null and b/assets/theme/booru-lisu/0.gif differ diff --git a/assets/theme/booru-lisu/1.gif b/assets/theme/booru-lisu/1.gif new file mode 100644 index 0000000..f16b963 Binary files /dev/null and b/assets/theme/booru-lisu/1.gif differ diff --git a/assets/theme/booru-lisu/2.gif b/assets/theme/booru-lisu/2.gif new file mode 100644 index 0000000..f3c6a2b Binary files /dev/null and b/assets/theme/booru-lisu/2.gif differ diff --git a/assets/theme/booru-lisu/3.gif b/assets/theme/booru-lisu/3.gif new file mode 100644 index 0000000..e537242 Binary files /dev/null and b/assets/theme/booru-lisu/3.gif differ diff --git a/assets/theme/booru-lisu/4.gif b/assets/theme/booru-lisu/4.gif new file mode 100644 index 0000000..d4ec013 Binary files /dev/null and b/assets/theme/booru-lisu/4.gif differ diff --git a/assets/theme/booru-lisu/5.gif b/assets/theme/booru-lisu/5.gif new file mode 100644 index 0000000..2015552 Binary files /dev/null and b/assets/theme/booru-lisu/5.gif differ diff --git a/assets/theme/booru-lisu/6.gif b/assets/theme/booru-lisu/6.gif new file mode 100644 index 0000000..11cd3d6 Binary files /dev/null and b/assets/theme/booru-lisu/6.gif differ diff --git a/assets/theme/booru-lisu/7.gif b/assets/theme/booru-lisu/7.gif new file mode 100644 index 0000000..3e7ed71 Binary files /dev/null and b/assets/theme/booru-lisu/7.gif differ diff --git a/assets/theme/booru-lisu/8.gif b/assets/theme/booru-lisu/8.gif new file mode 100644 index 0000000..de7effd Binary files /dev/null and b/assets/theme/booru-lisu/8.gif differ diff --git a/assets/theme/booru-lisu/9.gif b/assets/theme/booru-lisu/9.gif new file mode 100644 index 0000000..3d7ff09 Binary files /dev/null and b/assets/theme/booru-lisu/9.gif differ diff --git a/assets/theme/booru-mjg/0.gif b/assets/theme/booru-mjg/0.gif new file mode 100644 index 0000000..e8cc6e8 Binary files /dev/null and b/assets/theme/booru-mjg/0.gif differ diff --git a/assets/theme/booru-mjg/1.gif b/assets/theme/booru-mjg/1.gif new file mode 100644 index 0000000..fda5361 Binary files /dev/null and b/assets/theme/booru-mjg/1.gif differ diff --git a/assets/theme/booru-mjg/2.gif b/assets/theme/booru-mjg/2.gif new file mode 100644 index 0000000..d79f246 Binary files /dev/null and b/assets/theme/booru-mjg/2.gif differ diff --git a/assets/theme/booru-mjg/3.gif b/assets/theme/booru-mjg/3.gif new file mode 100644 index 0000000..f6feb1c Binary files /dev/null and b/assets/theme/booru-mjg/3.gif differ diff --git a/assets/theme/booru-mjg/4.gif b/assets/theme/booru-mjg/4.gif new file mode 100644 index 0000000..edbcb35 Binary files /dev/null and b/assets/theme/booru-mjg/4.gif differ diff --git a/assets/theme/booru-mjg/5.gif b/assets/theme/booru-mjg/5.gif new file mode 100644 index 0000000..2295251 Binary files /dev/null and b/assets/theme/booru-mjg/5.gif differ diff --git a/assets/theme/booru-mjg/6.gif b/assets/theme/booru-mjg/6.gif new file mode 100644 index 0000000..4424e7a Binary files /dev/null and b/assets/theme/booru-mjg/6.gif differ diff --git a/assets/theme/booru-mjg/7.gif b/assets/theme/booru-mjg/7.gif new file mode 100644 index 0000000..7b16571 Binary files /dev/null and b/assets/theme/booru-mjg/7.gif differ diff --git a/assets/theme/booru-mjg/8.gif b/assets/theme/booru-mjg/8.gif new file mode 100644 index 0000000..4288c8c Binary files /dev/null and b/assets/theme/booru-mjg/8.gif differ diff --git a/assets/theme/booru-mjg/9.gif b/assets/theme/booru-mjg/9.gif new file mode 100644 index 0000000..1848f2d Binary files /dev/null and b/assets/theme/booru-mjg/9.gif differ diff --git a/assets/theme/booru-mof/0.gif b/assets/theme/booru-mof/0.gif new file mode 100644 index 0000000..6b2c17b Binary files /dev/null and b/assets/theme/booru-mof/0.gif differ diff --git a/assets/theme/booru-mof/1.gif b/assets/theme/booru-mof/1.gif new file mode 100644 index 0000000..d263ceb Binary files /dev/null and b/assets/theme/booru-mof/1.gif differ diff --git a/assets/theme/booru-mof/2.gif b/assets/theme/booru-mof/2.gif new file mode 100644 index 0000000..99b96d9 Binary files /dev/null and b/assets/theme/booru-mof/2.gif differ diff --git a/assets/theme/booru-mof/3.gif b/assets/theme/booru-mof/3.gif new file mode 100644 index 0000000..cea7c8e Binary files /dev/null and b/assets/theme/booru-mof/3.gif differ diff --git a/assets/theme/booru-mof/4.gif b/assets/theme/booru-mof/4.gif new file mode 100644 index 0000000..507aca4 Binary files /dev/null and b/assets/theme/booru-mof/4.gif differ diff --git a/assets/theme/booru-mof/5.gif b/assets/theme/booru-mof/5.gif new file mode 100644 index 0000000..ba92142 Binary files /dev/null and b/assets/theme/booru-mof/5.gif differ diff --git a/assets/theme/booru-mof/6.gif b/assets/theme/booru-mof/6.gif new file mode 100644 index 0000000..ea9382f Binary files /dev/null and b/assets/theme/booru-mof/6.gif differ diff --git a/assets/theme/booru-mof/7.gif b/assets/theme/booru-mof/7.gif new file mode 100644 index 0000000..d39cd57 Binary files /dev/null and b/assets/theme/booru-mof/7.gif differ diff --git a/assets/theme/booru-mof/8.gif b/assets/theme/booru-mof/8.gif new file mode 100644 index 0000000..72bf538 Binary files /dev/null and b/assets/theme/booru-mof/8.gif differ diff --git a/assets/theme/booru-mof/9.gif b/assets/theme/booru-mof/9.gif new file mode 100644 index 0000000..9c84686 Binary files /dev/null and b/assets/theme/booru-mof/9.gif differ diff --git a/assets/theme/booru-nandroid/0.gif b/assets/theme/booru-nandroid/0.gif new file mode 100644 index 0000000..619e282 Binary files /dev/null and b/assets/theme/booru-nandroid/0.gif differ diff --git a/assets/theme/booru-nandroid/1.gif b/assets/theme/booru-nandroid/1.gif new file mode 100644 index 0000000..4c6869c Binary files /dev/null and b/assets/theme/booru-nandroid/1.gif differ diff --git a/assets/theme/booru-nandroid/2.gif b/assets/theme/booru-nandroid/2.gif new file mode 100644 index 0000000..9e3f13a Binary files /dev/null and b/assets/theme/booru-nandroid/2.gif differ diff --git a/assets/theme/booru-nandroid/3.gif b/assets/theme/booru-nandroid/3.gif new file mode 100644 index 0000000..9273029 Binary files /dev/null and b/assets/theme/booru-nandroid/3.gif differ diff --git a/assets/theme/booru-nandroid/4.gif b/assets/theme/booru-nandroid/4.gif new file mode 100644 index 0000000..31e0968 Binary files /dev/null and b/assets/theme/booru-nandroid/4.gif differ diff --git a/assets/theme/booru-nandroid/5.gif b/assets/theme/booru-nandroid/5.gif new file mode 100644 index 0000000..b16053d Binary files /dev/null and b/assets/theme/booru-nandroid/5.gif differ diff --git a/assets/theme/booru-nandroid/6.gif b/assets/theme/booru-nandroid/6.gif new file mode 100644 index 0000000..e17ff5b Binary files /dev/null and b/assets/theme/booru-nandroid/6.gif differ diff --git a/assets/theme/booru-nandroid/7.gif b/assets/theme/booru-nandroid/7.gif new file mode 100644 index 0000000..d4ea05f Binary files /dev/null and b/assets/theme/booru-nandroid/7.gif differ diff --git a/assets/theme/booru-nandroid/8.gif b/assets/theme/booru-nandroid/8.gif new file mode 100644 index 0000000..43d0ece Binary files /dev/null and b/assets/theme/booru-nandroid/8.gif differ diff --git a/assets/theme/booru-nandroid/9.gif b/assets/theme/booru-nandroid/9.gif new file mode 100644 index 0000000..a368205 Binary files /dev/null and b/assets/theme/booru-nandroid/9.gif differ diff --git a/assets/theme/booru-qualityhentais/0.gif b/assets/theme/booru-qualityhentais/0.gif new file mode 100644 index 0000000..5c15df9 Binary files /dev/null and b/assets/theme/booru-qualityhentais/0.gif differ diff --git a/assets/theme/booru-qualityhentais/1.gif b/assets/theme/booru-qualityhentais/1.gif new file mode 100644 index 0000000..020c2d6 Binary files /dev/null and b/assets/theme/booru-qualityhentais/1.gif differ diff --git a/assets/theme/booru-qualityhentais/2.gif b/assets/theme/booru-qualityhentais/2.gif new file mode 100644 index 0000000..d4e4ccd Binary files /dev/null and b/assets/theme/booru-qualityhentais/2.gif differ diff --git a/assets/theme/booru-qualityhentais/3.gif b/assets/theme/booru-qualityhentais/3.gif new file mode 100644 index 0000000..58a28b9 Binary files /dev/null and b/assets/theme/booru-qualityhentais/3.gif differ diff --git a/assets/theme/booru-qualityhentais/4.gif b/assets/theme/booru-qualityhentais/4.gif new file mode 100644 index 0000000..6ca30ca Binary files /dev/null and b/assets/theme/booru-qualityhentais/4.gif differ diff --git a/assets/theme/booru-qualityhentais/5.gif b/assets/theme/booru-qualityhentais/5.gif new file mode 100644 index 0000000..1278970 Binary files /dev/null and b/assets/theme/booru-qualityhentais/5.gif differ diff --git a/assets/theme/booru-qualityhentais/6.gif b/assets/theme/booru-qualityhentais/6.gif new file mode 100644 index 0000000..239cf2d Binary files /dev/null and b/assets/theme/booru-qualityhentais/6.gif differ diff --git a/assets/theme/booru-qualityhentais/7.gif b/assets/theme/booru-qualityhentais/7.gif new file mode 100644 index 0000000..8c49794 Binary files /dev/null and b/assets/theme/booru-qualityhentais/7.gif differ diff --git a/assets/theme/booru-qualityhentais/8.gif b/assets/theme/booru-qualityhentais/8.gif new file mode 100644 index 0000000..a61e96c Binary files /dev/null and b/assets/theme/booru-qualityhentais/8.gif differ diff --git a/assets/theme/booru-qualityhentais/9.gif b/assets/theme/booru-qualityhentais/9.gif new file mode 100644 index 0000000..6f0cd76 Binary files /dev/null and b/assets/theme/booru-qualityhentais/9.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/0.gif b/assets/theme/booru-r6gdrawfriends/0.gif new file mode 100644 index 0000000..a55b59d Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/0.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/1.gif b/assets/theme/booru-r6gdrawfriends/1.gif new file mode 100644 index 0000000..7907619 Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/1.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/2.gif b/assets/theme/booru-r6gdrawfriends/2.gif new file mode 100644 index 0000000..ea1673b Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/2.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/3.gif b/assets/theme/booru-r6gdrawfriends/3.gif new file mode 100644 index 0000000..d559d70 Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/3.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/4.gif b/assets/theme/booru-r6gdrawfriends/4.gif new file mode 100644 index 0000000..fde8c2a Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/4.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/5.gif b/assets/theme/booru-r6gdrawfriends/5.gif new file mode 100644 index 0000000..0268acb Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/5.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/6.gif b/assets/theme/booru-r6gdrawfriends/6.gif new file mode 100644 index 0000000..1aed6d6 Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/6.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/7.gif b/assets/theme/booru-r6gdrawfriends/7.gif new file mode 100644 index 0000000..6e9791f Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/7.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/8.gif b/assets/theme/booru-r6gdrawfriends/8.gif new file mode 100644 index 0000000..f24a1e1 Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/8.gif differ diff --git a/assets/theme/booru-r6gdrawfriends/9.gif b/assets/theme/booru-r6gdrawfriends/9.gif new file mode 100644 index 0000000..4c4eed9 Binary files /dev/null and b/assets/theme/booru-r6gdrawfriends/9.gif differ diff --git a/assets/theme/booru-rfck/0.gif b/assets/theme/booru-rfck/0.gif new file mode 100644 index 0000000..e01ac20 Binary files /dev/null and b/assets/theme/booru-rfck/0.gif differ diff --git a/assets/theme/booru-rfck/1.gif b/assets/theme/booru-rfck/1.gif new file mode 100644 index 0000000..c5dfb12 Binary files /dev/null and b/assets/theme/booru-rfck/1.gif differ diff --git a/assets/theme/booru-rfck/2.gif b/assets/theme/booru-rfck/2.gif new file mode 100644 index 0000000..e32a7ac Binary files /dev/null and b/assets/theme/booru-rfck/2.gif differ diff --git a/assets/theme/booru-rfck/3.gif b/assets/theme/booru-rfck/3.gif new file mode 100644 index 0000000..72b60f8 Binary files /dev/null and b/assets/theme/booru-rfck/3.gif differ diff --git a/assets/theme/booru-rfck/4.gif b/assets/theme/booru-rfck/4.gif new file mode 100644 index 0000000..b3220ce Binary files /dev/null and b/assets/theme/booru-rfck/4.gif differ diff --git a/assets/theme/booru-rfck/5.gif b/assets/theme/booru-rfck/5.gif new file mode 100644 index 0000000..ec96be6 Binary files /dev/null and b/assets/theme/booru-rfck/5.gif differ diff --git a/assets/theme/booru-rfck/6.gif b/assets/theme/booru-rfck/6.gif new file mode 100644 index 0000000..a28424c Binary files /dev/null and b/assets/theme/booru-rfck/6.gif differ diff --git a/assets/theme/booru-rfck/7.gif b/assets/theme/booru-rfck/7.gif new file mode 100644 index 0000000..affe337 Binary files /dev/null and b/assets/theme/booru-rfck/7.gif differ diff --git a/assets/theme/booru-rfck/8.gif b/assets/theme/booru-rfck/8.gif new file mode 100644 index 0000000..df42c09 Binary files /dev/null and b/assets/theme/booru-rfck/8.gif differ diff --git a/assets/theme/booru-rfck/9.gif b/assets/theme/booru-rfck/9.gif new file mode 100644 index 0000000..1866013 Binary files /dev/null and b/assets/theme/booru-rfck/9.gif differ diff --git a/assets/theme/booru-smtg/0.gif b/assets/theme/booru-smtg/0.gif new file mode 100644 index 0000000..20f40f0 Binary files /dev/null and b/assets/theme/booru-smtg/0.gif differ diff --git a/assets/theme/booru-smtg/1.gif b/assets/theme/booru-smtg/1.gif new file mode 100644 index 0000000..6c8afb6 Binary files /dev/null and b/assets/theme/booru-smtg/1.gif differ diff --git a/assets/theme/booru-smtg/2.gif b/assets/theme/booru-smtg/2.gif new file mode 100644 index 0000000..dff751a Binary files /dev/null and b/assets/theme/booru-smtg/2.gif differ diff --git a/assets/theme/booru-smtg/3.gif b/assets/theme/booru-smtg/3.gif new file mode 100644 index 0000000..1343d80 Binary files /dev/null and b/assets/theme/booru-smtg/3.gif differ diff --git a/assets/theme/booru-smtg/4.gif b/assets/theme/booru-smtg/4.gif new file mode 100644 index 0000000..dce12ef Binary files /dev/null and b/assets/theme/booru-smtg/4.gif differ diff --git a/assets/theme/booru-smtg/5.gif b/assets/theme/booru-smtg/5.gif new file mode 100644 index 0000000..cf1f986 Binary files /dev/null and b/assets/theme/booru-smtg/5.gif differ diff --git a/assets/theme/booru-smtg/6.gif b/assets/theme/booru-smtg/6.gif new file mode 100644 index 0000000..d1ca5a5 Binary files /dev/null and b/assets/theme/booru-smtg/6.gif differ diff --git a/assets/theme/booru-smtg/7.gif b/assets/theme/booru-smtg/7.gif new file mode 100644 index 0000000..49f25af Binary files /dev/null and b/assets/theme/booru-smtg/7.gif differ diff --git a/assets/theme/booru-smtg/8.gif b/assets/theme/booru-smtg/8.gif new file mode 100644 index 0000000..be527bb Binary files /dev/null and b/assets/theme/booru-smtg/8.gif differ diff --git a/assets/theme/booru-smtg/9.gif b/assets/theme/booru-smtg/9.gif new file mode 100644 index 0000000..357ebd6 Binary files /dev/null and b/assets/theme/booru-smtg/9.gif differ diff --git a/assets/theme/booru-snyde/0.gif b/assets/theme/booru-snyde/0.gif new file mode 100644 index 0000000..8ed0802 Binary files /dev/null and b/assets/theme/booru-snyde/0.gif differ diff --git a/assets/theme/booru-snyde/1.gif b/assets/theme/booru-snyde/1.gif new file mode 100644 index 0000000..cbe3ef5 Binary files /dev/null and b/assets/theme/booru-snyde/1.gif differ diff --git a/assets/theme/booru-snyde/2.gif b/assets/theme/booru-snyde/2.gif new file mode 100644 index 0000000..07c8338 Binary files /dev/null and b/assets/theme/booru-snyde/2.gif differ diff --git a/assets/theme/booru-snyde/3.gif b/assets/theme/booru-snyde/3.gif new file mode 100644 index 0000000..15bb5d3 Binary files /dev/null and b/assets/theme/booru-snyde/3.gif differ diff --git a/assets/theme/booru-snyde/4.gif b/assets/theme/booru-snyde/4.gif new file mode 100644 index 0000000..d8a4299 Binary files /dev/null and b/assets/theme/booru-snyde/4.gif differ diff --git a/assets/theme/booru-snyde/5.gif b/assets/theme/booru-snyde/5.gif new file mode 100644 index 0000000..1e056b9 Binary files /dev/null and b/assets/theme/booru-snyde/5.gif differ diff --git a/assets/theme/booru-snyde/6.gif b/assets/theme/booru-snyde/6.gif new file mode 100644 index 0000000..e428a15 Binary files /dev/null and b/assets/theme/booru-snyde/6.gif differ diff --git a/assets/theme/booru-snyde/7.gif b/assets/theme/booru-snyde/7.gif new file mode 100644 index 0000000..e21954f Binary files /dev/null and b/assets/theme/booru-snyde/7.gif differ diff --git a/assets/theme/booru-snyde/8.gif b/assets/theme/booru-snyde/8.gif new file mode 100644 index 0000000..1f558bc Binary files /dev/null and b/assets/theme/booru-snyde/8.gif differ diff --git a/assets/theme/booru-snyde/9.gif b/assets/theme/booru-snyde/9.gif new file mode 100644 index 0000000..b886f42 Binary files /dev/null and b/assets/theme/booru-snyde/9.gif differ diff --git a/assets/theme/booru-the-collection/0.gif b/assets/theme/booru-the-collection/0.gif new file mode 100644 index 0000000..e474210 Binary files /dev/null and b/assets/theme/booru-the-collection/0.gif differ diff --git a/assets/theme/booru-the-collection/1.gif b/assets/theme/booru-the-collection/1.gif new file mode 100644 index 0000000..7f6769c Binary files /dev/null and b/assets/theme/booru-the-collection/1.gif differ diff --git a/assets/theme/booru-the-collection/2.gif b/assets/theme/booru-the-collection/2.gif new file mode 100644 index 0000000..9b5b830 Binary files /dev/null and b/assets/theme/booru-the-collection/2.gif differ diff --git a/assets/theme/booru-the-collection/3.gif b/assets/theme/booru-the-collection/3.gif new file mode 100644 index 0000000..a6ca42a Binary files /dev/null and b/assets/theme/booru-the-collection/3.gif differ diff --git a/assets/theme/booru-the-collection/4.gif b/assets/theme/booru-the-collection/4.gif new file mode 100644 index 0000000..9ae9e09 Binary files /dev/null and b/assets/theme/booru-the-collection/4.gif differ diff --git a/assets/theme/booru-the-collection/5.gif b/assets/theme/booru-the-collection/5.gif new file mode 100644 index 0000000..34935fc Binary files /dev/null and b/assets/theme/booru-the-collection/5.gif differ diff --git a/assets/theme/booru-the-collection/6.gif b/assets/theme/booru-the-collection/6.gif new file mode 100644 index 0000000..081c0cf Binary files /dev/null and b/assets/theme/booru-the-collection/6.gif differ diff --git a/assets/theme/booru-the-collection/7.gif b/assets/theme/booru-the-collection/7.gif new file mode 100644 index 0000000..c8dfb36 Binary files /dev/null and b/assets/theme/booru-the-collection/7.gif differ diff --git a/assets/theme/booru-the-collection/8.gif b/assets/theme/booru-the-collection/8.gif new file mode 100644 index 0000000..4a33b29 Binary files /dev/null and b/assets/theme/booru-the-collection/8.gif differ diff --git a/assets/theme/booru-the-collection/9.gif b/assets/theme/booru-the-collection/9.gif new file mode 100644 index 0000000..250c103 Binary files /dev/null and b/assets/theme/booru-the-collection/9.gif differ diff --git a/assets/theme/booru-touhoulat/0.gif b/assets/theme/booru-touhoulat/0.gif new file mode 100644 index 0000000..ae67fe5 Binary files /dev/null and b/assets/theme/booru-touhoulat/0.gif differ diff --git a/assets/theme/booru-touhoulat/1.gif b/assets/theme/booru-touhoulat/1.gif new file mode 100644 index 0000000..d0d5875 Binary files /dev/null and b/assets/theme/booru-touhoulat/1.gif differ diff --git a/assets/theme/booru-touhoulat/2.gif b/assets/theme/booru-touhoulat/2.gif new file mode 100644 index 0000000..b32170e Binary files /dev/null and b/assets/theme/booru-touhoulat/2.gif differ diff --git a/assets/theme/booru-touhoulat/3.gif b/assets/theme/booru-touhoulat/3.gif new file mode 100644 index 0000000..e1abc19 Binary files /dev/null and b/assets/theme/booru-touhoulat/3.gif differ diff --git a/assets/theme/booru-touhoulat/4.gif b/assets/theme/booru-touhoulat/4.gif new file mode 100644 index 0000000..b11eb37 Binary files /dev/null and b/assets/theme/booru-touhoulat/4.gif differ diff --git a/assets/theme/booru-touhoulat/5.gif b/assets/theme/booru-touhoulat/5.gif new file mode 100644 index 0000000..053163c Binary files /dev/null and b/assets/theme/booru-touhoulat/5.gif differ diff --git a/assets/theme/booru-touhoulat/6.gif b/assets/theme/booru-touhoulat/6.gif new file mode 100644 index 0000000..61c11f1 Binary files /dev/null and b/assets/theme/booru-touhoulat/6.gif differ diff --git a/assets/theme/booru-touhoulat/7.gif b/assets/theme/booru-touhoulat/7.gif new file mode 100644 index 0000000..f878894 Binary files /dev/null and b/assets/theme/booru-touhoulat/7.gif differ diff --git a/assets/theme/booru-touhoulat/8.gif b/assets/theme/booru-touhoulat/8.gif new file mode 100644 index 0000000..a5a6ca3 Binary files /dev/null and b/assets/theme/booru-touhoulat/8.gif differ diff --git a/assets/theme/booru-touhoulat/9.gif b/assets/theme/booru-touhoulat/9.gif new file mode 100644 index 0000000..eb1d6b1 Binary files /dev/null and b/assets/theme/booru-touhoulat/9.gif differ diff --git a/assets/theme/booru-townofgravityfalls/0.gif b/assets/theme/booru-townofgravityfalls/0.gif new file mode 100644 index 0000000..18b6fb4 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/0.gif differ diff --git a/assets/theme/booru-townofgravityfalls/1.gif b/assets/theme/booru-townofgravityfalls/1.gif new file mode 100644 index 0000000..005098b Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/1.gif differ diff --git a/assets/theme/booru-townofgravityfalls/2.gif b/assets/theme/booru-townofgravityfalls/2.gif new file mode 100644 index 0000000..f257b68 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/2.gif differ diff --git a/assets/theme/booru-townofgravityfalls/3.gif b/assets/theme/booru-townofgravityfalls/3.gif new file mode 100644 index 0000000..1fd658a Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/3.gif differ diff --git a/assets/theme/booru-townofgravityfalls/4.gif b/assets/theme/booru-townofgravityfalls/4.gif new file mode 100644 index 0000000..5ec83f1 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/4.gif differ diff --git a/assets/theme/booru-townofgravityfalls/5.gif b/assets/theme/booru-townofgravityfalls/5.gif new file mode 100644 index 0000000..8c8f6c8 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/5.gif differ diff --git a/assets/theme/booru-townofgravityfalls/6.gif b/assets/theme/booru-townofgravityfalls/6.gif new file mode 100644 index 0000000..94804a5 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/6.gif differ diff --git a/assets/theme/booru-townofgravityfalls/7.gif b/assets/theme/booru-townofgravityfalls/7.gif new file mode 100644 index 0000000..cf5b389 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/7.gif differ diff --git a/assets/theme/booru-townofgravityfalls/8.gif b/assets/theme/booru-townofgravityfalls/8.gif new file mode 100644 index 0000000..c3d1a8e Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/8.gif differ diff --git a/assets/theme/booru-townofgravityfalls/9.gif b/assets/theme/booru-townofgravityfalls/9.gif new file mode 100644 index 0000000..1698633 Binary files /dev/null and b/assets/theme/booru-townofgravityfalls/9.gif differ diff --git a/assets/theme/booru-twifanartsfw/0.gif b/assets/theme/booru-twifanartsfw/0.gif new file mode 100644 index 0000000..1b3926b Binary files /dev/null and b/assets/theme/booru-twifanartsfw/0.gif differ diff --git a/assets/theme/booru-twifanartsfw/1.gif b/assets/theme/booru-twifanartsfw/1.gif new file mode 100644 index 0000000..959317d Binary files /dev/null and b/assets/theme/booru-twifanartsfw/1.gif differ diff --git a/assets/theme/booru-twifanartsfw/2.gif b/assets/theme/booru-twifanartsfw/2.gif new file mode 100644 index 0000000..b703ae6 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/2.gif differ diff --git a/assets/theme/booru-twifanartsfw/3.gif b/assets/theme/booru-twifanartsfw/3.gif new file mode 100644 index 0000000..888acd9 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/3.gif differ diff --git a/assets/theme/booru-twifanartsfw/4.gif b/assets/theme/booru-twifanartsfw/4.gif new file mode 100644 index 0000000..0e8a1be Binary files /dev/null and b/assets/theme/booru-twifanartsfw/4.gif differ diff --git a/assets/theme/booru-twifanartsfw/5.gif b/assets/theme/booru-twifanartsfw/5.gif new file mode 100644 index 0000000..1baa8c7 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/5.gif differ diff --git a/assets/theme/booru-twifanartsfw/6.gif b/assets/theme/booru-twifanartsfw/6.gif new file mode 100644 index 0000000..520d935 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/6.gif differ diff --git a/assets/theme/booru-twifanartsfw/7.gif b/assets/theme/booru-twifanartsfw/7.gif new file mode 100644 index 0000000..79ac898 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/7.gif differ diff --git a/assets/theme/booru-twifanartsfw/8.gif b/assets/theme/booru-twifanartsfw/8.gif new file mode 100644 index 0000000..7519e42 Binary files /dev/null and b/assets/theme/booru-twifanartsfw/8.gif differ diff --git a/assets/theme/booru-twifanartsfw/9.gif b/assets/theme/booru-twifanartsfw/9.gif new file mode 100644 index 0000000..da8c6fc Binary files /dev/null and b/assets/theme/booru-twifanartsfw/9.gif differ diff --git a/assets/theme/booru-ve/0.gif b/assets/theme/booru-ve/0.gif new file mode 100644 index 0000000..57ae95c Binary files /dev/null and b/assets/theme/booru-ve/0.gif differ diff --git a/assets/theme/booru-ve/1.gif b/assets/theme/booru-ve/1.gif new file mode 100644 index 0000000..e64b87a Binary files /dev/null and b/assets/theme/booru-ve/1.gif differ diff --git a/assets/theme/booru-ve/2.gif b/assets/theme/booru-ve/2.gif new file mode 100644 index 0000000..b5ed6aa Binary files /dev/null and b/assets/theme/booru-ve/2.gif differ diff --git a/assets/theme/booru-ve/3.gif b/assets/theme/booru-ve/3.gif new file mode 100644 index 0000000..30f375f Binary files /dev/null and b/assets/theme/booru-ve/3.gif differ diff --git a/assets/theme/booru-ve/4.gif b/assets/theme/booru-ve/4.gif new file mode 100644 index 0000000..d16695f Binary files /dev/null and b/assets/theme/booru-ve/4.gif differ diff --git a/assets/theme/booru-ve/5.gif b/assets/theme/booru-ve/5.gif new file mode 100644 index 0000000..c5c32c9 Binary files /dev/null and b/assets/theme/booru-ve/5.gif differ diff --git a/assets/theme/booru-ve/6.gif b/assets/theme/booru-ve/6.gif new file mode 100644 index 0000000..34cbafe Binary files /dev/null and b/assets/theme/booru-ve/6.gif differ diff --git a/assets/theme/booru-ve/7.gif b/assets/theme/booru-ve/7.gif new file mode 100644 index 0000000..a24baea Binary files /dev/null and b/assets/theme/booru-ve/7.gif differ diff --git a/assets/theme/booru-ve/8.gif b/assets/theme/booru-ve/8.gif new file mode 100644 index 0000000..28e9897 Binary files /dev/null and b/assets/theme/booru-ve/8.gif differ diff --git a/assets/theme/booru-ve/9.gif b/assets/theme/booru-ve/9.gif new file mode 100644 index 0000000..f24604a Binary files /dev/null and b/assets/theme/booru-ve/9.gif differ diff --git a/assets/theme/booru-vivi/0.gif b/assets/theme/booru-vivi/0.gif new file mode 100644 index 0000000..04f4f31 Binary files /dev/null and b/assets/theme/booru-vivi/0.gif differ diff --git a/assets/theme/booru-vivi/1.gif b/assets/theme/booru-vivi/1.gif new file mode 100644 index 0000000..edbfb52 Binary files /dev/null and b/assets/theme/booru-vivi/1.gif differ diff --git a/assets/theme/booru-vivi/2.gif b/assets/theme/booru-vivi/2.gif new file mode 100644 index 0000000..72eaf9b Binary files /dev/null and b/assets/theme/booru-vivi/2.gif differ diff --git a/assets/theme/booru-vivi/3.gif b/assets/theme/booru-vivi/3.gif new file mode 100644 index 0000000..7d082c2 Binary files /dev/null and b/assets/theme/booru-vivi/3.gif differ diff --git a/assets/theme/booru-vivi/4.gif b/assets/theme/booru-vivi/4.gif new file mode 100644 index 0000000..0a43674 Binary files /dev/null and b/assets/theme/booru-vivi/4.gif differ diff --git a/assets/theme/booru-vivi/5.gif b/assets/theme/booru-vivi/5.gif new file mode 100644 index 0000000..4a9a2fb Binary files /dev/null and b/assets/theme/booru-vivi/5.gif differ diff --git a/assets/theme/booru-vivi/6.gif b/assets/theme/booru-vivi/6.gif new file mode 100644 index 0000000..6ecaaa3 Binary files /dev/null and b/assets/theme/booru-vivi/6.gif differ diff --git a/assets/theme/booru-vivi/7.gif b/assets/theme/booru-vivi/7.gif new file mode 100644 index 0000000..99ff77c Binary files /dev/null and b/assets/theme/booru-vivi/7.gif differ diff --git a/assets/theme/booru-vivi/8.gif b/assets/theme/booru-vivi/8.gif new file mode 100644 index 0000000..08f181b Binary files /dev/null and b/assets/theme/booru-vivi/8.gif differ diff --git a/assets/theme/booru-vivi/9.gif b/assets/theme/booru-vivi/9.gif new file mode 100644 index 0000000..385012c Binary files /dev/null and b/assets/theme/booru-vivi/9.gif differ diff --git a/assets/theme/booru-vp/0.gif b/assets/theme/booru-vp/0.gif new file mode 100644 index 0000000..9e692e0 Binary files /dev/null and b/assets/theme/booru-vp/0.gif differ diff --git a/assets/theme/booru-vp/1.gif b/assets/theme/booru-vp/1.gif new file mode 100644 index 0000000..a3a21fb Binary files /dev/null and b/assets/theme/booru-vp/1.gif differ diff --git a/assets/theme/booru-vp/2.gif b/assets/theme/booru-vp/2.gif new file mode 100644 index 0000000..6dc9915 Binary files /dev/null and b/assets/theme/booru-vp/2.gif differ diff --git a/assets/theme/booru-vp/3.gif b/assets/theme/booru-vp/3.gif new file mode 100644 index 0000000..6c3954b Binary files /dev/null and b/assets/theme/booru-vp/3.gif differ diff --git a/assets/theme/booru-vp/4.gif b/assets/theme/booru-vp/4.gif new file mode 100644 index 0000000..f0f98cf Binary files /dev/null and b/assets/theme/booru-vp/4.gif differ diff --git a/assets/theme/booru-vp/5.gif b/assets/theme/booru-vp/5.gif new file mode 100644 index 0000000..143b8a9 Binary files /dev/null and b/assets/theme/booru-vp/5.gif differ diff --git a/assets/theme/booru-vp/6.gif b/assets/theme/booru-vp/6.gif new file mode 100644 index 0000000..f7336f9 Binary files /dev/null and b/assets/theme/booru-vp/6.gif differ diff --git a/assets/theme/booru-vp/7.gif b/assets/theme/booru-vp/7.gif new file mode 100644 index 0000000..6c48e68 Binary files /dev/null and b/assets/theme/booru-vp/7.gif differ diff --git a/assets/theme/booru-vp/8.gif b/assets/theme/booru-vp/8.gif new file mode 100644 index 0000000..96ba6e4 Binary files /dev/null and b/assets/theme/booru-vp/8.gif differ diff --git a/assets/theme/booru-vp/9.gif b/assets/theme/booru-vp/9.gif new file mode 100644 index 0000000..9cf04c0 Binary files /dev/null and b/assets/theme/booru-vp/9.gif differ diff --git a/assets/theme/booru-yuyuyui/0.gif b/assets/theme/booru-yuyuyui/0.gif new file mode 100644 index 0000000..31d403f Binary files /dev/null and b/assets/theme/booru-yuyuyui/0.gif differ diff --git a/assets/theme/booru-yuyuyui/1.gif b/assets/theme/booru-yuyuyui/1.gif new file mode 100644 index 0000000..cf79ba5 Binary files /dev/null and b/assets/theme/booru-yuyuyui/1.gif differ diff --git a/assets/theme/booru-yuyuyui/2.gif b/assets/theme/booru-yuyuyui/2.gif new file mode 100644 index 0000000..a5f2e87 Binary files /dev/null and b/assets/theme/booru-yuyuyui/2.gif differ diff --git a/assets/theme/booru-yuyuyui/3.gif b/assets/theme/booru-yuyuyui/3.gif new file mode 100644 index 0000000..c66a5f4 Binary files /dev/null and b/assets/theme/booru-yuyuyui/3.gif differ diff --git a/assets/theme/booru-yuyuyui/4.gif b/assets/theme/booru-yuyuyui/4.gif new file mode 100644 index 0000000..17d4a2e Binary files /dev/null and b/assets/theme/booru-yuyuyui/4.gif differ diff --git a/assets/theme/booru-yuyuyui/5.gif b/assets/theme/booru-yuyuyui/5.gif new file mode 100644 index 0000000..facb651 Binary files /dev/null and b/assets/theme/booru-yuyuyui/5.gif differ diff --git a/assets/theme/booru-yuyuyui/6.gif b/assets/theme/booru-yuyuyui/6.gif new file mode 100644 index 0000000..a8335f1 Binary files /dev/null and b/assets/theme/booru-yuyuyui/6.gif differ diff --git a/assets/theme/booru-yuyuyui/7.gif b/assets/theme/booru-yuyuyui/7.gif new file mode 100644 index 0000000..3070f60 Binary files /dev/null and b/assets/theme/booru-yuyuyui/7.gif differ diff --git a/assets/theme/booru-yuyuyui/8.gif b/assets/theme/booru-yuyuyui/8.gif new file mode 100644 index 0000000..20e9e5e Binary files /dev/null and b/assets/theme/booru-yuyuyui/8.gif differ diff --git a/assets/theme/booru-yuyuyui/9.gif b/assets/theme/booru-yuyuyui/9.gif new file mode 100644 index 0000000..9661f1d Binary files /dev/null and b/assets/theme/booru-yuyuyui/9.gif differ diff --git a/assets/theme/capoo-1/0.png b/assets/theme/capoo-1/0.png new file mode 100644 index 0000000..11f20b9 Binary files /dev/null and b/assets/theme/capoo-1/0.png differ diff --git a/assets/theme/capoo-1/1.png b/assets/theme/capoo-1/1.png new file mode 100644 index 0000000..2b8b6d7 Binary files /dev/null and b/assets/theme/capoo-1/1.png differ diff --git a/assets/theme/capoo-1/2.png b/assets/theme/capoo-1/2.png new file mode 100644 index 0000000..d8e74eb Binary files /dev/null and b/assets/theme/capoo-1/2.png differ diff --git a/assets/theme/capoo-1/3.png b/assets/theme/capoo-1/3.png new file mode 100644 index 0000000..d0fe84f Binary files /dev/null and b/assets/theme/capoo-1/3.png differ diff --git a/assets/theme/capoo-1/4.png b/assets/theme/capoo-1/4.png new file mode 100644 index 0000000..96abaf6 Binary files /dev/null and b/assets/theme/capoo-1/4.png differ diff --git a/assets/theme/capoo-1/5.png b/assets/theme/capoo-1/5.png new file mode 100644 index 0000000..a4ec352 Binary files /dev/null and b/assets/theme/capoo-1/5.png differ diff --git a/assets/theme/capoo-1/6.png b/assets/theme/capoo-1/6.png new file mode 100644 index 0000000..3a500a5 Binary files /dev/null and b/assets/theme/capoo-1/6.png differ diff --git a/assets/theme/capoo-1/7.png b/assets/theme/capoo-1/7.png new file mode 100644 index 0000000..86ac3eb Binary files /dev/null and b/assets/theme/capoo-1/7.png differ diff --git a/assets/theme/capoo-1/8.png b/assets/theme/capoo-1/8.png new file mode 100644 index 0000000..b7bb956 Binary files /dev/null and b/assets/theme/capoo-1/8.png differ diff --git a/assets/theme/capoo-1/9.png b/assets/theme/capoo-1/9.png new file mode 100644 index 0000000..e2ac236 Binary files /dev/null and b/assets/theme/capoo-1/9.png differ diff --git a/assets/theme/capoo-2/0.png b/assets/theme/capoo-2/0.png new file mode 100644 index 0000000..44b7fbc Binary files /dev/null and b/assets/theme/capoo-2/0.png differ diff --git a/assets/theme/capoo-2/1.png b/assets/theme/capoo-2/1.png new file mode 100644 index 0000000..0aed967 Binary files /dev/null and b/assets/theme/capoo-2/1.png differ diff --git a/assets/theme/capoo-2/2.png b/assets/theme/capoo-2/2.png new file mode 100644 index 0000000..c5e68ce Binary files /dev/null and b/assets/theme/capoo-2/2.png differ diff --git a/assets/theme/capoo-2/3.png b/assets/theme/capoo-2/3.png new file mode 100644 index 0000000..3f70ae6 Binary files /dev/null and b/assets/theme/capoo-2/3.png differ diff --git a/assets/theme/capoo-2/4.png b/assets/theme/capoo-2/4.png new file mode 100644 index 0000000..948f1a6 Binary files /dev/null and b/assets/theme/capoo-2/4.png differ diff --git a/assets/theme/capoo-2/5.png b/assets/theme/capoo-2/5.png new file mode 100644 index 0000000..75cefea Binary files /dev/null and b/assets/theme/capoo-2/5.png differ diff --git a/assets/theme/capoo-2/6.png b/assets/theme/capoo-2/6.png new file mode 100644 index 0000000..02be5fc Binary files /dev/null and b/assets/theme/capoo-2/6.png differ diff --git a/assets/theme/capoo-2/7.png b/assets/theme/capoo-2/7.png new file mode 100644 index 0000000..67a8a43 Binary files /dev/null and b/assets/theme/capoo-2/7.png differ diff --git a/assets/theme/capoo-2/8.png b/assets/theme/capoo-2/8.png new file mode 100644 index 0000000..8c7d7c1 Binary files /dev/null and b/assets/theme/capoo-2/8.png differ diff --git a/assets/theme/capoo-2/9.png b/assets/theme/capoo-2/9.png new file mode 100644 index 0000000..8372a8f Binary files /dev/null and b/assets/theme/capoo-2/9.png differ diff --git a/assets/theme/capoo-2/_end.png b/assets/theme/capoo-2/_end.png new file mode 100644 index 0000000..3d9c180 Binary files /dev/null and b/assets/theme/capoo-2/_end.png differ diff --git a/assets/theme/capoo-2/_start.png b/assets/theme/capoo-2/_start.png new file mode 100644 index 0000000..926525f Binary files /dev/null and b/assets/theme/capoo-2/_start.png differ diff --git a/assets/theme/e621/0.gif b/assets/theme/e621/0.gif new file mode 100644 index 0000000..3e52868 Binary files /dev/null and b/assets/theme/e621/0.gif differ diff --git a/assets/theme/e621/1.gif b/assets/theme/e621/1.gif new file mode 100644 index 0000000..085bdaf Binary files /dev/null and b/assets/theme/e621/1.gif differ diff --git a/assets/theme/e621/2.gif b/assets/theme/e621/2.gif new file mode 100644 index 0000000..b423e02 Binary files /dev/null and b/assets/theme/e621/2.gif differ diff --git a/assets/theme/e621/3.gif b/assets/theme/e621/3.gif new file mode 100644 index 0000000..181f0c6 Binary files /dev/null and b/assets/theme/e621/3.gif differ diff --git a/assets/theme/e621/4.gif b/assets/theme/e621/4.gif new file mode 100644 index 0000000..d79f1d3 Binary files /dev/null and b/assets/theme/e621/4.gif differ diff --git a/assets/theme/e621/5.gif b/assets/theme/e621/5.gif new file mode 100644 index 0000000..2975b15 Binary files /dev/null and b/assets/theme/e621/5.gif differ diff --git a/assets/theme/e621/6.gif b/assets/theme/e621/6.gif new file mode 100644 index 0000000..5eb51e8 Binary files /dev/null and b/assets/theme/e621/6.gif differ diff --git a/assets/theme/e621/7.gif b/assets/theme/e621/7.gif new file mode 100644 index 0000000..d116a2e Binary files /dev/null and b/assets/theme/e621/7.gif differ diff --git a/assets/theme/e621/8.gif b/assets/theme/e621/8.gif new file mode 100644 index 0000000..eebb03d Binary files /dev/null and b/assets/theme/e621/8.gif differ diff --git a/assets/theme/e621/9.gif b/assets/theme/e621/9.gif new file mode 100644 index 0000000..2afe793 Binary files /dev/null and b/assets/theme/e621/9.gif differ diff --git a/assets/theme/food/0.gif b/assets/theme/food/0.gif new file mode 100644 index 0000000..7ceb025 Binary files /dev/null and b/assets/theme/food/0.gif differ diff --git a/assets/theme/food/1.gif b/assets/theme/food/1.gif new file mode 100644 index 0000000..8041cd9 Binary files /dev/null and b/assets/theme/food/1.gif differ diff --git a/assets/theme/food/2.gif b/assets/theme/food/2.gif new file mode 100644 index 0000000..471e3a9 Binary files /dev/null and b/assets/theme/food/2.gif differ diff --git a/assets/theme/food/3.gif b/assets/theme/food/3.gif new file mode 100644 index 0000000..d370542 Binary files /dev/null and b/assets/theme/food/3.gif differ diff --git a/assets/theme/food/4.gif b/assets/theme/food/4.gif new file mode 100644 index 0000000..b4390c9 Binary files /dev/null and b/assets/theme/food/4.gif differ diff --git a/assets/theme/food/5.gif b/assets/theme/food/5.gif new file mode 100644 index 0000000..8d705ba Binary files /dev/null and b/assets/theme/food/5.gif differ diff --git a/assets/theme/food/6.gif b/assets/theme/food/6.gif new file mode 100644 index 0000000..5b7cfed Binary files /dev/null and b/assets/theme/food/6.gif differ diff --git a/assets/theme/food/7.gif b/assets/theme/food/7.gif new file mode 100644 index 0000000..cc3c7cd Binary files /dev/null and b/assets/theme/food/7.gif differ diff --git a/assets/theme/food/8.gif b/assets/theme/food/8.gif new file mode 100644 index 0000000..a68a267 Binary files /dev/null and b/assets/theme/food/8.gif differ diff --git a/assets/theme/food/9.gif b/assets/theme/food/9.gif new file mode 100644 index 0000000..0b270a6 Binary files /dev/null and b/assets/theme/food/9.gif differ diff --git a/assets/theme/green/0.gif b/assets/theme/green/0.gif new file mode 100644 index 0000000..bbb5e2c Binary files /dev/null and b/assets/theme/green/0.gif differ diff --git a/assets/theme/green/1.gif b/assets/theme/green/1.gif new file mode 100644 index 0000000..3434acb Binary files /dev/null and b/assets/theme/green/1.gif differ diff --git a/assets/theme/green/2.gif b/assets/theme/green/2.gif new file mode 100644 index 0000000..67b51cb Binary files /dev/null and b/assets/theme/green/2.gif differ diff --git a/assets/theme/green/3.gif b/assets/theme/green/3.gif new file mode 100644 index 0000000..9248cd6 Binary files /dev/null and b/assets/theme/green/3.gif differ diff --git a/assets/theme/green/4.gif b/assets/theme/green/4.gif new file mode 100644 index 0000000..ca8ce58 Binary files /dev/null and b/assets/theme/green/4.gif differ diff --git a/assets/theme/green/5.gif b/assets/theme/green/5.gif new file mode 100644 index 0000000..91821bb Binary files /dev/null and b/assets/theme/green/5.gif differ diff --git a/assets/theme/green/6.gif b/assets/theme/green/6.gif new file mode 100644 index 0000000..38b631c Binary files /dev/null and b/assets/theme/green/6.gif differ diff --git a/assets/theme/green/7.gif b/assets/theme/green/7.gif new file mode 100644 index 0000000..f4b6908 Binary files /dev/null and b/assets/theme/green/7.gif differ diff --git a/assets/theme/green/8.gif b/assets/theme/green/8.gif new file mode 100644 index 0000000..12ac7ab Binary files /dev/null and b/assets/theme/green/8.gif differ diff --git a/assets/theme/green/9.gif b/assets/theme/green/9.gif new file mode 100644 index 0000000..75e280f Binary files /dev/null and b/assets/theme/green/9.gif differ diff --git a/assets/theme/kasuterura-1/0.gif b/assets/theme/kasuterura-1/0.gif new file mode 100644 index 0000000..3752006 Binary files /dev/null and b/assets/theme/kasuterura-1/0.gif differ diff --git a/assets/theme/kasuterura-1/1.gif b/assets/theme/kasuterura-1/1.gif new file mode 100644 index 0000000..3132407 Binary files /dev/null and b/assets/theme/kasuterura-1/1.gif differ diff --git a/assets/theme/kasuterura-1/2.gif b/assets/theme/kasuterura-1/2.gif new file mode 100644 index 0000000..377710c Binary files /dev/null and b/assets/theme/kasuterura-1/2.gif differ diff --git a/assets/theme/kasuterura-1/3.gif b/assets/theme/kasuterura-1/3.gif new file mode 100644 index 0000000..b1beeef Binary files /dev/null and b/assets/theme/kasuterura-1/3.gif differ diff --git a/assets/theme/kasuterura-1/4.gif b/assets/theme/kasuterura-1/4.gif new file mode 100644 index 0000000..2b8f901 Binary files /dev/null and b/assets/theme/kasuterura-1/4.gif differ diff --git a/assets/theme/kasuterura-1/5.gif b/assets/theme/kasuterura-1/5.gif new file mode 100644 index 0000000..44c55b0 Binary files /dev/null and b/assets/theme/kasuterura-1/5.gif differ diff --git a/assets/theme/kasuterura-1/6.gif b/assets/theme/kasuterura-1/6.gif new file mode 100644 index 0000000..e562e3a Binary files /dev/null and b/assets/theme/kasuterura-1/6.gif differ diff --git a/assets/theme/kasuterura-1/7.gif b/assets/theme/kasuterura-1/7.gif new file mode 100644 index 0000000..97ef125 Binary files /dev/null and b/assets/theme/kasuterura-1/7.gif differ diff --git a/assets/theme/kasuterura-1/8.gif b/assets/theme/kasuterura-1/8.gif new file mode 100644 index 0000000..690bae5 Binary files /dev/null and b/assets/theme/kasuterura-1/8.gif differ diff --git a/assets/theme/kasuterura-1/9.gif b/assets/theme/kasuterura-1/9.gif new file mode 100644 index 0000000..bc81932 Binary files /dev/null and b/assets/theme/kasuterura-1/9.gif differ diff --git a/assets/theme/kasuterura-2/0.gif b/assets/theme/kasuterura-2/0.gif new file mode 100644 index 0000000..4b492d7 Binary files /dev/null and b/assets/theme/kasuterura-2/0.gif differ diff --git a/assets/theme/kasuterura-2/1.gif b/assets/theme/kasuterura-2/1.gif new file mode 100644 index 0000000..fbebe2e Binary files /dev/null and b/assets/theme/kasuterura-2/1.gif differ diff --git a/assets/theme/kasuterura-2/2.gif b/assets/theme/kasuterura-2/2.gif new file mode 100644 index 0000000..f6d857f Binary files /dev/null and b/assets/theme/kasuterura-2/2.gif differ diff --git a/assets/theme/kasuterura-2/3.gif b/assets/theme/kasuterura-2/3.gif new file mode 100644 index 0000000..9fb31d9 Binary files /dev/null and b/assets/theme/kasuterura-2/3.gif differ diff --git a/assets/theme/kasuterura-2/4.gif b/assets/theme/kasuterura-2/4.gif new file mode 100644 index 0000000..3d8acb2 Binary files /dev/null and b/assets/theme/kasuterura-2/4.gif differ diff --git a/assets/theme/kasuterura-2/5.gif b/assets/theme/kasuterura-2/5.gif new file mode 100644 index 0000000..b3b17e5 Binary files /dev/null and b/assets/theme/kasuterura-2/5.gif differ diff --git a/assets/theme/kasuterura-2/6.gif b/assets/theme/kasuterura-2/6.gif new file mode 100644 index 0000000..ef0e362 Binary files /dev/null and b/assets/theme/kasuterura-2/6.gif differ diff --git a/assets/theme/kasuterura-2/7.gif b/assets/theme/kasuterura-2/7.gif new file mode 100644 index 0000000..75a1eca Binary files /dev/null and b/assets/theme/kasuterura-2/7.gif differ diff --git a/assets/theme/kasuterura-2/8.gif b/assets/theme/kasuterura-2/8.gif new file mode 100644 index 0000000..990eceb Binary files /dev/null and b/assets/theme/kasuterura-2/8.gif differ diff --git a/assets/theme/kasuterura-2/9.gif b/assets/theme/kasuterura-2/9.gif new file mode 100644 index 0000000..67f815d Binary files /dev/null and b/assets/theme/kasuterura-2/9.gif differ diff --git a/assets/theme/kasuterura-3/0.gif b/assets/theme/kasuterura-3/0.gif new file mode 100644 index 0000000..7f59a4e Binary files /dev/null and b/assets/theme/kasuterura-3/0.gif differ diff --git a/assets/theme/kasuterura-3/1.gif b/assets/theme/kasuterura-3/1.gif new file mode 100644 index 0000000..d36c2dd Binary files /dev/null and b/assets/theme/kasuterura-3/1.gif differ diff --git a/assets/theme/kasuterura-3/2.gif b/assets/theme/kasuterura-3/2.gif new file mode 100644 index 0000000..1429a70 Binary files /dev/null and b/assets/theme/kasuterura-3/2.gif differ diff --git a/assets/theme/kasuterura-3/3.gif b/assets/theme/kasuterura-3/3.gif new file mode 100644 index 0000000..defec3e Binary files /dev/null and b/assets/theme/kasuterura-3/3.gif differ diff --git a/assets/theme/kasuterura-3/4.gif b/assets/theme/kasuterura-3/4.gif new file mode 100644 index 0000000..ccad315 Binary files /dev/null and b/assets/theme/kasuterura-3/4.gif differ diff --git a/assets/theme/kasuterura-3/5.gif b/assets/theme/kasuterura-3/5.gif new file mode 100644 index 0000000..83abf98 Binary files /dev/null and b/assets/theme/kasuterura-3/5.gif differ diff --git a/assets/theme/kasuterura-3/6.gif b/assets/theme/kasuterura-3/6.gif new file mode 100644 index 0000000..7423cc0 Binary files /dev/null and b/assets/theme/kasuterura-3/6.gif differ diff --git a/assets/theme/kasuterura-3/7.gif b/assets/theme/kasuterura-3/7.gif new file mode 100644 index 0000000..9490ef4 Binary files /dev/null and b/assets/theme/kasuterura-3/7.gif differ diff --git a/assets/theme/kasuterura-3/8.gif b/assets/theme/kasuterura-3/8.gif new file mode 100644 index 0000000..d137b96 Binary files /dev/null and b/assets/theme/kasuterura-3/8.gif differ diff --git a/assets/theme/kasuterura-3/9.gif b/assets/theme/kasuterura-3/9.gif new file mode 100644 index 0000000..e4c5665 Binary files /dev/null and b/assets/theme/kasuterura-3/9.gif differ diff --git a/assets/theme/kasuterura-4/0.gif b/assets/theme/kasuterura-4/0.gif new file mode 100644 index 0000000..9074f5d Binary files /dev/null and b/assets/theme/kasuterura-4/0.gif differ diff --git a/assets/theme/kasuterura-4/1.gif b/assets/theme/kasuterura-4/1.gif new file mode 100644 index 0000000..f4d3fac Binary files /dev/null and b/assets/theme/kasuterura-4/1.gif differ diff --git a/assets/theme/kasuterura-4/2.gif b/assets/theme/kasuterura-4/2.gif new file mode 100644 index 0000000..f188ed7 Binary files /dev/null and b/assets/theme/kasuterura-4/2.gif differ diff --git a/assets/theme/kasuterura-4/3.gif b/assets/theme/kasuterura-4/3.gif new file mode 100644 index 0000000..ee372c3 Binary files /dev/null and b/assets/theme/kasuterura-4/3.gif differ diff --git a/assets/theme/kasuterura-4/4.gif b/assets/theme/kasuterura-4/4.gif new file mode 100644 index 0000000..78bfc5f Binary files /dev/null and b/assets/theme/kasuterura-4/4.gif differ diff --git a/assets/theme/kasuterura-4/5.gif b/assets/theme/kasuterura-4/5.gif new file mode 100644 index 0000000..9692534 Binary files /dev/null and b/assets/theme/kasuterura-4/5.gif differ diff --git a/assets/theme/kasuterura-4/6.gif b/assets/theme/kasuterura-4/6.gif new file mode 100644 index 0000000..b49d8ab Binary files /dev/null and b/assets/theme/kasuterura-4/6.gif differ diff --git a/assets/theme/kasuterura-4/7.gif b/assets/theme/kasuterura-4/7.gif new file mode 100644 index 0000000..30d4920 Binary files /dev/null and b/assets/theme/kasuterura-4/7.gif differ diff --git a/assets/theme/kasuterura-4/8.gif b/assets/theme/kasuterura-4/8.gif new file mode 100644 index 0000000..a16938a Binary files /dev/null and b/assets/theme/kasuterura-4/8.gif differ diff --git a/assets/theme/kasuterura-4/9.gif b/assets/theme/kasuterura-4/9.gif new file mode 100644 index 0000000..39f4cad Binary files /dev/null and b/assets/theme/kasuterura-4/9.gif differ diff --git a/assets/theme/kyun/0.gif b/assets/theme/kyun/0.gif new file mode 100644 index 0000000..5738cb1 Binary files /dev/null and b/assets/theme/kyun/0.gif differ diff --git a/assets/theme/kyun/1.gif b/assets/theme/kyun/1.gif new file mode 100644 index 0000000..f111c3e Binary files /dev/null and b/assets/theme/kyun/1.gif differ diff --git a/assets/theme/kyun/2.gif b/assets/theme/kyun/2.gif new file mode 100644 index 0000000..7d97836 Binary files /dev/null and b/assets/theme/kyun/2.gif differ diff --git a/assets/theme/kyun/3.gif b/assets/theme/kyun/3.gif new file mode 100644 index 0000000..960367a Binary files /dev/null and b/assets/theme/kyun/3.gif differ diff --git a/assets/theme/kyun/4.gif b/assets/theme/kyun/4.gif new file mode 100644 index 0000000..8a8ce21 Binary files /dev/null and b/assets/theme/kyun/4.gif differ diff --git a/assets/theme/kyun/5.gif b/assets/theme/kyun/5.gif new file mode 100644 index 0000000..1a8a045 Binary files /dev/null and b/assets/theme/kyun/5.gif differ diff --git a/assets/theme/kyun/6.gif b/assets/theme/kyun/6.gif new file mode 100644 index 0000000..97bec27 Binary files /dev/null and b/assets/theme/kyun/6.gif differ diff --git a/assets/theme/kyun/7.gif b/assets/theme/kyun/7.gif new file mode 100644 index 0000000..a013c8d Binary files /dev/null and b/assets/theme/kyun/7.gif differ diff --git a/assets/theme/kyun/8.gif b/assets/theme/kyun/8.gif new file mode 100644 index 0000000..11604b6 Binary files /dev/null and b/assets/theme/kyun/8.gif differ diff --git a/assets/theme/kyun/9.gif b/assets/theme/kyun/9.gif new file mode 100644 index 0000000..befbc15 Binary files /dev/null and b/assets/theme/kyun/9.gif differ diff --git a/assets/theme/love-and-deepspace/0.png b/assets/theme/love-and-deepspace/0.png new file mode 100644 index 0000000..47eb4cd Binary files /dev/null and b/assets/theme/love-and-deepspace/0.png differ diff --git a/assets/theme/love-and-deepspace/1.png b/assets/theme/love-and-deepspace/1.png new file mode 100644 index 0000000..7b29bde Binary files /dev/null and b/assets/theme/love-and-deepspace/1.png differ diff --git a/assets/theme/love-and-deepspace/2.png b/assets/theme/love-and-deepspace/2.png new file mode 100644 index 0000000..25394bc Binary files /dev/null and b/assets/theme/love-and-deepspace/2.png differ diff --git a/assets/theme/love-and-deepspace/3.png b/assets/theme/love-and-deepspace/3.png new file mode 100644 index 0000000..67b6504 Binary files /dev/null and b/assets/theme/love-and-deepspace/3.png differ diff --git a/assets/theme/love-and-deepspace/4.png b/assets/theme/love-and-deepspace/4.png new file mode 100644 index 0000000..eb5c8d8 Binary files /dev/null and b/assets/theme/love-and-deepspace/4.png differ diff --git a/assets/theme/love-and-deepspace/5.png b/assets/theme/love-and-deepspace/5.png new file mode 100644 index 0000000..b45b3b5 Binary files /dev/null and b/assets/theme/love-and-deepspace/5.png differ diff --git a/assets/theme/love-and-deepspace/6.png b/assets/theme/love-and-deepspace/6.png new file mode 100644 index 0000000..ca37abd Binary files /dev/null and b/assets/theme/love-and-deepspace/6.png differ diff --git a/assets/theme/love-and-deepspace/7.png b/assets/theme/love-and-deepspace/7.png new file mode 100644 index 0000000..6d04623 Binary files /dev/null and b/assets/theme/love-and-deepspace/7.png differ diff --git a/assets/theme/love-and-deepspace/8.png b/assets/theme/love-and-deepspace/8.png new file mode 100644 index 0000000..8ed6be1 Binary files /dev/null and b/assets/theme/love-and-deepspace/8.png differ diff --git a/assets/theme/love-and-deepspace/9.png b/assets/theme/love-and-deepspace/9.png new file mode 100644 index 0000000..86a109c Binary files /dev/null and b/assets/theme/love-and-deepspace/9.png differ diff --git a/assets/theme/minecraft/0.gif b/assets/theme/minecraft/0.gif new file mode 100644 index 0000000..e1d6c2a Binary files /dev/null and b/assets/theme/minecraft/0.gif differ diff --git a/assets/theme/minecraft/1.gif b/assets/theme/minecraft/1.gif new file mode 100644 index 0000000..cd9c278 Binary files /dev/null and b/assets/theme/minecraft/1.gif differ diff --git a/assets/theme/minecraft/2.gif b/assets/theme/minecraft/2.gif new file mode 100644 index 0000000..bc0bd21 Binary files /dev/null and b/assets/theme/minecraft/2.gif differ diff --git a/assets/theme/minecraft/3.gif b/assets/theme/minecraft/3.gif new file mode 100644 index 0000000..7546018 Binary files /dev/null and b/assets/theme/minecraft/3.gif differ diff --git a/assets/theme/minecraft/4.gif b/assets/theme/minecraft/4.gif new file mode 100644 index 0000000..af23f16 Binary files /dev/null and b/assets/theme/minecraft/4.gif differ diff --git a/assets/theme/minecraft/5.gif b/assets/theme/minecraft/5.gif new file mode 100644 index 0000000..e1764b8 Binary files /dev/null and b/assets/theme/minecraft/5.gif differ diff --git a/assets/theme/minecraft/6.gif b/assets/theme/minecraft/6.gif new file mode 100644 index 0000000..25e3d9d Binary files /dev/null and b/assets/theme/minecraft/6.gif differ diff --git a/assets/theme/minecraft/7.gif b/assets/theme/minecraft/7.gif new file mode 100644 index 0000000..ceeb725 Binary files /dev/null and b/assets/theme/minecraft/7.gif differ diff --git a/assets/theme/minecraft/8.gif b/assets/theme/minecraft/8.gif new file mode 100644 index 0000000..a63ecfa Binary files /dev/null and b/assets/theme/minecraft/8.gif differ diff --git a/assets/theme/minecraft/9.gif b/assets/theme/minecraft/9.gif new file mode 100644 index 0000000..9ea20c7 Binary files /dev/null and b/assets/theme/minecraft/9.gif differ diff --git a/assets/theme/morden-num/0.gif b/assets/theme/morden-num/0.gif new file mode 100644 index 0000000..de96eb4 Binary files /dev/null and b/assets/theme/morden-num/0.gif differ diff --git a/assets/theme/morden-num/1.gif b/assets/theme/morden-num/1.gif new file mode 100644 index 0000000..fa5985c Binary files /dev/null and b/assets/theme/morden-num/1.gif differ diff --git a/assets/theme/morden-num/2.gif b/assets/theme/morden-num/2.gif new file mode 100644 index 0000000..c99dede Binary files /dev/null and b/assets/theme/morden-num/2.gif differ diff --git a/assets/theme/morden-num/3.gif b/assets/theme/morden-num/3.gif new file mode 100644 index 0000000..f54e034 Binary files /dev/null and b/assets/theme/morden-num/3.gif differ diff --git a/assets/theme/morden-num/4.gif b/assets/theme/morden-num/4.gif new file mode 100644 index 0000000..af9af46 Binary files /dev/null and b/assets/theme/morden-num/4.gif differ diff --git a/assets/theme/morden-num/5.gif b/assets/theme/morden-num/5.gif new file mode 100644 index 0000000..709a666 Binary files /dev/null and b/assets/theme/morden-num/5.gif differ diff --git a/assets/theme/morden-num/6.gif b/assets/theme/morden-num/6.gif new file mode 100644 index 0000000..f022521 Binary files /dev/null and b/assets/theme/morden-num/6.gif differ diff --git a/assets/theme/morden-num/7.gif b/assets/theme/morden-num/7.gif new file mode 100644 index 0000000..5d5c144 Binary files /dev/null and b/assets/theme/morden-num/7.gif differ diff --git a/assets/theme/morden-num/8.gif b/assets/theme/morden-num/8.gif new file mode 100644 index 0000000..62a8ce1 Binary files /dev/null and b/assets/theme/morden-num/8.gif differ diff --git a/assets/theme/morden-num/9.gif b/assets/theme/morden-num/9.gif new file mode 100644 index 0000000..0a9b706 Binary files /dev/null and b/assets/theme/morden-num/9.gif differ diff --git a/assets/theme/nixietube-1/0.gif b/assets/theme/nixietube-1/0.gif new file mode 100644 index 0000000..6eaab21 Binary files /dev/null and b/assets/theme/nixietube-1/0.gif differ diff --git a/assets/theme/nixietube-1/1.gif b/assets/theme/nixietube-1/1.gif new file mode 100644 index 0000000..6e57b14 Binary files /dev/null and b/assets/theme/nixietube-1/1.gif differ diff --git a/assets/theme/nixietube-1/2.gif b/assets/theme/nixietube-1/2.gif new file mode 100644 index 0000000..6c9650c Binary files /dev/null and b/assets/theme/nixietube-1/2.gif differ diff --git a/assets/theme/nixietube-1/3.gif b/assets/theme/nixietube-1/3.gif new file mode 100644 index 0000000..00082ae Binary files /dev/null and b/assets/theme/nixietube-1/3.gif differ diff --git a/assets/theme/nixietube-1/4.gif b/assets/theme/nixietube-1/4.gif new file mode 100644 index 0000000..151678a Binary files /dev/null and b/assets/theme/nixietube-1/4.gif differ diff --git a/assets/theme/nixietube-1/5.gif b/assets/theme/nixietube-1/5.gif new file mode 100644 index 0000000..e18a971 Binary files /dev/null and b/assets/theme/nixietube-1/5.gif differ diff --git a/assets/theme/nixietube-1/6.gif b/assets/theme/nixietube-1/6.gif new file mode 100644 index 0000000..6ca0a4c Binary files /dev/null and b/assets/theme/nixietube-1/6.gif differ diff --git a/assets/theme/nixietube-1/7.gif b/assets/theme/nixietube-1/7.gif new file mode 100644 index 0000000..ea1d192 Binary files /dev/null and b/assets/theme/nixietube-1/7.gif differ diff --git a/assets/theme/nixietube-1/8.gif b/assets/theme/nixietube-1/8.gif new file mode 100644 index 0000000..2d80bcb Binary files /dev/null and b/assets/theme/nixietube-1/8.gif differ diff --git a/assets/theme/nixietube-1/9.gif b/assets/theme/nixietube-1/9.gif new file mode 100644 index 0000000..8b50d79 Binary files /dev/null and b/assets/theme/nixietube-1/9.gif differ diff --git a/assets/theme/nixietube-2/0.gif b/assets/theme/nixietube-2/0.gif new file mode 100644 index 0000000..09f4728 Binary files /dev/null and b/assets/theme/nixietube-2/0.gif differ diff --git a/assets/theme/nixietube-2/1.gif b/assets/theme/nixietube-2/1.gif new file mode 100644 index 0000000..b6ac51e Binary files /dev/null and b/assets/theme/nixietube-2/1.gif differ diff --git a/assets/theme/nixietube-2/2.gif b/assets/theme/nixietube-2/2.gif new file mode 100644 index 0000000..03c4184 Binary files /dev/null and b/assets/theme/nixietube-2/2.gif differ diff --git a/assets/theme/nixietube-2/3.gif b/assets/theme/nixietube-2/3.gif new file mode 100644 index 0000000..ee73ae1 Binary files /dev/null and b/assets/theme/nixietube-2/3.gif differ diff --git a/assets/theme/nixietube-2/4.gif b/assets/theme/nixietube-2/4.gif new file mode 100644 index 0000000..e7f84a3 Binary files /dev/null and b/assets/theme/nixietube-2/4.gif differ diff --git a/assets/theme/nixietube-2/5.gif b/assets/theme/nixietube-2/5.gif new file mode 100644 index 0000000..a88cbf3 Binary files /dev/null and b/assets/theme/nixietube-2/5.gif differ diff --git a/assets/theme/nixietube-2/6.gif b/assets/theme/nixietube-2/6.gif new file mode 100644 index 0000000..ddf25d2 Binary files /dev/null and b/assets/theme/nixietube-2/6.gif differ diff --git a/assets/theme/nixietube-2/7.gif b/assets/theme/nixietube-2/7.gif new file mode 100644 index 0000000..7a9042c Binary files /dev/null and b/assets/theme/nixietube-2/7.gif differ diff --git a/assets/theme/nixietube-2/8.gif b/assets/theme/nixietube-2/8.gif new file mode 100644 index 0000000..72899ba Binary files /dev/null and b/assets/theme/nixietube-2/8.gif differ diff --git a/assets/theme/nixietube-2/9.gif b/assets/theme/nixietube-2/9.gif new file mode 100644 index 0000000..c5e5be8 Binary files /dev/null and b/assets/theme/nixietube-2/9.gif differ diff --git a/assets/theme/normal-1/0.gif b/assets/theme/normal-1/0.gif new file mode 100644 index 0000000..ec1fa57 Binary files /dev/null and b/assets/theme/normal-1/0.gif differ diff --git a/assets/theme/normal-1/1.gif b/assets/theme/normal-1/1.gif new file mode 100644 index 0000000..b159e41 Binary files /dev/null and b/assets/theme/normal-1/1.gif differ diff --git a/assets/theme/normal-1/2.gif b/assets/theme/normal-1/2.gif new file mode 100644 index 0000000..e6ea87c Binary files /dev/null and b/assets/theme/normal-1/2.gif differ diff --git a/assets/theme/normal-1/3.gif b/assets/theme/normal-1/3.gif new file mode 100644 index 0000000..78ed279 Binary files /dev/null and b/assets/theme/normal-1/3.gif differ diff --git a/assets/theme/normal-1/4.gif b/assets/theme/normal-1/4.gif new file mode 100644 index 0000000..7ec7cf6 Binary files /dev/null and b/assets/theme/normal-1/4.gif differ diff --git a/assets/theme/normal-1/5.gif b/assets/theme/normal-1/5.gif new file mode 100644 index 0000000..cccedbb Binary files /dev/null and b/assets/theme/normal-1/5.gif differ diff --git a/assets/theme/normal-1/6.gif b/assets/theme/normal-1/6.gif new file mode 100644 index 0000000..b084443 Binary files /dev/null and b/assets/theme/normal-1/6.gif differ diff --git a/assets/theme/normal-1/7.gif b/assets/theme/normal-1/7.gif new file mode 100644 index 0000000..1240b82 Binary files /dev/null and b/assets/theme/normal-1/7.gif differ diff --git a/assets/theme/normal-1/8.gif b/assets/theme/normal-1/8.gif new file mode 100644 index 0000000..cebc3f7 Binary files /dev/null and b/assets/theme/normal-1/8.gif differ diff --git a/assets/theme/normal-1/9.gif b/assets/theme/normal-1/9.gif new file mode 100644 index 0000000..1502a50 Binary files /dev/null and b/assets/theme/normal-1/9.gif differ diff --git a/assets/theme/normal-2/0.gif b/assets/theme/normal-2/0.gif new file mode 100644 index 0000000..56d86e2 Binary files /dev/null and b/assets/theme/normal-2/0.gif differ diff --git a/assets/theme/normal-2/1.gif b/assets/theme/normal-2/1.gif new file mode 100644 index 0000000..cd7a820 Binary files /dev/null and b/assets/theme/normal-2/1.gif differ diff --git a/assets/theme/normal-2/2.gif b/assets/theme/normal-2/2.gif new file mode 100644 index 0000000..17c50d3 Binary files /dev/null and b/assets/theme/normal-2/2.gif differ diff --git a/assets/theme/normal-2/3.gif b/assets/theme/normal-2/3.gif new file mode 100644 index 0000000..bd2c86f Binary files /dev/null and b/assets/theme/normal-2/3.gif differ diff --git a/assets/theme/normal-2/4.gif b/assets/theme/normal-2/4.gif new file mode 100644 index 0000000..5f62199 Binary files /dev/null and b/assets/theme/normal-2/4.gif differ diff --git a/assets/theme/normal-2/5.gif b/assets/theme/normal-2/5.gif new file mode 100644 index 0000000..5516670 Binary files /dev/null and b/assets/theme/normal-2/5.gif differ diff --git a/assets/theme/normal-2/6.gif b/assets/theme/normal-2/6.gif new file mode 100644 index 0000000..fa9133d Binary files /dev/null and b/assets/theme/normal-2/6.gif differ diff --git a/assets/theme/normal-2/7.gif b/assets/theme/normal-2/7.gif new file mode 100644 index 0000000..58ba2d9 Binary files /dev/null and b/assets/theme/normal-2/7.gif differ diff --git a/assets/theme/normal-2/8.gif b/assets/theme/normal-2/8.gif new file mode 100644 index 0000000..6e74a7e Binary files /dev/null and b/assets/theme/normal-2/8.gif differ diff --git a/assets/theme/normal-2/9.gif b/assets/theme/normal-2/9.gif new file mode 100644 index 0000000..be9bdb1 Binary files /dev/null and b/assets/theme/normal-2/9.gif differ diff --git a/assets/theme/original-new/0.gif b/assets/theme/original-new/0.gif new file mode 100644 index 0000000..f91f33e Binary files /dev/null and b/assets/theme/original-new/0.gif differ diff --git a/assets/theme/original-new/1.gif b/assets/theme/original-new/1.gif new file mode 100644 index 0000000..d7a3ad7 Binary files /dev/null and b/assets/theme/original-new/1.gif differ diff --git a/assets/theme/original-new/2.gif b/assets/theme/original-new/2.gif new file mode 100644 index 0000000..8e6b2d6 Binary files /dev/null and b/assets/theme/original-new/2.gif differ diff --git a/assets/theme/original-new/3.gif b/assets/theme/original-new/3.gif new file mode 100644 index 0000000..ef84aa2 Binary files /dev/null and b/assets/theme/original-new/3.gif differ diff --git a/assets/theme/original-new/4.gif b/assets/theme/original-new/4.gif new file mode 100644 index 0000000..34cd750 Binary files /dev/null and b/assets/theme/original-new/4.gif differ diff --git a/assets/theme/original-new/5.gif b/assets/theme/original-new/5.gif new file mode 100644 index 0000000..5c2c7b5 Binary files /dev/null and b/assets/theme/original-new/5.gif differ diff --git a/assets/theme/original-new/6.gif b/assets/theme/original-new/6.gif new file mode 100644 index 0000000..01d39d9 Binary files /dev/null and b/assets/theme/original-new/6.gif differ diff --git a/assets/theme/original-new/7.gif b/assets/theme/original-new/7.gif new file mode 100644 index 0000000..eb13e32 Binary files /dev/null and b/assets/theme/original-new/7.gif differ diff --git a/assets/theme/original-new/8.gif b/assets/theme/original-new/8.gif new file mode 100644 index 0000000..40ad5dd Binary files /dev/null and b/assets/theme/original-new/8.gif differ diff --git a/assets/theme/original-new/9.gif b/assets/theme/original-new/9.gif new file mode 100644 index 0000000..3614182 Binary files /dev/null and b/assets/theme/original-new/9.gif differ diff --git a/assets/theme/original-old/0.gif b/assets/theme/original-old/0.gif new file mode 100644 index 0000000..d158948 Binary files /dev/null and b/assets/theme/original-old/0.gif differ diff --git a/assets/theme/original-old/1.gif b/assets/theme/original-old/1.gif new file mode 100644 index 0000000..9ff460e Binary files /dev/null and b/assets/theme/original-old/1.gif differ diff --git a/assets/theme/original-old/2.gif b/assets/theme/original-old/2.gif new file mode 100644 index 0000000..a5dbb78 Binary files /dev/null and b/assets/theme/original-old/2.gif differ diff --git a/assets/theme/original-old/3.gif b/assets/theme/original-old/3.gif new file mode 100644 index 0000000..3713eeb Binary files /dev/null and b/assets/theme/original-old/3.gif differ diff --git a/assets/theme/original-old/4.gif b/assets/theme/original-old/4.gif new file mode 100644 index 0000000..990b9d7 Binary files /dev/null and b/assets/theme/original-old/4.gif differ diff --git a/assets/theme/original-old/5.gif b/assets/theme/original-old/5.gif new file mode 100644 index 0000000..ea049ac Binary files /dev/null and b/assets/theme/original-old/5.gif differ diff --git a/assets/theme/original-old/6.gif b/assets/theme/original-old/6.gif new file mode 100644 index 0000000..b209ffb Binary files /dev/null and b/assets/theme/original-old/6.gif differ diff --git a/assets/theme/original-old/7.gif b/assets/theme/original-old/7.gif new file mode 100644 index 0000000..91fbffd Binary files /dev/null and b/assets/theme/original-old/7.gif differ diff --git a/assets/theme/original-old/8.gif b/assets/theme/original-old/8.gif new file mode 100644 index 0000000..4e029f2 Binary files /dev/null and b/assets/theme/original-old/8.gif differ diff --git a/assets/theme/original-old/9.gif b/assets/theme/original-old/9.gif new file mode 100644 index 0000000..d4ffaa1 Binary files /dev/null and b/assets/theme/original-old/9.gif differ diff --git a/assets/theme/shimmie2/0.gif b/assets/theme/shimmie2/0.gif new file mode 100644 index 0000000..8bf28b4 Binary files /dev/null and b/assets/theme/shimmie2/0.gif differ diff --git a/assets/theme/shimmie2/1.gif b/assets/theme/shimmie2/1.gif new file mode 100644 index 0000000..bfccd64 Binary files /dev/null and b/assets/theme/shimmie2/1.gif differ diff --git a/assets/theme/shimmie2/2.gif b/assets/theme/shimmie2/2.gif new file mode 100644 index 0000000..66b9bc6 Binary files /dev/null and b/assets/theme/shimmie2/2.gif differ diff --git a/assets/theme/shimmie2/3.gif b/assets/theme/shimmie2/3.gif new file mode 100644 index 0000000..6b1e98f Binary files /dev/null and b/assets/theme/shimmie2/3.gif differ diff --git a/assets/theme/shimmie2/4.gif b/assets/theme/shimmie2/4.gif new file mode 100644 index 0000000..5dce74c Binary files /dev/null and b/assets/theme/shimmie2/4.gif differ diff --git a/assets/theme/shimmie2/5.gif b/assets/theme/shimmie2/5.gif new file mode 100644 index 0000000..99d0a35 Binary files /dev/null and b/assets/theme/shimmie2/5.gif differ diff --git a/assets/theme/shimmie2/6.gif b/assets/theme/shimmie2/6.gif new file mode 100644 index 0000000..549f765 Binary files /dev/null and b/assets/theme/shimmie2/6.gif differ diff --git a/assets/theme/shimmie2/7.gif b/assets/theme/shimmie2/7.gif new file mode 100644 index 0000000..e6047a5 Binary files /dev/null and b/assets/theme/shimmie2/7.gif differ diff --git a/assets/theme/shimmie2/8.gif b/assets/theme/shimmie2/8.gif new file mode 100644 index 0000000..df2ad91 Binary files /dev/null and b/assets/theme/shimmie2/8.gif differ diff --git a/assets/theme/shimmie2/9.gif b/assets/theme/shimmie2/9.gif new file mode 100644 index 0000000..ca06c15 Binary files /dev/null and b/assets/theme/shimmie2/9.gif differ diff --git a/assets/theme/sketch-1/0.png b/assets/theme/sketch-1/0.png new file mode 100644 index 0000000..064e4df Binary files /dev/null and b/assets/theme/sketch-1/0.png differ diff --git a/assets/theme/sketch-1/1.png b/assets/theme/sketch-1/1.png new file mode 100644 index 0000000..d2eb8a8 Binary files /dev/null and b/assets/theme/sketch-1/1.png differ diff --git a/assets/theme/sketch-1/2.png b/assets/theme/sketch-1/2.png new file mode 100644 index 0000000..0189ade Binary files /dev/null and b/assets/theme/sketch-1/2.png differ diff --git a/assets/theme/sketch-1/3.png b/assets/theme/sketch-1/3.png new file mode 100644 index 0000000..f7a765e Binary files /dev/null and b/assets/theme/sketch-1/3.png differ diff --git a/assets/theme/sketch-1/4.png b/assets/theme/sketch-1/4.png new file mode 100644 index 0000000..468eb01 Binary files /dev/null and b/assets/theme/sketch-1/4.png differ diff --git a/assets/theme/sketch-1/5.png b/assets/theme/sketch-1/5.png new file mode 100644 index 0000000..2e14547 Binary files /dev/null and b/assets/theme/sketch-1/5.png differ diff --git a/assets/theme/sketch-1/6.png b/assets/theme/sketch-1/6.png new file mode 100644 index 0000000..49ea931 Binary files /dev/null and b/assets/theme/sketch-1/6.png differ diff --git a/assets/theme/sketch-1/7.png b/assets/theme/sketch-1/7.png new file mode 100644 index 0000000..d69d6a6 Binary files /dev/null and b/assets/theme/sketch-1/7.png differ diff --git a/assets/theme/sketch-1/8.png b/assets/theme/sketch-1/8.png new file mode 100644 index 0000000..6c01f43 Binary files /dev/null and b/assets/theme/sketch-1/8.png differ diff --git a/assets/theme/sketch-1/9.png b/assets/theme/sketch-1/9.png new file mode 100644 index 0000000..03a0438 Binary files /dev/null and b/assets/theme/sketch-1/9.png differ diff --git a/assets/theme/sketch-2/0.png b/assets/theme/sketch-2/0.png new file mode 100644 index 0000000..95576fd Binary files /dev/null and b/assets/theme/sketch-2/0.png differ diff --git a/assets/theme/sketch-2/1.png b/assets/theme/sketch-2/1.png new file mode 100644 index 0000000..4d2b879 Binary files /dev/null and b/assets/theme/sketch-2/1.png differ diff --git a/assets/theme/sketch-2/2.png b/assets/theme/sketch-2/2.png new file mode 100644 index 0000000..6d56cb1 Binary files /dev/null and b/assets/theme/sketch-2/2.png differ diff --git a/assets/theme/sketch-2/3.png b/assets/theme/sketch-2/3.png new file mode 100644 index 0000000..c4e474b Binary files /dev/null and b/assets/theme/sketch-2/3.png differ diff --git a/assets/theme/sketch-2/4.png b/assets/theme/sketch-2/4.png new file mode 100644 index 0000000..7accc31 Binary files /dev/null and b/assets/theme/sketch-2/4.png differ diff --git a/assets/theme/sketch-2/5.png b/assets/theme/sketch-2/5.png new file mode 100644 index 0000000..16c644d Binary files /dev/null and b/assets/theme/sketch-2/5.png differ diff --git a/assets/theme/sketch-2/6.png b/assets/theme/sketch-2/6.png new file mode 100644 index 0000000..2281dff Binary files /dev/null and b/assets/theme/sketch-2/6.png differ diff --git a/assets/theme/sketch-2/7.png b/assets/theme/sketch-2/7.png new file mode 100644 index 0000000..940f08e Binary files /dev/null and b/assets/theme/sketch-2/7.png differ diff --git a/assets/theme/sketch-2/8.png b/assets/theme/sketch-2/8.png new file mode 100644 index 0000000..f8e29cc Binary files /dev/null and b/assets/theme/sketch-2/8.png differ diff --git a/assets/theme/sketch-2/9.png b/assets/theme/sketch-2/9.png new file mode 100644 index 0000000..8249bbe Binary files /dev/null and b/assets/theme/sketch-2/9.png differ diff --git a/config.yml b/config.yml deleted file mode 100644 index a5070f3..0000000 --- a/config.yml +++ /dev/null @@ -1,6 +0,0 @@ -app: - # site: https://count.getloli.com # your website - port: 3000 - -db: - type: sqlite # sqlite or mongodb diff --git a/db/index.js b/db/index.js index cc8adb0..efcdfb6 100644 --- a/db/index.js +++ b/db/index.js @@ -1,10 +1,8 @@ 'use strict' -const config = require('config-yml') - let db -switch(config.db.type){ +switch(process.env.DB_TYPE){ case 'mongodb': db = require('./mongodb') break; diff --git a/db/mongodb.js b/db/mongodb.js index 4119c7a..a154b9a 100644 --- a/db/mongodb.js +++ b/db/mongodb.js @@ -1,55 +1,60 @@ -'use strict' +"use strict"; -const mongoose = require('mongoose') -const schema = require('./schema') +const mongoose = require("mongoose"); + +const schema = new mongoose.Schema( + { + name: { type: String, required: true }, + num: { type: Number, required: true } + }, + { collection: 'tb_count', versionKey: false } +); // the default mongodb url (local server) -const mongodbURL = process.env.DB_URL || 'mongodb://127.0.0.1:27017' +const mongodbURL = process.env.DB_URL || "mongodb://127.0.0.1:27017"; mongoose.connect(mongodbURL, { useNewUrlParser: true, useUnifiedTopology: true, - useFindAndModify: false -}) + useFindAndModify: false, +}); -const Count = mongoose.connection.model('Count', schema) +const Count = mongoose.connection.model("Count", schema); function getNum(name) { - return Count - .findOne({ name }, '-_id -__v') - .exec() + return Count.findOne({ name }, "-_id -__v").exec(); } function getAll() { - return Count - .find({ }, '-_id -__v') - .exec() + return Count.find({}, "-_id -__v").exec(); } function setNum(name, num) { - return Count - .findOneAndUpdate({ name }, { name, num }, { upsert: true }) - .exec() + return Count.findOneAndUpdate( + { name }, + { name, num }, + { upsert: true } + ).exec(); } function setNumMulti(counters) { - const bulkOps = counters.map(obj => { - const { name, num } = obj + const bulkOps = counters.map((obj) => { + const { name, num } = obj; return { updateOne: { filter: { name }, update: { name, num }, - upsert: true - } - } - }) + upsert: true, + }, + }; + }); - return Count.bulkWrite(bulkOps, { ordered : false }) + return Count.bulkWrite(bulkOps, { ordered: false }); } module.exports = { getNum, getAll, setNum, - setNumMulti -} + setNumMulti, +}; diff --git a/db/schema.js b/db/schema.js deleted file mode 100644 index f558723..0000000 --- a/db/schema.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict' - -const mongoose = require('mongoose'); - -module.exports = new mongoose.Schema({ - name: { type: String, required: true }, - num: { type: Number, required: true } -}, { collection: 'tb_count', versionKey: false }); \ No newline at end of file diff --git a/index.js b/index.js index 77237b8..983add9 100644 --- a/index.js +++ b/index.js @@ -1,125 +1,162 @@ -'use strict' +"use strict"; -const fs = require('fs') -const config = require('config-yml') -const express = require('express') -const compression = require('compression') +require('dotenv').config(); +const express = require("express"); +const compression = require("compression"); +const { z } = require("zod"); -const db = require('./db') -const themify = require('./utils/themify') +const db = require("./db"); +const { themeList, getCountImage } = require("./utils/themify"); +const { cors, ZodValid } = require("./utils/middleware"); +const { randomArray, logger } = require("./utils"); -const PLACES = 7 +const app = express(); -const app = express() - -app.use(express.static('assets')) -app.use(compression()) -app.set('view engine', 'pug') +app.use(express.static("assets")); +app.use(compression()); +app.use(cors()); +app.set("view engine", "pug"); app.get('/', (req, res) => { - const site = config.app.site || `${req.protocol}://${req.get('host')}` - res.render('index', { site }) + const site = process.env.APP_SITE || `${req.protocol}://${req.get('host')}` + const ga_id = process.env.GA_ID || null + res.render('index', { + site, + ga_id, + themeList, + }) }); // get the image -app.get('/get/@:name', async (req, res) => { - const { name } = req.params - const { theme = 'moebooru' } = req.query - let length = PLACES +app.get(["/@:name", "/get/@:name"], + ZodValid({ + params: z.object({ + name: z.string().max(32), + }), + query: z.object({ + theme: z.string().default("moebooru"), + padding: z.coerce.number().int().min(0).max(16).default(7), + offset: z.coerce.number().min(-500).max(500).default(0), + align: z.enum(["top", "center", "bottom"]).default("top"), + scale: z.coerce.number().min(0.1).max(2).default(1), + pixelated: z.enum(["0", "1"]).default("1"), + darkmode: z.enum(["0", "1", "auto"]).default("auto"), - // This helps with GitHub's image cache - res.set({ - 'content-type': 'image/svg+xml', - 'cache-control': 'max-age=0, no-cache, no-store, must-revalidate' - }) - - const data = await getCountByName(name) - - if (name === 'demo') { - res.set({ - 'cache-control': 'max-age=31536000' + // Unusual Options + num: z.coerce.number().int().min(0).max(1e15).default(0), // a carry-safe integer, less than `2^53-1`, and aesthetically pleasing in decimal. + prefix: z.coerce.number().int().min(-1).max(999999).default(-1) }) - length = 10 + }), + async (req, res) => { + const { name } = req.params; + let { theme = "moebooru", num = 0, ...rest } = req.query; + + // This helps with GitHub's image cache + res.set({ + "content-type": "image/svg+xml", + "cache-control": "max-age=0, no-cache, no-store, must-revalidate", + }); + + const data = await getCountByName(String(name), Number(num)); + + if (name === "demo") { + res.set("cache-control", "max-age=31536000"); + } + + if (theme === "random") { + theme = randomArray(Object.keys(themeList)); + } + + // Send the generated SVG as the result + const renderSvg = getCountImage({ + count: data.num, + theme, + ...rest + }); + + res.send(renderSvg); + + logger.debug( + data, + { theme, ...req.query }, + `ip: ${req.headers['x-forwarded-for'] || req.connection.remoteAddress}`, + `ref: ${req.get("Referrer") || null}`, + `ua: ${req.get("User-Agent") || null}` + ); } - - // Send the generated SVG as the result - const renderSvg = themify.getCountImage({ count: data.num, theme, length }) - res.send(renderSvg) - - console.log(data, `theme: ${theme}`, `ref: ${req.get('Referrer') || null}`, `ua: ${req.get('User-Agent') || null}`) -}) +); // JSON record -app.get('/record/@:name', async (req, res) => { - const { name } = req.params +app.get("/record/@:name", async (req, res) => { + const { name } = req.params; - const data = await getCountByName(name) + const data = await getCountByName(name); - res.json(data) -}) - -app.get('/heart-beat', (req, res) => { - res.set({ - 'cache-control': 'max-age=0, no-cache, no-store, must-revalidate' - }) - - res.send('alive') - console.log('heart-beat') + res.json(data); }); -const listener = app.listen(config.app.port || 3000, () => { - console.log('Your app is listening on port ' + listener.address().port) -}) +app.get("/heart-beat", (req, res) => { + res.set("cache-control", "max-age=0, no-cache, no-store, must-revalidate"); + res.send("alive"); + logger.debug("heart-beat"); +}); -let __cache_counter = {}, shouldPush = false +const listener = app.listen(process.env.APP_PORT || 3000, () => { + logger.info("Your app is listening on port " + listener.address().port); +}); -setInterval(() => { - shouldPush = true -}, 1000 * 60); +let __cache_counter = {}; +let enablePushDelay = process.env.DB_INTERVAL > 0 +let needPush = false; + +if (enablePushDelay) { + setInterval(() => { + needPush = true; + }, 1000 * process.env.DB_INTERVAL); +} async function pushDB() { - if (!shouldPush) return + if (Object.keys(__cache_counter).length === 0) return; + if (enablePushDelay && !needPush) return; try { - shouldPush = false - if (Object.keys(__cache_counter).length === 0) return + needPush = false; + logger.info("pushDB", __cache_counter); - console.log("pushDB", __cache_counter) - - const counters = Object.keys(__cache_counter).map(key => { + const counters = Object.keys(__cache_counter).map((key) => { return { name: key, - num: __cache_counter[key] - } - }) + num: __cache_counter[key], + }; + }); - await db.setNumMulti(counters) - __cache_counter = {} + await db.setNumMulti(counters); + __cache_counter = {}; } catch (error) { - console.log("pushDB is error: ", error) + logger.error("pushDB is error: ", error); } } -async function getCountByName(name) { - const defaultCount = { name, num: 0 } +async function getCountByName(name, num) { + const defaultCount = { name, num: 0 }; - if (name === 'demo') return { name, num: '0123456789' } + if (name === "demo") return { name, num: "0123456789" }; + + if (num > 0) { return { name, num } }; try { if (!(name in __cache_counter)) { - const counter = await db.getNum(name) || defaultCount - __cache_counter[name] = counter.num + 1 + const counter = (await db.getNum(name)) || defaultCount; + __cache_counter[name] = counter.num + 1; } else { - __cache_counter[name]++ + __cache_counter[name]++; } - pushDB() - - return { name, num: __cache_counter[name] } + pushDB(); + return { name, num: __cache_counter[name] }; } catch (error) { - console.log("get count by name is error: ", error) - return defaultCount - + logger.error("get count by name is error: ", error); + return defaultCount; } } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 223cb5d..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2091 +0,0 @@ -{ - "name": "kawaii-counter", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-never": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", - "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "optional": true - }, - "babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "requires": { - "@babel/types": "^7.9.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true - }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "requires": { - "is-regex": "^1.0.3" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "config-yml": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/config-yml/-/config-yml-0.10.3.tgz", - "integrity": "sha512-OsFOdaVpC7o0lNLOT9HGicTEB/txYESVqsCpeXdU86i1OrcMR4QJ0qwkmVujOe54kYA0bkKFucF9WvjCFVOvqQ==", - "requires": { - "js-yaml": "^3.6.1", - "lodash": "^4.13.1", - "moment": "^2.13.0", - "shelljs": "^0.7.0", - "yargs": "^4.7.1" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "requires": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "optional": true - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "optional": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "optional": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "requires": { - "queue": "6.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "requires": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "optional": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "optional": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "requires": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "kareem": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", - "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" - }, - "mongodb": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.10.tgz", - "integrity": "sha512-p/C48UvTU/dr/PQEDKfb9DsCVDJWXGmdJNFC+u5FPmTQVtog69X6D8vrWHz+sJx1zJnd96sjdh9ueo7bx2ILTw==", - "requires": { - "bl": "^2.2.0", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, - "mongoose": { - "version": "5.9.28", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.28.tgz", - "integrity": "sha512-A8lNRk4eCQDzk+DagSMYdH94LAYrbTK83LgrUlzqdig3YXvizW3DApJqOWQ5DdhuimvsfiD0Z5NTVzXl/rgi2w==", - "requires": { - "bson": "^1.1.4", - "kareem": "2.3.1", - "mongodb": "3.5.10", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.7.0", - "mquery": "3.2.2", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", - "sift": "7.0.1", - "sliced": "1.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "mpath": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", - "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" - }, - "mquery": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", - "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", - "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node-addon-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", - "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "optional": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - } - }, - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "optional": true - }, - "pug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", - "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", - "requires": { - "pug-code-gen": "^3.0.0", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.0", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.0", - "pug-strip-comments": "^2.0.0" - } - }, - "pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "requires": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "pug-code-gen": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", - "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", - "requires": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" - }, - "pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "requires": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "pug-lexer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", - "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", - "requires": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "requires": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "requires": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "requires": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "pug-runtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", - "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==" - }, - "pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "requires": { - "pug-error": "^2.0.0" - } - }, - "pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "requires": { - "inherits": "~2.0.3" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "optional": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sqlite3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", - "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", - "requires": { - "node-addon-api": "2.0.0", - "node-gyp": "3.x", - "node-pre-gyp": "^0.11.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "optional": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "requires": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } -} diff --git a/package.json b/package.json index df1b7d6..83187aa 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,17 @@ "author": "journey-ad", "license": "MIT", "dependencies": { - "better-sqlite3": "^8.1.0", + "better-sqlite3": "^8.2.0", "compression": "^1.7.4", - "config-yml": "^0.10.3", - "express": "^4.17.1", + "dotenv": "^16.4.5", + "express": "^4.18.2", "image-size": "^0.8.3", "mime-types": "^2.1.27", "mongoose": "^5.9.28", - "pug": "^3.0.0" + "pug": "^3.0.0", + "zod": "^3.23.8" + }, + "engines": { + "node": "16.x" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..dc08804 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1273 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + better-sqlite3: + specifier: ^8.2.0 + version: 8.7.0 + compression: + specifier: ^1.7.4 + version: 1.7.4 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + express: + specifier: ^4.18.2 + version: 4.21.1 + image-size: + specifier: ^0.8.3 + version: 0.8.3 + mime-types: + specifier: ^2.1.27 + version: 2.1.35 + mongoose: + specifier: ^5.9.28 + version: 5.13.22 + pug: + specifier: ^3.0.0 + version: 3.0.3 + zod: + specifier: ^3.23.8 + version: 3.23.8 + +packages: + + /@babel/helper-string-parser@7.25.7: + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.25.7: + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/parser@7.25.8: + resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.8 + dev: false + + /@babel/types@7.25.8: + resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + to-fast-properties: 2.0.0 + dev: false + + /@types/bson@4.0.5: + resolution: {integrity: sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==} + dependencies: + '@types/node': 22.7.7 + dev: false + + /@types/mongodb@3.6.20: + resolution: {integrity: sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==} + dependencies: + '@types/bson': 4.0.5 + '@types/node': 22.7.7 + dev: false + + /@types/node@22.7.7: + resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} + dependencies: + undici-types: 6.19.8 + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + dev: false + + /babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/types': 7.25.8 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /better-sqlite3@8.7.0: + resolution: {integrity: sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.2 + dev: false + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bluebird@3.5.1: + resolution: {integrity: sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==} + dev: false + + /body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bson@1.1.6: + resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==} + engines: {node: '>=0.6.19'} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: false + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: false + + /character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + dependencies: + is-regex: 1.1.4 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.53.0 + dev: false + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + dependencies: + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: false + + /denque@1.5.1: + resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} + engines: {node: '>=0.10'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + + /doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + dev: false + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: false + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /express@4.21.1: + resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: false + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: false + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /image-size@0.8.3: + resolution: {integrity: sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + queue: 6.0.1 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: false + + /is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + dev: false + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: false + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + dev: false + + /jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + dev: false + + /kareem@2.3.2: + resolution: {integrity: sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + requiresBuild: true + dev: false + optional: true + + /merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + dev: false + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mongodb@3.7.4: + resolution: {integrity: sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==} + engines: {node: '>=4'} + peerDependencies: + aws4: '*' + bson-ext: '*' + kerberos: '*' + mongodb-client-encryption: '*' + mongodb-extjson: '*' + snappy: '*' + peerDependenciesMeta: + aws4: + optional: true + bson-ext: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + mongodb-extjson: + optional: true + snappy: + optional: true + dependencies: + bl: 2.2.1 + bson: 1.1.6 + denque: 1.5.1 + optional-require: 1.1.8 + safe-buffer: 5.2.1 + optionalDependencies: + saslprep: 1.0.3 + dev: false + + /mongoose-legacy-pluralize@1.0.2(mongoose@5.13.22): + resolution: {integrity: sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==} + peerDependencies: + mongoose: '*' + dependencies: + mongoose: 5.13.22 + dev: false + + /mongoose@5.13.22: + resolution: {integrity: sha512-p51k/c4X/MfqeQ3I1ranlDiggLzNumZrTDD9CeezHwZxt2/btf+YZD7MCe07RAY2NgFYVMayq6jMamw02Jmf9w==} + engines: {node: '>=4.0.0'} + dependencies: + '@types/bson': 4.0.5 + '@types/mongodb': 3.6.20 + bson: 1.1.6 + kareem: 2.3.2 + mongodb: 3.7.4 + mongoose-legacy-pluralize: 1.0.2(mongoose@5.13.22) + mpath: 0.8.4 + mquery: 3.2.5 + ms: 2.1.2 + optional-require: 1.0.3 + regexp-clone: 1.0.0 + safe-buffer: 5.2.1 + sift: 13.5.2 + sliced: 1.0.1 + transitivePeerDependencies: + - aws4 + - bson-ext + - kerberos + - mongodb-client-encryption + - mongodb-extjson + - snappy + - supports-color + dev: false + + /mpath@0.8.4: + resolution: {integrity: sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==} + engines: {node: '>=4.0.0'} + dev: false + + /mquery@3.2.5: + resolution: {integrity: sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==} + engines: {node: '>=4.0.0'} + dependencies: + bluebird: 3.5.1 + debug: 3.1.0 + regexp-clone: 1.0.0 + safe-buffer: 5.1.2 + sliced: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.3 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /optional-require@1.0.3: + resolution: {integrity: sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==} + engines: {node: '>=4'} + dev: false + + /optional-require@1.1.8: + resolution: {integrity: sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==} + engines: {node: '>=4'} + dependencies: + require-at: 1.0.6 + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + dev: false + + /prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.71.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + dev: false + + /pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + dev: false + + /pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + dev: false + + /pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.8 + dev: false + + /pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + dev: false + + /pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + dev: false + + /pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + dev: false + + /pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + dev: false + + /pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + dev: false + + /pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + dependencies: + pug-error: 2.1.0 + dev: false + + /pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + dev: false + + /pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + dev: false + + /pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: false + + /queue@6.0.1: + resolution: {integrity: sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==} + dependencies: + inherits: 2.0.4 + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /regexp-clone@1.0.0: + resolution: {integrity: sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==} + dev: false + + /require-at@1.0.6: + resolution: {integrity: sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==} + engines: {node: '>=4'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /saslprep@1.0.3: + resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + sparse-bitfield: 3.0.3 + dev: false + optional: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: false + + /sift@13.5.2: + resolution: {integrity: sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /sliced@1.0.1: + resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==} + dev: false + + /sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + requiresBuild: true + dependencies: + memory-pager: 1.5.0 + dev: false + optional: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + + /with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 + assert-never: 1.3.0 + babel-walk: 3.0.0-canary-5 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + dev: false diff --git a/utils/index.js b/utils/index.js new file mode 100644 index 0000000..f369e06 --- /dev/null +++ b/utils/index.js @@ -0,0 +1,28 @@ +const log_level = process.env.LOG_LEVEL || 'info'; + +const levels = ['none', 'error', 'warn', 'info', 'debug']; +const currentLevelIndex = levels.indexOf(log_level); + +const buildLogMethod = (level) => (...args) => { + const levelIndex = levels.indexOf(level); + const shouldLog = levelIndex <= currentLevelIndex; + + if (shouldLog) { + console[level](...args); + } +}; + +module.exports = { + randomArray: (arr) => { + return arr[Math.floor(Math.random() * arr.length)] + }, + toFixed: (num, digits = 2) => { + return parseFloat(Number(num).toFixed(digits)) + }, + logger: { + debug: buildLogMethod('debug'), + info: buildLogMethod('info'), + warn: buildLogMethod('warn'), + error: buildLogMethod('error') + } +} diff --git a/utils/middleware.js b/utils/middleware.js new file mode 100644 index 0000000..dc352e0 --- /dev/null +++ b/utils/middleware.js @@ -0,0 +1,83 @@ +function parseError(error) { + const err = JSON.parse(error)[0]; + + return { + code: 400, + message: `The field \`${err.path[0]}\` is invalid. ${err.message}`, + } +} +function validateInput(parseFn, input) { + const result = parseFn(input); + if (!result.success) { + return parseError(result.error); + } + return null; +} + +module.exports = { + ZodValid: ({ headers, params, query, body }) => { + const handler = (req, res, next) => { + const validations = [ + { input: req.headers, parseFn: headers?.safeParse }, + { input: req.params, parseFn: params?.safeParse }, + { input: req.query, parseFn: query?.safeParse }, + { input: req.body, parseFn: body?.safeParse }, + ]; + + for (const { input, parseFn } of validations) { + if (parseFn) { + const error = validateInput(parseFn, input); + if (error) { + return res.status(400).send(error); + } + } + } + + next(); + } + + return handler + }, + cors: ({ allowOrigins = '*', allowMethods = 'GET, POST, PUT, DELETE' } = {}) => { + const isOriginAllowed = (origin) => { + if (Array.isArray(allowOrigins)) { + return allowOrigins.includes(origin); + } + if (typeof allowOrigins === 'string') { + return allowOrigins === '*' || allowOrigins === origin; + } + return false; + }; + + const handler = (req, res, next) => { + const origin = req.headers.origin; + + if (origin && isOriginAllowed(origin)) { + res.header("Access-Control-Allow-Origin", origin); + res.header("Access-Control-Allow-Credentials", "true"); + } else { + return next(); + } + + if (req.method === "OPTIONS") { + const requestMethod = req.headers['access-control-request-method']; + if (requestMethod) { + res.header("Access-Control-Allow-Methods", requestMethod); + } else { + res.header("Access-Control-Allow-Methods", allowMethods); + } + + const requestHeaders = req.headers['access-control-request-headers']; + if (requestHeaders) { + res.header("Access-Control-Allow-Headers", requestHeaders); + } + + return res.sendStatus(204); + } + + next(); + }; + + return handler; + } +} diff --git a/utils/themify.js b/utils/themify.js index 5487a83..ecbcd4d 100644 --- a/utils/themify.js +++ b/utils/themify.js @@ -4,20 +4,29 @@ const fs = require('fs') const path = require('path') const mimeType = require('mime-types') const sizeOf = require('image-size') +const { toFixed } = require('./index') const themePath = path.resolve(__dirname, '../assets/theme') +const imgExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp'] const themeList = {} fs.readdirSync(themePath).forEach(theme => { - if(!(theme in themeList)) themeList[theme] = {} - const imgList = fs.readdirSync(path.resolve(themePath, theme)) + const currentThemePath = path.resolve(themePath, theme) + // skip non-directory + if (!fs.statSync(currentThemePath).isDirectory()) return + + if (!(theme in themeList)) themeList[theme] = {} + const imgList = fs.readdirSync(currentThemePath) imgList.forEach(img => { - const imgPath = path.resolve(themePath, theme, img) - const name = path.parse(img).name + // skip non-image files + if (!imgExts.includes(path.extname(img).toLowerCase())) return + + const imgPath = path.resolve(currentThemePath, img) + const char = path.parse(img).name const { width, height } = sizeOf(imgPath) - themeList[theme][name] = { + themeList[theme][char] = { width, height, data: convertToDatauri(imgPath) @@ -25,43 +34,100 @@ fs.readdirSync(themePath).forEach(theme => { }) }) -function convertToDatauri(path){ +function convertToDatauri(path) { const mime = mimeType.lookup(path) const base64 = fs.readFileSync(path).toString('base64') return `data:${mime};base64,${base64}` } -function getCountImage({ count, theme='moebooru', length=7 }) { - if(!(theme in themeList)) theme = 'moebooru' +function getCountImage(params) { + let { count, theme = 'moebooru', padding = 7, prefix = -1, offset = 0, align = 'top', scale = 1, pixelated = '1', darkmode = 'auto' } = params + + if (!(theme in themeList)) theme = 'moebooru' + padding = parseInt(Number(padding), 10) + offset = parseFloat(Number(offset), 10) + scale = parseFloat(Number(scale), 10) // This is not the greatest way for generating an SVG but it'll do for now - const countArray = count.toString().padStart(length, '0').split('') + const countArray = count.toString().padStart(padding, '0').split('') + + // Add prefix if exist + if (prefix >= 0) { + countArray.unshift(...String(prefix).split('')) + } + + // Add _start and _end if exist + if (themeList[theme]['_start']) { + countArray.unshift('_start') + } + if (themeList[theme]['_end']) { + countArray.push('_end') + } + + const uniqueChar = [...new Set(countArray)] let x = 0, y = 0 - const parts = countArray.reduce((acc, next, index) => { - const { width, height, data } = themeList[theme][next] - const image = `${acc} - ` + const defs = uniqueChar.reduce((ret, cur) => { + let { width, height, data } = themeList[theme][cur] + width *= scale + height *= scale - x += width + y = Math.max(y, height) - if(height > y) y = height + ret = `${ret} + ` + + return ret + }, '') + + const parts = countArray.reduce((ret, cur) => { + let { width, height } = themeList[theme][cur] + width *= scale + height *= scale + + let yOffset = 0 + + if (align === 'center') { + yOffset = (y - height) / 2 + } else if (align === 'bottom') { + yOffset = y - height + } + + const image = `${ret} + ` + + x += width + offset return image }, '') + // Fix the last image offset + x -= offset + + const style = ` + svg { + ${pixelated === '1' ? 'image-rendering: pixelated;' : ''} + ${darkmode === '1' ? 'filter: brightness(.6);' : ''} + } + ${darkmode === 'auto' ? `@media (prefers-color-scheme: dark) { svg { filter: brightness(.6); } }` : ''} + ` + return ` - - Moe Count - - ${parts} - + + + Moe Counter! + + ${defs} + + ${parts} + ` } module.exports = { + themeList, getCountImage } diff --git a/views/index.pug b/views/index.pug index a144569..05f7b07 100644 --- a/views/index.pug +++ b/views/index.pug @@ -1,112 +1,156 @@ html head title='Moe Counter!' - meta(name='viewport', content='width=device-width, initial-scale=1') - link(rel='icon', type='image/png', href='favicon.png') - link(rel='stylesheet', href='https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css') - link(rel='stylesheet', href='style.css') - - script(async, src='https://www.googletagmanager.com/gtag/js?id=G-2RLWN5JXRL') + meta(name='viewport', content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no') + link(rel='icon', type='image/png', href=`${site}/favicon.png`) + link(rel='stylesheet', href='https://cdn.jsdelivr.net/npm/normalize.css') + link(rel='stylesheet', href='https://cdn.jsdelivr.net/npm/bamboo.css') + link(rel='stylesheet/less', href=`${site}/style.less`) + script(less, src='https://cdn.jsdelivr.net/npm/less') + if ga_id + + script(async, src=`https://www.googletagmanager.com/gtag/js?id=${ga_id}`) script. window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} + function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); - gtag('config', 'G-2RLWN5JXRL'); + gtag('config', '#{ga_id}'); - function _evt_push(type, category, label){ + function _evt_push(type, category, label) { gtag('event', type, { 'event_category' : category, 'event_label' : label }); } + script. + var __global_data = { site: "#{site}" }; + body - h3 How to use: + h1#main_title + i Moe Counter! + + h3 How to use + p Set a unique id for your counter, replace + code :name + | in the url, That's it! h5 SVG address - code #{site}/get/@:name + code #{site}/@:name h5 Img tag - code <img src="#{site}/get/@:name" alt=":name" /> + code <img src="#{site}/@:name" alt=":name" /> h5 Markdown - code ![:name](#{site}/get/@:name) + code ![:name](#{site}/@:name) - h3 eg: - Moe Count! + h5 e.g. + img(src=`${site}/@index` alt="Moe Counter!") - i Data can access by anyone, please - | DO NOT - | enter personal information - - details - summary(style='display: inline-block;', onclick='_evt_push("click", "normal", "more_theme")') - h3(style='display: inline-block; cursor: pointer;') More theme - p(style='margin: 0;') Just use the query parameters theme, like this: #{site}/get/@:name?theme=moebooru - h5 asoul - img(src='#{site}/get/@demo?theme=asoul', alt='A-SOUL') - h5 moebooru - img(src='#{site}/get/@demo?theme=moebooru', alt='Moebooru') - h5 moebooru-h - img(src='#{site}/get/@demo?theme=moebooru-h', alt='Moebooru-Hentai') - h5 rule34 - img(src='#{site}/get/@demo?theme=rule34', alt='Rule34') - h5 gelbooru - img(src='#{site}/get/@demo?theme=gelbooru', alt='Gelbooru') - h5 gelbooru-h - img(src='#{site}/get/@demo?theme=gelbooru-h', alt='Gelbooru-Hentai') + details#themes + summary#more_theme(onclick='_evt_push("click", "normal", "more_theme")') + h3 More theme✨ + p Just use the query parameters theme, like this: #{site}/@:name?theme=moebooru + each theme in Object.keys(themeList) + div.item(data-theme=theme) + h5 #{theme} + img(data-src=`${site}/@demo?theme=${theme}` alt=theme) h3 Credits ul - li - a(href='https://repl.it/', target='_blank', rel='nofollow') repl.it - li - a(href='https://space.bilibili.com/703007996', target='_blank', title='A-SOUL_Official') A-SOUL - li - a(href='https://github.com/moebooru/moebooru', target='_blank', rel='nofollow') moebooru - li - a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') rule34.xxx - | NSFW + li: a(href='https://glitch.com/', target='_blank', rel='nofollow') Glitch + li: a(href='https://space.bilibili.com/703007996', target='_blank', title='A-SOUL_Official') A-SOUL + li: a(href='https://github.com/moebooru/moebooru', target='_blank', rel='nofollow') moebooru li a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') gelbooru.com | NSFW - li - a(href='https://icons8.com/icons/set/star', target='_blank', rel='nofollow') Icons8 + li: a(href='https://icons8.com/icon/80355/star', target='_blank', rel='nofollow') Icons8 + span: i And all booru site... h3 Tool .tool - code #{site}/get/@ - input#name(type='text', placeholder=':name', style='display: inline-block; width: 80px; height: 1.4em; line-height: 1.4em; margin: 0 4px; vertical-align: middle;') - code ?theme= - select#theme(style='display: inline-block; height: 1.6em; line-height: 1.6em; font-size: 14px; margin: 0 4px; padding: 0 4px; vertical-align: middle;') - option(value='asoul') asoul - option(value='moebooru') moebooru - option(value='moebooru-h') moebooru-h - option(value='rule34') rule34 - option(value='gelbooru') gelbooru - option(value='gelbooru-h') gelbooru-h - button#get(style='margin: 10px 0;', onclick='_evt_push("click", "normal", "get_counter")') Get - img#result(style='display: block;') + table + thead + tr + th Param + th Description + th Value + tbody + tr + td: code name + td Unique counter name + td: input#name(type='text', placeholder=':name') + tr + td: code theme + td Select a counter image theme, default is + code moebooru + td + select#theme + option(value="random", selected) * random + each theme in Object.keys(themeList) + option(value=theme) #{theme} + tr + td: code padding + td Set the minimum length, between 1-16, default is + code 7 + td: input#padding(type='number', value='7', min='1', max='32', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")') + tr + td: code offset + td Set the offset pixel value, between -500-500, default is + code 0 + td: input#offset(type='number', value='0', min='-500', max='500', step='1', oninput='this.value = this.value.replace(/[^0-9|\-]/g, "")') + tr + td: code scale + td Set the image scale, between 0.1-2, default is + code 1 + td: input#scale(type='number', value='1', min='0.1', max='2', step='0.1', oninput='this.value = this.value.replace(/[^0-9|\.]/g, "")') + tr + td: code align + td Set the image align, Enum top/center/bottom, default is + code top + td: select#align(name="align") + option(value="top", selected) top + option(value="center") center + option(value="bottom") bottom + tr + td: code pixelated + td Enable pixelated mode, Enum 0/1, default is + code 1 + td + input#pixelated(type='checkbox', role='switch', checked) + label(for='pixelated'): span + tr + td: code darkmode + td Enable dark mode, Enum 0/1/auto, default is + code auto + td: select#darkmode(name="darkmode") + option(value="auto", selected) auto + option(value="1") yes + option(value="0") no + tr + td(colspan=3) + h4.caption Unusual Options + tr + td: code num + td Set counter display number, 0 for disable, default is + code 0 + td: input#num(type='number', value='0', min='0', max='1e15', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")') + tr + td: code prefix + td Set the prefix number, empty for disable + td: input#prefix(type='number', value='', min='0', max='999999', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")') - script. - var btn = document.getElementById('get'), - img = document.getElementById('result') + button#get(onclick='_evt_push("click", "normal", "get_counter")') Generate - btn.addEventListener('click', function() { - var name = document.getElementById('name'), - themeEl = document.getElementById('theme') - var text = name.value ? name.value.trim() : '' - var theme = themeEl.value || 'moebooru' - if(!text) { - alert('Please input counter name.') - return - } + div + code#code + img#result - img.src = '#{site}/get/@' + text + '?theme=' + theme - }) - - iframe(src="https://chat.getloli.com/room/@Moe-counter?title=%E8%90%8C%E8%90%8C%E8%AE%A1%E6%95%B0%E5%99%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF", scrolling="no", frameborder="0", height="70%", width="26%", style="position: fixed;top: 2%;right: 5%;") - - p.copy + p.github a(href='https://github.com/journey-ad/Moe-Counter', target='_blank', onclick='_evt_push("click", "normal", "go_github")') source code + + div.back-to-top + + script(async, src='https://cdn.jsdelivr.net/npm/party-js@2/bundle/party.min.js') + script(async, src=`${site}/script.js`)