├── .github └── FUNDING.yml ├── .gitignore ├── README.md ├── dist └── script.js ├── package-lock.json ├── package.json ├── src ├── config │ ├── constants.js │ ├── jobUrls.js │ └── selectors.js ├── data │ └── data.js ├── globals │ └── globals.js ├── main.js ├── modules │ ├── interface │ │ ├── addResponseBtn.js │ │ ├── addSponsorBtn.js │ │ ├── findElementByText.js │ │ └── toggleResponseBtn.js │ ├── popup │ │ ├── insertCoverLetter.js │ │ ├── selectResume.js │ │ ├── submitCoverLetter.js │ │ └── submitCoverLetterPopup.js │ ├── process │ │ └── processVacancies.js │ └── submit │ │ ├── submitMultiVacancies.js │ │ └── submitSingleVacancy.js └── utils │ ├── addToBlacklist.js │ ├── delay.js │ ├── goToNextPage.js │ ├── navigationGuard.js │ ├── popupHelpers.js │ ├── resumeMultiSubmit.js │ └── triggerInputChange.js └── webpack.config.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: ['ia-stepanov'] 2 | custom: ['https://boosty.to/ia-stepanov/donate'] 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | todo.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AutoSend Letters HeadHunter 2 | 3 | ## Описание проекта 4 | 5 | **AutoSend Letters HeadHunter** — это удобный скрипт, который автоматизирует отправку откликов на вакансии на HeadHunter. Цель проекта — сделать поиск работы быстрым и результативным. Если у вас есть желание поддержать развитие проекта и помочь в добавлении новых функций, можно сделать это по ссылке в конце описания. 6 | 7 | ## Зачем нужен этот скрипт? 8 | 9 | Поиск работы часто отнимает много сил: приходится просматривать десятки или сотни вакансий, следить за обновлениями в интересующих компаниях и тратить время на составление сопроводительных писем. В результате удаётся отправить несколько откликов в день. Это неэффективно и отнимает много времени. 10 | 11 | **AutoSend Letters HeadHunter** помогает автоматизировать процесс отправки откликов, освобождая время для более важных дел: подготовки к собеседованиям, улучшению резюме и развитию необходимых навыков. 12 | 13 | ## Что уже сделано (версия 2.2.0) 14 | 15 | - **Удобная автоматизация откликов**: 16 | 17 | - Скрипт открывает попап «Отклик на вакансию» со страницы вакансии или из списка вакансий; 18 | - Автоматически выбирает нужное резюме для отклика; 19 | - Подставляет название вакансии в сопроводительное письмо; 20 | - Нажимает кнопку «Откликнуться» и переходит к следующей вакансии. 21 | 22 | - **Улучшенная архитектура**: 23 | 24 | - Код разделён на модули для удобной поддержки и масштабирования; 25 | - Обновлены селекторы, настройки и константы вынесены в отдельные файлы; 26 | - Добавлен сборщик webpack, упрощающий внесение изменений и сборку модулей в один файл; 27 | - Написаны комментарии (в стиле мини-документации), что облегчает быстрый вход в проект другим разработчикам. 28 | 29 | - **Что нового**: 30 | - Обновлены селекторы, настройки и константы; 31 | - Обновлена функция для правильного изменения `value` у `input / select / textarea` 32 | - Реализован отклик на вакансию из другого города; 33 | - Реализован отклик на вакансию «Непрямой работодатель»; 34 | - В тестировании автоматический переход на следующую страницу; 35 | - В разработке защита от переходов между страницами. 36 | 37 | ### Структура проекта 38 | 39 | ``` 40 | src/ 41 | ├─ config/ — настройки и константы 42 | │ ├─ constants.js — выбираем резюме, название шаблона и время задержки 43 | │ ├─ jobUrls.js — ссылки для нужных сайтов 44 | │ └─ selectors.js — селекторы для интерфейса HeadHunter 45 | ├─ data/ — шаблоны сопроводительных писем 46 | │ └─ data.js 47 | ├─ globals/ — глобальные переменные и флаги состояния 48 | │ └─ globals.js 49 | ├─ modules/ 50 | │ ├─ interface/ — модули для взаимодействия с элементами интерфейса 51 | │ │ ├─ addResponseBtn.js — добавляет кнопку «Отправить отклики» 52 | │ │ ├─ addSponsorBtn.js — добавляет кнопку «Поддержать проект» 53 | │ │ ├─ findElementByText.js — ищет элемент по тексту 54 | │ │ └─ toggleResponseBtn.js — переключает состояние кнопки «Отправить отклики/Остановить отправку» 55 | │ ├─ popup/ — модули для работы с попапом для отправки откликов 56 | │ │ ├─ insertCoverLetter.js — вставляет сопроводительное письмо в форму отклика 57 | │ │ ├─ selectResume.js — выбирает нужное резюме из списка 58 | │ │ ├─ submitCoverLetter.js — нажимает кнопку «Откликнуться» напрямую 59 | │ │ └─ submitCoverLetterPopup.js — нажимает кнопку «Откликнуться» в попапе 60 | │ ├─ process/ модуль для определения контекста страницы 61 | │ │ └─ processVacancies.js 62 | │ └─ submit/ модули для отправки откликов на одну или нескольких вакансий 63 | │ ├─ submitMultiVacancies.js — отправляет отклики на все найденные вакансии 64 | │ └─ submitSingleVacancy.js — отправляет отклик на одну вакансию 65 | ├─ utils/ — вспомогательные функции 66 | │ ├─ addToBlacklist.js — добавляет вакансию в чёрный список 67 | │ ├─ delay.js — реализует задержку в выполнении кода 68 | │ ├─ goToNextPage.js — переходит на следующую страницу // тестируется 69 | │ ├─ navigationGuard.js — запрещает переходы между страницами // в разработке 70 | │ ├─ popupHelpers.js — вспомогательные функции для работы с попапами 71 | │ ├─ resumeMultiSubmit.js — продолжает отправку откликов после обновления страницы // в разработке 72 | │ └─ triggerInputChange.js — инициирует изменение в элементе 73 | ├─ main.js — основной файл, который запускает проект 74 | └─ webpack.config.js — конфигурационный файл для сборки проекта 75 | 76 | ``` 77 | 78 | ## В планах реализовать 79 | 80 | - [ ] **Удобный и интуитивно понятный интерфейс** — возможность выбирать резюме, время задержки и сопроводительные письма напрямую, без редактирования кода; 81 | - [ ] **Автоматическое обновление резюме** — автоматическое поднятие резюме, повышая его приоритет в поисковой выдаче; 82 | - [ ] **Создание сопроводительных писем с помощью AI** — автоматическое формирование персонализированных откликов, которые увеличивают шанс получить приглашение на собеседование. 83 | 84 | ## Как установить и запустить скрипт 85 | 86 | ### Для разработчиков 87 | 88 | 1. **Скопируйте репозиторий**: 89 | ``` 90 | git clone https://github.com/ia-stepanov/autosend-letters-hh.git 91 | ``` 92 | 2. **Установите модули**: 93 | ``` 94 | npm install 95 | ``` 96 | 3. **Соберите код**: 97 | ``` 98 | npm run build 99 | ``` 100 | 101 | ### Для пользователей 102 | 103 | 4. **Установите расширение для Chrome** — [Scripty](https://chrome.google.com/webstore/detail/scripty-javascript-inject/milkbiaeapddfnpenedfgbfdacpbcbam); 104 | 5. **Автоматическая установка скрипта** — [установить скрипт](https://scripty.abhisheksatre.com/#/share/script_mbb7h4qpayicsv); 105 | 6. **Ручная установка** — [см. видеоинструкцию](https://disk.yandex.ru/i/vSoQiv2_ePeTnQ): 106 | - Измените шаблон сопроводительного письма (при желании); 107 | - Добавьте ID резюме в скрипт. 108 | 109 | Теперь вы можете использовать несколько шаблонов сопроводительных писем, управлять задержкой и выбирать, с какого резюме отправлять отклики. 110 | 111 | ## Языки 112 | 113 | - **JavaScript** 114 | 115 | ## Скриншот 116 | 117 |
Развернуть 118 | 119 | [![AutoSend Letters HeadHunter](https://user-images.githubusercontent.com/86494748/184140911-b7603645-7bc5-4fad-8d06-80a56cbdedf7.png)](https://hh.ru/search/vacancy?text=Frontend+developer) 120 | 121 |
122 | 123 | ## Ссылка на проект 124 | 125 | 🔗 **GitHub**: [https://github.com/ia-stepanov/autosend-letters-hh](https://github.com/ia-stepanov/autosend-letters-hh) 126 | 127 | --- 128 | 129 | [![Поддержать проект](https://img.shields.io/badge/Поддержать_проект-Boosty-blue)](https://boosty.to/ia-stepanov/single-payment/donation/364228) 130 | -------------------------------------------------------------------------------- /dist/script.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";const e="coverLetter_1",t=1500,n={naviItems:".supernova-navi-item.supernova-navi-item_lvl-2",blacklist:"[data-qa=vacancy__blacklist-show-add]",addBlacklist:"[data-qa=vacancy__blacklist-menu-add-vacancy]",pagerNext:'[data-qa="pager-next"]',modalOverlay:'[data-qa="modal-overlay"]',alertBox:'[data-qa="magritte-alert"]',countryConfirmBtn:".bloko-modal-footer .bloko-button_kind-success",chatikCloseBtn:'[data-qa="chatik-close-chatik"]',vacancyCards:'[data-qa="vacancy-serp__vacancy"]',vacancyCard:'[data-qa="vacancy-response-link-top"]',vacancyTitle:"[data-qa='serp-item__title']",addCoverLetter:'[data-qa="vacancy-response-letter-toggle-text"]',coverLetterInput:"#cover-letter textarea",respondBtn:'[data-qa="vacancy-serp__vacancy_response"]',sendBtn:'[data-qa="vacancy-response-letter-submit"]',vacancyTitlePopup:'[data-qa="title-description"]',resumeDropdown:'[data-qa="resume-title"]',addCoverLetterPopup:'[data-qa="add-cover-letter"]',coverLetterInputPopup:'[data-qa="vacancy-response-popup-form-letter-input"]',respondBtnPopup:'[data-qa="vacancy-response-submit-popup"]'},a=e=>new Promise((t=>setTimeout(t,e)));let c=!1;function o(){return c}function r(e){c=e}const i="https://hh.ru/vacancy",l=["https://hh.ru/vacancies","https://hh.ru/search/vacancy"],s={coverLetter_1:"Добрый день! \n\nМеня заинтересовала предложенная Вами вакансия {#vacancyName}. Ознакомившись с перечнем требований к кандидатам, пришел к выводу, что мой опыт работы позволяют мне претендовать на данную должность. \n\nОбладаю высоким уровнем фронтенд-разработки, свободно говорю по-английски. В работе ответствен, пунктуален и коммуникабелен.\n\nБуду с нетерпением ждать ответа и возможности обсудить условия работы и взаимные ожидания на собеседовании. Спасибо, что уделили время. \n\nКонтактные данные прилагаю.",coverLetter_2:".",coverLetter_3:"",coverLetter_4:"",coverLetter_5:""};function u(e,t){const a=document.querySelector(n.coverLetterInput)||document.querySelector(n.coverLetterInputPopup);a&&function(e,t=""){if([window.HTMLInputElement,window.HTMLSelectElement,window.HTMLTextAreaElement].includes(e?.__proto__?.constructor)){Object.getOwnPropertyDescriptor(e.__proto__,"value").set.call(e,t);const n=new Event("input",{bubbles:!0});e.dispatchEvent(n)}}(a,s[e].replace("{#vacancyName}",t))}async function d(){const e=document.querySelector(n.alertBox),c=e?.nextElementSibling?.querySelectorAll("button");c?.[1]?.click(),await a(t)}async function y(c){document.querySelector(n.addCoverLetter).click(),await a(t);const o=document.querySelector(n.sendBtn);u(e,c),o.click(),await a(t),document.querySelector(n.chatikCloseBtn)?.click()}async function p(c){const o=document.querySelector(n.respondBtnPopup);await async function(){const e=document.querySelector(n.vacancyTitlePopup),c=document.querySelector(n.resumeDropdown),o=document.querySelector(n.addCoverLetterPopup);c.click(),await a(t);const r=document.querySelector('[data-qa="magritte-select-option-ВАШ_ID_РЕЗЮМЕ"]');r?.click(),o?.click()||e.click()}(),await a(t),u(e,c),o.click(),await a(t)}async function v(){const e=document.querySelector('[data-action="submit-responses"]');if(o())return r(!1),e.textContent="Отправить отклики",void console.log("⏹️ Отправка откликов остановлена");r(!0),e.textContent="Остановить отправку",console.log("▶️ Начата отправка откликов");try{await async function(){const e=window.location.href,c=i,r=l;e.includes(c)?await async function(){const e=document.querySelector(n.singleVacancy);e&&(e.click(),await y())}():r.some((t=>e.includes(t)))&&await async function(){const e=document.querySelectorAll(n.vacancyCards);if(e.length)for(const c of e){if(!o())break;c.scrollIntoView({behavior:"smooth",block:"center"}),c.style.boxShadow="0 0 8px #0059b3";const e=c.querySelector(n.vacancyTitle)?.innerText,r=c.querySelector(n.respondBtn);["Respond","Откликнуться"].includes(r?.innerText)&&(r.click(),await a(t),document.querySelector(n.countryConfirmBtn)?.click(),await d(),document.querySelector(n.modalOverlay)?await p(e):await y(e)),c.style.boxShadow=""}}()}()}catch(e){console.error("Ошибка при отправке откликов:",e)}finally{r(!1),e.textContent="Отправить отклики",console.log("✅ Отправка откликов завершена")}}function m(e,t="div",n="Помощь"){return Array.from(e.querySelectorAll(t)).find((e=>e.textContent.trim()===n&&0===e.children.length))}!async function(){await async function(){await a(t);const e=document.querySelectorAll(n.naviItems),c=e[4].cloneNode(!0),o=m(c);o.setAttribute("data-action","submit-responses"),o.textContent="Отправить отклики",e[4].insertAdjacentElement("afterend",c),c.querySelector('[data-action="submit-responses"]').addEventListener("click",v)}(),await async function(){const e=document.querySelectorAll(n.naviItems),t=e[4].cloneNode(!0);m(t).textContent="Поддержать проект",t.removeAttribute("href"),t.style.cursor="pointer",t.addEventListener("click",(()=>{window.open("https://boosty.to/ia-stepanov/donate","_blank")})),e[5].insertAdjacentElement("afterend",t)}()}()})(); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "autosend-letters-hh", 3 | "version": "2.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "autosend-letters-hh", 9 | "version": "2.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@babel/core": "^7.26.9", 13 | "@babel/preset-env": "^7.26.9", 14 | "babel-loader": "^10.0.0", 15 | "webpack": "^5.98.0", 16 | "webpack-cli": "^6.0.1" 17 | } 18 | }, 19 | "node_modules/@ampproject/remapping": { 20 | "version": "2.3.0", 21 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 22 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 23 | "dev": true, 24 | "dependencies": { 25 | "@jridgewell/gen-mapping": "^0.3.5", 26 | "@jridgewell/trace-mapping": "^0.3.24" 27 | }, 28 | "engines": { 29 | "node": ">=6.0.0" 30 | } 31 | }, 32 | "node_modules/@babel/code-frame": { 33 | "version": "7.26.2", 34 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 35 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 36 | "dev": true, 37 | "dependencies": { 38 | "@babel/helper-validator-identifier": "^7.25.9", 39 | "js-tokens": "^4.0.0", 40 | "picocolors": "^1.0.0" 41 | }, 42 | "engines": { 43 | "node": ">=6.9.0" 44 | } 45 | }, 46 | "node_modules/@babel/compat-data": { 47 | "version": "7.26.8", 48 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", 49 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", 50 | "dev": true, 51 | "engines": { 52 | "node": ">=6.9.0" 53 | } 54 | }, 55 | "node_modules/@babel/core": { 56 | "version": "7.26.9", 57 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", 58 | "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", 59 | "dev": true, 60 | "dependencies": { 61 | "@ampproject/remapping": "^2.2.0", 62 | "@babel/code-frame": "^7.26.2", 63 | "@babel/generator": "^7.26.9", 64 | "@babel/helper-compilation-targets": "^7.26.5", 65 | "@babel/helper-module-transforms": "^7.26.0", 66 | "@babel/helpers": "^7.26.9", 67 | "@babel/parser": "^7.26.9", 68 | "@babel/template": "^7.26.9", 69 | "@babel/traverse": "^7.26.9", 70 | "@babel/types": "^7.26.9", 71 | "convert-source-map": "^2.0.0", 72 | "debug": "^4.1.0", 73 | "gensync": "^1.0.0-beta.2", 74 | "json5": "^2.2.3", 75 | "semver": "^6.3.1" 76 | }, 77 | "engines": { 78 | "node": ">=6.9.0" 79 | }, 80 | "funding": { 81 | "type": "opencollective", 82 | "url": "https://opencollective.com/babel" 83 | } 84 | }, 85 | "node_modules/@babel/generator": { 86 | "version": "7.26.9", 87 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", 88 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", 89 | "dev": true, 90 | "dependencies": { 91 | "@babel/parser": "^7.26.9", 92 | "@babel/types": "^7.26.9", 93 | "@jridgewell/gen-mapping": "^0.3.5", 94 | "@jridgewell/trace-mapping": "^0.3.25", 95 | "jsesc": "^3.0.2" 96 | }, 97 | "engines": { 98 | "node": ">=6.9.0" 99 | } 100 | }, 101 | "node_modules/@babel/helper-annotate-as-pure": { 102 | "version": "7.25.9", 103 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", 104 | "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", 105 | "dev": true, 106 | "dependencies": { 107 | "@babel/types": "^7.25.9" 108 | }, 109 | "engines": { 110 | "node": ">=6.9.0" 111 | } 112 | }, 113 | "node_modules/@babel/helper-compilation-targets": { 114 | "version": "7.26.5", 115 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", 116 | "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", 117 | "dev": true, 118 | "dependencies": { 119 | "@babel/compat-data": "^7.26.5", 120 | "@babel/helper-validator-option": "^7.25.9", 121 | "browserslist": "^4.24.0", 122 | "lru-cache": "^5.1.1", 123 | "semver": "^6.3.1" 124 | }, 125 | "engines": { 126 | "node": ">=6.9.0" 127 | } 128 | }, 129 | "node_modules/@babel/helper-create-class-features-plugin": { 130 | "version": "7.26.9", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", 132 | "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", 133 | "dev": true, 134 | "dependencies": { 135 | "@babel/helper-annotate-as-pure": "^7.25.9", 136 | "@babel/helper-member-expression-to-functions": "^7.25.9", 137 | "@babel/helper-optimise-call-expression": "^7.25.9", 138 | "@babel/helper-replace-supers": "^7.26.5", 139 | "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", 140 | "@babel/traverse": "^7.26.9", 141 | "semver": "^6.3.1" 142 | }, 143 | "engines": { 144 | "node": ">=6.9.0" 145 | }, 146 | "peerDependencies": { 147 | "@babel/core": "^7.0.0" 148 | } 149 | }, 150 | "node_modules/@babel/helper-create-regexp-features-plugin": { 151 | "version": "7.26.3", 152 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", 153 | "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", 154 | "dev": true, 155 | "dependencies": { 156 | "@babel/helper-annotate-as-pure": "^7.25.9", 157 | "regexpu-core": "^6.2.0", 158 | "semver": "^6.3.1" 159 | }, 160 | "engines": { 161 | "node": ">=6.9.0" 162 | }, 163 | "peerDependencies": { 164 | "@babel/core": "^7.0.0" 165 | } 166 | }, 167 | "node_modules/@babel/helper-define-polyfill-provider": { 168 | "version": "0.6.3", 169 | "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", 170 | "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", 171 | "dev": true, 172 | "dependencies": { 173 | "@babel/helper-compilation-targets": "^7.22.6", 174 | "@babel/helper-plugin-utils": "^7.22.5", 175 | "debug": "^4.1.1", 176 | "lodash.debounce": "^4.0.8", 177 | "resolve": "^1.14.2" 178 | }, 179 | "peerDependencies": { 180 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 181 | } 182 | }, 183 | "node_modules/@babel/helper-member-expression-to-functions": { 184 | "version": "7.25.9", 185 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", 186 | "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", 187 | "dev": true, 188 | "dependencies": { 189 | "@babel/traverse": "^7.25.9", 190 | "@babel/types": "^7.25.9" 191 | }, 192 | "engines": { 193 | "node": ">=6.9.0" 194 | } 195 | }, 196 | "node_modules/@babel/helper-module-imports": { 197 | "version": "7.25.9", 198 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 199 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 200 | "dev": true, 201 | "dependencies": { 202 | "@babel/traverse": "^7.25.9", 203 | "@babel/types": "^7.25.9" 204 | }, 205 | "engines": { 206 | "node": ">=6.9.0" 207 | } 208 | }, 209 | "node_modules/@babel/helper-module-transforms": { 210 | "version": "7.26.0", 211 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 212 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 213 | "dev": true, 214 | "dependencies": { 215 | "@babel/helper-module-imports": "^7.25.9", 216 | "@babel/helper-validator-identifier": "^7.25.9", 217 | "@babel/traverse": "^7.25.9" 218 | }, 219 | "engines": { 220 | "node": ">=6.9.0" 221 | }, 222 | "peerDependencies": { 223 | "@babel/core": "^7.0.0" 224 | } 225 | }, 226 | "node_modules/@babel/helper-optimise-call-expression": { 227 | "version": "7.25.9", 228 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", 229 | "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", 230 | "dev": true, 231 | "dependencies": { 232 | "@babel/types": "^7.25.9" 233 | }, 234 | "engines": { 235 | "node": ">=6.9.0" 236 | } 237 | }, 238 | "node_modules/@babel/helper-plugin-utils": { 239 | "version": "7.26.5", 240 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", 241 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", 242 | "dev": true, 243 | "engines": { 244 | "node": ">=6.9.0" 245 | } 246 | }, 247 | "node_modules/@babel/helper-remap-async-to-generator": { 248 | "version": "7.25.9", 249 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", 250 | "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", 251 | "dev": true, 252 | "dependencies": { 253 | "@babel/helper-annotate-as-pure": "^7.25.9", 254 | "@babel/helper-wrap-function": "^7.25.9", 255 | "@babel/traverse": "^7.25.9" 256 | }, 257 | "engines": { 258 | "node": ">=6.9.0" 259 | }, 260 | "peerDependencies": { 261 | "@babel/core": "^7.0.0" 262 | } 263 | }, 264 | "node_modules/@babel/helper-replace-supers": { 265 | "version": "7.26.5", 266 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", 267 | "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", 268 | "dev": true, 269 | "dependencies": { 270 | "@babel/helper-member-expression-to-functions": "^7.25.9", 271 | "@babel/helper-optimise-call-expression": "^7.25.9", 272 | "@babel/traverse": "^7.26.5" 273 | }, 274 | "engines": { 275 | "node": ">=6.9.0" 276 | }, 277 | "peerDependencies": { 278 | "@babel/core": "^7.0.0" 279 | } 280 | }, 281 | "node_modules/@babel/helper-skip-transparent-expression-wrappers": { 282 | "version": "7.25.9", 283 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", 284 | "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", 285 | "dev": true, 286 | "dependencies": { 287 | "@babel/traverse": "^7.25.9", 288 | "@babel/types": "^7.25.9" 289 | }, 290 | "engines": { 291 | "node": ">=6.9.0" 292 | } 293 | }, 294 | "node_modules/@babel/helper-string-parser": { 295 | "version": "7.25.9", 296 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 297 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 298 | "dev": true, 299 | "engines": { 300 | "node": ">=6.9.0" 301 | } 302 | }, 303 | "node_modules/@babel/helper-validator-identifier": { 304 | "version": "7.25.9", 305 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 306 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 307 | "dev": true, 308 | "engines": { 309 | "node": ">=6.9.0" 310 | } 311 | }, 312 | "node_modules/@babel/helper-validator-option": { 313 | "version": "7.25.9", 314 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", 315 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", 316 | "dev": true, 317 | "engines": { 318 | "node": ">=6.9.0" 319 | } 320 | }, 321 | "node_modules/@babel/helper-wrap-function": { 322 | "version": "7.25.9", 323 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", 324 | "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", 325 | "dev": true, 326 | "dependencies": { 327 | "@babel/template": "^7.25.9", 328 | "@babel/traverse": "^7.25.9", 329 | "@babel/types": "^7.25.9" 330 | }, 331 | "engines": { 332 | "node": ">=6.9.0" 333 | } 334 | }, 335 | "node_modules/@babel/helpers": { 336 | "version": "7.26.9", 337 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", 338 | "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", 339 | "dev": true, 340 | "dependencies": { 341 | "@babel/template": "^7.26.9", 342 | "@babel/types": "^7.26.9" 343 | }, 344 | "engines": { 345 | "node": ">=6.9.0" 346 | } 347 | }, 348 | "node_modules/@babel/parser": { 349 | "version": "7.26.9", 350 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 351 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 352 | "dev": true, 353 | "dependencies": { 354 | "@babel/types": "^7.26.9" 355 | }, 356 | "bin": { 357 | "parser": "bin/babel-parser.js" 358 | }, 359 | "engines": { 360 | "node": ">=6.0.0" 361 | } 362 | }, 363 | "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { 364 | "version": "7.25.9", 365 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", 366 | "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", 367 | "dev": true, 368 | "dependencies": { 369 | "@babel/helper-plugin-utils": "^7.25.9", 370 | "@babel/traverse": "^7.25.9" 371 | }, 372 | "engines": { 373 | "node": ">=6.9.0" 374 | }, 375 | "peerDependencies": { 376 | "@babel/core": "^7.0.0" 377 | } 378 | }, 379 | "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { 380 | "version": "7.25.9", 381 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", 382 | "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", 383 | "dev": true, 384 | "dependencies": { 385 | "@babel/helper-plugin-utils": "^7.25.9" 386 | }, 387 | "engines": { 388 | "node": ">=6.9.0" 389 | }, 390 | "peerDependencies": { 391 | "@babel/core": "^7.0.0" 392 | } 393 | }, 394 | "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { 395 | "version": "7.25.9", 396 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", 397 | "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", 398 | "dev": true, 399 | "dependencies": { 400 | "@babel/helper-plugin-utils": "^7.25.9" 401 | }, 402 | "engines": { 403 | "node": ">=6.9.0" 404 | }, 405 | "peerDependencies": { 406 | "@babel/core": "^7.0.0" 407 | } 408 | }, 409 | "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { 410 | "version": "7.25.9", 411 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", 412 | "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", 413 | "dev": true, 414 | "dependencies": { 415 | "@babel/helper-plugin-utils": "^7.25.9", 416 | "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", 417 | "@babel/plugin-transform-optional-chaining": "^7.25.9" 418 | }, 419 | "engines": { 420 | "node": ">=6.9.0" 421 | }, 422 | "peerDependencies": { 423 | "@babel/core": "^7.13.0" 424 | } 425 | }, 426 | "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { 427 | "version": "7.25.9", 428 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", 429 | "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", 430 | "dev": true, 431 | "dependencies": { 432 | "@babel/helper-plugin-utils": "^7.25.9", 433 | "@babel/traverse": "^7.25.9" 434 | }, 435 | "engines": { 436 | "node": ">=6.9.0" 437 | }, 438 | "peerDependencies": { 439 | "@babel/core": "^7.0.0" 440 | } 441 | }, 442 | "node_modules/@babel/plugin-proposal-private-property-in-object": { 443 | "version": "7.21.0-placeholder-for-preset-env.2", 444 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", 445 | "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", 446 | "dev": true, 447 | "engines": { 448 | "node": ">=6.9.0" 449 | }, 450 | "peerDependencies": { 451 | "@babel/core": "^7.0.0-0" 452 | } 453 | }, 454 | "node_modules/@babel/plugin-syntax-import-assertions": { 455 | "version": "7.26.0", 456 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", 457 | "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", 458 | "dev": true, 459 | "dependencies": { 460 | "@babel/helper-plugin-utils": "^7.25.9" 461 | }, 462 | "engines": { 463 | "node": ">=6.9.0" 464 | }, 465 | "peerDependencies": { 466 | "@babel/core": "^7.0.0-0" 467 | } 468 | }, 469 | "node_modules/@babel/plugin-syntax-import-attributes": { 470 | "version": "7.26.0", 471 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", 472 | "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", 473 | "dev": true, 474 | "dependencies": { 475 | "@babel/helper-plugin-utils": "^7.25.9" 476 | }, 477 | "engines": { 478 | "node": ">=6.9.0" 479 | }, 480 | "peerDependencies": { 481 | "@babel/core": "^7.0.0-0" 482 | } 483 | }, 484 | "node_modules/@babel/plugin-syntax-unicode-sets-regex": { 485 | "version": "7.18.6", 486 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", 487 | "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", 488 | "dev": true, 489 | "dependencies": { 490 | "@babel/helper-create-regexp-features-plugin": "^7.18.6", 491 | "@babel/helper-plugin-utils": "^7.18.6" 492 | }, 493 | "engines": { 494 | "node": ">=6.9.0" 495 | }, 496 | "peerDependencies": { 497 | "@babel/core": "^7.0.0" 498 | } 499 | }, 500 | "node_modules/@babel/plugin-transform-arrow-functions": { 501 | "version": "7.25.9", 502 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", 503 | "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", 504 | "dev": true, 505 | "dependencies": { 506 | "@babel/helper-plugin-utils": "^7.25.9" 507 | }, 508 | "engines": { 509 | "node": ">=6.9.0" 510 | }, 511 | "peerDependencies": { 512 | "@babel/core": "^7.0.0-0" 513 | } 514 | }, 515 | "node_modules/@babel/plugin-transform-async-generator-functions": { 516 | "version": "7.26.8", 517 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", 518 | "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", 519 | "dev": true, 520 | "dependencies": { 521 | "@babel/helper-plugin-utils": "^7.26.5", 522 | "@babel/helper-remap-async-to-generator": "^7.25.9", 523 | "@babel/traverse": "^7.26.8" 524 | }, 525 | "engines": { 526 | "node": ">=6.9.0" 527 | }, 528 | "peerDependencies": { 529 | "@babel/core": "^7.0.0-0" 530 | } 531 | }, 532 | "node_modules/@babel/plugin-transform-async-to-generator": { 533 | "version": "7.25.9", 534 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", 535 | "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", 536 | "dev": true, 537 | "dependencies": { 538 | "@babel/helper-module-imports": "^7.25.9", 539 | "@babel/helper-plugin-utils": "^7.25.9", 540 | "@babel/helper-remap-async-to-generator": "^7.25.9" 541 | }, 542 | "engines": { 543 | "node": ">=6.9.0" 544 | }, 545 | "peerDependencies": { 546 | "@babel/core": "^7.0.0-0" 547 | } 548 | }, 549 | "node_modules/@babel/plugin-transform-block-scoped-functions": { 550 | "version": "7.26.5", 551 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", 552 | "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", 553 | "dev": true, 554 | "dependencies": { 555 | "@babel/helper-plugin-utils": "^7.26.5" 556 | }, 557 | "engines": { 558 | "node": ">=6.9.0" 559 | }, 560 | "peerDependencies": { 561 | "@babel/core": "^7.0.0-0" 562 | } 563 | }, 564 | "node_modules/@babel/plugin-transform-block-scoping": { 565 | "version": "7.25.9", 566 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", 567 | "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", 568 | "dev": true, 569 | "dependencies": { 570 | "@babel/helper-plugin-utils": "^7.25.9" 571 | }, 572 | "engines": { 573 | "node": ">=6.9.0" 574 | }, 575 | "peerDependencies": { 576 | "@babel/core": "^7.0.0-0" 577 | } 578 | }, 579 | "node_modules/@babel/plugin-transform-class-properties": { 580 | "version": "7.25.9", 581 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", 582 | "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", 583 | "dev": true, 584 | "dependencies": { 585 | "@babel/helper-create-class-features-plugin": "^7.25.9", 586 | "@babel/helper-plugin-utils": "^7.25.9" 587 | }, 588 | "engines": { 589 | "node": ">=6.9.0" 590 | }, 591 | "peerDependencies": { 592 | "@babel/core": "^7.0.0-0" 593 | } 594 | }, 595 | "node_modules/@babel/plugin-transform-class-static-block": { 596 | "version": "7.26.0", 597 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", 598 | "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", 599 | "dev": true, 600 | "dependencies": { 601 | "@babel/helper-create-class-features-plugin": "^7.25.9", 602 | "@babel/helper-plugin-utils": "^7.25.9" 603 | }, 604 | "engines": { 605 | "node": ">=6.9.0" 606 | }, 607 | "peerDependencies": { 608 | "@babel/core": "^7.12.0" 609 | } 610 | }, 611 | "node_modules/@babel/plugin-transform-classes": { 612 | "version": "7.25.9", 613 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", 614 | "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", 615 | "dev": true, 616 | "dependencies": { 617 | "@babel/helper-annotate-as-pure": "^7.25.9", 618 | "@babel/helper-compilation-targets": "^7.25.9", 619 | "@babel/helper-plugin-utils": "^7.25.9", 620 | "@babel/helper-replace-supers": "^7.25.9", 621 | "@babel/traverse": "^7.25.9", 622 | "globals": "^11.1.0" 623 | }, 624 | "engines": { 625 | "node": ">=6.9.0" 626 | }, 627 | "peerDependencies": { 628 | "@babel/core": "^7.0.0-0" 629 | } 630 | }, 631 | "node_modules/@babel/plugin-transform-computed-properties": { 632 | "version": "7.25.9", 633 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", 634 | "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", 635 | "dev": true, 636 | "dependencies": { 637 | "@babel/helper-plugin-utils": "^7.25.9", 638 | "@babel/template": "^7.25.9" 639 | }, 640 | "engines": { 641 | "node": ">=6.9.0" 642 | }, 643 | "peerDependencies": { 644 | "@babel/core": "^7.0.0-0" 645 | } 646 | }, 647 | "node_modules/@babel/plugin-transform-destructuring": { 648 | "version": "7.25.9", 649 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", 650 | "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", 651 | "dev": true, 652 | "dependencies": { 653 | "@babel/helper-plugin-utils": "^7.25.9" 654 | }, 655 | "engines": { 656 | "node": ">=6.9.0" 657 | }, 658 | "peerDependencies": { 659 | "@babel/core": "^7.0.0-0" 660 | } 661 | }, 662 | "node_modules/@babel/plugin-transform-dotall-regex": { 663 | "version": "7.25.9", 664 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", 665 | "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", 666 | "dev": true, 667 | "dependencies": { 668 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 669 | "@babel/helper-plugin-utils": "^7.25.9" 670 | }, 671 | "engines": { 672 | "node": ">=6.9.0" 673 | }, 674 | "peerDependencies": { 675 | "@babel/core": "^7.0.0-0" 676 | } 677 | }, 678 | "node_modules/@babel/plugin-transform-duplicate-keys": { 679 | "version": "7.25.9", 680 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", 681 | "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", 682 | "dev": true, 683 | "dependencies": { 684 | "@babel/helper-plugin-utils": "^7.25.9" 685 | }, 686 | "engines": { 687 | "node": ">=6.9.0" 688 | }, 689 | "peerDependencies": { 690 | "@babel/core": "^7.0.0-0" 691 | } 692 | }, 693 | "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { 694 | "version": "7.25.9", 695 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", 696 | "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", 697 | "dev": true, 698 | "dependencies": { 699 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 700 | "@babel/helper-plugin-utils": "^7.25.9" 701 | }, 702 | "engines": { 703 | "node": ">=6.9.0" 704 | }, 705 | "peerDependencies": { 706 | "@babel/core": "^7.0.0" 707 | } 708 | }, 709 | "node_modules/@babel/plugin-transform-dynamic-import": { 710 | "version": "7.25.9", 711 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", 712 | "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", 713 | "dev": true, 714 | "dependencies": { 715 | "@babel/helper-plugin-utils": "^7.25.9" 716 | }, 717 | "engines": { 718 | "node": ">=6.9.0" 719 | }, 720 | "peerDependencies": { 721 | "@babel/core": "^7.0.0-0" 722 | } 723 | }, 724 | "node_modules/@babel/plugin-transform-exponentiation-operator": { 725 | "version": "7.26.3", 726 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", 727 | "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", 728 | "dev": true, 729 | "dependencies": { 730 | "@babel/helper-plugin-utils": "^7.25.9" 731 | }, 732 | "engines": { 733 | "node": ">=6.9.0" 734 | }, 735 | "peerDependencies": { 736 | "@babel/core": "^7.0.0-0" 737 | } 738 | }, 739 | "node_modules/@babel/plugin-transform-export-namespace-from": { 740 | "version": "7.25.9", 741 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", 742 | "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", 743 | "dev": true, 744 | "dependencies": { 745 | "@babel/helper-plugin-utils": "^7.25.9" 746 | }, 747 | "engines": { 748 | "node": ">=6.9.0" 749 | }, 750 | "peerDependencies": { 751 | "@babel/core": "^7.0.0-0" 752 | } 753 | }, 754 | "node_modules/@babel/plugin-transform-for-of": { 755 | "version": "7.26.9", 756 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", 757 | "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", 758 | "dev": true, 759 | "dependencies": { 760 | "@babel/helper-plugin-utils": "^7.26.5", 761 | "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" 762 | }, 763 | "engines": { 764 | "node": ">=6.9.0" 765 | }, 766 | "peerDependencies": { 767 | "@babel/core": "^7.0.0-0" 768 | } 769 | }, 770 | "node_modules/@babel/plugin-transform-function-name": { 771 | "version": "7.25.9", 772 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", 773 | "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", 774 | "dev": true, 775 | "dependencies": { 776 | "@babel/helper-compilation-targets": "^7.25.9", 777 | "@babel/helper-plugin-utils": "^7.25.9", 778 | "@babel/traverse": "^7.25.9" 779 | }, 780 | "engines": { 781 | "node": ">=6.9.0" 782 | }, 783 | "peerDependencies": { 784 | "@babel/core": "^7.0.0-0" 785 | } 786 | }, 787 | "node_modules/@babel/plugin-transform-json-strings": { 788 | "version": "7.25.9", 789 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", 790 | "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", 791 | "dev": true, 792 | "dependencies": { 793 | "@babel/helper-plugin-utils": "^7.25.9" 794 | }, 795 | "engines": { 796 | "node": ">=6.9.0" 797 | }, 798 | "peerDependencies": { 799 | "@babel/core": "^7.0.0-0" 800 | } 801 | }, 802 | "node_modules/@babel/plugin-transform-literals": { 803 | "version": "7.25.9", 804 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", 805 | "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", 806 | "dev": true, 807 | "dependencies": { 808 | "@babel/helper-plugin-utils": "^7.25.9" 809 | }, 810 | "engines": { 811 | "node": ">=6.9.0" 812 | }, 813 | "peerDependencies": { 814 | "@babel/core": "^7.0.0-0" 815 | } 816 | }, 817 | "node_modules/@babel/plugin-transform-logical-assignment-operators": { 818 | "version": "7.25.9", 819 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", 820 | "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", 821 | "dev": true, 822 | "dependencies": { 823 | "@babel/helper-plugin-utils": "^7.25.9" 824 | }, 825 | "engines": { 826 | "node": ">=6.9.0" 827 | }, 828 | "peerDependencies": { 829 | "@babel/core": "^7.0.0-0" 830 | } 831 | }, 832 | "node_modules/@babel/plugin-transform-member-expression-literals": { 833 | "version": "7.25.9", 834 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", 835 | "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", 836 | "dev": true, 837 | "dependencies": { 838 | "@babel/helper-plugin-utils": "^7.25.9" 839 | }, 840 | "engines": { 841 | "node": ">=6.9.0" 842 | }, 843 | "peerDependencies": { 844 | "@babel/core": "^7.0.0-0" 845 | } 846 | }, 847 | "node_modules/@babel/plugin-transform-modules-amd": { 848 | "version": "7.25.9", 849 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", 850 | "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", 851 | "dev": true, 852 | "dependencies": { 853 | "@babel/helper-module-transforms": "^7.25.9", 854 | "@babel/helper-plugin-utils": "^7.25.9" 855 | }, 856 | "engines": { 857 | "node": ">=6.9.0" 858 | }, 859 | "peerDependencies": { 860 | "@babel/core": "^7.0.0-0" 861 | } 862 | }, 863 | "node_modules/@babel/plugin-transform-modules-commonjs": { 864 | "version": "7.26.3", 865 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", 866 | "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", 867 | "dev": true, 868 | "dependencies": { 869 | "@babel/helper-module-transforms": "^7.26.0", 870 | "@babel/helper-plugin-utils": "^7.25.9" 871 | }, 872 | "engines": { 873 | "node": ">=6.9.0" 874 | }, 875 | "peerDependencies": { 876 | "@babel/core": "^7.0.0-0" 877 | } 878 | }, 879 | "node_modules/@babel/plugin-transform-modules-systemjs": { 880 | "version": "7.25.9", 881 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", 882 | "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", 883 | "dev": true, 884 | "dependencies": { 885 | "@babel/helper-module-transforms": "^7.25.9", 886 | "@babel/helper-plugin-utils": "^7.25.9", 887 | "@babel/helper-validator-identifier": "^7.25.9", 888 | "@babel/traverse": "^7.25.9" 889 | }, 890 | "engines": { 891 | "node": ">=6.9.0" 892 | }, 893 | "peerDependencies": { 894 | "@babel/core": "^7.0.0-0" 895 | } 896 | }, 897 | "node_modules/@babel/plugin-transform-modules-umd": { 898 | "version": "7.25.9", 899 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", 900 | "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", 901 | "dev": true, 902 | "dependencies": { 903 | "@babel/helper-module-transforms": "^7.25.9", 904 | "@babel/helper-plugin-utils": "^7.25.9" 905 | }, 906 | "engines": { 907 | "node": ">=6.9.0" 908 | }, 909 | "peerDependencies": { 910 | "@babel/core": "^7.0.0-0" 911 | } 912 | }, 913 | "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { 914 | "version": "7.25.9", 915 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", 916 | "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", 917 | "dev": true, 918 | "dependencies": { 919 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 920 | "@babel/helper-plugin-utils": "^7.25.9" 921 | }, 922 | "engines": { 923 | "node": ">=6.9.0" 924 | }, 925 | "peerDependencies": { 926 | "@babel/core": "^7.0.0" 927 | } 928 | }, 929 | "node_modules/@babel/plugin-transform-new-target": { 930 | "version": "7.25.9", 931 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", 932 | "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", 933 | "dev": true, 934 | "dependencies": { 935 | "@babel/helper-plugin-utils": "^7.25.9" 936 | }, 937 | "engines": { 938 | "node": ">=6.9.0" 939 | }, 940 | "peerDependencies": { 941 | "@babel/core": "^7.0.0-0" 942 | } 943 | }, 944 | "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { 945 | "version": "7.26.6", 946 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", 947 | "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", 948 | "dev": true, 949 | "dependencies": { 950 | "@babel/helper-plugin-utils": "^7.26.5" 951 | }, 952 | "engines": { 953 | "node": ">=6.9.0" 954 | }, 955 | "peerDependencies": { 956 | "@babel/core": "^7.0.0-0" 957 | } 958 | }, 959 | "node_modules/@babel/plugin-transform-numeric-separator": { 960 | "version": "7.25.9", 961 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", 962 | "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", 963 | "dev": true, 964 | "dependencies": { 965 | "@babel/helper-plugin-utils": "^7.25.9" 966 | }, 967 | "engines": { 968 | "node": ">=6.9.0" 969 | }, 970 | "peerDependencies": { 971 | "@babel/core": "^7.0.0-0" 972 | } 973 | }, 974 | "node_modules/@babel/plugin-transform-object-rest-spread": { 975 | "version": "7.25.9", 976 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", 977 | "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", 978 | "dev": true, 979 | "dependencies": { 980 | "@babel/helper-compilation-targets": "^7.25.9", 981 | "@babel/helper-plugin-utils": "^7.25.9", 982 | "@babel/plugin-transform-parameters": "^7.25.9" 983 | }, 984 | "engines": { 985 | "node": ">=6.9.0" 986 | }, 987 | "peerDependencies": { 988 | "@babel/core": "^7.0.0-0" 989 | } 990 | }, 991 | "node_modules/@babel/plugin-transform-object-super": { 992 | "version": "7.25.9", 993 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", 994 | "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", 995 | "dev": true, 996 | "dependencies": { 997 | "@babel/helper-plugin-utils": "^7.25.9", 998 | "@babel/helper-replace-supers": "^7.25.9" 999 | }, 1000 | "engines": { 1001 | "node": ">=6.9.0" 1002 | }, 1003 | "peerDependencies": { 1004 | "@babel/core": "^7.0.0-0" 1005 | } 1006 | }, 1007 | "node_modules/@babel/plugin-transform-optional-catch-binding": { 1008 | "version": "7.25.9", 1009 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", 1010 | "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "@babel/helper-plugin-utils": "^7.25.9" 1014 | }, 1015 | "engines": { 1016 | "node": ">=6.9.0" 1017 | }, 1018 | "peerDependencies": { 1019 | "@babel/core": "^7.0.0-0" 1020 | } 1021 | }, 1022 | "node_modules/@babel/plugin-transform-optional-chaining": { 1023 | "version": "7.25.9", 1024 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", 1025 | "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", 1026 | "dev": true, 1027 | "dependencies": { 1028 | "@babel/helper-plugin-utils": "^7.25.9", 1029 | "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" 1030 | }, 1031 | "engines": { 1032 | "node": ">=6.9.0" 1033 | }, 1034 | "peerDependencies": { 1035 | "@babel/core": "^7.0.0-0" 1036 | } 1037 | }, 1038 | "node_modules/@babel/plugin-transform-parameters": { 1039 | "version": "7.25.9", 1040 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", 1041 | "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "@babel/helper-plugin-utils": "^7.25.9" 1045 | }, 1046 | "engines": { 1047 | "node": ">=6.9.0" 1048 | }, 1049 | "peerDependencies": { 1050 | "@babel/core": "^7.0.0-0" 1051 | } 1052 | }, 1053 | "node_modules/@babel/plugin-transform-private-methods": { 1054 | "version": "7.25.9", 1055 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", 1056 | "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", 1057 | "dev": true, 1058 | "dependencies": { 1059 | "@babel/helper-create-class-features-plugin": "^7.25.9", 1060 | "@babel/helper-plugin-utils": "^7.25.9" 1061 | }, 1062 | "engines": { 1063 | "node": ">=6.9.0" 1064 | }, 1065 | "peerDependencies": { 1066 | "@babel/core": "^7.0.0-0" 1067 | } 1068 | }, 1069 | "node_modules/@babel/plugin-transform-private-property-in-object": { 1070 | "version": "7.25.9", 1071 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", 1072 | "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", 1073 | "dev": true, 1074 | "dependencies": { 1075 | "@babel/helper-annotate-as-pure": "^7.25.9", 1076 | "@babel/helper-create-class-features-plugin": "^7.25.9", 1077 | "@babel/helper-plugin-utils": "^7.25.9" 1078 | }, 1079 | "engines": { 1080 | "node": ">=6.9.0" 1081 | }, 1082 | "peerDependencies": { 1083 | "@babel/core": "^7.0.0-0" 1084 | } 1085 | }, 1086 | "node_modules/@babel/plugin-transform-property-literals": { 1087 | "version": "7.25.9", 1088 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", 1089 | "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "@babel/helper-plugin-utils": "^7.25.9" 1093 | }, 1094 | "engines": { 1095 | "node": ">=6.9.0" 1096 | }, 1097 | "peerDependencies": { 1098 | "@babel/core": "^7.0.0-0" 1099 | } 1100 | }, 1101 | "node_modules/@babel/plugin-transform-regenerator": { 1102 | "version": "7.25.9", 1103 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", 1104 | "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "@babel/helper-plugin-utils": "^7.25.9", 1108 | "regenerator-transform": "^0.15.2" 1109 | }, 1110 | "engines": { 1111 | "node": ">=6.9.0" 1112 | }, 1113 | "peerDependencies": { 1114 | "@babel/core": "^7.0.0-0" 1115 | } 1116 | }, 1117 | "node_modules/@babel/plugin-transform-regexp-modifiers": { 1118 | "version": "7.26.0", 1119 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", 1120 | "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", 1121 | "dev": true, 1122 | "dependencies": { 1123 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 1124 | "@babel/helper-plugin-utils": "^7.25.9" 1125 | }, 1126 | "engines": { 1127 | "node": ">=6.9.0" 1128 | }, 1129 | "peerDependencies": { 1130 | "@babel/core": "^7.0.0" 1131 | } 1132 | }, 1133 | "node_modules/@babel/plugin-transform-reserved-words": { 1134 | "version": "7.25.9", 1135 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", 1136 | "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", 1137 | "dev": true, 1138 | "dependencies": { 1139 | "@babel/helper-plugin-utils": "^7.25.9" 1140 | }, 1141 | "engines": { 1142 | "node": ">=6.9.0" 1143 | }, 1144 | "peerDependencies": { 1145 | "@babel/core": "^7.0.0-0" 1146 | } 1147 | }, 1148 | "node_modules/@babel/plugin-transform-shorthand-properties": { 1149 | "version": "7.25.9", 1150 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", 1151 | "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", 1152 | "dev": true, 1153 | "dependencies": { 1154 | "@babel/helper-plugin-utils": "^7.25.9" 1155 | }, 1156 | "engines": { 1157 | "node": ">=6.9.0" 1158 | }, 1159 | "peerDependencies": { 1160 | "@babel/core": "^7.0.0-0" 1161 | } 1162 | }, 1163 | "node_modules/@babel/plugin-transform-spread": { 1164 | "version": "7.25.9", 1165 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", 1166 | "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", 1167 | "dev": true, 1168 | "dependencies": { 1169 | "@babel/helper-plugin-utils": "^7.25.9", 1170 | "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" 1171 | }, 1172 | "engines": { 1173 | "node": ">=6.9.0" 1174 | }, 1175 | "peerDependencies": { 1176 | "@babel/core": "^7.0.0-0" 1177 | } 1178 | }, 1179 | "node_modules/@babel/plugin-transform-sticky-regex": { 1180 | "version": "7.25.9", 1181 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", 1182 | "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", 1183 | "dev": true, 1184 | "dependencies": { 1185 | "@babel/helper-plugin-utils": "^7.25.9" 1186 | }, 1187 | "engines": { 1188 | "node": ">=6.9.0" 1189 | }, 1190 | "peerDependencies": { 1191 | "@babel/core": "^7.0.0-0" 1192 | } 1193 | }, 1194 | "node_modules/@babel/plugin-transform-template-literals": { 1195 | "version": "7.26.8", 1196 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", 1197 | "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", 1198 | "dev": true, 1199 | "dependencies": { 1200 | "@babel/helper-plugin-utils": "^7.26.5" 1201 | }, 1202 | "engines": { 1203 | "node": ">=6.9.0" 1204 | }, 1205 | "peerDependencies": { 1206 | "@babel/core": "^7.0.0-0" 1207 | } 1208 | }, 1209 | "node_modules/@babel/plugin-transform-typeof-symbol": { 1210 | "version": "7.26.7", 1211 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", 1212 | "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", 1213 | "dev": true, 1214 | "dependencies": { 1215 | "@babel/helper-plugin-utils": "^7.26.5" 1216 | }, 1217 | "engines": { 1218 | "node": ">=6.9.0" 1219 | }, 1220 | "peerDependencies": { 1221 | "@babel/core": "^7.0.0-0" 1222 | } 1223 | }, 1224 | "node_modules/@babel/plugin-transform-unicode-escapes": { 1225 | "version": "7.25.9", 1226 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", 1227 | "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "@babel/helper-plugin-utils": "^7.25.9" 1231 | }, 1232 | "engines": { 1233 | "node": ">=6.9.0" 1234 | }, 1235 | "peerDependencies": { 1236 | "@babel/core": "^7.0.0-0" 1237 | } 1238 | }, 1239 | "node_modules/@babel/plugin-transform-unicode-property-regex": { 1240 | "version": "7.25.9", 1241 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", 1242 | "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", 1243 | "dev": true, 1244 | "dependencies": { 1245 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 1246 | "@babel/helper-plugin-utils": "^7.25.9" 1247 | }, 1248 | "engines": { 1249 | "node": ">=6.9.0" 1250 | }, 1251 | "peerDependencies": { 1252 | "@babel/core": "^7.0.0-0" 1253 | } 1254 | }, 1255 | "node_modules/@babel/plugin-transform-unicode-regex": { 1256 | "version": "7.25.9", 1257 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", 1258 | "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", 1259 | "dev": true, 1260 | "dependencies": { 1261 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 1262 | "@babel/helper-plugin-utils": "^7.25.9" 1263 | }, 1264 | "engines": { 1265 | "node": ">=6.9.0" 1266 | }, 1267 | "peerDependencies": { 1268 | "@babel/core": "^7.0.0-0" 1269 | } 1270 | }, 1271 | "node_modules/@babel/plugin-transform-unicode-sets-regex": { 1272 | "version": "7.25.9", 1273 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", 1274 | "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", 1275 | "dev": true, 1276 | "dependencies": { 1277 | "@babel/helper-create-regexp-features-plugin": "^7.25.9", 1278 | "@babel/helper-plugin-utils": "^7.25.9" 1279 | }, 1280 | "engines": { 1281 | "node": ">=6.9.0" 1282 | }, 1283 | "peerDependencies": { 1284 | "@babel/core": "^7.0.0" 1285 | } 1286 | }, 1287 | "node_modules/@babel/preset-env": { 1288 | "version": "7.26.9", 1289 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", 1290 | "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "@babel/compat-data": "^7.26.8", 1294 | "@babel/helper-compilation-targets": "^7.26.5", 1295 | "@babel/helper-plugin-utils": "^7.26.5", 1296 | "@babel/helper-validator-option": "^7.25.9", 1297 | "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", 1298 | "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", 1299 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", 1300 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", 1301 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", 1302 | "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", 1303 | "@babel/plugin-syntax-import-assertions": "^7.26.0", 1304 | "@babel/plugin-syntax-import-attributes": "^7.26.0", 1305 | "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", 1306 | "@babel/plugin-transform-arrow-functions": "^7.25.9", 1307 | "@babel/plugin-transform-async-generator-functions": "^7.26.8", 1308 | "@babel/plugin-transform-async-to-generator": "^7.25.9", 1309 | "@babel/plugin-transform-block-scoped-functions": "^7.26.5", 1310 | "@babel/plugin-transform-block-scoping": "^7.25.9", 1311 | "@babel/plugin-transform-class-properties": "^7.25.9", 1312 | "@babel/plugin-transform-class-static-block": "^7.26.0", 1313 | "@babel/plugin-transform-classes": "^7.25.9", 1314 | "@babel/plugin-transform-computed-properties": "^7.25.9", 1315 | "@babel/plugin-transform-destructuring": "^7.25.9", 1316 | "@babel/plugin-transform-dotall-regex": "^7.25.9", 1317 | "@babel/plugin-transform-duplicate-keys": "^7.25.9", 1318 | "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", 1319 | "@babel/plugin-transform-dynamic-import": "^7.25.9", 1320 | "@babel/plugin-transform-exponentiation-operator": "^7.26.3", 1321 | "@babel/plugin-transform-export-namespace-from": "^7.25.9", 1322 | "@babel/plugin-transform-for-of": "^7.26.9", 1323 | "@babel/plugin-transform-function-name": "^7.25.9", 1324 | "@babel/plugin-transform-json-strings": "^7.25.9", 1325 | "@babel/plugin-transform-literals": "^7.25.9", 1326 | "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", 1327 | "@babel/plugin-transform-member-expression-literals": "^7.25.9", 1328 | "@babel/plugin-transform-modules-amd": "^7.25.9", 1329 | "@babel/plugin-transform-modules-commonjs": "^7.26.3", 1330 | "@babel/plugin-transform-modules-systemjs": "^7.25.9", 1331 | "@babel/plugin-transform-modules-umd": "^7.25.9", 1332 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", 1333 | "@babel/plugin-transform-new-target": "^7.25.9", 1334 | "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", 1335 | "@babel/plugin-transform-numeric-separator": "^7.25.9", 1336 | "@babel/plugin-transform-object-rest-spread": "^7.25.9", 1337 | "@babel/plugin-transform-object-super": "^7.25.9", 1338 | "@babel/plugin-transform-optional-catch-binding": "^7.25.9", 1339 | "@babel/plugin-transform-optional-chaining": "^7.25.9", 1340 | "@babel/plugin-transform-parameters": "^7.25.9", 1341 | "@babel/plugin-transform-private-methods": "^7.25.9", 1342 | "@babel/plugin-transform-private-property-in-object": "^7.25.9", 1343 | "@babel/plugin-transform-property-literals": "^7.25.9", 1344 | "@babel/plugin-transform-regenerator": "^7.25.9", 1345 | "@babel/plugin-transform-regexp-modifiers": "^7.26.0", 1346 | "@babel/plugin-transform-reserved-words": "^7.25.9", 1347 | "@babel/plugin-transform-shorthand-properties": "^7.25.9", 1348 | "@babel/plugin-transform-spread": "^7.25.9", 1349 | "@babel/plugin-transform-sticky-regex": "^7.25.9", 1350 | "@babel/plugin-transform-template-literals": "^7.26.8", 1351 | "@babel/plugin-transform-typeof-symbol": "^7.26.7", 1352 | "@babel/plugin-transform-unicode-escapes": "^7.25.9", 1353 | "@babel/plugin-transform-unicode-property-regex": "^7.25.9", 1354 | "@babel/plugin-transform-unicode-regex": "^7.25.9", 1355 | "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", 1356 | "@babel/preset-modules": "0.1.6-no-external-plugins", 1357 | "babel-plugin-polyfill-corejs2": "^0.4.10", 1358 | "babel-plugin-polyfill-corejs3": "^0.11.0", 1359 | "babel-plugin-polyfill-regenerator": "^0.6.1", 1360 | "core-js-compat": "^3.40.0", 1361 | "semver": "^6.3.1" 1362 | }, 1363 | "engines": { 1364 | "node": ">=6.9.0" 1365 | }, 1366 | "peerDependencies": { 1367 | "@babel/core": "^7.0.0-0" 1368 | } 1369 | }, 1370 | "node_modules/@babel/preset-modules": { 1371 | "version": "0.1.6-no-external-plugins", 1372 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", 1373 | "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", 1374 | "dev": true, 1375 | "dependencies": { 1376 | "@babel/helper-plugin-utils": "^7.0.0", 1377 | "@babel/types": "^7.4.4", 1378 | "esutils": "^2.0.2" 1379 | }, 1380 | "peerDependencies": { 1381 | "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" 1382 | } 1383 | }, 1384 | "node_modules/@babel/runtime": { 1385 | "version": "7.26.9", 1386 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", 1387 | "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", 1388 | "dev": true, 1389 | "dependencies": { 1390 | "regenerator-runtime": "^0.14.0" 1391 | }, 1392 | "engines": { 1393 | "node": ">=6.9.0" 1394 | } 1395 | }, 1396 | "node_modules/@babel/template": { 1397 | "version": "7.26.9", 1398 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", 1399 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", 1400 | "dev": true, 1401 | "dependencies": { 1402 | "@babel/code-frame": "^7.26.2", 1403 | "@babel/parser": "^7.26.9", 1404 | "@babel/types": "^7.26.9" 1405 | }, 1406 | "engines": { 1407 | "node": ">=6.9.0" 1408 | } 1409 | }, 1410 | "node_modules/@babel/traverse": { 1411 | "version": "7.26.9", 1412 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", 1413 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", 1414 | "dev": true, 1415 | "dependencies": { 1416 | "@babel/code-frame": "^7.26.2", 1417 | "@babel/generator": "^7.26.9", 1418 | "@babel/parser": "^7.26.9", 1419 | "@babel/template": "^7.26.9", 1420 | "@babel/types": "^7.26.9", 1421 | "debug": "^4.3.1", 1422 | "globals": "^11.1.0" 1423 | }, 1424 | "engines": { 1425 | "node": ">=6.9.0" 1426 | } 1427 | }, 1428 | "node_modules/@babel/types": { 1429 | "version": "7.26.9", 1430 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 1431 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 1432 | "dev": true, 1433 | "dependencies": { 1434 | "@babel/helper-string-parser": "^7.25.9", 1435 | "@babel/helper-validator-identifier": "^7.25.9" 1436 | }, 1437 | "engines": { 1438 | "node": ">=6.9.0" 1439 | } 1440 | }, 1441 | "node_modules/@discoveryjs/json-ext": { 1442 | "version": "0.6.3", 1443 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", 1444 | "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", 1445 | "dev": true, 1446 | "engines": { 1447 | "node": ">=14.17.0" 1448 | } 1449 | }, 1450 | "node_modules/@jridgewell/gen-mapping": { 1451 | "version": "0.3.8", 1452 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 1453 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 1454 | "dev": true, 1455 | "dependencies": { 1456 | "@jridgewell/set-array": "^1.2.1", 1457 | "@jridgewell/sourcemap-codec": "^1.4.10", 1458 | "@jridgewell/trace-mapping": "^0.3.24" 1459 | }, 1460 | "engines": { 1461 | "node": ">=6.0.0" 1462 | } 1463 | }, 1464 | "node_modules/@jridgewell/resolve-uri": { 1465 | "version": "3.1.2", 1466 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1467 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1468 | "dev": true, 1469 | "engines": { 1470 | "node": ">=6.0.0" 1471 | } 1472 | }, 1473 | "node_modules/@jridgewell/set-array": { 1474 | "version": "1.2.1", 1475 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1476 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1477 | "dev": true, 1478 | "engines": { 1479 | "node": ">=6.0.0" 1480 | } 1481 | }, 1482 | "node_modules/@jridgewell/source-map": { 1483 | "version": "0.3.6", 1484 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", 1485 | "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", 1486 | "dev": true, 1487 | "dependencies": { 1488 | "@jridgewell/gen-mapping": "^0.3.5", 1489 | "@jridgewell/trace-mapping": "^0.3.25" 1490 | } 1491 | }, 1492 | "node_modules/@jridgewell/sourcemap-codec": { 1493 | "version": "1.5.0", 1494 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1495 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1496 | "dev": true 1497 | }, 1498 | "node_modules/@jridgewell/trace-mapping": { 1499 | "version": "0.3.25", 1500 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1501 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1502 | "dev": true, 1503 | "dependencies": { 1504 | "@jridgewell/resolve-uri": "^3.1.0", 1505 | "@jridgewell/sourcemap-codec": "^1.4.14" 1506 | } 1507 | }, 1508 | "node_modules/@types/eslint": { 1509 | "version": "9.6.1", 1510 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", 1511 | "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", 1512 | "dev": true, 1513 | "dependencies": { 1514 | "@types/estree": "*", 1515 | "@types/json-schema": "*" 1516 | } 1517 | }, 1518 | "node_modules/@types/eslint-scope": { 1519 | "version": "3.7.7", 1520 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", 1521 | "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", 1522 | "dev": true, 1523 | "dependencies": { 1524 | "@types/eslint": "*", 1525 | "@types/estree": "*" 1526 | } 1527 | }, 1528 | "node_modules/@types/estree": { 1529 | "version": "1.0.6", 1530 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1531 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1532 | "dev": true 1533 | }, 1534 | "node_modules/@types/json-schema": { 1535 | "version": "7.0.15", 1536 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1537 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1538 | "dev": true 1539 | }, 1540 | "node_modules/@types/node": { 1541 | "version": "22.13.10", 1542 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", 1543 | "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", 1544 | "dev": true, 1545 | "dependencies": { 1546 | "undici-types": "~6.20.0" 1547 | } 1548 | }, 1549 | "node_modules/@webassemblyjs/ast": { 1550 | "version": "1.14.1", 1551 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", 1552 | "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", 1553 | "dev": true, 1554 | "dependencies": { 1555 | "@webassemblyjs/helper-numbers": "1.13.2", 1556 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2" 1557 | } 1558 | }, 1559 | "node_modules/@webassemblyjs/floating-point-hex-parser": { 1560 | "version": "1.13.2", 1561 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", 1562 | "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", 1563 | "dev": true 1564 | }, 1565 | "node_modules/@webassemblyjs/helper-api-error": { 1566 | "version": "1.13.2", 1567 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", 1568 | "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", 1569 | "dev": true 1570 | }, 1571 | "node_modules/@webassemblyjs/helper-buffer": { 1572 | "version": "1.14.1", 1573 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", 1574 | "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", 1575 | "dev": true 1576 | }, 1577 | "node_modules/@webassemblyjs/helper-numbers": { 1578 | "version": "1.13.2", 1579 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", 1580 | "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", 1581 | "dev": true, 1582 | "dependencies": { 1583 | "@webassemblyjs/floating-point-hex-parser": "1.13.2", 1584 | "@webassemblyjs/helper-api-error": "1.13.2", 1585 | "@xtuc/long": "4.2.2" 1586 | } 1587 | }, 1588 | "node_modules/@webassemblyjs/helper-wasm-bytecode": { 1589 | "version": "1.13.2", 1590 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", 1591 | "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", 1592 | "dev": true 1593 | }, 1594 | "node_modules/@webassemblyjs/helper-wasm-section": { 1595 | "version": "1.14.1", 1596 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", 1597 | "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", 1598 | "dev": true, 1599 | "dependencies": { 1600 | "@webassemblyjs/ast": "1.14.1", 1601 | "@webassemblyjs/helper-buffer": "1.14.1", 1602 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 1603 | "@webassemblyjs/wasm-gen": "1.14.1" 1604 | } 1605 | }, 1606 | "node_modules/@webassemblyjs/ieee754": { 1607 | "version": "1.13.2", 1608 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", 1609 | "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", 1610 | "dev": true, 1611 | "dependencies": { 1612 | "@xtuc/ieee754": "^1.2.0" 1613 | } 1614 | }, 1615 | "node_modules/@webassemblyjs/leb128": { 1616 | "version": "1.13.2", 1617 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", 1618 | "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", 1619 | "dev": true, 1620 | "dependencies": { 1621 | "@xtuc/long": "4.2.2" 1622 | } 1623 | }, 1624 | "node_modules/@webassemblyjs/utf8": { 1625 | "version": "1.13.2", 1626 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", 1627 | "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", 1628 | "dev": true 1629 | }, 1630 | "node_modules/@webassemblyjs/wasm-edit": { 1631 | "version": "1.14.1", 1632 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", 1633 | "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", 1634 | "dev": true, 1635 | "dependencies": { 1636 | "@webassemblyjs/ast": "1.14.1", 1637 | "@webassemblyjs/helper-buffer": "1.14.1", 1638 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 1639 | "@webassemblyjs/helper-wasm-section": "1.14.1", 1640 | "@webassemblyjs/wasm-gen": "1.14.1", 1641 | "@webassemblyjs/wasm-opt": "1.14.1", 1642 | "@webassemblyjs/wasm-parser": "1.14.1", 1643 | "@webassemblyjs/wast-printer": "1.14.1" 1644 | } 1645 | }, 1646 | "node_modules/@webassemblyjs/wasm-gen": { 1647 | "version": "1.14.1", 1648 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", 1649 | "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", 1650 | "dev": true, 1651 | "dependencies": { 1652 | "@webassemblyjs/ast": "1.14.1", 1653 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 1654 | "@webassemblyjs/ieee754": "1.13.2", 1655 | "@webassemblyjs/leb128": "1.13.2", 1656 | "@webassemblyjs/utf8": "1.13.2" 1657 | } 1658 | }, 1659 | "node_modules/@webassemblyjs/wasm-opt": { 1660 | "version": "1.14.1", 1661 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", 1662 | "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", 1663 | "dev": true, 1664 | "dependencies": { 1665 | "@webassemblyjs/ast": "1.14.1", 1666 | "@webassemblyjs/helper-buffer": "1.14.1", 1667 | "@webassemblyjs/wasm-gen": "1.14.1", 1668 | "@webassemblyjs/wasm-parser": "1.14.1" 1669 | } 1670 | }, 1671 | "node_modules/@webassemblyjs/wasm-parser": { 1672 | "version": "1.14.1", 1673 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", 1674 | "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", 1675 | "dev": true, 1676 | "dependencies": { 1677 | "@webassemblyjs/ast": "1.14.1", 1678 | "@webassemblyjs/helper-api-error": "1.13.2", 1679 | "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 1680 | "@webassemblyjs/ieee754": "1.13.2", 1681 | "@webassemblyjs/leb128": "1.13.2", 1682 | "@webassemblyjs/utf8": "1.13.2" 1683 | } 1684 | }, 1685 | "node_modules/@webassemblyjs/wast-printer": { 1686 | "version": "1.14.1", 1687 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", 1688 | "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", 1689 | "dev": true, 1690 | "dependencies": { 1691 | "@webassemblyjs/ast": "1.14.1", 1692 | "@xtuc/long": "4.2.2" 1693 | } 1694 | }, 1695 | "node_modules/@webpack-cli/configtest": { 1696 | "version": "3.0.1", 1697 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", 1698 | "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", 1699 | "dev": true, 1700 | "engines": { 1701 | "node": ">=18.12.0" 1702 | }, 1703 | "peerDependencies": { 1704 | "webpack": "^5.82.0", 1705 | "webpack-cli": "6.x.x" 1706 | } 1707 | }, 1708 | "node_modules/@webpack-cli/info": { 1709 | "version": "3.0.1", 1710 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", 1711 | "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">=18.12.0" 1715 | }, 1716 | "peerDependencies": { 1717 | "webpack": "^5.82.0", 1718 | "webpack-cli": "6.x.x" 1719 | } 1720 | }, 1721 | "node_modules/@webpack-cli/serve": { 1722 | "version": "3.0.1", 1723 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", 1724 | "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", 1725 | "dev": true, 1726 | "engines": { 1727 | "node": ">=18.12.0" 1728 | }, 1729 | "peerDependencies": { 1730 | "webpack": "^5.82.0", 1731 | "webpack-cli": "6.x.x" 1732 | }, 1733 | "peerDependenciesMeta": { 1734 | "webpack-dev-server": { 1735 | "optional": true 1736 | } 1737 | } 1738 | }, 1739 | "node_modules/@xtuc/ieee754": { 1740 | "version": "1.2.0", 1741 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 1742 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 1743 | "dev": true 1744 | }, 1745 | "node_modules/@xtuc/long": { 1746 | "version": "4.2.2", 1747 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 1748 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 1749 | "dev": true 1750 | }, 1751 | "node_modules/acorn": { 1752 | "version": "8.14.1", 1753 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 1754 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1755 | "dev": true, 1756 | "bin": { 1757 | "acorn": "bin/acorn" 1758 | }, 1759 | "engines": { 1760 | "node": ">=0.4.0" 1761 | } 1762 | }, 1763 | "node_modules/ajv": { 1764 | "version": "8.17.1", 1765 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 1766 | "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 1767 | "dev": true, 1768 | "dependencies": { 1769 | "fast-deep-equal": "^3.1.3", 1770 | "fast-uri": "^3.0.1", 1771 | "json-schema-traverse": "^1.0.0", 1772 | "require-from-string": "^2.0.2" 1773 | }, 1774 | "funding": { 1775 | "type": "github", 1776 | "url": "https://github.com/sponsors/epoberezkin" 1777 | } 1778 | }, 1779 | "node_modules/ajv-formats": { 1780 | "version": "2.1.1", 1781 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 1782 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 1783 | "dev": true, 1784 | "dependencies": { 1785 | "ajv": "^8.0.0" 1786 | }, 1787 | "peerDependencies": { 1788 | "ajv": "^8.0.0" 1789 | }, 1790 | "peerDependenciesMeta": { 1791 | "ajv": { 1792 | "optional": true 1793 | } 1794 | } 1795 | }, 1796 | "node_modules/ajv-keywords": { 1797 | "version": "5.1.0", 1798 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 1799 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 1800 | "dev": true, 1801 | "dependencies": { 1802 | "fast-deep-equal": "^3.1.3" 1803 | }, 1804 | "peerDependencies": { 1805 | "ajv": "^8.8.2" 1806 | } 1807 | }, 1808 | "node_modules/babel-loader": { 1809 | "version": "10.0.0", 1810 | "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", 1811 | "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", 1812 | "dev": true, 1813 | "dependencies": { 1814 | "find-up": "^5.0.0" 1815 | }, 1816 | "engines": { 1817 | "node": "^18.20.0 || ^20.10.0 || >=22.0.0" 1818 | }, 1819 | "peerDependencies": { 1820 | "@babel/core": "^7.12.0", 1821 | "webpack": ">=5.61.0" 1822 | } 1823 | }, 1824 | "node_modules/babel-loader/node_modules/find-up": { 1825 | "version": "5.0.0", 1826 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1827 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1828 | "dev": true, 1829 | "dependencies": { 1830 | "locate-path": "^6.0.0", 1831 | "path-exists": "^4.0.0" 1832 | }, 1833 | "engines": { 1834 | "node": ">=10" 1835 | }, 1836 | "funding": { 1837 | "url": "https://github.com/sponsors/sindresorhus" 1838 | } 1839 | }, 1840 | "node_modules/babel-loader/node_modules/locate-path": { 1841 | "version": "6.0.0", 1842 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1843 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1844 | "dev": true, 1845 | "dependencies": { 1846 | "p-locate": "^5.0.0" 1847 | }, 1848 | "engines": { 1849 | "node": ">=10" 1850 | }, 1851 | "funding": { 1852 | "url": "https://github.com/sponsors/sindresorhus" 1853 | } 1854 | }, 1855 | "node_modules/babel-loader/node_modules/p-limit": { 1856 | "version": "3.1.0", 1857 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1858 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1859 | "dev": true, 1860 | "dependencies": { 1861 | "yocto-queue": "^0.1.0" 1862 | }, 1863 | "engines": { 1864 | "node": ">=10" 1865 | }, 1866 | "funding": { 1867 | "url": "https://github.com/sponsors/sindresorhus" 1868 | } 1869 | }, 1870 | "node_modules/babel-loader/node_modules/p-locate": { 1871 | "version": "5.0.0", 1872 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1873 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1874 | "dev": true, 1875 | "dependencies": { 1876 | "p-limit": "^3.0.2" 1877 | }, 1878 | "engines": { 1879 | "node": ">=10" 1880 | }, 1881 | "funding": { 1882 | "url": "https://github.com/sponsors/sindresorhus" 1883 | } 1884 | }, 1885 | "node_modules/babel-plugin-polyfill-corejs2": { 1886 | "version": "0.4.12", 1887 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", 1888 | "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", 1889 | "dev": true, 1890 | "dependencies": { 1891 | "@babel/compat-data": "^7.22.6", 1892 | "@babel/helper-define-polyfill-provider": "^0.6.3", 1893 | "semver": "^6.3.1" 1894 | }, 1895 | "peerDependencies": { 1896 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 1897 | } 1898 | }, 1899 | "node_modules/babel-plugin-polyfill-corejs3": { 1900 | "version": "0.11.1", 1901 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", 1902 | "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", 1903 | "dev": true, 1904 | "dependencies": { 1905 | "@babel/helper-define-polyfill-provider": "^0.6.3", 1906 | "core-js-compat": "^3.40.0" 1907 | }, 1908 | "peerDependencies": { 1909 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 1910 | } 1911 | }, 1912 | "node_modules/babel-plugin-polyfill-regenerator": { 1913 | "version": "0.6.3", 1914 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", 1915 | "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", 1916 | "dev": true, 1917 | "dependencies": { 1918 | "@babel/helper-define-polyfill-provider": "^0.6.3" 1919 | }, 1920 | "peerDependencies": { 1921 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 1922 | } 1923 | }, 1924 | "node_modules/browserslist": { 1925 | "version": "4.24.4", 1926 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", 1927 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 1928 | "dev": true, 1929 | "funding": [ 1930 | { 1931 | "type": "opencollective", 1932 | "url": "https://opencollective.com/browserslist" 1933 | }, 1934 | { 1935 | "type": "tidelift", 1936 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1937 | }, 1938 | { 1939 | "type": "github", 1940 | "url": "https://github.com/sponsors/ai" 1941 | } 1942 | ], 1943 | "dependencies": { 1944 | "caniuse-lite": "^1.0.30001688", 1945 | "electron-to-chromium": "^1.5.73", 1946 | "node-releases": "^2.0.19", 1947 | "update-browserslist-db": "^1.1.1" 1948 | }, 1949 | "bin": { 1950 | "browserslist": "cli.js" 1951 | }, 1952 | "engines": { 1953 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1954 | } 1955 | }, 1956 | "node_modules/buffer-from": { 1957 | "version": "1.1.2", 1958 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1959 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1960 | "dev": true 1961 | }, 1962 | "node_modules/caniuse-lite": { 1963 | "version": "1.0.30001702", 1964 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", 1965 | "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", 1966 | "dev": true, 1967 | "funding": [ 1968 | { 1969 | "type": "opencollective", 1970 | "url": "https://opencollective.com/browserslist" 1971 | }, 1972 | { 1973 | "type": "tidelift", 1974 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1975 | }, 1976 | { 1977 | "type": "github", 1978 | "url": "https://github.com/sponsors/ai" 1979 | } 1980 | ] 1981 | }, 1982 | "node_modules/chrome-trace-event": { 1983 | "version": "1.0.4", 1984 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", 1985 | "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", 1986 | "dev": true, 1987 | "engines": { 1988 | "node": ">=6.0" 1989 | } 1990 | }, 1991 | "node_modules/clone-deep": { 1992 | "version": "4.0.1", 1993 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 1994 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 1995 | "dev": true, 1996 | "dependencies": { 1997 | "is-plain-object": "^2.0.4", 1998 | "kind-of": "^6.0.2", 1999 | "shallow-clone": "^3.0.0" 2000 | }, 2001 | "engines": { 2002 | "node": ">=6" 2003 | } 2004 | }, 2005 | "node_modules/colorette": { 2006 | "version": "2.0.20", 2007 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", 2008 | "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", 2009 | "dev": true 2010 | }, 2011 | "node_modules/commander": { 2012 | "version": "2.20.3", 2013 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 2014 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 2015 | "dev": true 2016 | }, 2017 | "node_modules/convert-source-map": { 2018 | "version": "2.0.0", 2019 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2020 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2021 | "dev": true 2022 | }, 2023 | "node_modules/core-js-compat": { 2024 | "version": "3.41.0", 2025 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", 2026 | "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", 2027 | "dev": true, 2028 | "dependencies": { 2029 | "browserslist": "^4.24.4" 2030 | }, 2031 | "funding": { 2032 | "type": "opencollective", 2033 | "url": "https://opencollective.com/core-js" 2034 | } 2035 | }, 2036 | "node_modules/cross-spawn": { 2037 | "version": "7.0.6", 2038 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2039 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2040 | "dev": true, 2041 | "dependencies": { 2042 | "path-key": "^3.1.0", 2043 | "shebang-command": "^2.0.0", 2044 | "which": "^2.0.1" 2045 | }, 2046 | "engines": { 2047 | "node": ">= 8" 2048 | } 2049 | }, 2050 | "node_modules/debug": { 2051 | "version": "4.4.0", 2052 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 2053 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 2054 | "dev": true, 2055 | "dependencies": { 2056 | "ms": "^2.1.3" 2057 | }, 2058 | "engines": { 2059 | "node": ">=6.0" 2060 | }, 2061 | "peerDependenciesMeta": { 2062 | "supports-color": { 2063 | "optional": true 2064 | } 2065 | } 2066 | }, 2067 | "node_modules/electron-to-chromium": { 2068 | "version": "1.5.113", 2069 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz", 2070 | "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==", 2071 | "dev": true 2072 | }, 2073 | "node_modules/enhanced-resolve": { 2074 | "version": "5.18.1", 2075 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", 2076 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 2077 | "dev": true, 2078 | "dependencies": { 2079 | "graceful-fs": "^4.2.4", 2080 | "tapable": "^2.2.0" 2081 | }, 2082 | "engines": { 2083 | "node": ">=10.13.0" 2084 | } 2085 | }, 2086 | "node_modules/envinfo": { 2087 | "version": "7.14.0", 2088 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", 2089 | "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", 2090 | "dev": true, 2091 | "bin": { 2092 | "envinfo": "dist/cli.js" 2093 | }, 2094 | "engines": { 2095 | "node": ">=4" 2096 | } 2097 | }, 2098 | "node_modules/es-module-lexer": { 2099 | "version": "1.6.0", 2100 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", 2101 | "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", 2102 | "dev": true 2103 | }, 2104 | "node_modules/escalade": { 2105 | "version": "3.2.0", 2106 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2107 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2108 | "dev": true, 2109 | "engines": { 2110 | "node": ">=6" 2111 | } 2112 | }, 2113 | "node_modules/eslint-scope": { 2114 | "version": "5.1.1", 2115 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 2116 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 2117 | "dev": true, 2118 | "dependencies": { 2119 | "esrecurse": "^4.3.0", 2120 | "estraverse": "^4.1.1" 2121 | }, 2122 | "engines": { 2123 | "node": ">=8.0.0" 2124 | } 2125 | }, 2126 | "node_modules/esrecurse": { 2127 | "version": "4.3.0", 2128 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2129 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2130 | "dev": true, 2131 | "dependencies": { 2132 | "estraverse": "^5.2.0" 2133 | }, 2134 | "engines": { 2135 | "node": ">=4.0" 2136 | } 2137 | }, 2138 | "node_modules/esrecurse/node_modules/estraverse": { 2139 | "version": "5.3.0", 2140 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2141 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2142 | "dev": true, 2143 | "engines": { 2144 | "node": ">=4.0" 2145 | } 2146 | }, 2147 | "node_modules/estraverse": { 2148 | "version": "4.3.0", 2149 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 2150 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 2151 | "dev": true, 2152 | "engines": { 2153 | "node": ">=4.0" 2154 | } 2155 | }, 2156 | "node_modules/esutils": { 2157 | "version": "2.0.3", 2158 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2159 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2160 | "dev": true, 2161 | "engines": { 2162 | "node": ">=0.10.0" 2163 | } 2164 | }, 2165 | "node_modules/events": { 2166 | "version": "3.3.0", 2167 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 2168 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 2169 | "dev": true, 2170 | "engines": { 2171 | "node": ">=0.8.x" 2172 | } 2173 | }, 2174 | "node_modules/fast-deep-equal": { 2175 | "version": "3.1.3", 2176 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2177 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2178 | "dev": true 2179 | }, 2180 | "node_modules/fast-uri": { 2181 | "version": "3.0.6", 2182 | "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", 2183 | "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", 2184 | "dev": true, 2185 | "funding": [ 2186 | { 2187 | "type": "github", 2188 | "url": "https://github.com/sponsors/fastify" 2189 | }, 2190 | { 2191 | "type": "opencollective", 2192 | "url": "https://opencollective.com/fastify" 2193 | } 2194 | ] 2195 | }, 2196 | "node_modules/fastest-levenshtein": { 2197 | "version": "1.0.16", 2198 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 2199 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 2200 | "dev": true, 2201 | "engines": { 2202 | "node": ">= 4.9.1" 2203 | } 2204 | }, 2205 | "node_modules/find-up": { 2206 | "version": "4.1.0", 2207 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2208 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2209 | "dev": true, 2210 | "dependencies": { 2211 | "locate-path": "^5.0.0", 2212 | "path-exists": "^4.0.0" 2213 | }, 2214 | "engines": { 2215 | "node": ">=8" 2216 | } 2217 | }, 2218 | "node_modules/flat": { 2219 | "version": "5.0.2", 2220 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2221 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2222 | "dev": true, 2223 | "bin": { 2224 | "flat": "cli.js" 2225 | } 2226 | }, 2227 | "node_modules/function-bind": { 2228 | "version": "1.1.2", 2229 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2230 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2231 | "dev": true, 2232 | "funding": { 2233 | "url": "https://github.com/sponsors/ljharb" 2234 | } 2235 | }, 2236 | "node_modules/gensync": { 2237 | "version": "1.0.0-beta.2", 2238 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2239 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2240 | "dev": true, 2241 | "engines": { 2242 | "node": ">=6.9.0" 2243 | } 2244 | }, 2245 | "node_modules/glob-to-regexp": { 2246 | "version": "0.4.1", 2247 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2248 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 2249 | "dev": true 2250 | }, 2251 | "node_modules/globals": { 2252 | "version": "11.12.0", 2253 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2254 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2255 | "dev": true, 2256 | "engines": { 2257 | "node": ">=4" 2258 | } 2259 | }, 2260 | "node_modules/graceful-fs": { 2261 | "version": "4.2.11", 2262 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2263 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2264 | "dev": true 2265 | }, 2266 | "node_modules/has-flag": { 2267 | "version": "4.0.0", 2268 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2269 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2270 | "dev": true, 2271 | "engines": { 2272 | "node": ">=8" 2273 | } 2274 | }, 2275 | "node_modules/hasown": { 2276 | "version": "2.0.2", 2277 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2278 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2279 | "dev": true, 2280 | "dependencies": { 2281 | "function-bind": "^1.1.2" 2282 | }, 2283 | "engines": { 2284 | "node": ">= 0.4" 2285 | } 2286 | }, 2287 | "node_modules/import-local": { 2288 | "version": "3.2.0", 2289 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", 2290 | "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", 2291 | "dev": true, 2292 | "dependencies": { 2293 | "pkg-dir": "^4.2.0", 2294 | "resolve-cwd": "^3.0.0" 2295 | }, 2296 | "bin": { 2297 | "import-local-fixture": "fixtures/cli.js" 2298 | }, 2299 | "engines": { 2300 | "node": ">=8" 2301 | }, 2302 | "funding": { 2303 | "url": "https://github.com/sponsors/sindresorhus" 2304 | } 2305 | }, 2306 | "node_modules/interpret": { 2307 | "version": "3.1.1", 2308 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", 2309 | "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", 2310 | "dev": true, 2311 | "engines": { 2312 | "node": ">=10.13.0" 2313 | } 2314 | }, 2315 | "node_modules/is-core-module": { 2316 | "version": "2.16.1", 2317 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 2318 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 2319 | "dev": true, 2320 | "dependencies": { 2321 | "hasown": "^2.0.2" 2322 | }, 2323 | "engines": { 2324 | "node": ">= 0.4" 2325 | }, 2326 | "funding": { 2327 | "url": "https://github.com/sponsors/ljharb" 2328 | } 2329 | }, 2330 | "node_modules/is-plain-object": { 2331 | "version": "2.0.4", 2332 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 2333 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 2334 | "dev": true, 2335 | "dependencies": { 2336 | "isobject": "^3.0.1" 2337 | }, 2338 | "engines": { 2339 | "node": ">=0.10.0" 2340 | } 2341 | }, 2342 | "node_modules/isexe": { 2343 | "version": "2.0.0", 2344 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2345 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2346 | "dev": true 2347 | }, 2348 | "node_modules/isobject": { 2349 | "version": "3.0.1", 2350 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2351 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 2352 | "dev": true, 2353 | "engines": { 2354 | "node": ">=0.10.0" 2355 | } 2356 | }, 2357 | "node_modules/jest-worker": { 2358 | "version": "27.5.1", 2359 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 2360 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 2361 | "dev": true, 2362 | "dependencies": { 2363 | "@types/node": "*", 2364 | "merge-stream": "^2.0.0", 2365 | "supports-color": "^8.0.0" 2366 | }, 2367 | "engines": { 2368 | "node": ">= 10.13.0" 2369 | } 2370 | }, 2371 | "node_modules/js-tokens": { 2372 | "version": "4.0.0", 2373 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2374 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2375 | "dev": true 2376 | }, 2377 | "node_modules/jsesc": { 2378 | "version": "3.1.0", 2379 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 2380 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2381 | "dev": true, 2382 | "bin": { 2383 | "jsesc": "bin/jsesc" 2384 | }, 2385 | "engines": { 2386 | "node": ">=6" 2387 | } 2388 | }, 2389 | "node_modules/json-parse-even-better-errors": { 2390 | "version": "2.3.1", 2391 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2392 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2393 | "dev": true 2394 | }, 2395 | "node_modules/json-schema-traverse": { 2396 | "version": "1.0.0", 2397 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2398 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2399 | "dev": true 2400 | }, 2401 | "node_modules/json5": { 2402 | "version": "2.2.3", 2403 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2404 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2405 | "dev": true, 2406 | "bin": { 2407 | "json5": "lib/cli.js" 2408 | }, 2409 | "engines": { 2410 | "node": ">=6" 2411 | } 2412 | }, 2413 | "node_modules/kind-of": { 2414 | "version": "6.0.3", 2415 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 2416 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 2417 | "dev": true, 2418 | "engines": { 2419 | "node": ">=0.10.0" 2420 | } 2421 | }, 2422 | "node_modules/loader-runner": { 2423 | "version": "4.3.0", 2424 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 2425 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 2426 | "dev": true, 2427 | "engines": { 2428 | "node": ">=6.11.5" 2429 | } 2430 | }, 2431 | "node_modules/locate-path": { 2432 | "version": "5.0.0", 2433 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2434 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2435 | "dev": true, 2436 | "dependencies": { 2437 | "p-locate": "^4.1.0" 2438 | }, 2439 | "engines": { 2440 | "node": ">=8" 2441 | } 2442 | }, 2443 | "node_modules/lodash.debounce": { 2444 | "version": "4.0.8", 2445 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 2446 | "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", 2447 | "dev": true 2448 | }, 2449 | "node_modules/lru-cache": { 2450 | "version": "5.1.1", 2451 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2452 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2453 | "dev": true, 2454 | "dependencies": { 2455 | "yallist": "^3.0.2" 2456 | } 2457 | }, 2458 | "node_modules/merge-stream": { 2459 | "version": "2.0.0", 2460 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2461 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2462 | "dev": true 2463 | }, 2464 | "node_modules/mime-db": { 2465 | "version": "1.52.0", 2466 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2467 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2468 | "dev": true, 2469 | "engines": { 2470 | "node": ">= 0.6" 2471 | } 2472 | }, 2473 | "node_modules/mime-types": { 2474 | "version": "2.1.35", 2475 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2476 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2477 | "dev": true, 2478 | "dependencies": { 2479 | "mime-db": "1.52.0" 2480 | }, 2481 | "engines": { 2482 | "node": ">= 0.6" 2483 | } 2484 | }, 2485 | "node_modules/ms": { 2486 | "version": "2.1.3", 2487 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2488 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2489 | "dev": true 2490 | }, 2491 | "node_modules/neo-async": { 2492 | "version": "2.6.2", 2493 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2494 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 2495 | "dev": true 2496 | }, 2497 | "node_modules/node-releases": { 2498 | "version": "2.0.19", 2499 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2500 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2501 | "dev": true 2502 | }, 2503 | "node_modules/p-limit": { 2504 | "version": "2.3.0", 2505 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2506 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2507 | "dev": true, 2508 | "dependencies": { 2509 | "p-try": "^2.0.0" 2510 | }, 2511 | "engines": { 2512 | "node": ">=6" 2513 | }, 2514 | "funding": { 2515 | "url": "https://github.com/sponsors/sindresorhus" 2516 | } 2517 | }, 2518 | "node_modules/p-locate": { 2519 | "version": "4.1.0", 2520 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2521 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2522 | "dev": true, 2523 | "dependencies": { 2524 | "p-limit": "^2.2.0" 2525 | }, 2526 | "engines": { 2527 | "node": ">=8" 2528 | } 2529 | }, 2530 | "node_modules/p-try": { 2531 | "version": "2.2.0", 2532 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2533 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2534 | "dev": true, 2535 | "engines": { 2536 | "node": ">=6" 2537 | } 2538 | }, 2539 | "node_modules/path-exists": { 2540 | "version": "4.0.0", 2541 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2542 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2543 | "dev": true, 2544 | "engines": { 2545 | "node": ">=8" 2546 | } 2547 | }, 2548 | "node_modules/path-key": { 2549 | "version": "3.1.1", 2550 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2551 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2552 | "dev": true, 2553 | "engines": { 2554 | "node": ">=8" 2555 | } 2556 | }, 2557 | "node_modules/path-parse": { 2558 | "version": "1.0.7", 2559 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2560 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2561 | "dev": true 2562 | }, 2563 | "node_modules/picocolors": { 2564 | "version": "1.1.1", 2565 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2566 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2567 | "dev": true 2568 | }, 2569 | "node_modules/pkg-dir": { 2570 | "version": "4.2.0", 2571 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2572 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2573 | "dev": true, 2574 | "dependencies": { 2575 | "find-up": "^4.0.0" 2576 | }, 2577 | "engines": { 2578 | "node": ">=8" 2579 | } 2580 | }, 2581 | "node_modules/randombytes": { 2582 | "version": "2.1.0", 2583 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2584 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2585 | "dev": true, 2586 | "dependencies": { 2587 | "safe-buffer": "^5.1.0" 2588 | } 2589 | }, 2590 | "node_modules/rechoir": { 2591 | "version": "0.8.0", 2592 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 2593 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 2594 | "dev": true, 2595 | "dependencies": { 2596 | "resolve": "^1.20.0" 2597 | }, 2598 | "engines": { 2599 | "node": ">= 10.13.0" 2600 | } 2601 | }, 2602 | "node_modules/regenerate": { 2603 | "version": "1.4.2", 2604 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 2605 | "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", 2606 | "dev": true 2607 | }, 2608 | "node_modules/regenerate-unicode-properties": { 2609 | "version": "10.2.0", 2610 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", 2611 | "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", 2612 | "dev": true, 2613 | "dependencies": { 2614 | "regenerate": "^1.4.2" 2615 | }, 2616 | "engines": { 2617 | "node": ">=4" 2618 | } 2619 | }, 2620 | "node_modules/regenerator-runtime": { 2621 | "version": "0.14.1", 2622 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2623 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", 2624 | "dev": true 2625 | }, 2626 | "node_modules/regenerator-transform": { 2627 | "version": "0.15.2", 2628 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", 2629 | "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", 2630 | "dev": true, 2631 | "dependencies": { 2632 | "@babel/runtime": "^7.8.4" 2633 | } 2634 | }, 2635 | "node_modules/regexpu-core": { 2636 | "version": "6.2.0", 2637 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", 2638 | "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", 2639 | "dev": true, 2640 | "dependencies": { 2641 | "regenerate": "^1.4.2", 2642 | "regenerate-unicode-properties": "^10.2.0", 2643 | "regjsgen": "^0.8.0", 2644 | "regjsparser": "^0.12.0", 2645 | "unicode-match-property-ecmascript": "^2.0.0", 2646 | "unicode-match-property-value-ecmascript": "^2.1.0" 2647 | }, 2648 | "engines": { 2649 | "node": ">=4" 2650 | } 2651 | }, 2652 | "node_modules/regjsgen": { 2653 | "version": "0.8.0", 2654 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", 2655 | "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", 2656 | "dev": true 2657 | }, 2658 | "node_modules/regjsparser": { 2659 | "version": "0.12.0", 2660 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", 2661 | "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", 2662 | "dev": true, 2663 | "dependencies": { 2664 | "jsesc": "~3.0.2" 2665 | }, 2666 | "bin": { 2667 | "regjsparser": "bin/parser" 2668 | } 2669 | }, 2670 | "node_modules/regjsparser/node_modules/jsesc": { 2671 | "version": "3.0.2", 2672 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 2673 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 2674 | "dev": true, 2675 | "bin": { 2676 | "jsesc": "bin/jsesc" 2677 | }, 2678 | "engines": { 2679 | "node": ">=6" 2680 | } 2681 | }, 2682 | "node_modules/require-from-string": { 2683 | "version": "2.0.2", 2684 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2685 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2686 | "dev": true, 2687 | "engines": { 2688 | "node": ">=0.10.0" 2689 | } 2690 | }, 2691 | "node_modules/resolve": { 2692 | "version": "1.22.10", 2693 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 2694 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 2695 | "dev": true, 2696 | "dependencies": { 2697 | "is-core-module": "^2.16.0", 2698 | "path-parse": "^1.0.7", 2699 | "supports-preserve-symlinks-flag": "^1.0.0" 2700 | }, 2701 | "bin": { 2702 | "resolve": "bin/resolve" 2703 | }, 2704 | "engines": { 2705 | "node": ">= 0.4" 2706 | }, 2707 | "funding": { 2708 | "url": "https://github.com/sponsors/ljharb" 2709 | } 2710 | }, 2711 | "node_modules/resolve-cwd": { 2712 | "version": "3.0.0", 2713 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 2714 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 2715 | "dev": true, 2716 | "dependencies": { 2717 | "resolve-from": "^5.0.0" 2718 | }, 2719 | "engines": { 2720 | "node": ">=8" 2721 | } 2722 | }, 2723 | "node_modules/resolve-from": { 2724 | "version": "5.0.0", 2725 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2726 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2727 | "dev": true, 2728 | "engines": { 2729 | "node": ">=8" 2730 | } 2731 | }, 2732 | "node_modules/safe-buffer": { 2733 | "version": "5.2.1", 2734 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2735 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2736 | "dev": true, 2737 | "funding": [ 2738 | { 2739 | "type": "github", 2740 | "url": "https://github.com/sponsors/feross" 2741 | }, 2742 | { 2743 | "type": "patreon", 2744 | "url": "https://www.patreon.com/feross" 2745 | }, 2746 | { 2747 | "type": "consulting", 2748 | "url": "https://feross.org/support" 2749 | } 2750 | ] 2751 | }, 2752 | "node_modules/schema-utils": { 2753 | "version": "4.3.0", 2754 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", 2755 | "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", 2756 | "dev": true, 2757 | "dependencies": { 2758 | "@types/json-schema": "^7.0.9", 2759 | "ajv": "^8.9.0", 2760 | "ajv-formats": "^2.1.1", 2761 | "ajv-keywords": "^5.1.0" 2762 | }, 2763 | "engines": { 2764 | "node": ">= 10.13.0" 2765 | }, 2766 | "funding": { 2767 | "type": "opencollective", 2768 | "url": "https://opencollective.com/webpack" 2769 | } 2770 | }, 2771 | "node_modules/semver": { 2772 | "version": "6.3.1", 2773 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2774 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2775 | "dev": true, 2776 | "bin": { 2777 | "semver": "bin/semver.js" 2778 | } 2779 | }, 2780 | "node_modules/serialize-javascript": { 2781 | "version": "6.0.2", 2782 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 2783 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 2784 | "dev": true, 2785 | "dependencies": { 2786 | "randombytes": "^2.1.0" 2787 | } 2788 | }, 2789 | "node_modules/shallow-clone": { 2790 | "version": "3.0.1", 2791 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2792 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2793 | "dev": true, 2794 | "dependencies": { 2795 | "kind-of": "^6.0.2" 2796 | }, 2797 | "engines": { 2798 | "node": ">=8" 2799 | } 2800 | }, 2801 | "node_modules/shebang-command": { 2802 | "version": "2.0.0", 2803 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2804 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2805 | "dev": true, 2806 | "dependencies": { 2807 | "shebang-regex": "^3.0.0" 2808 | }, 2809 | "engines": { 2810 | "node": ">=8" 2811 | } 2812 | }, 2813 | "node_modules/shebang-regex": { 2814 | "version": "3.0.0", 2815 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2816 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2817 | "dev": true, 2818 | "engines": { 2819 | "node": ">=8" 2820 | } 2821 | }, 2822 | "node_modules/source-map": { 2823 | "version": "0.6.1", 2824 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2825 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2826 | "dev": true, 2827 | "engines": { 2828 | "node": ">=0.10.0" 2829 | } 2830 | }, 2831 | "node_modules/source-map-support": { 2832 | "version": "0.5.21", 2833 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2834 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2835 | "dev": true, 2836 | "dependencies": { 2837 | "buffer-from": "^1.0.0", 2838 | "source-map": "^0.6.0" 2839 | } 2840 | }, 2841 | "node_modules/supports-color": { 2842 | "version": "8.1.1", 2843 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2844 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2845 | "dev": true, 2846 | "dependencies": { 2847 | "has-flag": "^4.0.0" 2848 | }, 2849 | "engines": { 2850 | "node": ">=10" 2851 | }, 2852 | "funding": { 2853 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2854 | } 2855 | }, 2856 | "node_modules/supports-preserve-symlinks-flag": { 2857 | "version": "1.0.0", 2858 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2859 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2860 | "dev": true, 2861 | "engines": { 2862 | "node": ">= 0.4" 2863 | }, 2864 | "funding": { 2865 | "url": "https://github.com/sponsors/ljharb" 2866 | } 2867 | }, 2868 | "node_modules/tapable": { 2869 | "version": "2.2.1", 2870 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2871 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2872 | "dev": true, 2873 | "engines": { 2874 | "node": ">=6" 2875 | } 2876 | }, 2877 | "node_modules/terser": { 2878 | "version": "5.39.0", 2879 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", 2880 | "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", 2881 | "dev": true, 2882 | "dependencies": { 2883 | "@jridgewell/source-map": "^0.3.3", 2884 | "acorn": "^8.8.2", 2885 | "commander": "^2.20.0", 2886 | "source-map-support": "~0.5.20" 2887 | }, 2888 | "bin": { 2889 | "terser": "bin/terser" 2890 | }, 2891 | "engines": { 2892 | "node": ">=10" 2893 | } 2894 | }, 2895 | "node_modules/terser-webpack-plugin": { 2896 | "version": "5.3.14", 2897 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", 2898 | "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", 2899 | "dev": true, 2900 | "dependencies": { 2901 | "@jridgewell/trace-mapping": "^0.3.25", 2902 | "jest-worker": "^27.4.5", 2903 | "schema-utils": "^4.3.0", 2904 | "serialize-javascript": "^6.0.2", 2905 | "terser": "^5.31.1" 2906 | }, 2907 | "engines": { 2908 | "node": ">= 10.13.0" 2909 | }, 2910 | "funding": { 2911 | "type": "opencollective", 2912 | "url": "https://opencollective.com/webpack" 2913 | }, 2914 | "peerDependencies": { 2915 | "webpack": "^5.1.0" 2916 | }, 2917 | "peerDependenciesMeta": { 2918 | "@swc/core": { 2919 | "optional": true 2920 | }, 2921 | "esbuild": { 2922 | "optional": true 2923 | }, 2924 | "uglify-js": { 2925 | "optional": true 2926 | } 2927 | } 2928 | }, 2929 | "node_modules/undici-types": { 2930 | "version": "6.20.0", 2931 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 2932 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 2933 | "dev": true 2934 | }, 2935 | "node_modules/unicode-canonical-property-names-ecmascript": { 2936 | "version": "2.0.1", 2937 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", 2938 | "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", 2939 | "dev": true, 2940 | "engines": { 2941 | "node": ">=4" 2942 | } 2943 | }, 2944 | "node_modules/unicode-match-property-ecmascript": { 2945 | "version": "2.0.0", 2946 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", 2947 | "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", 2948 | "dev": true, 2949 | "dependencies": { 2950 | "unicode-canonical-property-names-ecmascript": "^2.0.0", 2951 | "unicode-property-aliases-ecmascript": "^2.0.0" 2952 | }, 2953 | "engines": { 2954 | "node": ">=4" 2955 | } 2956 | }, 2957 | "node_modules/unicode-match-property-value-ecmascript": { 2958 | "version": "2.2.0", 2959 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", 2960 | "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", 2961 | "dev": true, 2962 | "engines": { 2963 | "node": ">=4" 2964 | } 2965 | }, 2966 | "node_modules/unicode-property-aliases-ecmascript": { 2967 | "version": "2.1.0", 2968 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", 2969 | "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", 2970 | "dev": true, 2971 | "engines": { 2972 | "node": ">=4" 2973 | } 2974 | }, 2975 | "node_modules/update-browserslist-db": { 2976 | "version": "1.1.3", 2977 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 2978 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 2979 | "dev": true, 2980 | "funding": [ 2981 | { 2982 | "type": "opencollective", 2983 | "url": "https://opencollective.com/browserslist" 2984 | }, 2985 | { 2986 | "type": "tidelift", 2987 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2988 | }, 2989 | { 2990 | "type": "github", 2991 | "url": "https://github.com/sponsors/ai" 2992 | } 2993 | ], 2994 | "dependencies": { 2995 | "escalade": "^3.2.0", 2996 | "picocolors": "^1.1.1" 2997 | }, 2998 | "bin": { 2999 | "update-browserslist-db": "cli.js" 3000 | }, 3001 | "peerDependencies": { 3002 | "browserslist": ">= 4.21.0" 3003 | } 3004 | }, 3005 | "node_modules/watchpack": { 3006 | "version": "2.4.2", 3007 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", 3008 | "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", 3009 | "dev": true, 3010 | "dependencies": { 3011 | "glob-to-regexp": "^0.4.1", 3012 | "graceful-fs": "^4.1.2" 3013 | }, 3014 | "engines": { 3015 | "node": ">=10.13.0" 3016 | } 3017 | }, 3018 | "node_modules/webpack": { 3019 | "version": "5.98.0", 3020 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", 3021 | "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", 3022 | "dev": true, 3023 | "dependencies": { 3024 | "@types/eslint-scope": "^3.7.7", 3025 | "@types/estree": "^1.0.6", 3026 | "@webassemblyjs/ast": "^1.14.1", 3027 | "@webassemblyjs/wasm-edit": "^1.14.1", 3028 | "@webassemblyjs/wasm-parser": "^1.14.1", 3029 | "acorn": "^8.14.0", 3030 | "browserslist": "^4.24.0", 3031 | "chrome-trace-event": "^1.0.2", 3032 | "enhanced-resolve": "^5.17.1", 3033 | "es-module-lexer": "^1.2.1", 3034 | "eslint-scope": "5.1.1", 3035 | "events": "^3.2.0", 3036 | "glob-to-regexp": "^0.4.1", 3037 | "graceful-fs": "^4.2.11", 3038 | "json-parse-even-better-errors": "^2.3.1", 3039 | "loader-runner": "^4.2.0", 3040 | "mime-types": "^2.1.27", 3041 | "neo-async": "^2.6.2", 3042 | "schema-utils": "^4.3.0", 3043 | "tapable": "^2.1.1", 3044 | "terser-webpack-plugin": "^5.3.11", 3045 | "watchpack": "^2.4.1", 3046 | "webpack-sources": "^3.2.3" 3047 | }, 3048 | "bin": { 3049 | "webpack": "bin/webpack.js" 3050 | }, 3051 | "engines": { 3052 | "node": ">=10.13.0" 3053 | }, 3054 | "funding": { 3055 | "type": "opencollective", 3056 | "url": "https://opencollective.com/webpack" 3057 | }, 3058 | "peerDependenciesMeta": { 3059 | "webpack-cli": { 3060 | "optional": true 3061 | } 3062 | } 3063 | }, 3064 | "node_modules/webpack-cli": { 3065 | "version": "6.0.1", 3066 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", 3067 | "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", 3068 | "dev": true, 3069 | "dependencies": { 3070 | "@discoveryjs/json-ext": "^0.6.1", 3071 | "@webpack-cli/configtest": "^3.0.1", 3072 | "@webpack-cli/info": "^3.0.1", 3073 | "@webpack-cli/serve": "^3.0.1", 3074 | "colorette": "^2.0.14", 3075 | "commander": "^12.1.0", 3076 | "cross-spawn": "^7.0.3", 3077 | "envinfo": "^7.14.0", 3078 | "fastest-levenshtein": "^1.0.12", 3079 | "import-local": "^3.0.2", 3080 | "interpret": "^3.1.1", 3081 | "rechoir": "^0.8.0", 3082 | "webpack-merge": "^6.0.1" 3083 | }, 3084 | "bin": { 3085 | "webpack-cli": "bin/cli.js" 3086 | }, 3087 | "engines": { 3088 | "node": ">=18.12.0" 3089 | }, 3090 | "funding": { 3091 | "type": "opencollective", 3092 | "url": "https://opencollective.com/webpack" 3093 | }, 3094 | "peerDependencies": { 3095 | "webpack": "^5.82.0" 3096 | }, 3097 | "peerDependenciesMeta": { 3098 | "webpack-bundle-analyzer": { 3099 | "optional": true 3100 | }, 3101 | "webpack-dev-server": { 3102 | "optional": true 3103 | } 3104 | } 3105 | }, 3106 | "node_modules/webpack-cli/node_modules/commander": { 3107 | "version": "12.1.0", 3108 | "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", 3109 | "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", 3110 | "dev": true, 3111 | "engines": { 3112 | "node": ">=18" 3113 | } 3114 | }, 3115 | "node_modules/webpack-merge": { 3116 | "version": "6.0.1", 3117 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", 3118 | "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", 3119 | "dev": true, 3120 | "dependencies": { 3121 | "clone-deep": "^4.0.1", 3122 | "flat": "^5.0.2", 3123 | "wildcard": "^2.0.1" 3124 | }, 3125 | "engines": { 3126 | "node": ">=18.0.0" 3127 | } 3128 | }, 3129 | "node_modules/webpack-sources": { 3130 | "version": "3.2.3", 3131 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 3132 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 3133 | "dev": true, 3134 | "engines": { 3135 | "node": ">=10.13.0" 3136 | } 3137 | }, 3138 | "node_modules/which": { 3139 | "version": "2.0.2", 3140 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3141 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3142 | "dev": true, 3143 | "dependencies": { 3144 | "isexe": "^2.0.0" 3145 | }, 3146 | "bin": { 3147 | "node-which": "bin/node-which" 3148 | }, 3149 | "engines": { 3150 | "node": ">= 8" 3151 | } 3152 | }, 3153 | "node_modules/wildcard": { 3154 | "version": "2.0.1", 3155 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", 3156 | "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", 3157 | "dev": true 3158 | }, 3159 | "node_modules/yallist": { 3160 | "version": "3.1.1", 3161 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3162 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3163 | "dev": true 3164 | }, 3165 | "node_modules/yocto-queue": { 3166 | "version": "0.1.0", 3167 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3168 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3169 | "dev": true, 3170 | "engines": { 3171 | "node": ">=10" 3172 | }, 3173 | "funding": { 3174 | "url": "https://github.com/sponsors/sindresorhus" 3175 | } 3176 | } 3177 | } 3178 | } 3179 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "autosend-letters-hh", 3 | "version": "2.1.0", 4 | "description": "**AutoSend Letters HeadHunter** — это удобный скрипт, который автоматически отправляет отклики на вакансии на платформе HeadHunter. Цель проекта — упростить процесс поиска работы, сэкономив ваше время и усилия.", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "webpack" 8 | }, 9 | "keywords": [], 10 | "author": "Igor Stepanov", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@babel/core": "^7.26.9", 14 | "@babel/preset-env": "^7.26.9", 15 | "babel-loader": "^10.0.0", 16 | "webpack": "^5.98.0", 17 | "webpack-cli": "^6.0.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/config/constants.js: -------------------------------------------------------------------------------- 1 | // Основные константы, используемые в приложении 2 | export const CONSTANTS = { 3 | // Селектор для выбора резюме 4 | resume: '[data-qa="magritte-select-option-ВАШ_ID_РЕЗЮМЕ"]', 5 | 6 | // Название шаблона по умолчанию 7 | coverLetter: 'coverLetter_1', 8 | 9 | // Время задержки в миллисекундах 10 | delayMs: 1500, 11 | }; 12 | -------------------------------------------------------------------------------- /src/config/jobUrls.js: -------------------------------------------------------------------------------- 1 | // URL-адреса для страниц вакансий 2 | export const JOB_URLS = { 3 | hh: { 4 | // Ссылка на страницу отдельной вакансии 5 | vacancyPage: 'https://hh.ru/vacancy', 6 | 7 | // Ссылка на страницу списка вакансий 8 | vacancyList: ['https://hh.ru/vacancies', 'https://hh.ru/search/vacancy'], 9 | }, 10 | 11 | superJob: {}, 12 | }; 13 | -------------------------------------------------------------------------------- /src/config/selectors.js: -------------------------------------------------------------------------------- 1 | // CSS-селекторы для различных элементов интерфейса 2 | export const SELECTORS = { 3 | // -------------------- Блок для элементов интерфейса -------------------- 4 | // Селектор элементов навигации 5 | naviItems: '.supernova-navi-item.supernova-navi-item_lvl-2', 6 | 7 | // Селектор кнопки вызова меню "Добавить в чёрный список" 8 | blacklist: '[data-qa=vacancy__blacklist-show-add]', 9 | 10 | // Селектор кнопки "Добавить в чёрный список" 11 | addBlacklist: '[data-qa=vacancy__blacklist-menu-add-vacancy]', 12 | 13 | // Селектор кнопки "Следующая страница" 14 | pagerNext: '[data-qa="pager-next"]', 15 | 16 | // Селектор попапа формы отклика 17 | modalOverlay: '[data-qa="modal-overlay"]', 18 | 19 | // Селектор попапа "Непрямой работодатель" 20 | alertBox: '[data-qa="magritte-alert"]', 21 | 22 | // Селектор кнопки подтверждения выбора страны 23 | countryConfirmBtn: '.bloko-modal-footer .bloko-button_kind-success', 24 | 25 | // Селектор кнопки закрытия чата 26 | chatikCloseBtn: '[data-qa="chatik-close-chatik"]', 27 | 28 | // -------------------- Блок для списка вакансий -------------------- 29 | // Селектор карточки для нескольких вакансий 30 | vacancyCards: '[data-qa="vacancy-serp__vacancy"]', 31 | 32 | // Селектор кнопки "Откликнуться" для одной вакансии 33 | vacancyCard: '[data-qa="vacancy-response-link-top"]', 34 | 35 | // -------------------- Блок для элементов отклика -------------------- 36 | // Селектор заголовка вакансии 37 | vacancyTitle: "[data-qa='serp-item__title']", 38 | 39 | // Селектор кнопки "Приложить письмо" 40 | addCoverLetter: '[data-qa="vacancy-response-letter-toggle-text"]', 41 | 42 | // Селектор поля для сопроводительного письма 43 | coverLetterInput: '#cover-letter textarea', 44 | 45 | // Селектор кнопки "Откликнуться" для отправки отклика 46 | respondBtn: '[data-qa="vacancy-serp__vacancy_response"]', 47 | 48 | // Селектор кнопки "Отправить" для отправки отклика 49 | sendBtn: '[data-qa="vacancy-response-letter-submit"]', 50 | 51 | // -------------------- Блок для элементов отклика в попапе -------------------- 52 | // Селектор заголовка вакансии в попапе 53 | vacancyTitlePopup: '[data-qa="title-description"]', 54 | 55 | // Селектор выпадающего списка с резюме в попапе 56 | resumeDropdown: '[data-qa="resume-title"]', 57 | 58 | // Селектор кнопки "Добавить сопроводительное" в попапе 59 | addCoverLetterPopup: '[data-qa="add-cover-letter"]', 60 | 61 | // Селектор поля для сопроводительного письма в попапе 62 | coverLetterInputPopup: '[data-qa="vacancy-response-popup-form-letter-input"]', 63 | 64 | // Селектор кнопки "Откликнуться" в попапе 65 | respondBtnPopup: '[data-qa="vacancy-response-submit-popup"]', 66 | }; 67 | -------------------------------------------------------------------------------- /src/data/data.js: -------------------------------------------------------------------------------- 1 | // Объект с шаблонами сопроводительных писем 2 | export const TEMPLATES = { 3 | coverLetter_1: `Добрый день! 4 | 5 | Меня заинтересовала предложенная Вами вакансия {#vacancyName}. Ознакомившись с перечнем требований к кандидатам, пришел к выводу, что мой опыт работы позволяют мне претендовать на данную должность. 6 | 7 | Обладаю высоким уровнем фронтенд-разработки, свободно говорю по-английски. В работе ответствен, пунктуален и коммуникабелен. 8 | 9 | Буду с нетерпением ждать ответа и возможности обсудить условия работы и взаимные ожидания на собеседовании. Спасибо, что уделили время. 10 | 11 | Контактные данные прилагаю.`, 12 | coverLetter_2: '.', 13 | coverLetter_3: '', 14 | coverLetter_4: '', 15 | coverLetter_5: '', 16 | }; 17 | -------------------------------------------------------------------------------- /src/globals/globals.js: -------------------------------------------------------------------------------- 1 | // Глобальный флаг показывает, идет ли отправка откликов в данный момент 2 | let isSubmitting = false; 3 | 4 | // Функция возвращает текущее состояние отправки откликов 5 | export function getIsSubmitting() { 6 | return isSubmitting; 7 | } 8 | 9 | // Функция изменяет состояние флага отправки откликов 10 | export function setIsSubmitting(value) { 11 | isSubmitting = value; 12 | } 13 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // Импортируем функцию для предотвращающая перехода на другие страницы 2 | // import { navigationGuard } from './utils/navigationGuard'; 3 | 4 | // Импортируем функцию для продолжения отправки откликов после обновления страницы 5 | // import { resumeMultiSubmit } from './utils/resumeMultiSubmit'; 6 | 7 | // Импортируем функцию, которая добавляет кнопку "Отправить отклики" 8 | import { addResponseBtn } from './modules/interface/addResponseBtn'; 9 | 10 | // Импортируем функцию, которая добавляет кнопку "Поддержать проект" 11 | import { addSponsorBtn } from './modules/interface/addSponsorBtn'; 12 | 13 | // Основная точка входа в приложение 14 | (async function main() { 15 | // Запрещаем переход на другие страницы 16 | // navigationGuard(); 17 | 18 | // Продолжаем отправку откликов после обновления страницы 19 | // await resumeMultiSubmit(); 20 | 21 | // Добавляем кнопку "Отправить отклики" 22 | await addResponseBtn(); 23 | 24 | // Добавляем кнопку "Поддержать проект" 25 | await addSponsorBtn(); 26 | })(); 27 | -------------------------------------------------------------------------------- /src/modules/interface/addResponseBtn.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from '../../utils/delay.js'; 9 | 10 | // Импортируем функцию для переключения состояния кнопки 11 | import { toggleResponseBtn } from './toggleResponseBtn.js'; 12 | 13 | // Импортируем функцию для поиска элемента с указанным текстом 14 | import { findElementByText } from './findElementByText.js'; 15 | 16 | // Функция добавляет новую кнопку в навигации "Отправить отклики" 17 | export async function addResponseBtn() { 18 | // Ждём заданное время перед продолжением 19 | await delay(CONSTANTS.delayMs); 20 | 21 | // Получаем список элементов навигации 22 | const navItems = document.querySelectorAll(SELECTORS.naviItems); 23 | 24 | // Клонируем 5-й элемент навигации 25 | const clonedItem = navItems[4].cloneNode(true); 26 | 27 | // Находим текстовый элемент внутри склонированного элемента 28 | const textElement = findElementByText(clonedItem); 29 | 30 | // Устанавливаем атрибут для назначения обработчика 31 | textElement.setAttribute('data-action', 'submit-responses'); 32 | 33 | // Меняем текст кнопки 34 | textElement.textContent = 'Отправить отклики'; 35 | 36 | // Вставляем склонированный элемент сразу после исходного 37 | navItems[4].insertAdjacentElement('afterend', clonedItem); 38 | 39 | // Ищем в клоне новую кнопку по атрибуту 40 | const newButton = clonedItem.querySelector('[data-action="submit-responses"]'); 41 | 42 | // Навешиваем обработчик клика на новую кнопку 43 | newButton.addEventListener('click', toggleResponseBtn); 44 | } 45 | -------------------------------------------------------------------------------- /src/modules/interface/addSponsorBtn.js: -------------------------------------------------------------------------------- 1 | // Импортируем селекторы 2 | import { SELECTORS } from '../../config/selectors.js'; 3 | 4 | // Импортируем функцию для поиска элемента с указанным текстом 5 | import { findElementByText } from './findElementByText.js'; 6 | 7 | // Функция добавляет новую кнопку в навигации "Поддержать проект" 8 | export async function addSponsorBtn() { 9 | // Получаем список элементов навигации 10 | const navItems = document.querySelectorAll(SELECTORS.naviItems); 11 | 12 | // Клонируем 5-й элемент навигации 13 | const clonedItem = navItems[4].cloneNode(true); 14 | 15 | // Находим текстовый элемент внутри склонированного элемента 16 | const textElement = findElementByText(clonedItem); 17 | 18 | // Меняем текст кнопки 19 | textElement.textContent = 'Поддержать проект'; 20 | 21 | // Удаляем ссылку, чтобы не было перехода по умолчанию 22 | clonedItem.removeAttribute('href'); 23 | 24 | // Меняем курсор на указатель (визуально как кнопка) 25 | clonedItem.style.cursor = 'pointer'; 26 | 27 | // Добавляем обработчик перехода 28 | clonedItem.addEventListener('click', () => { 29 | window.open('https://boosty.to/ia-stepanov/donate', '_blank'); 30 | }); 31 | 32 | // Вставляем склонированный элемент сразу после исходного 33 | navItems[5].insertAdjacentElement('afterend', clonedItem); 34 | } 35 | -------------------------------------------------------------------------------- /src/modules/interface/findElementByText.js: -------------------------------------------------------------------------------- 1 | // Функция для поиска элемента с указанным текстом внутри заданного контейнера 2 | export function findElementByText(container, selector = 'div', text = 'Помощь') { 3 | // Получаем все элементы внутри контейнера по указанному селектору 4 | return Array.from(container.querySelectorAll(selector)).find( 5 | // Ищем элемент, у которого текстовое содержимое совпадает с заданным текстом 6 | // и который не содержит дочерних элементов 7 | (el) => el.textContent.trim() === text && el.children.length === 0 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/modules/interface/toggleResponseBtn.js: -------------------------------------------------------------------------------- 1 | // Импортируем функции для проверки и установки состояния отправки откликов 2 | import { getIsSubmitting, setIsSubmitting } from '../../globals/globals'; 3 | 4 | // Импортируем функцию для отправки откликов 5 | import { processVacancies } from '../process/processVacancies'; 6 | 7 | // Функция переключает состояние кнопки "Отправить отклики" 8 | export async function toggleResponseBtn() { 9 | // Находим кнопку "Отправить отклики" 10 | const button = document.querySelector('[data-action="submit-responses"]'); 11 | 12 | // Если процесс уже запущен, останавливаем его 13 | if (getIsSubmitting()) { 14 | setIsSubmitting(false); 15 | button.textContent = 'Отправить отклики'; 16 | console.log('⏹️ Отправка откликов остановлена'); 17 | return; 18 | } 19 | 20 | // Если процесс не запущен, запускаем его 21 | setIsSubmitting(true); 22 | button.textContent = 'Остановить отправку'; 23 | console.log('▶️ Начата отправка откликов'); 24 | 25 | try { 26 | // Выполняем асинхронную функцию для отправки откликов 27 | await processVacancies(); 28 | } catch (error) { 29 | // Если произошла ошибка, выводим её в консоль 30 | console.error('Ошибка при отправке откликов:', error); 31 | } finally { 32 | // В любом случае завершаем процесс и восстанавливаем текст кнопки 33 | setIsSubmitting(false); 34 | button.textContent = 'Отправить отклики'; 35 | console.log('✅ Отправка откликов завершена'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/modules/popup/insertCoverLetter.js: -------------------------------------------------------------------------------- 1 | // Импортируем селекторы 2 | import { SELECTORS } from '../../config/selectors.js'; 3 | 4 | // Импортируем список шаблонов сопроводительных писем 5 | import { TEMPLATES } from '../../data/data.js'; 6 | 7 | // Импортируем функцию для программного изменения "value" у "input" 8 | import { triggerInputChange } from '../../utils/triggerInputChange.js'; 9 | 10 | // Функция для добавления готового письма в поле ввода 11 | export function insertCoverLetter(coverLetter, vacancyName) { 12 | // Ищем поле ввода для сопроводительного письма 13 | const coverLetterInput = 14 | document.querySelector(SELECTORS.coverLetterInput) || 15 | document.querySelector(SELECTORS.coverLetterInputPopup); 16 | 17 | // Если поле не найдено, прекращаем выполнение 18 | if (!coverLetterInput) return; 19 | 20 | // Формируем письмо, подставив в него название вакансии 21 | const messageValue = TEMPLATES[coverLetter].replace('{#vacancyName}', vacancyName); 22 | 23 | // Добавляем в поле готовое письмо через сеттер 24 | triggerInputChange(coverLetterInput, messageValue); 25 | } 26 | -------------------------------------------------------------------------------- /src/modules/popup/selectResume.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from '../../utils/delay.js'; 9 | 10 | // Функция для выбора резюме и нажатия на кнопку "Добавить сопроводительное" 11 | export async function selectResume() { 12 | // Находим заголовок вакансии 13 | const vacancyTitle = document.querySelector(SELECTORS.vacancyTitlePopup); 14 | 15 | // Находим выпадающий список с резюме 16 | const resumeDropdown = document.querySelector(SELECTORS.resumeDropdown); 17 | 18 | // Находим кнопку "Добавить сопроводительное" 19 | const addCoverLetter = document.querySelector(SELECTORS.addCoverLetterPopup); 20 | 21 | // Открываем выпадающий список 22 | resumeDropdown.click(); 23 | 24 | // Ждём заданное время перед продолжением 25 | await delay(CONSTANTS.delayMs); 26 | 27 | // Находим резюме на странице 28 | const resume = document.querySelector(CONSTANTS.resume); 29 | 30 | // Выбираем резюме 31 | resume?.click(); 32 | 33 | // Если кнопка "Добавить сопроводительное" найдена, нажимаем её, 34 | // иначе кликаем на заголовок вакансии, чтобы закрыть выпадающий список 35 | addCoverLetter?.click() || vacancyTitle.click(); 36 | } 37 | -------------------------------------------------------------------------------- /src/modules/popup/submitCoverLetter.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from '../../utils/delay.js'; 9 | 10 | // Импортируем функцию для добавления готового письма в поле ввода 11 | import { insertCoverLetter } from './insertCoverLetter.js'; 12 | 13 | // Импортируем функцию для закрытия чата 14 | import { checkChatikActive } from '../../utils/popupHelpers.js'; 15 | 16 | // Функция для отправки сопроводительного письма 17 | export async function submitCoverLetter(vacancyTitle) { 18 | // Находим кнопку "Приложить письмо" 19 | const addCoverLetter = document.querySelector(SELECTORS.addCoverLetter); 20 | 21 | // Нажимаем на кнопку "Приложить письмо" 22 | addCoverLetter.click(); 23 | 24 | // Ждём заданное время перед вставкой письма 25 | await delay(CONSTANTS.delayMs); 26 | 27 | // Находим кнопку "Отправить" 28 | const sendBtn = document.querySelector(SELECTORS.sendBtn); 29 | 30 | // Вставляем сопроводительное письмо 31 | insertCoverLetter(CONSTANTS.coverLetter, vacancyTitle); 32 | 33 | // Нажимаем кнопку "Отправить" 34 | sendBtn.click(); 35 | 36 | // Ждём, чтобы корректно завершить процесс 37 | await delay(CONSTANTS.delayMs); 38 | 39 | // Закрываем чат, если открылся 40 | checkChatikActive(); 41 | } 42 | -------------------------------------------------------------------------------- /src/modules/popup/submitCoverLetterPopup.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from '../../utils/delay.js'; 9 | 10 | // Импортируем функцию для выбора резюме 11 | import { selectResume } from './selectResume.js'; 12 | 13 | // Импортируем функцию для добавления готового письма в поле ввода 14 | import { insertCoverLetter } from './insertCoverLetter.js'; 15 | 16 | // Функция для отправки сопроводительного письма 17 | export async function submitCoverLetterPopup(vacancyTitle) { 18 | // Находим кнопку "Откликнуться" 19 | const respondBtn = document.querySelector(SELECTORS.respondBtnPopup); 20 | 21 | // Выбираем резюме 22 | await selectResume(); 23 | 24 | // Ждём заданное время перед вставкой письма 25 | await delay(CONSTANTS.delayMs); 26 | 27 | // Вставляем сопроводительное письмо 28 | insertCoverLetter(CONSTANTS.coverLetter, vacancyTitle); 29 | 30 | // Нажимаем кнопку "Откликнуться" 31 | respondBtn.click(); 32 | 33 | // Ждём, чтобы корректно завершить процесс 34 | await delay(CONSTANTS.delayMs); 35 | } 36 | -------------------------------------------------------------------------------- /src/modules/process/processVacancies.js: -------------------------------------------------------------------------------- 1 | // Импортируем URL-адреса страниц вакансий 2 | import { JOB_URLS } from '../../config/jobUrls.js'; 3 | 4 | // Импортируем константы 5 | import { CONSTANTS } from '../../config/constants.js'; 6 | 7 | // Импорт функций для отклика на вакансии 8 | import { submitSingleVacancy } from '../submit/submitSingleVacancy.js'; 9 | import { submitMultiVacancies } from '../submit/submitMultiVacancies.js'; 10 | 11 | // Импортируем функцию для перехода на следующую страницу 12 | import { goToNextPage } from '../../utils/goToNextPage.js'; 13 | 14 | // Функция для проверки, на какой странице находится пользователь 15 | export async function processVacancies() { 16 | // Получаем текущий адрес страницы 17 | const url = window.location.href; 18 | 19 | // Ссылка на страницу отдельной вакансии 20 | const vacancy = JOB_URLS.hh.vacancyPage; 21 | 22 | // Ссылка на страницу списка вакансий 23 | const vacancies = JOB_URLS.hh.vacancyList; 24 | 25 | // Если в адресе страницы содержится путь отдельной вакансии 26 | if (url.includes(vacancy)) { 27 | // Отправляем отклик на одну вакансию 28 | await submitSingleVacancy(); 29 | // Если в адресе страницы содержится путь списка вакансий 30 | } else if (vacancies.some((path) => url.includes(path))) { 31 | // Отправляем отклики на несколько вакансий 32 | await submitMultiVacancies(); 33 | 34 | // Переходим на следующую страницу и продолжаем отправлять отклики 35 | // goToNextPage(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/modules/submit/submitMultiVacancies.js: -------------------------------------------------------------------------------- 1 | // Импортируем функцию для проверки, идет ли процесс отправки откликов 2 | import { getIsSubmitting } from '../../globals/globals.js'; 3 | 4 | // Импортируем константы 5 | import { CONSTANTS } from '../../config/constants.js'; 6 | 7 | // Импортируем селекторы 8 | import { SELECTORS } from '../../config/selectors.js'; 9 | 10 | // Импортируем функцию задержки выполнения кода 11 | import { delay } from '../../utils/delay.js'; 12 | 13 | // Импортируем функцию для проверки пропуска текущей вакансии 14 | // import { skipVacancy } from '../../utils/addToBlacklist.js'; 15 | 16 | // Импортируем вспомогательные функции для обработки попапов 17 | import { 18 | confirmCountry, // Подтверждает отклик на вакансию в другой стране 19 | confirmEmployerAlert, // Подтверждает отклик на вакансию "Непрямой работодатель" 20 | checkPopupActive, // Проверяет, открыт ли попап формы отклика 21 | } from '../../utils/popupHelpers.js'; 22 | 23 | // Импортируем функцию для отправки сопроводительного письма через поап 24 | import { submitCoverLetterPopup } from '../popup/submitCoverLetterPopup.js'; 25 | 26 | // Импортируем функцию для отправки сопроводительного письма напрямую 27 | import { submitCoverLetter } from '../popup/submitCoverLetter.js'; 28 | 29 | // Функция для отправки откликов на несколько вакансий 30 | export async function submitMultiVacancies() { 31 | // Находим все доступные вакансии 32 | const vacancies = document.querySelectorAll(SELECTORS.vacancyCards); 33 | 34 | // Если вакансии не найдены, прекращаем выполнение 35 | if (!vacancies.length) return; 36 | 37 | // Проходим по каждой вакансии и отправляем отклик 38 | for (const vacancy of vacancies) { 39 | // Если процесс отправки был остановлен, прекращаем выполнение 40 | if (!getIsSubmitting()) break; 41 | 42 | // Плавно прокручиваем вакансии и визуально выделяем синей рамкой 43 | vacancy.scrollIntoView({ behavior: 'smooth', block: 'center' }); 44 | vacancy.style.boxShadow = '0 0 8px #0059b3'; 45 | 46 | // Пропускаем вакансию, если установлен флаг пропуска 47 | // if (skipVacancy()) continue; 48 | 49 | // Находим название вакансии 50 | const vacancyTitle = vacancy.querySelector(SELECTORS.vacancyTitle)?.innerText; 51 | 52 | // Находим кнопку "Откликнуться" 53 | const respondBtn = vacancy.querySelector(SELECTORS.respondBtn); 54 | 55 | // Проверяем, доступна ли кнопка отклика 56 | if (['Respond', 'Откликнуться'].includes(respondBtn?.innerText)) { 57 | // Нажимаем кнопку "Откликнуться" 58 | respondBtn.click(); 59 | 60 | // Ждём заданное время перед продолжением 61 | await delay(CONSTANTS.delayMs); 62 | 63 | // Подтверждаем отклик на вакансию в другой стране, если открылся попап 64 | confirmCountry(); 65 | 66 | // Подтверждаем отклик на вакансию "Непрямой работодатель", если открылся попап 67 | await confirmEmployerAlert(); 68 | 69 | // Проверяем, открыт ли попап формы отклика 70 | if (checkPopupActive()) { 71 | // Если попап открыт, отправляем сопроводительное письмо через попап 72 | await submitCoverLetterPopup(vacancyTitle); 73 | } else { 74 | // Иначе отправляем сопроводительное письмо напрямую 75 | await submitCoverLetter(vacancyTitle); 76 | } 77 | } 78 | 79 | // Убираем синюю рамку после обработки текущей вакансии 80 | vacancy.style.boxShadow = ''; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/modules/submit/submitSingleVacancy.js: -------------------------------------------------------------------------------- 1 | // Импортируем селекторы 2 | import { SELECTORS } from '../../config/selectors.js'; 3 | 4 | // Импортируем функцию для отправки сопроводительного письма 5 | import { submitCoverLetter } from '../popup/submitCoverLetter.js'; 6 | 7 | // Функция для отклика на одну вакансию 8 | export async function submitSingleVacancy() { 9 | // Находим элемент вакансии 10 | const vacancy = document.querySelector(SELECTORS.singleVacancy); 11 | 12 | // Если вакансия не найдена, прекращаем выполнение 13 | if (!vacancy) return; 14 | 15 | // Нажимаем кнопку "Откликнуться", открывая форму отклика 16 | vacancy.click(); 17 | 18 | // Отправляем сопроводительное письмо 19 | await submitCoverLetter(); 20 | } 21 | -------------------------------------------------------------------------------- /src/utils/addToBlacklist.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from './delay.js'; 9 | 10 | // Функция для добавления в чёрный список первой вакансии 11 | export async function addToBlacklist() { 12 | // Находим первую вакансию 13 | const vacancy = document.querySelectorAll(SELECTORS.vacancyCards)[0]; 14 | 15 | // Находим кнопку для вызова меню "Добавить в чёрный список" 16 | const blacklist = vacancy.querySelector(SELECTORS.blacklist); 17 | 18 | // Кликаем по кнопке, если она найдена 19 | blacklist?.click(); 20 | 21 | // Ждём заданное время перед продолжением 22 | await delay(CONSTANTS.delayMs); 23 | 24 | // Находим кнопку "Добавить в чёрный список" 25 | const addBlacklist = document.querySelector(SELECTORS.addBlacklist); 26 | 27 | // Нажимаем на кнопку, если она найдена 28 | addBlacklist?.click(); 29 | 30 | // Убираем синюю рамку после обработки текущей вакансии 31 | vacancy.style.boxShadow = ''; 32 | 33 | // Устанавливаем флаг, что вакансию нужно пропустить 34 | sessionStorage.setItem('skipVacancy', 'true'); 35 | } 36 | 37 | // Функция для проверки пропуска текущей вакансии 38 | export function skipVacancy() { 39 | // Проверяем, установлен ли флаг пропуска 40 | const shouldSkip = !!sessionStorage.getItem('skipVacancy'); 41 | 42 | // Если флаг был установлен, удаляем его 43 | if (shouldSkip) sessionStorage.removeItem('skipVacancy'); 44 | 45 | // Возвращаем результат 46 | return shouldSkip; 47 | } 48 | -------------------------------------------------------------------------------- /src/utils/delay.js: -------------------------------------------------------------------------------- 1 | // Функция реализует задержку в выполнении кода на заданное количество миллисекунд 2 | export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 3 | -------------------------------------------------------------------------------- /src/utils/goToNextPage.js: -------------------------------------------------------------------------------- 1 | // Импортируем селекторы 2 | import { SELECTORS } from '../config/selectors.js'; 3 | 4 | // Импортируем функцию продолжения отправки откликов после обновления страницы 5 | import { resumeMultiSubmit } from './resumeMultiSubmit'; 6 | 7 | // Функция для перехода на следующую страницу 8 | export function goToNextPage() { 9 | // Ищем кнопку "Следующая страница" 10 | const nextPage = document.querySelector(SELECTORS.pagerNext); 11 | 12 | // Если кнопка не найдена, прекращаем выполнение 13 | if (!nextPage) return; 14 | 15 | // Устанавливаем флаг перед перезагрузкой страницы 16 | sessionStorage.setItem('resumeAfterNextPage', 'true'); 17 | 18 | // Нажимаем кнопку "Следующая страница" 19 | nextPage.click(); 20 | } 21 | -------------------------------------------------------------------------------- /src/utils/navigationGuard.js: -------------------------------------------------------------------------------- 1 | // Функция для предотвращающая перехода на другие страницы 2 | export function navigationGuard() { 3 | // Получаем текущий адрес страницы 4 | const prevLoc = window.location.href; 5 | 6 | // Добавляем слушатель на событие перехода 7 | navigation.addEventListener('navigate', (e) => { 8 | // Отменяем переход по адресу и прекращаем распространение события 9 | e.preventDefault(); 10 | e.stopPropagation(); 11 | e.stopImmediatePropagation(); 12 | 13 | // Устанавливаем флаг перед перезагрузкой страницы 14 | sessionStorage.setItem('resumeAfterReload', 'true'); 15 | 16 | // Возвращаем пользователя на исходную страницу 17 | window.location.href = prevLoc; 18 | }); 19 | 20 | // Замораживаем объект location, чтобы его нельзя было изменить вручную 21 | Object.freeze(document.location); 22 | } 23 | -------------------------------------------------------------------------------- /src/utils/popupHelpers.js: -------------------------------------------------------------------------------- 1 | // Импортируем константы 2 | import { CONSTANTS } from '../config/constants.js'; 3 | 4 | // Импортируем селекторы 5 | import { SELECTORS } from '../config/selectors.js'; 6 | 7 | // Импортируем функцию задержки выполнения кода 8 | import { delay } from '../utils/delay.js'; 9 | 10 | // Функция для подтверждения отклика на вакансию в другой стране 11 | export function confirmCountry() { 12 | // Ищем кнопку по заданному селектору, если она найдена, нажимаем на неё 13 | document.querySelector(SELECTORS.countryConfirmBtn)?.click(); 14 | } 15 | 16 | // Функция для подтверждения отклика на вакансию "Непрямой работодатель" 17 | export async function confirmEmployerAlert() { 18 | // Ищем попап "Непрямой работодатель" 19 | const alertBox = document.querySelector(SELECTORS.alertBox); 20 | 21 | // Переходим к его соседнему элементу, где находятся кнопки 22 | const buttons = alertBox?.nextElementSibling?.querySelectorAll('button'); 23 | 24 | // Если кнопки найдены, нажимаем на кнопку "Всё равно откликнуться" 25 | buttons?.[1]?.click(); 26 | 27 | // Ждём заданное время перед продолжением 28 | await delay(CONSTANTS.delayMs); 29 | } 30 | 31 | // Функция для проверки, открылась ли форма отклика в попапе 32 | export function checkPopupActive() { 33 | // Ищем форму отклика по заданному селектору и возвращаем булевое значение 34 | return !!document.querySelector(SELECTORS.modalOverlay); 35 | } 36 | 37 | // Функция для закрытия чата 38 | export function checkChatikActive() { 39 | // Ищем кнопку по заданному селектору, если она найдена, нажимаем на неё 40 | document.querySelector(SELECTORS.chatikCloseBtn)?.click(); 41 | } 42 | -------------------------------------------------------------------------------- /src/utils/resumeMultiSubmit.js: -------------------------------------------------------------------------------- 1 | // Импортируем функцию задержки выполнения кода 2 | import { delay } from './delay.js'; 3 | 4 | // Импортируем функцию для добавления вакансии в чёрный список 5 | import { addToBlacklist } from './addToBlacklist.js'; 6 | 7 | // Функция для продолжения отправки откликов после обновления страницы 8 | export async function resumeMultiSubmit() { 9 | // Определяем, какой из двух флагов установлен 10 | const FLAG_RELOAD = 'resumeAfterReload'; // перезагрузка страницы 11 | const FLAG_NEXT = 'resumeAfterNextPage'; // переход на следующую страницу 12 | 13 | // Получаем активный флаг из sessionStorage 14 | const flag = sessionStorage.getItem(FLAG_RELOAD) 15 | ? FLAG_RELOAD 16 | : sessionStorage.getItem(FLAG_NEXT) 17 | ? FLAG_NEXT 18 | : null; 19 | 20 | // Прекращаем выполнение, если нет активных флагов 21 | if (!flag) return; 22 | 23 | // Удаляем флаг, чтобы не сработал повторно 24 | sessionStorage.removeItem(flag); 25 | 26 | // Ждём заданное время перед продолжением 27 | await delay(4000); 28 | 29 | // Если это возврат после перезагрузки 30 | if (flag === FLAG_RELOAD) { 31 | // Добавляем первую вакансию в чёрный список 32 | await addToBlacklist(); 33 | } 34 | 35 | // Ищем кнопку "Отправить отклики" 36 | const submitResBtn = document.querySelector('[data-action="submit-responses"]'); 37 | 38 | // Если кнопка найдена, нажимаем на неё 39 | submitResBtn?.click(); 40 | } 41 | -------------------------------------------------------------------------------- /src/utils/triggerInputChange.js: -------------------------------------------------------------------------------- 1 | // Универсальная функция для изменения "value" у input / select / textarea 2 | export function triggerInputChange(node, value = '') { 3 | // Типы элементов, у которых есть свойство value 4 | const inputTypes = [ 5 | window.HTMLInputElement, 6 | window.HTMLSelectElement, 7 | window.HTMLTextAreaElement, 8 | ]; 9 | 10 | // Проверяем, принадлежит ли элемент к input / select / textarea 11 | if (inputTypes.includes(node?.__proto__?.constructor)) { 12 | // Получаем оригинальный сеттер свойства "value" из прототипа 13 | const valueSetter = Object.getOwnPropertyDescriptor(node.__proto__, 'value').set; 14 | 15 | // Устанавливаем новое значение, используя оригинальный сеттер 16 | valueSetter.call(node, value); 17 | 18 | // Создаём событие input с всплытием, чтобы сайт увидел изменение 19 | const event = new Event('input', { bubbles: true }); 20 | 21 | // Инициируем событие на переданном элементе 22 | node.dispatchEvent(event); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | // Импортируем модуль path для работы с файловыми путями 2 | const path = require('path'); 3 | 4 | module.exports = { 5 | // Режим сборки: 'production' для финальной версии, 'development' для отладки 6 | mode: 'production', 7 | 8 | // Входной файл, с которого начинается выполнение приложения 9 | entry: './src/main.js', 10 | 11 | // Настройки выходного файла 12 | output: { 13 | filename: 'script.js', // Имя итогового файла после сборки 14 | path: path.resolve(__dirname, 'dist'), // Папка, куда будет сохранён файл 15 | }, 16 | 17 | module: { 18 | rules: [ 19 | { 20 | // Правило для обработки JavaScript-файлов 21 | test: /\.js$/, // Применяется ко всем файлам с расширением .js 22 | exclude: /node_modules/, // Исключаем файлы из папки node_modules 23 | use: { 24 | loader: 'babel-loader', // Используем Babel для трансформации кода ES6+ в ES5 25 | }, 26 | }, 27 | ], 28 | }, 29 | }; 30 | --------------------------------------------------------------------------------